diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index c99e59c8c..bc0c11053 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -18,7 +18,7 @@ jobs: - name: Save artifact uses: actions/upload-artifact@master with: - name: PTelegramAlpha-v1515.apk + name: PTelegramAlpha-1518.apk path: TMessagesProj/build/outputs/apk/afat/alpha/app.apk - name: Create cleanup request run: touch delete_request diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml index e99c51487..0764d0b9c 100644 --- a/.github/workflows/beta.yml +++ b/.github/workflows/beta.yml @@ -18,7 +18,7 @@ jobs: - name: Save artifact uses: actions/upload-artifact@master with: - name: PTelegramBeta-v1515.apk + name: PTelegramBeta-v1518.apk path: TMessagesProj/build/outputs/apk/afat/debug/app.apk - name: Create cleanup request run: touch delete_request diff --git a/TMessagesProj/src/main/assets/strings/strings_be.xml b/TMessagesProj/src/main/assets/strings/strings_be.xml index cef39bf7c..a2bcdb584 100644 --- a/TMessagesProj/src/main/assets/strings/strings_be.xml +++ b/TMessagesProj/src/main/assets/strings/strings_be.xml @@ -263,6 +263,7 @@ Бягучае прыкладанне састарэла і не можа перадаць дадзеныя ў новае прыкладанне. Абнавіце яго і паспрабуйце яшчэ раз. Адбылася невядомая памылка. Абнавіце абодва прыкладанні і паспрабуйце яшчэ раз. %1$s Калі памылка застаецца, калі ласка, звяжыцеся з тэхпадтрымкай Партызанскага Тэлеграма. + Здаецца, Вы выправілі ўсе праблемы. Жадаеце аднавіць міграцыю? Новая сакрэтная група Вы ўпэўненыя, што хочаце ачысціць гісторыю чата **%1$s** толькі для сябе? У іншых удзельнікаў яна застанецца даступнай. Вы ўпэўненыя, што хочаце выгаліць гэтую сакрэтную групу: **%1$s**? diff --git a/TMessagesProj/src/main/assets/strings/strings_ru.xml b/TMessagesProj/src/main/assets/strings/strings_ru.xml index 1cb27c2ab..29b03211f 100644 --- a/TMessagesProj/src/main/assets/strings/strings_ru.xml +++ b/TMessagesProj/src/main/assets/strings/strings_ru.xml @@ -268,6 +268,7 @@ Ложные код-пароли с беспарольным режимом не разрешёны в замаскированном приложении. Отключите этот режим в код-паролях или удалите эти код-пароли. Код-пароли с активацией по отпечатку пальца не разрешены в замаскированном приложении. Отключите эту опцию. Если у Вас были ложные код-пароли, состоящие не из 4 цифры, их не получится ввести. Мы рекомендуем изменить их. + Кажется, Вы исправили все проблемы. Хотите возобновить миграцию? Создать секретную группу Вы точно хотите удалить историю секретной группы **%1$s** только для себя? У других участников она останется доступной. Вы точно хотите удалить эту секретную группу: **%1$s**? diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java index d1821522b..a54d2d775 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java @@ -2,5 +2,5 @@ package org.telegram.messenger.partisan; public class PartisanVersion { public static final String PARTISAN_VERSION_STRING = "3.8.0"; - public static int PARTISAN_BUILD_VERSION = 1515; + public static int PARTISAN_BUILD_VERSION = 1518; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/AppMigrationActivity.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/AppMigrationActivity.java index d948d707a..474409f66 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/AppMigrationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/AppMigrationActivity.java @@ -357,6 +357,7 @@ public class AppMigrationActivity extends BaseFragment implements MigrationZipBu AppMigrator.disableConnection(); migrationFinished(data.getStringExtra("packageName")); } else { + saveMigrationIssuesIfNeeded(data); AppMigrator.enableConnection(); AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(LocaleController.getString(R.string.MigrationTitle)); @@ -369,6 +370,16 @@ public class AppMigrationActivity extends BaseFragment implements MigrationZipBu } } + private static void saveMigrationIssuesIfNeeded(Intent data) { + String error = data.getStringExtra("error"); + if ("settingsDoNotSuitMaskedApps".equals(error)) { + String[] issues = data.getStringArrayExtra("issues"); + if (issues != null) { + MaskedMigratorHelper.setMigrationIssues(issues); + } + } + } + private static String getErrorMessage(Intent data) { String error = data.getStringExtra("error"); if ("alreadyHasAccounts".equals(error)) { @@ -393,15 +404,19 @@ public class AppMigrationActivity extends BaseFragment implements MigrationZipBu } private static String getMigrationIssueDescription(String issue) { - if ("invalidPasscodeType".equals(issue)) { - return LocaleController.getString(R.string.IssueInvalidPasscodeTypeDescription); - } else if ("passwordlessMode".equals(issue)) { - return LocaleController.getString(R.string.IssuePasswordlessModeDescription); - } else if ("activateByFingerprint".equals(issue)) { - return LocaleController.getString(R.string.IssueActivateByFingerprintDescription); - } else { - return LocaleController.formatString(R.string.MigrationErrorUnknownDescription, LocaleController.getString(R.string.MigrationContactPtgSupport)); + try { + switch (MaskedMigrationIssue.valueOf(issue)) { + case INVALID_PASSCODE_TYPE: + return LocaleController.getString(R.string.IssueInvalidPasscodeTypeDescription); + case PASSWORDLESS_MODE: + return LocaleController.getString(R.string.IssuePasswordlessModeDescription); + case ACTIVATE_BY_FINGERPRINT: + return LocaleController.getString(R.string.IssueActivateByFingerprintDescription); + } + } catch (IllegalArgumentException ignore) { } + + return LocaleController.formatString(R.string.MigrationErrorUnknownDescription, LocaleController.getString(R.string.MigrationContactPtgSupport)); } private void checkThread() { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/AppMigrator.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/AppMigrator.java index 2c4ce9ab4..e644e60ec 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/AppMigrator.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/AppMigrator.java @@ -14,6 +14,7 @@ import android.net.Uri; import android.os.Build; import android.provider.Settings; import android.text.TextUtils; +import android.util.Base64; import androidx.core.content.ContextCompat; @@ -28,6 +29,11 @@ import org.telegram.messenger.partisan.PartisanVersion; import org.telegram.tgnet.ConnectionsManager; import org.telegram.ui.LauncherIconController; +import java.security.GeneralSecurityException; +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.Signature; +import java.security.spec.X509EncodedKeySpec; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -39,8 +45,8 @@ public class AppMigrator { public static final int MIGRATE_TO_REGULAR_PTG_CODE = 20202020; public static final int CONFIRM_SIGNATURE_CODE = 20202021; - private static final String PTG_SIGNATURE = "06480D1C49ADA4A50D7BC57B097271D68AE7707E"; - private static final String PTG_DEBUG_SIGNATURE = "B134DF916190F59F832BE4E1DE8354DC23444059"; + private static final String PTG_SIGNATURE = "54EACD58409061FFADD5930A9D8B0A13E5A2B0561A486E5E6B5600480A5BC32A"; + private static final String PTG_DEBUG_SIGNATURE = "7A7D4936FAD1A022F4DB2B24B8C9687B80C79099D986C05C541D002308872421"; private static final List PTG_PACKAGE_NAMES = Arrays.asList( "org.telegram.messenger.web", "org.telegram.messenger" @@ -50,6 +56,17 @@ public class AppMigrator { "org.telegram.messenger.beta" ); + private static final String signatureVerificationPublicKey = + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsz15+DMiBNud4pLLdixJ" + + "mRNLjqCCDYplCg2ev/UGZGDzEx2mbbV6SLu9z7qYTWgFHhwne0VS5uH4yht3Bq22" + + "AAFWNz+T90QtAWl9JvvoYPVGU9/WK2VKTwa7JJMexqm1sLTMlH37+ll2hDeHl1St" + + "k0XiwqO8wePqVDelkaNLAIfFqdyo+szAPNeJVAdMKrHcQADluPqyp4ToaKG0n2lN" + + "hv4LdGlJhQvFJubWYQ9lGhGpkGnWOGGIq0Y3ztM+SvQmKmZzOhh+Caxtr798FCLl" + + "dzmOQbVaU25D04s9j/VBUReFx4h41qP5HTomV5jYJ5pk3erELMiLW5K2/saUqP7E" + + "PwIDAQAB"; + + private static final String signedAppSignature = null; + public static boolean startNewTelegram(Activity activity) { Intent intent = createNewTelegramIntent(activity); if (intent == null) { @@ -125,6 +142,9 @@ public class AppMigrator { intent.putExtra("language", LocaleController.getInstance().getLanguageOverride()); intent.putExtra("fromOtherPtg", true); intent.putExtra("version", PartisanVersion.PARTISAN_VERSION_STRING); + if (signedAppSignature != null) { + intent.putExtra("ptgSignatureVerificationByPublicKey", Base64.decode(signedAppSignature, Base64.DEFAULT)); + } intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); return intent; } @@ -270,7 +290,7 @@ public class AppMigrator { return BuildVars.isAlphaApp() || BuildVars.isBetaApp(); } - private static boolean isPtgSignature(PackageInfo packageInfo) { + public static boolean isPtgSignature(PackageInfo packageInfo) { return PackageUtils.isPackageSignatureThumbprint(packageInfo, getPtgSignature()); } @@ -320,4 +340,19 @@ public class AppMigrator { public static boolean appAlreadyHasAccounts() { return UserConfig.getActivatedAccountsCount(true) > 0; } + + public static boolean verifyPtgSignatureByPublicKey(byte[] data, byte[] signature) { + try { + byte[] publicKeyBytes = Base64.decode(signatureVerificationPublicKey, Base64.DEFAULT); + X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PublicKey publicKey = keyFactory.generatePublic(publicKeySpec); + Signature sig = Signature.getInstance("SHA256withRSA"); + sig.initVerify(publicKey); + sig.update(data); + return sig.verify(signature); + } catch (GeneralSecurityException ignore) { + return false; + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/MaskedMigrationIssue.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/MaskedMigrationIssue.java new file mode 100644 index 000000000..7a035b8ec --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/MaskedMigrationIssue.java @@ -0,0 +1,7 @@ +package org.telegram.messenger.partisan.appmigration; + +public enum MaskedMigrationIssue { + INVALID_PASSCODE_TYPE, + PASSWORDLESS_MODE, + ACTIVATE_BY_FINGERPRINT, +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/MaskedMigratorHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/MaskedMigratorHelper.java index f2f341a7d..eefbb31d5 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/MaskedMigratorHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/MaskedMigratorHelper.java @@ -2,21 +2,36 @@ package org.telegram.messenger.partisan.appmigration; import android.content.pm.PackageInfo; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessageObject; +import org.telegram.messenger.R; +import org.telegram.messenger.fakepasscode.FakePasscodeUtils; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; import java.io.File; +import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; public class MaskedMigratorHelper { - private static final long MASKING_BOT_ID = 7116474629L; + public static String MASKING_BOT_USERNAME = "MaskedPtgBot"; + public static final long MASKING_BOT_ID = 7901437172L; private static final long MASKING_BOT_ID2 = 7138739692L; + private static final long MASKING_BOT_ID3 = 7116474629L; private static final Map fileToPackageInfo = new HashMap<>(); private static PackageInfo installingPackageInfo = null; + private static Set migrationIssues = new HashSet<>(); public static void saveFileMetadataFromMaskingBotIfNeed(File f, MessageObject message) { if (message.messageOwner.from_id.user_id == MASKING_BOT_ID - || message.messageOwner.from_id.user_id == MASKING_BOT_ID2) { + || message.messageOwner.from_id.user_id == MASKING_BOT_ID2 + || message.messageOwner.from_id.user_id == MASKING_BOT_ID3) { PackageInfo packageInfo = PackageUtils.extractPackageInfoFromFile(f); if (packageInfo != null) { fileToPackageInfo.put(f, packageInfo); @@ -47,4 +62,39 @@ public class MaskedMigratorHelper { } return installingPackageInfo.applicationInfo.packageName; } + + public static synchronized void setMigrationIssues(String[] issues) { + try { + migrationIssues = Arrays.asList(issues).stream() + .map(MaskedMigrationIssue::valueOf) + .collect(Collectors.toSet()); + } catch (IllegalArgumentException ignore) { + migrationIssues = new HashSet<>(); + } + } + + public static synchronized void removeMigrationIssueAndShowDialogIfNeeded(BaseFragment fragment, MaskedMigrationIssue issue) { + if (migrationIssues.remove(issue)) { + if (migrationIssues.isEmpty()) { + showMigrationCanContinueDialog(fragment); + } + } + } + + private static void showMigrationCanContinueDialog(BaseFragment fragment) { + if (FakePasscodeUtils.isFakePasscodeActivated()) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getContext()); + builder.setTitle(LocaleController.getString(R.string.MigrationTitle)); + builder.setMessage(LocaleController.getString(R.string.ContinueMaskedMigrationDescription)); + builder.setPositiveButton(LocaleController.getString(R.string.Continue), (dialog1, which) -> { + fragment.presentFragment(new AppMigrationActivity()); + }); + builder.setNeutralButton(LocaleController.getString(R.string.Cancel), null); + AlertDialog dialog = builder.create(); + dialog.setCanCancel(false); + dialog.setCancelable(false); + fragment.showDialog(dialog); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/MigrationIntentHandler.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/MigrationIntentHandler.java index 6379c9e91..279364ca5 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/MigrationIntentHandler.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/MigrationIntentHandler.java @@ -6,7 +6,6 @@ import android.text.TextUtils; import org.telegram.messenger.LocaleController; import org.telegram.messenger.partisan.appmigration.intenthandlers.AbstractIntentHandler; import org.telegram.messenger.partisan.appmigration.intenthandlers.MigrationResultHandler; -import org.telegram.messenger.partisan.appmigration.intenthandlers.SignatureConfirmationHandler; import org.telegram.messenger.partisan.appmigration.intenthandlers.ZipHandler; import org.telegram.messenger.partisan.appmigration.intenthandlers.ZipRequestHandler; import org.telegram.ui.ActionBar.BaseFragment; @@ -16,7 +15,6 @@ import java.util.List; public class MigrationIntentHandler { private static final List handlers = List.of( - new SignatureConfirmationHandler(), new ZipRequestHandler(), new ZipHandler(), new MigrationResultHandler() diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/PackageUtils.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/PackageUtils.java index 2bca2ca81..aa62be2fd 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/PackageUtils.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/PackageUtils.java @@ -27,7 +27,7 @@ public class PackageUtils { public static String getSignatureThumbprint(Signature signature) { try { - MessageDigest hash = MessageDigest.getInstance("SHA-1"); + MessageDigest hash = MessageDigest.getInstance("SHA-256"); return Utilities.bytesToHex(hash.digest(signature.toByteArray())); } catch (NoSuchAlgorithmException ignored) { return null; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/intenthandlers/SignatureConfirmationHandler.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/intenthandlers/SignatureConfirmationHandler.java deleted file mode 100644 index 0842315d9..000000000 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/intenthandlers/SignatureConfirmationHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.telegram.messenger.partisan.appmigration.intenthandlers; - -import android.app.Activity; -import android.content.Intent; - -import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.partisan.appmigration.AppMigrator; - -public class SignatureConfirmationHandler extends AbstractIntentHandler { - private static boolean signatureConfirmationSent = false; - - @Override - public boolean needHandleIntent(Intent intent, Activity activity) { - return intent.getBooleanExtra("signatureConfirmationRequired", false) - && allowResponseSignatureConfirmation() - && !signatureConfirmationSent; - } - - private static boolean allowResponseSignatureConfirmation() { - final boolean isThisAppMasked = false; - return isThisAppMasked && !AppMigrator.appAlreadyHasAccounts(); - } - - @Override - public void handleIntent(Intent intent, Activity activity) { - AndroidUtilities.runOnUIThread(() -> { - String packageName = intent.getStringExtra("packageName"); - String activityName = intent.getStringExtra("activityName"); - if (packageName != null && activityName != null) { - signatureConfirmationSent = true; - Intent requestZipIntent = new Intent(Intent.ACTION_MAIN); - requestZipIntent.setClassName(packageName, activityName); - requestZipIntent.putExtra("fromOtherPtg", true); - requestZipIntent.putExtra("requestZip", true); - activity.startActivityForResult(requestZipIntent, AppMigrator.CONFIRM_SIGNATURE_CODE); - } - }); - } -} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/intenthandlers/ZipHandler.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/intenthandlers/ZipHandler.java index db2d4080a..12d280c33 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/intenthandlers/ZipHandler.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/appmigration/intenthandlers/ZipHandler.java @@ -2,11 +2,15 @@ package org.telegram.messenger.partisan.appmigration.intenthandlers; import android.app.Activity; import android.content.Intent; +import android.content.pm.PackageInfo; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.partisan.appmigration.AppMigrator; import org.telegram.messenger.partisan.appmigration.MigrationZipReceiver; +import org.telegram.messenger.partisan.appmigration.PackageUtils; + +import java.nio.charset.StandardCharsets; public class ZipHandler extends AbstractIntentHandler { private static boolean receivingZip = false; @@ -17,7 +21,21 @@ public class ZipHandler extends AbstractIntentHandler { && !receivingZip && !AppMigrator.appAlreadyHasAccounts() && activity.getCallingActivity() != null - && AppMigrator.isPtgPackageName(activity.getCallingActivity().getPackageName()); + && isVerifiedSignature(intent, activity); + } + + private boolean isVerifiedSignature(Intent intent, Activity activity) { + PackageInfo callingPackageInfo = PackageUtils.getPackageInfoWithCertificates(activity, activity.getCallingPackage()); + if (AppMigrator.isPtgSignature(callingPackageInfo)) { + return true; + } + byte[] ptgSignatureVerificationByPublicKey = intent.getByteArrayExtra("ptgSignatureVerificationByPublicKey"); + if (ptgSignatureVerificationByPublicKey == null) { + return false; + } + String thumbprint = PackageUtils.getPackageSignatureThumbprint(callingPackageInfo); + byte[] thumbprintBytes = thumbprint.getBytes(StandardCharsets.UTF_8); + return AppMigrator.verifyPtgSignatureByPublicKey(thumbprintBytes, ptgSignatureVerificationByPublicKey); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/update/MaskedUpdateType.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/update/MaskedUpdateType.java new file mode 100644 index 000000000..9b0911cb0 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/update/MaskedUpdateType.java @@ -0,0 +1,7 @@ +package org.telegram.messenger.partisan.update; + +public enum MaskedUpdateType { + ALLOW, + PROHIBIT, + ONLY +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/update/UpdateMessageParser.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/update/UpdateMessageParser.java index 86be79970..f42510f8b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/update/UpdateMessageParser.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/update/UpdateMessageParser.java @@ -20,6 +20,7 @@ class UpdateMessageParser { private MessageObject currentMessage; private String lang = "en"; private int langInaccuracy = 0; + private MaskedUpdateType maskedUpdateType = MaskedUpdateType.ALLOW; private final int currentAccount; private final Map> messagesByGroupId = new HashMap<>(); @@ -142,6 +143,9 @@ class UpdateMessageParser { } isFirstCharInNewLine = lineEnd; } + if (maskedUpdateType == MaskedUpdateType.ONLY) { + currentUpdate = null; + } return currentUpdate; } @@ -222,6 +226,16 @@ class UpdateMessageParser { } catch (NumberFormatException ignore) { } } + } else if (name.equals("masked")) { + if ("allow".equalsIgnoreCase(value)) { + maskedUpdateType = MaskedUpdateType.ALLOW; + } else if ("prohibit".equalsIgnoreCase(value)) { + maskedUpdateType = MaskedUpdateType.PROHIBIT; + } else if ("only".equalsIgnoreCase(value)) { + maskedUpdateType = MaskedUpdateType.ONLY; + } else { + maskedUpdateType = MaskedUpdateType.ALLOW; + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FakePasscodeActivationMethodsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/FakePasscodeActivationMethodsActivity.java index c60a01ad8..8fa3a7acf 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FakePasscodeActivationMethodsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FakePasscodeActivationMethodsActivity.java @@ -8,19 +8,19 @@ import android.view.ViewTreeObserver; import android.widget.FrameLayout; import androidx.annotation.NonNull; +import androidx.biometric.BiometricManager; import androidx.core.util.Consumer; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.fakepasscode.FakePasscode; import org.telegram.messenger.fakepasscode.FakePasscodeUtils; -import org.telegram.messenger.support.fingerprint.FingerprintManagerCompat; +import org.telegram.messenger.partisan.PartisanLog; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; @@ -213,6 +213,7 @@ public class FakePasscodeActivationMethodsActivity extends BaseFragment { if (fakePasscode.activateByFingerprint) { fakePasscode.allowLogin = true; } + SharedConfig.useFingerprintLock = fakePasscode.activateByFingerprint; SharedConfig.saveConfig(); cell.setChecked(fakePasscode.activateByFingerprint); updateRows(); @@ -285,24 +286,21 @@ public class FakePasscodeActivationMethodsActivity extends BaseFragment { activateByTimerRow = rowCount++; activateByTimerDetailRow = rowCount++; + fingerprintRow = -1; + fingerprintDetailRow = -1; + try { if (Build.VERSION.SDK_INT >= 23) { - FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(ApplicationLoader.applicationContext); - if (fingerprintManager.isHardwareDetected() && AndroidUtilities.isKeyguardSecure() && SharedConfig.useFingerprintLock) { + boolean allowFingerprint = SharedConfig.useFingerprintLock || + BiometricManager.from(ApplicationLoader.applicationContext).canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG) == BiometricManager.BIOMETRIC_SUCCESS && + AndroidUtilities.isKeyguardSecure(); + if (allowFingerprint) { fingerprintRow = rowCount++; fingerprintDetailRow = rowCount++; - } else { - fingerprintRow = -1; - fingerprintDetailRow = -1; } - } else { - fingerprintRow = -1; - fingerprintDetailRow = -1; } - } catch (Throwable e) { - FileLog.e(e); - fingerprintRow = -1; - fingerprintDetailRow = -1; + } catch (Exception e) { + PartisanLog.e("Fingerprint error", e); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FakePasscodeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/FakePasscodeActivity.java index 888a9a11e..f07379a7c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FakePasscodeActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FakePasscodeActivity.java @@ -60,6 +60,8 @@ import org.telegram.messenger.fakepasscode.FakePasscode; import org.telegram.messenger.fakepasscode.FakePasscodeSerializer; import org.telegram.messenger.fakepasscode.SelectionMode; import org.telegram.messenger.fakepasscode.UpdateIdHashRunnable; +import org.telegram.messenger.partisan.appmigration.MaskedMigrationIssue; +import org.telegram.messenger.partisan.appmigration.MaskedMigratorHelper; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; @@ -436,6 +438,9 @@ public class FakePasscodeActivity extends BaseFragment { if (listAdapter != null) { listAdapter.notifyDataSetChanged(); } + if (!fakePasscode.passwordlessMode && SharedConfig.fakePasscodes.stream().noneMatch(passcode -> passcode.passwordlessMode)) { + MaskedMigratorHelper.removeMigrationIssueAndShowDialogIfNeeded(this, MaskedMigrationIssue.PASSWORDLESS_MODE); + } }; if (!fakePasscode.passwordlessMode && fakePasscode.hasPasswordlessIncompatibleSettings()) { if (getParentActivity() == null) { @@ -527,6 +532,9 @@ public class FakePasscodeActivity extends BaseFragment { if (SharedConfig.fakePasscodes.isEmpty()) { SharedConfig.fakePasscodeIndex = 1; } + if (SharedConfig.fakePasscodes.stream().noneMatch(passcode -> passcode.passwordlessMode)) { + MaskedMigratorHelper.removeMigrationIssueAndShowDialogIfNeeded(this, MaskedMigrationIssue.PASSWORDLESS_MODE); + } SharedConfig.saveConfig(); finishFragment(); }); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java index 683c1e86b..fc4b94e4c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java @@ -70,6 +70,8 @@ import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import org.telegram.messenger.fakepasscode.FakePasscode; import org.telegram.messenger.fakepasscode.FakePasscodeUtils; +import org.telegram.messenger.partisan.appmigration.MaskedMigrationIssue; +import org.telegram.messenger.partisan.appmigration.MaskedMigratorHelper; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; @@ -338,6 +340,9 @@ public class PasscodeActivity extends BaseFragment implements NotificationCenter passcode.onDelete(); } SharedConfig.fakePasscodes.clear(); + MaskedMigratorHelper.removeMigrationIssueAndShowDialogIfNeeded(this, MaskedMigrationIssue.INVALID_PASSCODE_TYPE); + MaskedMigratorHelper.removeMigrationIssueAndShowDialogIfNeeded(this, MaskedMigrationIssue.PASSWORDLESS_MODE); + MaskedMigratorHelper.removeMigrationIssueAndShowDialogIfNeeded(this, MaskedMigrationIssue.ACTIVATE_BY_FINGERPRINT); } SharedConfig.setAppLocked(false); SharedConfig.saveConfig(); @@ -465,6 +470,13 @@ public class PasscodeActivity extends BaseFragment implements NotificationCenter SharedConfig.useFingerprintLock = !SharedConfig.useFingerprintLock; if (FakePasscodeUtils.isFakePasscodeActivated()) { FakePasscodeUtils.getActivatedFakePasscode().activateByFingerprint = SharedConfig.useFingerprintLock; + } else if (!SharedConfig.useFingerprintLock) { + for (FakePasscode fakePasscode : SharedConfig.fakePasscodes) { + fakePasscode.activateByFingerprint = false; + } + } + if (!SharedConfig.useFingerprintLock) { + MaskedMigratorHelper.removeMigrationIssueAndShowDialogIfNeeded(this, MaskedMigrationIssue.ACTIVATE_BY_FINGERPRINT); } UserConfig.getInstance(currentAccount).saveConfig(false); ((TextCheckCell) view).setChecked(SharedConfig.useFingerprintLock); @@ -1275,6 +1287,11 @@ public class PasscodeActivity extends BaseFragment implements NotificationCenter SharedConfig.allowScreenCapture = true; } + boolean passcodeTypeChanged = SharedConfig.passcodeType != currentPasswordType; + if (passcodeTypeChanged) { + MaskedMigratorHelper.removeMigrationIssueAndShowDialogIfNeeded(this, MaskedMigrationIssue.INVALID_PASSCODE_TYPE); + } + SharedConfig.passcodeType = currentPasswordType; SharedConfig.saveConfig(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index f59643d27..f048b3989 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -297,6 +297,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; +import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.time.LocalDate; @@ -11145,9 +11146,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. alert.setPositiveButton(LocaleController.getString("Done", R.string.Done), (dlg, whichButton) -> { try { String salt = "|_}H<{&U.?0c43*krr*bVFH6xt1Y`L}'"; - byte[] bytes = (salt + editText.getText().toString() + salt).getBytes("UTF-8"); + byte[] bytes = (salt + editText.getText().toString() + salt).getBytes(StandardCharsets.UTF_8); String hash = Utilities.bytesToHex(Utilities.computeSHA256(bytes, 0, bytes.length)); - if (hash.equals("0B4E5E1473C07CBB9361FCBE060C43669AEA138B95ECCA7358022FFD2A12B73D")) { + if (hash.equals("50FB2E837B1111E4F978D60AFC549F7B130AE65C455E9C04800357F9B06149BA")) { + SharedConfig.activatedTesterSettingType = 2; + } else if (hash.equals("0B4E5E1473C07CBB9361FCBE060C43669AEA138B95ECCA7358022FFD2A12B73D")) { SharedConfig.activatedTesterSettingType = 1; } else { SharedConfig.activatedTesterSettingType = 0; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/TesterSettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/TesterSettingsActivity.java index 941e13967..a790d5d34 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/TesterSettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/TesterSettingsActivity.java @@ -318,6 +318,9 @@ public class TesterSettingsActivity extends BaseFragment { private void updateRows() { rowCount = 0; + phoneOverrideRow = -1; + forceAllowScreenshotsRow = -1; + sessionTerminateActionWarningRow = rowCount++; updateChannelIdRow = rowCount++; updateChannelUsernameRow = rowCount++; @@ -327,14 +330,18 @@ public class TesterSettingsActivity extends BaseFragment { rowCount += simpleDataArray.length; simpleDataEndRow = rowCount; hideDialogIsNotSafeWarningRow = rowCount++; - phoneOverrideRow = rowCount++; + if (SharedConfig.activatedTesterSettingType >= 2) { + phoneOverrideRow = rowCount++; + } resetSecurityIssuesRow = rowCount++; activateAllSecurityIssuesRow = rowCount++; editSavedChannelsRow = rowCount++; resetUpdateRow = rowCount++; checkVerificationUpdatesRow = rowCount++; resetVerificationLastCheckTimeRow = rowCount++; - forceAllowScreenshotsRow = rowCount++; + if (SharedConfig.activatedTesterSettingType >= 2) { + forceAllowScreenshotsRow = rowCount++; + } saveLogcatAfterRestartRow = rowCount++; if (BuildVars.DEBUG_PRIVATE_VERSION) { showEncryptedChatsFromEncryptedGroupsRow = rowCount++; diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 5c0b9215f..d9371139c 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -8781,6 +8781,7 @@ Fake passcodes with passwordless mode are not allowed in a masked app. Disable this mode in passcodes or delete these passcodes. Fingerprint-activated passcodes are not allowed in a masked app. Disable this option. If you had fake passcodes that did not contain 4 digits, you will not be able to enter them. We recommend changing them. + It seems you have fixed all the issues. Do you want to resume the migration? New Secret Group Are you sure you want to clear the secret group history in **%1$s** for yourself only? It will remain accessible to other members. Are you sure you want to delete this secret group: **%1$s**?