From 5cd86415a9104b0de40ff59564357c63d1e9aa28 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:29:53 +0200 Subject: [PATCH 1/3] Propagate IOException from CryptoManager.configure --- .../activity/security/AuthActivityExtension.java | 15 +++++++++++---- .../core/security/crypto/CryptoManager.java | 9 ++++----- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/app/notesr/activity/security/AuthActivityExtension.java b/app/src/main/java/app/notesr/activity/security/AuthActivityExtension.java index 46d3bac2..5bcf0f6d 100644 --- a/app/src/main/java/app/notesr/activity/security/AuthActivityExtension.java +++ b/app/src/main/java/app/notesr/activity/security/AuthActivityExtension.java @@ -56,10 +56,17 @@ public void authorize() { return; } - if (cryptoManager.configure(activity.getApplicationContext(), password)) { - onAuthorizationSuccessful(); - } else { - onAuthorizationFailed(); + try { + boolean isAuthorized = cryptoManager.configure(activity.getApplicationContext(), + password); + + if (isAuthorized) { + onAuthorizationSuccessful(); + } else { + onAuthorizationFailed(); + } + } catch (IOException e) { + throw new RuntimeException(e); } } diff --git a/core/src/main/java/app/notesr/core/security/crypto/CryptoManager.java b/core/src/main/java/app/notesr/core/security/crypto/CryptoManager.java index 12d2ad48..4322a480 100644 --- a/core/src/main/java/app/notesr/core/security/crypto/CryptoManager.java +++ b/core/src/main/java/app/notesr/core/security/crypto/CryptoManager.java @@ -58,14 +58,12 @@ public final class CryptoManager { * @param context The application context. * @param password The password to use for decryption. * @return {@code true} if configuration was successful, {@code false} if decryption failed. - * @throws RuntimeException if an unexpected I/O error occurs. + * @throws IOException if an I/O error occurs. */ - public boolean configure(Context context, char[] password) { + public boolean configure(Context context, char[] password) throws IOException { try { this.secrets = tryGetSecretsWithFallback(context, password); return true; - } catch (IOException e) { - throw new RuntimeException(e); } catch (DecryptionFailedException e) { return false; } @@ -217,7 +215,7 @@ public void destroySecrets() { * @param context The application context. * @param password The password for decryption. * @return The retrieved {@link CryptoSecrets}. - * @throws IOException if an I/O error occurs. + * @throws IOException if an I/O error occurs. * @throws DecryptionFailedException if decryption fails with both cryptors. */ private CryptoSecrets tryGetSecretsWithFallback(Context context, char[] password) @@ -319,6 +317,7 @@ private void setKeyHash(String keyHash) { /** * Removes old key hash file that was in older versions of NoteSR. + * * @param context application context * @throws IOException if failed to delete file */ From ead2d21f2ac6ed7df5becbd67c41a0eba0ec201a Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:30:22 +0200 Subject: [PATCH 2/3] Propagate ReflectiveOperationException in AesCryptorFactory --- .../app/notesr/core/security/crypto/AesCryptorFactory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/app/notesr/core/security/crypto/AesCryptorFactory.java b/core/src/main/java/app/notesr/core/security/crypto/AesCryptorFactory.java index 07e76eb9..0f31fa42 100644 --- a/core/src/main/java/app/notesr/core/security/crypto/AesCryptorFactory.java +++ b/core/src/main/java/app/notesr/core/security/crypto/AesCryptorFactory.java @@ -11,7 +11,7 @@ public final class AesCryptorFactory implements CryptorFactory { @Override public AesCryptor create(char[] password, Class cryptorClass) - throws NoSuchAlgorithmException { + throws NoSuchAlgorithmException, ReflectiveOperationException { byte[] salt = AesCryptor.generatePasswordBasedSalt(password); try { @@ -21,7 +21,7 @@ public AesCryptor create(char[] password, Class cryptorCla | InstantiationException | InvocationTargetException | NoSuchMethodException e) { - throw new RuntimeException(e); + throw new ReflectiveOperationException(e); } } } From a01cc5c41b97bd5baf73cbb0dd304ca19fa57695 Mon Sep 17 00:00:00 2001 From: zHd4 <38856321+zHd4@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:32:24 +0200 Subject: [PATCH 3/3] Remove unused IOException from tryGetSecretsWithFallback signature --- .../java/app/notesr/core/security/crypto/CryptoManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/app/notesr/core/security/crypto/CryptoManager.java b/core/src/main/java/app/notesr/core/security/crypto/CryptoManager.java index 4322a480..4dd527fb 100644 --- a/core/src/main/java/app/notesr/core/security/crypto/CryptoManager.java +++ b/core/src/main/java/app/notesr/core/security/crypto/CryptoManager.java @@ -215,11 +215,10 @@ public void destroySecrets() { * @param context The application context. * @param password The password for decryption. * @return The retrieved {@link CryptoSecrets}. - * @throws IOException if an I/O error occurs. * @throws DecryptionFailedException if decryption fails with both cryptors. */ private CryptoSecrets tryGetSecretsWithFallback(Context context, char[] password) - throws IOException, DecryptionFailedException { + throws DecryptionFailedException { try { return getSecrets(context, password, AesGcmCryptor.class); } catch (DecryptionFailedException e) {