Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
88 changes: 88 additions & 0 deletions app/src/main/java/com/erikraft/drop/FtpSecurityDefaults.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.erikraft.drop;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Base64;

import androidx.preference.PreferenceManager;

import java.security.SecureRandom;
import java.util.Locale;

/** Secure one-time migration and credential checks for the local FTP/FTPS/SFTP servers. */
public final class FtpSecurityDefaults {
private static final String MIGRATION_KEY = "security_ftp_sftp_defaults_v1";
private static final SecureRandom RANDOM = new SecureRandom();

private FtpSecurityDefaults() { }

public static synchronized void ensureSecureDefaults(Context context) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getBoolean(MIGRATION_KEY, false)) return;

String ftpUserKey = context.getString(R.string.pref_ftp_username);
String ftpPasswordKey = context.getString(R.string.pref_ftp_password);
String sftpUserKey = context.getString(R.string.pref_sftp_username);
String sftpPasswordKey = context.getString(R.string.pref_sftp_password);

String ftpUser = prefs.getString(ftpUserKey, "android");
String ftpPassword = prefs.getString(ftpPasswordKey, "");
String sftpUser = prefs.getString(sftpUserKey, "android");
String sftpPassword = prefs.getString(sftpPasswordKey, "");

SharedPreferences.Editor editor = prefs.edit();
if (ftpUser == null || ftpUser.trim().isEmpty()) editor.putString(ftpUserKey, "android");
if (!hasStrongCredentials(ftpUser, ftpPassword)) {
editor.putString(ftpPasswordKey, generatePassword());
}
if (sftpUser == null || sftpUser.trim().isEmpty()) editor.putString(sftpUserKey, "android");
if (!hasStrongCredentials(sftpUser, sftpPassword)) {
editor.putString(sftpPasswordKey, generatePassword());
}

// These settings were previously persisted with insecure defaults. Migrate once;
// users can still deliberately change them again from the settings screen.
editor.putBoolean(context.getString(R.string.pref_ftp_anonymous), false);
editor.putBoolean(context.getString(R.string.pref_ftp_ftps), true);
editor.putBoolean(MIGRATION_KEY, true);
editor.apply();
}

public static boolean hasStrongCredentials(String username, String password) {
if (username == null || username.trim().isEmpty() || password == null || password.trim().length() < 12) {
return false;
}
String trimmedPassword = password.trim();
if (trimmedPassword.equalsIgnoreCase(username.trim())) return false;
String normalized = trimmedPassword.toLowerCase(Locale.ROOT);
if (normalized.equals("android")
|| normalized.equals("admin")
|| normalized.equals("erikraft")
|| normalized.equals("password")
|| normalized.equals("123456789012")
|| normalized.equals("abcdefghijkl")
|| normalized.equals("qwertyuiopas")) return false;

boolean lower = false, upper = false, digit = false, symbol = false;
char previous = 0;
boolean allSame = true;
for (int i = 0; i < trimmedPassword.length(); i++) {
char c = trimmedPassword.charAt(i);
lower |= Character.isLowerCase(c);
upper |= Character.isUpperCase(c);
digit |= Character.isDigit(c);
symbol |= !Character.isLetterOrDigit(c);
if (i > 0 && c != previous) allSame = false;
previous = c;
}
int characterClasses = (lower ? 1 : 0) + (upper ? 1 : 0)
+ (digit ? 1 : 0) + (symbol ? 1 : 0);
return !allSame && characterClasses >= 3;
}

private static String generatePassword() {
byte[] bytes = new byte[24];
RANDOM.nextBytes(bytes);
return Base64.encodeToString(bytes, Base64.URL_SAFE | Base64.NO_WRAP | Base64.NO_PADDING);
}
}
8 changes: 6 additions & 2 deletions app/src/main/java/com/erikraft/drop/FtpServerService.java
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,17 @@ public int onStartCommand(Intent intent, int flags, int startId) {

private void startServer(long generation) {
try {
FtpSecurityDefaults.ensureSecureDefaults(this);
android.content.SharedPreferences prefs = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this);
int port = parsePort(prefs.getString(getString(R.string.pref_ftp_port), "" + DEFAULT_PORT));
String username = valueOrDefault(prefs.getString(getString(R.string.pref_ftp_username), ""), "android");
String password = valueOrDefault(prefs.getString(getString(R.string.pref_ftp_password), ""), "android");
boolean anonymous = prefs.getBoolean(getString(R.string.pref_ftp_anonymous), true);
boolean ftps = prefs.getBoolean(getString(R.string.pref_ftp_ftps), false);
boolean anonymous = prefs.getBoolean(getString(R.string.pref_ftp_anonymous), false);
boolean ftps = prefs.getBoolean(getString(R.string.pref_ftp_ftps), true);
boolean implicitFtps = prefs.getBoolean(getString(R.string.pref_ftp_ftps_implicit), false);
if (!FtpSecurityDefaults.hasStrongCredentials(username, password)) {
throw new IllegalStateException(getString(R.string.ftp_sftp_weak_credentials_error));
}
boolean readOnly = prefs.getBoolean(getString(R.string.pref_ftp_read_only), false);
File home = resolveHome(prefs.getString(getString(R.string.pref_save_location), ""));
if (!home.exists() && !home.mkdirs()) throw new IllegalStateException("Não foi possível criar a pasta base: " + home);
Expand Down
7 changes: 4 additions & 3 deletions app/src/main/java/com/erikraft/drop/FtpSettingsActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SnapdropApplication.setAppTheme(this);
prefs = PreferenceManager.getDefaultSharedPreferences(this);
FtpSecurityDefaults.ensureSecureDefaults(this);
notificationPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), granted -> {
if (stopNotificationSwitch != null) stopNotificationSwitch.setChecked(granted);
prefs.edit().putBoolean(getString(R.string.pref_ftp_stop_notification), granted).apply();
Expand Down Expand Up @@ -157,11 +158,11 @@ private void buildUi() {
content.addView((TextInputLayout) passwordInput.getTag(), lpTop(dp(8)));
anonymousSwitch = new SwitchCompat(this);
anonymousSwitch.setText(R.string.ftp_anonymous_title);
anonymousSwitch.setChecked(prefs.getBoolean(getString(R.string.pref_ftp_anonymous), true));
anonymousSwitch.setChecked(prefs.getBoolean(getString(R.string.pref_ftp_anonymous), false));
content.addView(anonymousSwitch, lpTop(dp(8)));
ftpsSwitch = new SwitchCompat(this);
ftpsSwitch.setText(R.string.ftp_ftps_title);
ftpsSwitch.setChecked(prefs.getBoolean(getString(R.string.pref_ftp_ftps), false));
ftpsSwitch.setChecked(prefs.getBoolean(getString(R.string.pref_ftp_ftps), true));
content.addView(ftpsSwitch, lpTop(dp(4)));
ftpsModeButton = new MaterialButton(this);
content.addView(ftpsModeButton, lpTop(dp(4)));
Expand Down Expand Up @@ -289,7 +290,7 @@ private void updateAddress() {

private String buildAddress() {
String port = prefs.getString(getString(R.string.pref_ftp_port), "2221");
String scheme = prefs.getBoolean(getString(R.string.pref_ftp_ftps), false) ? "ftps" : "ftp";
String scheme = prefs.getBoolean(getString(R.string.pref_ftp_ftps), true) ? "ftps" : "ftp";
return scheme + "://" + getWifiAddress() + ":" + port;
}

Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/erikraft/drop/SftpServerService.java
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,17 @@ private void startServer() {

// Android provides its own crypto primitives; avoid SSHD's optional BC registrar.
System.setProperty("org.apache.sshd.security.provider.BC.enabled", "false");
FtpSecurityDefaults.ensureSecureDefaults(this);
android.content.SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(this);
int port = parsePort(prefs.getString(getString(R.string.pref_sftp_port), "" + DEFAULT_PORT));
String username = valueOrDefault(
prefs.getString(getString(R.string.pref_sftp_username), ""), "android");
String password = valueOrDefault(
prefs.getString(getString(R.string.pref_sftp_password), ""), "android");
if (!FtpSecurityDefaults.hasStrongCredentials(username, password)) {
throw new IllegalStateException(getString(R.string.ftp_sftp_weak_credentials_error));
}
String configuredHome = prefs.getString(getString(R.string.pref_sftp_save_location), "");
boolean readOnly = prefs.getBoolean(getString(R.string.pref_sftp_read_only), false);
File home = new File(configuredHome);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public class SftpSettingsActivity extends DropPipActivity {

@Override protected void onCreate(Bundle state) {
super.onCreate(state);
FtpSecurityDefaults.ensureSecureDefaults(this);
notificationPermissionLauncher = registerForActivityResult(
new ActivityResultContracts.RequestPermission(), granted -> {
if (stopNotificationSwitch != null) stopNotificationSwitch.setChecked(granted);
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/values-af-rZA/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Gebruik vir sekuriteit ’n unieke wagwoord van minstens 12 karakters in die FTP/FTPS/SFTP-instellings.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-ar-rSA/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">لأسباب أمنية، استخدم كلمة مرور فريدة من 12 حرفًا على الأقل في إعدادات FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-bg-rBG/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">За сигурност използвайте уникална парола с поне 12 знака в настройките за FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-ca-rES/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Per seguretat, fes servir una contrasenya única d’almenys 12 caràcters a la configuració FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-cs-rCZ/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Z bezpečnostních důvodů použijte v nastavení FTP/FTPS/SFTP jedinečné heslo o délce alespoň 12 znaků.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-da-rDK/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Af sikkerhedshensyn skal du bruge en unik adgangskode på mindst 12 tegn i FTP/FTPS/SFTP-indstillingerne.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-de-rDE/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Verwende aus Sicherheitsgründen in den FTP/FTPS/SFTP-Einstellungen ein einzigartiges Passwort mit mindestens 12 Zeichen.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-el-rGR/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Για λόγους ασφαλείας, χρησιμοποιήστε μοναδικό κωδικό πρόσβασης τουλάχιστον 12 χαρακτήρων στις ρυθμίσεις FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-es-rES/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Por seguridad, utiliza una contraseña única de al menos 12 caracteres en los ajustes de FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-fi-rFI/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Käytä turvallisuussyistä FTP/FTPS/SFTP-asetuksissa yksilöllistä salasanaa, jossa on vähintään 12 merkkiä.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-fr-rFR/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Pour votre sécurité, utilisez un mot de passe unique d’au moins 12 caractères dans les paramètres FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-hi-rIN/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">सुरक्षा के लिए, FTP/FTPS/SFTP सेटिंग में कम से कम 12 अक्षरों वाला विशिष्ट पासवर्ड इस्तेमाल करें।</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-hr-rHR/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Radi sigurnosti koristite jedinstvenu lozinku od najmanje 12 znakova u postavkama FTP/FTPS/SFTP-a.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-hu-rHU/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Biztonsági okokból használjon legalább 12 karakteres, egyedi jelszót az FTP/FTPS/SFTP beállításaiban.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-in-rID/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Demi keamanan, gunakan kata sandi unik minimal 12 karakter di pengaturan FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-it-rIT/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Per sicurezza, usa una password univoca di almeno 12 caratteri nelle impostazioni FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-iw-rIL/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">למען האבטחה, יש להשתמש בהגדרות FTP/FTPS/SFTP בסיסמה ייחודית בת 12 תווים לפחות.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-ja-rJP/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">セキュリティのため、FTP/FTPS/SFTP の設定では 12 文字以上の固有のパスワードを使用してください。</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-ko-rKR/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">보안을 위해 FTP/FTPS/SFTP 설정에서 12자 이상의 고유한 비밀번호를 사용하세요.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-mk-rMK/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">За безбедност, користете единствена лозинка со најмалку 12 знаци во поставките за FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-ne-rNP/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">सुरक्षाका लागि FTP/FTPS/SFTP सेटिङमा कम्तीमा १२ वर्णको अद्वितीय पासवर्ड प्रयोग गर्नुहोस्।</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-nl-rNL/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Gebruik voor de veiligheid een uniek wachtwoord van minimaal 12 tekens in de FTP/FTPS/SFTP-instellingen.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-no-rNO/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Av sikkerhetshensyn må du bruke et unikt passord på minst 12 tegn i FTP/FTPS/SFTP-innstillingene.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-pl-rPL/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Ze względów bezpieczeństwa użyj unikalnego hasła o długości co najmniej 12 znaków w ustawieniach FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-pt-rBR/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Por segurança, use uma senha exclusiva com pelo menos 12 caracteres nas configurações de FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-pt-rPT/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Por segurança, utilize uma palavra-passe exclusiva com pelo menos 12 caracteres nas definições de FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-ro-rRO/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Pentru securitate, folosiți o parolă unică de cel puțin 12 caractere în setările FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-ru-rRU/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">В целях безопасности используйте в настройках FTP/FTPS/SFTP уникальный пароль длиной не менее 12 символов.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-sk-rSK/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Z bezpečnostných dôvodov použite v nastaveniach FTP/FTPS/SFTP jedinečné heslo s dĺžkou aspoň 12 znakov.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-sl-rSI/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Zaradi varnosti v nastavitvah FTP/FTPS/SFTP uporabite edinstveno geslo z najmanj 12 znaki.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-sr-rRS/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Ради безбедности користите јединствену лозинку од најмање 12 знакова у FTP/FTPS/SFTP подешавањима.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-sr-rSP/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Radi bezbednosti koristite jedinstvenu lozinku od najmanje 12 znakova u FTP/FTPS/SFTP podešavanjima.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-sr/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Ради безбедности користите јединствену лозинку од најмање 12 знакова у FTP/FTPS/SFTP подешавањима.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-sv-rSE/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Använd av säkerhetsskäl ett unikt lösenord på minst 12 tecken i FTP/FTPS/SFTP-inställningarna.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-tr-rTR/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Güvenlik için FTP/FTPS/SFTP ayarlarında en az 12 karakterli benzersiz bir parola kullanın.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-uk-rUA/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Для безпеки використовуйте в налаштуваннях FTP/FTPS/SFTP унікальний пароль довжиною щонайменше 12 символів.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-vi-rVN/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">Để bảo mật, hãy dùng mật khẩu riêng biệt dài ít nhất 12 ký tự trong cài đặt FTP/FTPS/SFTP.</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-zh-rCN/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">为确保安全,请在 FTP/FTPS/SFTP 设置中使用至少 12 个字符的唯一密码。</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values-zh-rTW/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">為確保安全,請在 FTP/FTPS/SFTP 設定中使用至少 12 個字元的專用密碼。</string>
</resources>
4 changes: 4 additions & 0 deletions app/src/main/res/values/ftp_security.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="ftp_sftp_weak_credentials_error">For security, use a unique password with at least 12 characters in FTP/FTPS/SFTP settings.</string>
</resources>
Loading