diff --git a/app/src/main/java/com/cringe_studios/cringe_authenticator/MainActivity.java b/app/src/main/java/com/cringe_studios/cringe_authenticator/MainActivity.java index 396e621..19a2ef5 100644 --- a/app/src/main/java/com/cringe_studios/cringe_authenticator/MainActivity.java +++ b/app/src/main/java/com/cringe_studios/cringe_authenticator/MainActivity.java @@ -50,19 +50,6 @@ public class MainActivity extends BaseActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - /*try { - byte[] salt = Crypto.generateSalt(); - SecretKey key = Crypto.generateKey("HELLO", salt); - Log.i("UWUSECRET", key.toString()); - KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); - ks.load(null); - ks.setEntry("", new KeyStore.SecretKeyEntry(key), null); - } catch (CryptoException | KeyStoreException | CertificateException | IOException | - NoSuchAlgorithmException e) { - throw new RuntimeException(e); - }*/ - - //getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); TODO: enable secure flag ThemeUtil.loadTheme(this); diff --git a/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/GroupFragment.java b/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/GroupFragment.java index 704f7f2..2de634e 100644 --- a/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/GroupFragment.java +++ b/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/GroupFragment.java @@ -145,12 +145,12 @@ public class GroupFragment extends NamedFragment { }, null); } - public void addOTP(OTPData data) { + public void addOTP(OTPData... data) { OTPDatabase.promptLoadDatabase(requireActivity(), () -> { try { - OTPDatabase.getLoadedDatabase().addOTP(groupID, data); + for(OTPData d : data) OTPDatabase.getLoadedDatabase().addOTP(groupID, d); OTPDatabase.saveDatabase(requireContext(), SettingsUtil.getCryptoParameters(requireContext())); - otpListAdapter.add(data); + for(OTPData d : data) otpListAdapter.add(d); } catch (OTPDatabaseException | CryptoException e) { DialogUtil.showErrorDialog(requireContext(), "Failed to save database: " + e); } diff --git a/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/SettingsFragment.java b/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/SettingsFragment.java index 444092c..1760161 100644 --- a/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/SettingsFragment.java +++ b/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/SettingsFragment.java @@ -117,13 +117,11 @@ public class SettingsFragment extends NamedFragment { binding.settingsBiometricLock.setOnCheckedChangeListener((view, checked) -> { if(checked) { OTPDatabase.promptLoadDatabase(requireActivity(), () -> { - Log.i("PROMPT", "§BERIIO"); BiometricUtil.promptBiometricAuth(requireActivity(), () -> { try { BiometricKey biometricKey = Crypto.createBiometricKey(SettingsUtil.getCryptoParameters(requireContext())); SettingsUtil.enableBiometricEncryption(requireContext(), biometricKey); } catch (CryptoException e) { - e.printStackTrace(); DialogUtil.showErrorDialog(requireContext(), "Failed to enable: " + e); } }, () -> view.setChecked(false)); diff --git a/app/src/main/java/com/cringe_studios/cringe_authenticator/scanner/QRScannerActivity.java b/app/src/main/java/com/cringe_studios/cringe_authenticator/scanner/QRScannerActivity.java index 81c38e6..268bbd9 100644 --- a/app/src/main/java/com/cringe_studios/cringe_authenticator/scanner/QRScannerActivity.java +++ b/app/src/main/java/com/cringe_studios/cringe_authenticator/scanner/QRScannerActivity.java @@ -8,6 +8,7 @@ import android.media.Image; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.util.Log; import android.view.MotionEvent; import android.view.WindowManager; import android.widget.Toast; @@ -200,6 +201,7 @@ public class QRScannerActivity extends AppCompatActivity { if(part.getBatchIndex() == part.getBatchSize() - 1) { success(currentCodes.toArray(new OTPData[0])); }else { + lastPart = part; process = true; } } diff --git a/app/src/main/java/com/cringe_studios/cringe_authenticator/unlock/UnlockActivity.java b/app/src/main/java/com/cringe_studios/cringe_authenticator/unlock/UnlockActivity.java index 5e8712b..310f2dd 100644 --- a/app/src/main/java/com/cringe_studios/cringe_authenticator/unlock/UnlockActivity.java +++ b/app/src/main/java/com/cringe_studios/cringe_authenticator/unlock/UnlockActivity.java @@ -61,8 +61,7 @@ public class UnlockActivity extends AppCompatActivity { setContentView(binding.getRoot()); if(SettingsUtil.isBiometricEncryption(this) && BiometricUtil.isSupported(this)) { - binding.unlockBiometrics.setOnClickListener(view -> BiometricUtil.promptBiometricAuth(this, this::success, () -> {})); - BiometricUtil.promptBiometricAuth(this, () -> { + Runnable onSuccess = () -> { BiometricKey biometricKey = SettingsUtil.getBiometricKey(this); try { SecretKey biometricSecretKey = Crypto.getBiometricKey(biometricKey); @@ -73,7 +72,10 @@ public class UnlockActivity extends AppCompatActivity { } catch (CryptoException | OTPDatabaseException e) { DialogUtil.showErrorDialog(this, "Failed to load database: " + e); } - }, () -> {}); + }; + + binding.unlockBiometrics.setOnClickListener(view -> BiometricUtil.promptBiometricAuth(this, onSuccess, () -> {})); + BiometricUtil.promptBiometricAuth(this, onSuccess, () -> {}); } binding.unlockButton.setOnClickListener(view -> { diff --git a/app/src/main/java/com/cringe_studios/cringe_authenticator/util/OTPParser.java b/app/src/main/java/com/cringe_studios/cringe_authenticator/util/OTPParser.java index 5bd562e..7263165 100644 --- a/app/src/main/java/com/cringe_studios/cringe_authenticator/util/OTPParser.java +++ b/app/src/main/java/com/cringe_studios/cringe_authenticator/util/OTPParser.java @@ -41,6 +41,14 @@ public class OTPParser { String name = params.getName(); String issuer = params.getIssuer(); + if(name.contains(":")) { // Name possibly contains issuer prefix + String[] spl = name.split(":"); + if(spl.length == 2) { // Otherwise it's not a valid prefix, or too many ':'s, just use everything as the account name + if(issuer == null || issuer.isEmpty()) issuer = spl[0]; + name = spl[1]; + } + } + OTPType type; switch(params.getType()) { case OTP_TYPE_UNSPECIFIED: @@ -115,8 +123,28 @@ public class OTPParser { } String type = uri.getHost(); - String accountName = uri.getPath(); + String path = uri.getPath(); + if(path == null || path.length() < 2) { + throw new IllegalArgumentException("Missing required parameters"); + } + + path = path.substring(1); + String issuer = uri.getQueryParameter("issuer"); + + String accountName; + if(path.contains(":")) { // Possibly contains issuer prefix + String[] spl = path.split(":"); + if(spl.length != 2) { // Either not a valid prefix, or too many ':'s, just use everything as the account name + accountName = path; + }else { + if(issuer == null || issuer.isEmpty()) issuer = spl[0]; + accountName = spl[1]; + } + }else { + accountName = path; + } + String secret = uri.getQueryParameter("secret"); String algorithm = uri.getQueryParameter("algorithm"); String digits = uri.getQueryParameter("digits"); @@ -139,12 +167,10 @@ public class OTPParser { throw new IllegalArgumentException("Missing required parameters"); } - if(accountName == null || accountName.length() < 2 /* Because path is /accName, so 2 letters for acc with 1 letter name */) { + if(accountName.length() == 0 || (issuer != null && issuer.length() == 0)) { throw new IllegalArgumentException("Missing required parameters"); } - accountName = accountName.substring(1); - try { // 0 or null for defaults (handled by Cringe-Authenticator-Library) OTPAlgorithm fAlgorithm = algorithm == null ? null : OTPAlgorithm.valueOf(algorithm.toUpperCase());