diff --git a/build.gradle b/build.gradle index 1173817c..e9f66baa 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,7 @@ dependencies { compile 'com.android.support:design:24.1.1' compile 'com.google.zxing:android-integration:3.2.1' compile 'com.google.code.gson:gson:2.7' + compile 'org.mindrot:jbcrypt:0.3m' androidTestCompile 'com.squareup.okhttp:mockwebserver:2.4.0' } diff --git a/src/main/java/com/nutomic/syncthingandroid/activities/WebGuiActivity.java b/src/main/java/com/nutomic/syncthingandroid/activities/WebGuiActivity.java index 9a68f183..a1547426 100644 --- a/src/main/java/com/nutomic/syncthingandroid/activities/WebGuiActivity.java +++ b/src/main/java/com/nutomic/syncthingandroid/activities/WebGuiActivity.java @@ -7,6 +7,7 @@ import android.net.http.SslError; import android.os.Build; import android.os.Bundle; import android.os.IBinder; +import android.preference.PreferenceManager; import android.util.Log; import android.view.View; import android.webkit.HttpAuthHandler; @@ -16,6 +17,7 @@ import android.webkit.WebViewClient; import com.nutomic.syncthingandroid.R; import com.nutomic.syncthingandroid.syncthing.SyncthingService; +import com.nutomic.syncthingandroid.util.ConfigXml; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -44,6 +46,8 @@ public class WebGuiActivity extends SyncthingActivity private X509Certificate mCaCert; + private ConfigXml mConfig; + /** * Hides the loading screen and shows the WebView once it is fully loaded. */ @@ -53,7 +57,7 @@ public class WebGuiActivity extends SyncthingActivity * Catch (self-signed) SSL errors and test if they correspond to Syncthing's certificate. */ @Override - public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { + public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { try { int sdk = android.os.Build.VERSION.SDK_INT; if (sdk >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { @@ -82,8 +86,10 @@ public class WebGuiActivity extends SyncthingActivity } } - public void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm) { - handler.proceed(getService().getApi().getGuiUser(), getService().getApi().getGuiPassword()); + public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { + String password = PreferenceManager.getDefaultSharedPreferences(WebGuiActivity.this) + .getString("web_gui_password", ""); + handler.proceed(mConfig.getUserName(), password); } @Override @@ -106,6 +112,7 @@ public class WebGuiActivity extends SyncthingActivity setContentView(R.layout.activity_web_gui); mLoadingView = findViewById(R.id.loading); + mConfig = new ConfigXml(this); loadCaCert(); mWebView = (WebView) findViewById(R.id.webview); diff --git a/src/main/java/com/nutomic/syncthingandroid/fragments/SettingsFragment.java b/src/main/java/com/nutomic/syncthingandroid/fragments/SettingsFragment.java index ada19f67..3c8079dd 100644 --- a/src/main/java/com/nutomic/syncthingandroid/fragments/SettingsFragment.java +++ b/src/main/java/com/nutomic/syncthingandroid/fragments/SettingsFragment.java @@ -44,8 +44,10 @@ public class SettingsFragment extends PreferenceFragment private static final String DEVICE_NAME_KEY = "deviceName"; private static final String USAGE_REPORT_ACCEPTED = "urAccepted"; private static final String ADDRESS = "address"; - private static final String GUI_USER = "gui_user"; - private static final String GUI_PASSWORD = "gui_password"; + private static final String USER = "user"; + // Note that this preference is seperate from the syncthing config value. While Syncthing + // stores a password hash, we store the plaintext password in the Android preferences. + private static final String PASSWORD = "web_gui_password"; private static final String EXPORT_CONFIG = "export_config"; private static final String IMPORT_CONFIG = "import_config"; private static final String STTRACE = "sttrace"; @@ -96,6 +98,13 @@ public class SettingsFragment extends PreferenceFragment Preference address = mGuiScreen.findPreference(ADDRESS); address.setOnPreferenceChangeListener(this); applyPreference(address, api.getValue(RestApi.TYPE_GUI, ADDRESS)); + + Preference user = mGuiScreen.findPreference(USER); + user.setOnPreferenceChangeListener(this); + applyPreference(user, api.getValue(RestApi.TYPE_GUI, USER)); + + Preference password = mGuiScreen.findPreference(PASSWORD); + password.setOnPreferenceChangeListener(this); } } @@ -113,7 +122,6 @@ public class SettingsFragment extends PreferenceFragment } } - /** * Loads layout, sets version from Rest API. * @@ -139,8 +147,6 @@ public class SettingsFragment extends PreferenceFragment Preference appVersion = screen.findPreference(APP_VERSION_KEY); mOptionsScreen = (PreferenceScreen) screen.findPreference(SYNCTHING_OPTIONS_KEY); mGuiScreen = (PreferenceScreen) screen.findPreference(SYNCTHING_GUI_KEY); - final Preference user = screen.findPreference(GUI_USER); - Preference password = screen.findPreference(GUI_PASSWORD); Preference sttrace = findPreference(STTRACE); try { @@ -159,8 +165,6 @@ public class SettingsFragment extends PreferenceFragment screen.findPreference(EXPORT_CONFIG).setOnPreferenceClickListener(this); screen.findPreference(IMPORT_CONFIG).setOnPreferenceClickListener(this); screen.findPreference(SYNCTHING_RESET).setOnPreferenceClickListener(this); - user.setOnPreferenceChangeListener(this); - password.setOnPreferenceChangeListener(this); sttrace.setOnPreferenceChangeListener(this); } @@ -256,32 +260,22 @@ public class SettingsFragment extends PreferenceFragment } else if (preference.getKey().equals(ADDRESS)) { mSyncthingService.getApi().setValue( RestApi.TYPE_GUI, preference.getKey(), o, false, getActivity()); + } else if (preference.getKey().equals(USER)) { + mSyncthingService.getApi().setValue( + RestApi.TYPE_GUI, preference.getKey(), o, false, getActivity()); + } else if (preference.getKey().equals(PASSWORD)) { + mSyncthingService.getApi().setValue( + RestApi.TYPE_GUI, "password", o, false, getActivity()); } - // Avoid any code injection. - int error = 0; if (preference.getKey().equals(STTRACE)) { if (((String) o).matches("[a-z, ]*")) requireRestart = true; - else - error = R.string.toast_invalid_sttrace; - } else if (preference.getKey().equals(GUI_USER)) { - String s = (String) o; - if (!s.contains(":") && !s.contains("'")) - requireRestart = true; - else - error = R.string.toast_invalid_username; - } else if (preference.getKey().equals(GUI_PASSWORD)) { - String s = (String) o; - if (!s.contains(":") && !s.contains("'")) - requireRestart = true; - else - error = R.string.toast_invalid_password; - } - if (error != 0) { - Toast.makeText(getActivity(), error, Toast.LENGTH_SHORT).show(); - return false; + else { + Toast.makeText(getActivity(), R.string.toast_invalid_sttrace, Toast.LENGTH_SHORT).show(); + return false; + } } if (requireRestart) diff --git a/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java b/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java index af8f31c7..965b2cfc 100644 --- a/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java +++ b/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java @@ -173,10 +173,6 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener, private final String mApiKey; - private final String mGuiUser; - - private final String mGuiPassword; - private final String mHttpsCertPath; private JSONObject mConfig; @@ -207,13 +203,11 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener, */ private final Map mCacheFolderPathLookup = new HashMap(); - public RestApi(Context context, String url, String apiKey, String guiUser, String guiPassword, - OnApiAvailableListener apiListener, OnConfigChangedListener configListener) { + public RestApi(Context context, String url, String apiKey, OnApiAvailableListener apiListener, + OnConfigChangedListener configListener) { mContext = context; mUrl = url; mApiKey = apiKey; - mGuiUser = guiUser; - mGuiPassword = guiPassword; mHttpsCertPath = mContext.getFilesDir() + "/" + SyncthingService.HTTPS_CERT_FILE; mOnApiAvailableListener = apiListener; mOnConfigChangedListener = configListener; @@ -1079,18 +1073,6 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener, return new Device(); } - public String getApiKey() { - return mApiKey; - } - - public String getGuiUser() { - return mGuiUser; - } - - public String getGuiPassword() { - return mGuiPassword; - } - /** * Returns value of usage reporting preference. */ diff --git a/src/main/java/com/nutomic/syncthingandroid/syncthing/SyncthingRunnable.java b/src/main/java/com/nutomic/syncthingandroid/syncthing/SyncthingRunnable.java index 56849f56..778c3a59 100644 --- a/src/main/java/com/nutomic/syncthingandroid/syncthing/SyncthingRunnable.java +++ b/src/main/java/com/nutomic/syncthingandroid/syncthing/SyncthingRunnable.java @@ -120,8 +120,6 @@ public class SyncthingRunnable implements Runnable { env.put("STTRACE", sp.getString("sttrace", "")); env.put("STNORESTART", "1"); env.put("STNOUPGRADE", "1"); - env.put("STGUIAUTH", sp.getString("gui_user", "") + ":" + - sp.getString("gui_password", "")); if (sp.getBoolean("use_tor", false)) { env.put("all_proxy", "socks5://localhost:9050"); env.put("ALL_PROXY_NO_FALLBACK", "1"); diff --git a/src/main/java/com/nutomic/syncthingandroid/syncthing/SyncthingService.java b/src/main/java/com/nutomic/syncthingandroid/syncthing/SyncthingService.java index 69c5c86c..6c378edd 100644 --- a/src/main/java/com/nutomic/syncthingandroid/syncthing/SyncthingService.java +++ b/src/main/java/com/nutomic/syncthingandroid/syncthing/SyncthingService.java @@ -305,22 +305,8 @@ public class SyncthingService extends Service implements @Override @TargetApi(21) public void onCreate() { + super.onCreate(); PRNGFixes.apply(); - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - - if (isFirstStart()) { - char[] chars = - "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz".toCharArray(); - StringBuilder sb = new StringBuilder(); - SecureRandom random = new SecureRandom(); - for (int i = 0; i < 20; i++) - sb.append(chars[random.nextInt(chars.length)]); - - String user = Build.MODEL.replaceAll("[^a-zA-Z0-9 ]", ""); - Log.i(TAG, "Generated GUI username and password (username is " + user + ")"); - sp.edit().putString("gui_user", user) - .putString("gui_password", sb.toString()).apply(); - } mDeviceStateHolder = new DeviceStateHolder(SyncthingService.this); registerReceiver(mDeviceStateHolder, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); @@ -328,9 +314,9 @@ public class SyncthingService extends Service implements registerReceiver(mPowerSaveModeChangedReceiver, new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)); } - - new StartupTask(sp.getString("gui_user",""), sp.getString("gui_password","")).execute(); - sp.registerOnSharedPreferenceChangeListener(this); + new StartupTask().execute(); + PreferenceManager.getDefaultSharedPreferences(this) + .registerOnSharedPreferenceChangeListener(this); } /** @@ -339,13 +325,6 @@ public class SyncthingService extends Service implements * {@code Pair}. */ private class StartupTask extends AsyncTask> { - String mGuiUser; - String mGuiPassword; - - public StartupTask(String guiUser, String guiPassword) { - mGuiUser = guiUser; - mGuiPassword = guiPassword; - } @Override protected Pair doInBackground(Void... voids) { @@ -368,7 +347,6 @@ public class SyncthingService extends Service implements } mApi = new RestApi(SyncthingService.this, urlAndKey.first, urlAndKey.second, - mGuiUser, mGuiPassword, new RestApi.OnApiAvailableListener() { @Override public void onApiAvailable() { diff --git a/src/main/java/com/nutomic/syncthingandroid/util/ConfigXml.java b/src/main/java/com/nutomic/syncthingandroid/util/ConfigXml.java index 06c0f985..963a29b7 100644 --- a/src/main/java/com/nutomic/syncthingandroid/util/ConfigXml.java +++ b/src/main/java/com/nutomic/syncthingandroid/util/ConfigXml.java @@ -3,11 +3,13 @@ package com.nutomic.syncthingandroid.util; import android.content.Context; import android.os.Build; import android.os.Environment; +import android.preference.PreferenceManager; import android.util.Log; import com.nutomic.syncthingandroid.R; import com.nutomic.syncthingandroid.syncthing.SyncthingRunnable; +import org.mindrot.jbcrypt.BCrypt; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -16,6 +18,7 @@ import org.xml.sax.SAXException; import java.io.File; import java.io.IOException; +import java.security.SecureRandom; import java.util.Arrays; import java.util.Locale; @@ -96,6 +99,7 @@ public class ConfigXml { if (isFirstStart) { changeDefaultFolder(); + generateLoginInfo(); } updateIfNeeded(); } @@ -116,6 +120,10 @@ public class ConfigXml { return getGuiElement().getElementsByTagName("apikey").item(0).getTextContent(); } + public String getUserName() { + return getGuiElement().getElementsByTagName("user").item(0).getTextContent(); + } + /** * Updates the config file. *

@@ -225,7 +233,7 @@ public class ConfigXml { /** * Change default folder id to camera and path to camera folder path. */ - public void changeDefaultFolder() { + private void changeDefaultFolder() { Element folder = (Element) mConfig.getDocumentElement() .getElementsByTagName("folder").item(0); String model = Build.MODEL @@ -240,6 +248,36 @@ public class ConfigXml { saveChanges(); } + /** + * Generates username and config, stores them in config and preferences. + * + * We have to store the plaintext password in preferences, because we need it in + * WebGuiActivity. The password in the config is hashed, so we can't use it directly. + */ + private void generateLoginInfo() { + char[] chars = + "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz".toCharArray(); + StringBuilder password = new StringBuilder(); + SecureRandom random = new SecureRandom(); + for (int i = 0; i < 20; i++) + password.append(chars[random.nextInt(chars.length)]); + + String user = Build.MODEL.replaceAll("[^a-zA-Z0-9 ]", ""); + Log.i(TAG, "Generated GUI username and password (username is " + user + ")"); + + Node userNode = mConfig.createElement("user"); + getGuiElement().appendChild(userNode); + userNode.setTextContent(user); + + Node passwordNode = mConfig.createElement("password"); + getGuiElement().appendChild(passwordNode); + String hashed = BCrypt.hashpw(password.toString(), BCrypt.gensalt()); + passwordNode.setTextContent(hashed); + PreferenceManager.getDefaultSharedPreferences(mContext).edit() + .putString("web_gui_password", password.toString()) + .apply(); + } + /** * Writes updated mConfig back to file. */ diff --git a/src/main/res/layout/activity_web_gui.xml b/src/main/res/layout/activity_web_gui.xml index 9a459cbc..4507a8b4 100644 --- a/src/main/res/layout/activity_web_gui.xml +++ b/src/main/res/layout/activity_web_gui.xml @@ -20,7 +20,6 @@ android:orientation="vertical"> diff --git a/src/main/res/layout/dialog_loading.xml b/src/main/res/layout/dialog_loading.xml index c4301c12..a6926d8c 100644 --- a/src/main/res/layout/dialog_loading.xml +++ b/src/main/res/layout/dialog_loading.xml @@ -7,7 +7,6 @@ android:theme="?alertDialogTheme"> В настройките на STTRACE са разрешени само символите a-z и \',\' - Символите : и \' ме могат да бъдат ползвани като част от потребителско име - Символите : и \' ме могат да бъдат ползвани като част от парола Нулиране на базата данни diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml index 7dc277c5..19e43914 100644 --- a/src/main/res/values-cs/strings.xml +++ b/src/main/res/values-cs/strings.xml @@ -194,9 +194,7 @@ Všechny problémy, se kterými se setkáte, nahlašte prosím přes Github. V STTRACE jsou povoleny pouze znaky a-z a \',\' - V uživatelském jménu nejsou povoleny znaky : a \' - V heslu nejsou povoleny znaky : a \' Resetovat databázi diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 445ea5f7..4e14499b 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -185,9 +185,7 @@ Bitte auftretenden Probleme via Github melden. Nur a-z und \',\' sind in STTRACE Optionen errlaubt - Die Zeichen : und \' sind im Benutzernamen nicht erlaubt - Die Zeichen : und \' sind im Passwort nicht erlaubt Datenbank zurücksetzen diff --git a/src/main/res/values-es-rMX/strings.xml b/src/main/res/values-es-rMX/strings.xml index 02c719f4..8fa40fbc 100644 --- a/src/main/res/values-es-rMX/strings.xml +++ b/src/main/res/values-es-rMX/strings.xml @@ -185,9 +185,7 @@ Por favor reporte cualquier problema que encuentre por medio de Github. Sólo (a-z) y (\',\') están permitidos en las opciones de STTRACE - Los caracteres : y \' no están permitidos en el nombre de usuario - Los caracteres : y \' no están permitidos en la contraseña Reiniciar Base de Datos diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 378220fc..6682a1b9 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -177,9 +177,7 @@ Por favor informe de qualquier problema que encuentres via Github. Sólo se permiten a-z y \',\' en las opciones STTRACE - No se permiten los carácteres : y \' en el nombre de usuario - No se permiten los carácteres : y \' en la contraseña Restablecer base de datos diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index c89aab05..1e8a3e9f 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -191,9 +191,7 @@ S\'il vous plait, signalez les problèmes que vous rencontrez via Gihub. Seuls, les caractères a-z et \',\' sont autorisés dans les options STTRACE - Les caractères : et \' ne sont pas autorisés dans le nom d\'utilisateur - Les caractères : et \' ne sont pas autorisés dans le mot de passe Remise à zéro de la base de données diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index ec10917b..39e7b628 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -194,9 +194,7 @@ Riferisci tramite Github i problemi che incontri. Solo le lettere da a-z e la virgola \',\' sono consentiti nelle opzioni STTRACE - I caratteri : (duepunti) e \' (apostrofo) non sono consentiti nel nome utente - I caratteri : (duepunti) e \' (apostrofo) non sono consentiti nella password Reset del Database diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml index 164a42f3..fbde8a82 100644 --- a/src/main/res/values-ja/strings.xml +++ b/src/main/res/values-ja/strings.xml @@ -194,9 +194,7 @@ STTRACE オプションでは、a-z および \',\' のみ使用できます。 - ユーザー名に 文字 : および \' は使用できません - パスワードに 文字 : および \' は使用できません データベースをリセット diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml index b8e1382f..e0f55390 100644 --- a/src/main/res/values-ko/strings.xml +++ b/src/main/res/values-ko/strings.xml @@ -193,9 +193,7 @@ STTRACE 옵션에서는 a-z 와 \'.\' 외의 문자를 사용할 수 없습니다. - 문자 :와 \'은 사용자명으로 사용할 수 없습니다 - 문자 :와 \'은 비밀번호로 사용할 수 없습니다 데이터베이스 리셋 diff --git a/src/main/res/values-nb/strings.xml b/src/main/res/values-nb/strings.xml index ec59d8e0..c75d7143 100644 --- a/src/main/res/values-nb/strings.xml +++ b/src/main/res/values-nb/strings.xml @@ -194,9 +194,7 @@ Vennligst rapporter eventuelle problemer som oppstår via GitHub. Bare a-z og \',\' er tillatt som STTRACE-valg - Tegnene : og \' er ikke tillatt i brukernavn - Tegnene : og \' er ikke tillatt i passord Nullstill database diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index 6897a26e..fcaf341d 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -194,9 +194,7 @@ Gelieve alle problemen die je tegenkomt via GitHub te melden. Enkel a-z en \',\' zijn toegestaan in STTRACE-opties - Tekens : en \' zijn niet toegestaan in gebruikersnaam - Tekens : en \' zijn niet toegestaan in wachtwoord Database opnieuw instellen diff --git a/src/main/res/values-nn/strings.xml b/src/main/res/values-nn/strings.xml index 1e934a44..d78a69ae 100644 --- a/src/main/res/values-nn/strings.xml +++ b/src/main/res/values-nn/strings.xml @@ -194,9 +194,7 @@ Om du skulle støyte på problem, ver snill å rapportere dei via Github. Berre a-z og \',\' er tillatne i STTRACE-alternativ - Teikna : og \' er ikkje tillatne i brukernamn - Teikna : og \' er ikkje tillatne i passord Nullstill database diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index c1a939ea..aca6641b 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -181,9 +181,7 @@ Proszę zgłaszać błędy programu w serwisie Github. Tylko znaki a-z oraz „,” są dopuszczalne w STTRACE - Znaki „:” oraz „\'” są niedozwolone w nazwie użytkownika - Znaki „:” oraz „\'” są niedozwolone w haśle Przywróć pierwotny stan bazy danych diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index abe329d3..a68e6914 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -194,9 +194,7 @@ Por favor, informe-nos sobre quaisquer problemas via Github. Somente a-z e \",\" (vírgula) são permitidos nas opções do STTRACE - Caracteres \":\" (dois-pontos) e \"\'\" (apóstrofo) não são permitidos no nome de usuário - Caracteres \":\" (dois-pontos) e \"\'\" (apóstrofo) não são permitidos na senha Limpar banco de dados diff --git a/src/main/res/values-pt/strings.xml b/src/main/res/values-pt/strings.xml index 9919e3dd..8f42a804 100644 --- a/src/main/res/values-pt/strings.xml +++ b/src/main/res/values-pt/strings.xml @@ -172,9 +172,7 @@ Relate quaisquer problemas que encontre via Github, por favor. Apenas é permitido usar a-z e \';\' nas opções do STTRACE - Os caracteres : e \' não são permitidos no nome de utilizador - Os caracteres : e \' não são permitidos na senha Reiniciar a base de dados diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index c4abff47..b8424856 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -188,9 +188,7 @@ В настройках STTRACE можно использовать только символы a-z и \',\' - Символы : и \' запрещено использовать в имени пользователя - Символы : и \' запрещено использовать в пароле Сбросить базу данных diff --git a/src/main/res/values-sk/strings.xml b/src/main/res/values-sk/strings.xml index dd297597..e0b673b1 100644 --- a/src/main/res/values-sk/strings.xml +++ b/src/main/res/values-sk/strings.xml @@ -170,9 +170,7 @@ Aby ste mohli zdielať dáta s ostatnými zariadeniami, musíte najprv pridať i V STTRACE options sú povolené iba znaky a-z a \',\' - Dvojbodka a apostrof nie sú v uživatelskom mene povolené - Dvojbodka a apostrof nie sú v hesle povolené Resetovať Databázu diff --git a/src/main/res/values-sv-rSE/strings.xml b/src/main/res/values-sv-rSE/strings.xml index cd3ef8c4..43554462 100644 --- a/src/main/res/values-sv-rSE/strings.xml +++ b/src/main/res/values-sv-rSE/strings.xml @@ -194,9 +194,7 @@ Vänligen rapportera eventuella problem du stöter på via Github. Endast a-z och \',\' är tillåtna i STTRACE alternativ - Tecknena : och \' tillåts inte i användarnamnet - Tecknet : och \' tillåts inte i lösenordet Återställ databas diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml index aab05819..528a5e2d 100644 --- a/src/main/res/values-sv/strings.xml +++ b/src/main/res/values-sv/strings.xml @@ -194,9 +194,7 @@ Vänligen rapportera eventuella problem du stöter på via Github. Endast a-z och \',\' är tillåtna i STTRACE alternativ - Tecknena : och \' tillåts inte i användarnamnet - Tecknena : och \' tillåts inte i lösenordet Återställ databas diff --git a/src/main/res/values-tr/strings.xml b/src/main/res/values-tr/strings.xml index a8892ae5..cadd211a 100644 --- a/src/main/res/values-tr/strings.xml +++ b/src/main/res/values-tr/strings.xml @@ -177,9 +177,7 @@ Lütfen, herhangi bir sorunla karşılaştığınızda Github üzerinden bildiri STTRACE seçenekleri içinde sadece a-z ve \',\' karakterleri kullanabilirsiniz - Kullanıcı adı içinde : ve \' karakterleri kullanamazsınız - Parola içinde : ve \' karakterleri kullanamazsınız Veritabanını Sıfırla diff --git a/src/main/res/values-vi/strings.xml b/src/main/res/values-vi/strings.xml index 1c422a2a..ab3570ad 100644 --- a/src/main/res/values-vi/strings.xml +++ b/src/main/res/values-vi/strings.xml @@ -185,9 +185,7 @@ Xin báo cáo mọi vấn đề phát sinh thông qua Github. Chỉ cho phép a-z và \',\' trong tuỳ chọn STTRACE - Không cho phép : và \' trong tên người dùng - Không cho phép : và \' trong mật khẩu Cài lại CSDL diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index e94aafc1..198fe7d5 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -194,9 +194,7 @@ STTRACE 选项仅允许 a-z 与逗号 - 用户名不允许存在符号 \' - 密码不允许存在符号 \' 重置数据库 diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 713c0ccc..711fb983 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -325,12 +325,6 @@ Please report any problems you encounter via Github. Only a-z and \',\' are allowed in STTRACE options - - Characters : and \' are not allowed in username - - - Characters : and \' are not allowed in password - Reset Database diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index c546bc97..52ccbb17 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -41,11 +41,6 @@ @null - -