Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
eefff9f
fix(security): scope auth token to (server, userId), stop exporting n…
OtavioStasiak Jun 25, 2026
8c9c908
action: organized translations
OtavioStasiak Jun 25, 2026
718e9b9
Merge branch 'develop' into fix.expose-broadcast-receiver-vulnerability
OtavioStasiak Jul 1, 2026
7f78313
fix: test
OtavioStasiak Jul 1, 2026
ccadcd0
fix: e2e tests
OtavioStasiak Jul 1, 2026
f46aea1
fix(security): scope token migration to unambiguous userIds and run i…
OtavioStasiak Jul 1, 2026
169246d
chore: simplify comments
OtavioStasiak Jul 2, 2026
0781686
chore: i18n translation
OtavioStasiak Jul 2, 2026
bdf531a
refactor: extract token migration out of init saga into a tested asyn…
OtavioStasiak Jul 2, 2026
36d748b
action: organized translations
OtavioStasiak Jul 2, 2026
109a79c
refactor(android): extract legacy token fallback into deprecated method
OtavioStasiak Jul 2, 2026
473d490
refactor: dedupe migration constant, extract legacy token fallback, a…
OtavioStasiak Jul 2, 2026
9f209ae
fix: e2e test login on ios
OtavioStasiak Jul 3, 2026
879aaf1
Merge branch 'develop' into fix.expose-broadcast-receiver-vulnerability
OtavioStasiak Aug 12, 2026
f1f8fdd
fix: tests
OtavioStasiak Aug 12, 2026
5e241b1
Merge branch 'develop' into fix.expose-broadcast-receiver-vulnerability
OtavioStasiak Aug 14, 2026
e0d7a12
Merge branch 'develop' into fix.expose-broadcast-receiver-vulnerability
OtavioStasiak Aug 14, 2026
6eb4c88
chore: trim explanatory comments from server-scoped token keys
OtavioStasiak Aug 20, 2026
835485f
chore: drop dead legacy token removal on logout
OtavioStasiak Aug 20, 2026
808c25f
refactor: route token key namespace through helpers in keys.ts
OtavioStasiak Aug 20, 2026
4f6976e
refactor: group token migration by userId with a single map
OtavioStasiak Aug 20, 2026
ee73b9c
fix: refuse legacy userId-only token lookup on native after migration
OtavioStasiak Aug 20, 2026
d82775b
fix(deeplink): declining login no longer adds or connects the server
OtavioStasiak Aug 20, 2026
88e6747
fix(security): clear legacy token slots and surface declined deep-lin…
OtavioStasiak Aug 20, 2026
33003ef
fix(security): anchor the legacy token sweep on the userId shape
OtavioStasiak Aug 20, 2026
5e04c0d
Merge branch 'develop' into fix.expose-broadcast-receiver-vulnerability
OtavioStasiak Aug 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions .maestro/tests/assorted/deeplink.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -310,3 +310,80 @@ tags:
visible:
id: 'new-server-view'
timeout: 60000

# should show a security confirmation prompt on deep link login and abort when cancelled.
- runFlow:
file: '../../helpers/launch-app.yaml'
- stopApp: ${APP_ID}
- runFlow:
file: '../../helpers/open-deeplink.yaml'
env:
link: ${output.utils.getDeepLink('auth', output.data.server, 'userId=', output.login.userId, '&token=', output.login.authToken, '&path=group/', output.room.name, '&forceLoginPrompt=true')}
- extendedWaitUntil:
visible:
text: '.*Sign in to this server.*'
timeout: 60000
- assertVisible:
text: '.*A link is asking to sign you in.*'
# decline the prompt — the app must NOT sign in or navigate to the room
- runFlow:
when:
platform: android
commands:
- tapOn:
id: 'android:id/button2'
- runFlow:
when:
platform: ios
commands:
- tapOn:
text: 'Cancel'
- extendedWaitUntil:
visible:
id: 'workspace-view'
timeout: 60000
- assertNotVisible:
id: 'room-view-title-${output.room.name}'

# should show a security confirmation prompt on deep link login and sign in when confirmed
- runFlow:
file: '../../helpers/launch-app.yaml'
- stopApp: ${APP_ID}
- runFlow:
file: '../../helpers/open-deeplink.yaml'
env:
link: ${output.utils.getDeepLink('auth', output.data.server, 'userId=', output.login.userId, '&token=', output.login.authToken, '&path=group/', output.room.name, '&forceLoginPrompt=true')}
- extendedWaitUntil:
visible:
text: '.*Sign in to this server.*'
timeout: 60000
# confirm the prompt — the app must sign in and navigate to the room.
# android:id/button1 is the positive (confirm) button, disambiguating it from the "Login" button
# rendered on the workspace screen behind the alert.
- runFlow:
when:
platform: android
commands:
- extendedWaitUntil:
visible:
id: 'android:id/button1'
timeout: 60000
- tapOn:
id: 'android:id/button1'
- runFlow:
when:
platform: ios
commands:
- tapOn:
text: 'Login'
rightOf:
text: 'Cancel'
- extendedWaitUntil:
visible:
id: 'room-view-title-${output.room.name}'
timeout: 60000
- runFlow: '../../helpers/go-back.yaml'
- extendedWaitUntil:
visible:
id: 'rooms-list-view'
timeout: 60000
4 changes: 2 additions & 2 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,11 @@
<receiver
android:name="chat.rocket.reactnative.notification.ReplyBroadcast"
android:enabled="true"
android:exported="true" />
android:exported="false" />
<receiver
android:name="chat.rocket.reactnative.notification.DismissNotification"
android:enabled="true"
android:exported="true" >
android:exported="false" >
</receiver>
<receiver
android:name="chat.rocket.reactnative.notification.VideoConfBroadcast"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ static public String toHex(String arg) {
public class Ejson {
private static final String TAG = "RocketChat.Ejson";
private static final String TOKEN_KEY = "reactnativemeteor_usertoken-";
private static final String TOKEN_KEY_SERVER_SCOPED_MIGRATED = "RC_TOKEN_KEY_SERVER_SCOPED_MIGRATED";

public String host;
String rid;
Expand Down Expand Up @@ -135,35 +136,60 @@ public String getCallerAvatarUri(int sizePx) {
}

public String token() {
String serverURL = serverURL();
String userId = userId();
MMKV mmkv = getMMKV();

if (mmkv == null) {
Log.e(TAG, "token() called but MMKV is null");
return "";
}

if (userId == null || userId.isEmpty()) {
Log.w(TAG, "token() called but userId is null or empty");
return "";
}

String key = TOKEN_KEY.concat(userId);
if (BuildConfig.DEBUG) {
Log.d(TAG, "Looking up token with key: " + key);

// Keep in sync with getUserTokenKey() (JS); falls back to the legacy userId-only slot
// until the JS migration runs.
String token = null;
if (serverURL != null && !serverURL.isEmpty()) {
String key = TOKEN_KEY.concat(serverURL).concat("-").concat(userId);
if (BuildConfig.DEBUG) {
Log.d(TAG, "Looking up token with server-scoped key");
}
token = mmkv.decodeString(key);
}

String token = mmkv.decodeString(key);


if (token == null || token.isEmpty()) {
token = decodeLegacyUserIdScopedToken(mmkv, userId);
Comment thread
OtavioStasiak marked this conversation as resolved.
}

if (token == null || token.isEmpty()) {
Log.w(TAG, "No token found in MMKV for userId");
} else if (BuildConfig.DEBUG) {
Log.d(TAG, "Successfully retrieved token from MMKV");
}

return token != null ? token : "";
}

/**
* Reads the token from the legacy userId-only slot, used until {@code migrateTokenKeysToServerScoped}
* (JS init saga) moves it to the server-scoped slot and deletes it.
*
* @deprecated remove once the migration is universal.
*/
@Deprecated
private String decodeLegacyUserIdScopedToken(MMKV mmkv, String userId) {
// The legacy slot is ambiguous across servers sharing a userId, so it is only readable
// before the migration runs.
if (mmkv.decodeBool(TOKEN_KEY_SERVER_SCOPED_MIGRATED, false)) {
return null;
}
return mmkv.decodeString(TOKEN_KEY.concat(userId));
}

public String userId() {
String serverURL = serverURL();

Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@
"Custom": "مخصص",
"Dark": "داكن",
"Dark_level": "مستوى السمة الداكنة",
"Deep_link_login_description": "يوجد رابط يطلب تسجيل دخولك إلى {{server}}. تابع فقط إذا كنت قد فتحت هذا الرابط بنفسك وتثق به.",
"Deep_link_login_title": "تسجيل الدخول إلى هذا الخادم؟",
"Default": "افتراضي",
"Default_browser": "المتصفح الأساسي",
"DELETE": "حذف",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/bn-IN.json
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,8 @@
"Dark": "অন্ধকার",
"Dark_level": "অন্ধকার স্তর",
"decline": "অস্বীকার করুন",
"Deep_link_login_description": "একটি লিঙ্ক আপনাকে {{server}}-এ সাইন ইন করাতে চাইছে। আপনি নিজে এই লিঙ্কটি খুলে থাকেন এবং এটিকে বিশ্বাস করেন তবেই এগিয়ে যান।",
"Deep_link_login_title": "এই সার্ভারে সাইন ইন করবেন?",
"Default": "ডিফল্ট",
"Default_browser": "ডিফল্ট ব্রাউজার",
"Defined_user_as_role": "{{user}} একটি {{role}} হিসেবে নির্ধারণ করেছে",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/cs.json
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,8 @@
"Dark": "Temný",
"Dark_level": "Temná úroveň",
"decline": "Pokles",
"Deep_link_login_description": "Odkaz se vás pokouší přihlásit do {{server}}. Pokračujte pouze, pokud jste tento odkaz otevřeli sami a důvěřujete mu.",
"Deep_link_login_title": "Přihlásit se k tomuto serveru?",
"Default": "Výchozí",
"Default_browser": "Výchozí prohlížeč",
"Defined_user_as_role": "definováno {{user}} jako {{role}}",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,8 @@
"Dark": "Dunkel",
"Dark_level": "Dunkelstufe",
"decline": "Ablehnen",
"Deep_link_login_description": "Ein Link versucht, Sie bei {{server}} anzumelden. Fahren Sie nur fort, wenn Sie diesen Link selbst geöffnet haben und ihm vertrauen.",
"Deep_link_login_title": "Bei diesem Server anmelden?",
"Default": "Standard",
"Default_browser": "Standard-Browser",
"Defined_user_as_role": "hat {{user}} als {{role}} gesetzt",
Expand Down
3 changes: 3 additions & 0 deletions app/i18n/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,9 @@
"Dark": "Dark",
"Dark_level": "Dark level",
"decline": "Decline",
"Deep_link_login_declined": "Sign-in link dismissed.",
"Deep_link_login_description": "A link is asking to sign you in to {{server}}. Only continue if you opened this link yourself and trust it.",
Comment thread
OtavioStasiak marked this conversation as resolved.
"Deep_link_login_title": "Sign in to this server?",
Comment thread
OtavioStasiak marked this conversation as resolved.
"Default": "Default",
"Default_browser": "Default browser",
"Defined_user_as_role": "defined {{user}} as {{role}}",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@
"Custom": "Personalizado",
"Dark": "Oscuro",
"Dark_level": "Nivel de oscuridad",
"Deep_link_login_description": "Un enlace está intentando iniciar sesión en {{server}}. Continúa solo si abriste este enlace tú mismo y confías en él.",
"Deep_link_login_title": "¿Iniciar sesión en este servidor?",
"Default": "Por defecto",
"DELETE": "ELIMINAR",
"Delete": "Eliminar",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/fi.json
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,8 @@
"Custom": "Mukautettu",
"Dark": "Tumma",
"Dark_level": "Tumman taso",
"Deep_link_login_description": "Linkki yrittää kirjata sinut palvelimeen {{server}}. Jatka vain, jos avasit tämän linkin itse ja luotat siihen.",
"Deep_link_login_title": "Kirjaudutaanko tälle palvelimelle?",
"Default": "Oletus",
"Default_browser": "Oletusselain",
"Defined_user_as_role": "määritti käyttäjän {{user}} rooliin {{role}}",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@
"Custom": "Personnalisé",
"Dark": "Sombre",
"Dark_level": "Niveau d'obscurité",
"Deep_link_login_description": "Un lien tente de vous connecter à {{server}}. Continuez uniquement si vous avez ouvert ce lien vous-même et que vous lui faites confiance.",
"Deep_link_login_title": "Se connecter à ce serveur ?",
"Default": "Défaut",
"Default_browser": "Navigateur par défaut",
"DELETE": "SUPPRIMER",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/hi-IN.json
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,8 @@
"Dark": "डार्क",
"Dark_level": "डार्क स्तर",
"decline": "तिरस्कार",
"Deep_link_login_description": "एक लिंक आपको {{server}} में साइन इन कराना चाहता है। केवल तभी आगे बढ़ें जब आपने यह लिंक स्वयं खोला हो और इस पर भरोसा करते हों।",
"Deep_link_login_title": "इस सर्वर में साइन इन करें?",
"Default": "डिफ़ॉल्ट",
"Default_browser": "डिफ़ॉल्ट ब्राउज़र",
"Defined_user_as_role": "{{user}} को {{role}} के रूप में परिभाषित किया गया है",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/hu.json
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,8 @@
"Dark": "Sötét",
"Dark_level": "Sötét szint",
"decline": "Elutasítom",
"Deep_link_login_description": "Egy hivatkozás be szeretné jelentkeztetni a(z) {{server}} kiszolgálóra. Csak akkor folytassa, ha ezt a hivatkozást Ön nyitotta meg, és megbízik benne.",
"Deep_link_login_title": "Bejelentkezik erre a kiszolgálóra?",
"Default": "Alapértelmezett",
"Default_browser": "Alapértelmezett böngésző",
"Defined_user_as_role": "a(z) {{user}} felhasználót mint {{role}} definiálták",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,8 @@
"Custom": "Personalizzato",
"Dark": "Scuro",
"Dark_level": "Contrasto",
"Deep_link_login_description": "Un link sta tentando di farti accedere a {{server}}. Continua solo se hai aperto tu questo link e ti fidi.",
"Deep_link_login_title": "Accedere a questo server?",
"Default": "Predefinito",
"Default_browser": "Browser predefinito",
"DELETE": "ELIMINA",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,8 @@
"Custom": "カスタム",
"Dark": "ダーク",
"Dark_level": "ダークレベル",
"Deep_link_login_description": "リンクが {{server}} へのサインインを求めています。このリンクを自分で開き、信頼できる場合にのみ続行してください。",
"Deep_link_login_title": "このサーバーにサインインしますか?",
"Default": "デフォルト",
"Default_browser": "デフォルトのブラウザ",
"DELETE": "削除",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@
"Custom": "Aangepast",
"Dark": "Donker",
"Dark_level": "Donker niveau",
"Deep_link_login_description": "Een link probeert je aan te melden bij {{server}}. Ga alleen verder als je deze link zelf hebt geopend en je deze vertrouwt.",
"Deep_link_login_title": "Aanmelden bij deze server?",
"Default": "Standaard",
"Default_browser": "Standaard browser",
"DELETE": "VERWIJDEREN",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/nn.json
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@
"Current_Status": "Nåværende status",
"Custom": "Tilpasset",
"decline": "Avslå",
"Deep_link_login_description": "Ei lenkje prøver å logge deg inn på {{server}}. Hald berre fram dersom du opna denne lenkja sjølv og stolar på henne.",
"Deep_link_login_title": "Logge inn på denne serveren?",
"Default": "Misligholde",
"Delete": "Slett",
"Delete_Account": "Slett konto",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/no.json
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,8 @@
"Dark": "Mørk",
"Dark_level": "Mørkt nivå",
"decline": "Avslå",
"Deep_link_login_description": "En lenke prøver å logge deg inn på {{server}}. Fortsett bare hvis du åpnet denne lenken selv og stoler på den.",
"Deep_link_login_title": "Logge inn på denne serveren?",
"Default": "Standard",
"Default_browser": "Standard nettleser",
"Defined_user_as_role": "definert {{user}} som {{role}}",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/pt-BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,8 @@
"Dark": "Escuro",
"Dark_level": "Nível escuro",
"decline": "Recusar",
"Deep_link_login_description": "Um link está tentando fazer seu login em {{server}}. Continue apenas se você abriu esse link por conta própria e confia nele.",
"Deep_link_login_title": "Fazer login neste servidor?",
"Default": "Padrão",
"Default_browser": "Navegador padrão",
"Defined_user_as_role": "definiu {{user}} como {{role}}",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/pt-PT.json
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@
"Custom": "Personalizado",
"Dark": "Escuro",
"Dark_level": "Nível Escuro",
"Deep_link_login_description": "Um link está a tentar iniciar a sua sessão em {{server}}. Continue apenas se abriu este link por si próprio e confia nele.",
"Deep_link_login_title": "Iniciar sessão neste servidor?",
"Default": "Predefinição",
"Default_browser": "Navegador predefinido",
"DELETE": "APAGAR",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,8 @@
"Custom": "Пользовательский",
"Dark": "Темный",
"Dark_level": "Уровень затемненности",
"Deep_link_login_description": "Ссылка пытается выполнить вход в {{server}}. Продолжайте, только если вы сами открыли эту ссылку и доверяете ей.",
"Deep_link_login_title": "Войти на этот сервер?",
"Default": "По умолчанию",
"Default_browser": "Браузер по умолчанию",
"DELETE": "УДАЛИТЬ",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/sl-SI.json
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,8 @@
"Custom": "Po meri",
"Dark": "Temno",
"Dark_level": "Temna raven",
"Deep_link_login_description": "Povezava vas poskuša prijaviti v {{server}}. Nadaljujte le, če ste to povezavo odprli sami in ji zaupate.",
"Deep_link_login_title": "Se želite prijaviti v ta strežnik?",
"Default": "Privzeto",
"Default_browser": "Privzeti brskalnik",
"DELETE": "Izbrisati",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/sv.json
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,8 @@
"Custom": "Anpassad",
"Dark": "Mörk",
"Dark_level": "Mörk nivå",
"Deep_link_login_description": "En länk försöker logga in dig på {{server}}. Fortsätt bara om du själv öppnade den här länken och litar på den.",
"Deep_link_login_title": "Logga in på den här servern?",
"Default": "Standard",
"Default_browser": "Standardwebbläsare",
"Defined_user_as_role": "angav {{user}} som {{role}}",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/ta-IN.json
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,8 @@
"Dark": "கருப்பு",
"Dark_level": "கருப்பு அளவு",
"decline": "மறுக்கு",
"Deep_link_login_description": "ஒரு இணைப்பு உங்களை {{server}} இல் உள்நுழையச் கேட்கிறது. இந்த இணைப்பை நீங்களே திறந்து அதைப் நம்பினால் மட்டுமே தொடரவும்.",
"Deep_link_login_title": "இந்த சர்வரில் உள்நுழையவா?",
"Default": "இயல்புநிலை",
"Default_browser": "இயல்புநிலை உலாவி",
"Defined_user_as_role": "{{user}} ஐ {{role}} என்று வெளியிடப்பட்டார்",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/te-IN.json
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,8 @@
"Dark": "గాఢంగా",
"Dark_level": "గాఢంగా స్థాయి",
"decline": "నిరాకరించు",
"Deep_link_login_description": "ఒక లింక్ మిమ్మల్ని {{server}} లో సైన్ ఇన్ చేయాలని కోరుతోంది. మీరు ఈ లింక్‌ను స్వయంగా తెరిచి దానిని నమ్మితేనే కొనసాగండి.",
"Deep_link_login_title": "ఈ సర్వర్‌లో సైన్ ఇన్ చేయాలా?",
"Default": "స్వచ్ఛందం",
"Default_browser": "స్వచ్ఛంద బ్రౌజర్",
"Defined_user_as_role": "{{user}} నియమాలను {{role}} గా ప్రవృత్తించారు",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/tr.json
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,8 @@
"Custom": "Özel",
"Dark": "Karanlık",
"Dark_level": "Karanlık Seviyesi",
"Deep_link_login_description": "Bir bağlantı sizi {{server}} sunucusunda oturum açtırmak istiyor. Yalnızca bu bağlantıyı kendiniz açtıysanız ve güveniyorsanız devam edin.",
"Deep_link_login_title": "Bu sunucuda oturum açılsın mı?",
"Default": "Varsayılan",
"Default_browser": "Varsayılan tarayıcı",
"DELETE": "SİL",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@
"Custom": "自定义",
"Dark": "深色",
"Dark_level": "深色程度",
"Deep_link_login_description": "有一个链接正尝试让你登录到 {{server}}。只有在你亲自打开此链接并且信任它的情况下才继续。",
"Deep_link_login_title": "登录到此服务器?",
"Default": "默認",
"Default_browser": "预设浏览器",
"DELETE": "删除",
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/zh-TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@
"Custom": "自訂",
"Dark": "深色",
"Dark_level": "深色程度",
"Deep_link_login_description": "有一個連結正嘗試讓你登入 {{server}}。只有在你親自開啟此連結並且信任它的情況下才繼續。",
"Deep_link_login_title": "登入此伺服器?",
"Default": "預設",
"Default_browser": "預設瀏覽器",
"DELETE": "刪除",
Expand Down
Loading
Loading