| Age | Commit message (Collapse) | Author | Files | Lines |
|
Recent Conscrypt (Android 14 mainline updates) registers a KeyFactory
for Ed25519. With sshj leaving provider selection to the JCA, its
Ed25519KeyFactory now gets Conscrypt's key class, whose algorithm name
sshj does not map to ssh-ed25519: KeyType.fromKey returns UNKNOWN and
every Ed25519 host key fails with "Don't know how to encode key", so
clone and sync over SSH break. 0.1.4 is affected since the sshj 0.41.2
update.
Register a provider at position 1 that serves only KeyFactory.Ed25519
from Bouncy Castle (kept by the existing R8 rule). Everything else,
including signatures with Android Keystore keys, still goes through
normal JCA provider selection.
Verified on an Android 14 tablet: clone over SSH failed before and
works with the fix.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit ad3c63f665e6264ed1db42d6ae2dfc0947e33393)
|
|
- Run the save's write, original delete, autofill and history updates
under NonCancellable so a recreated activity cannot leave a half
done rename.
- fsync the temporary file before the atomic move.
- Move dialog: refuse targets outside the store (symlinks) and moving
a folder into itself or a descendant, with a toast.
- Folder picker: do not navigate into a new folder whose mkdirs failed;
show a toast (new string, en and it).
- Normalize entryFile so "./" and "a/../b" give the same keys as the
list; covered in EditorModelTest.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Pure functions for the Compose editor: the form and the pass file it
writes, validation, the target file, the overwrite check, an atomic
write, OTP URI building and the random generator's options. The folder
picker lists subfolders with the list's hidden filter.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Totp now carries its period, so the entry view can draw how much of the
code's lifetime is left. EntryFields groups a decrypted entry the way the
spec lays it out.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
- renameFolder stops when the move fails instead of recording and committing
- delete runs its file work on the IO dispatcher
- folder delete no longer follows directory symlinks (new test)
- overwrite dialog is dismissed when its coroutine is cancelled
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
sshj 0.40 replaced the unmaintained net.i2p.crypto:eddsa 0.3.0 (last
release 2019) with Bouncy Castle's Ed25519. 0.41.2 still targets Java 8.
The app used eddsa directly for wrapped Ed25519 SSH keys. Generate the
32-byte seed with SecureRandom and build the key pair with sshj's
Ed25519KeyFactory and Bouncy Castle's public key derivation. The wrapped
format is still the raw RFC 8032 seed, so keys generated by 0.1.3 keep
working; Ed25519KeyPairTest pins this with the RFC 8032 test vector.
sshj 0.40 also changed setSecurityProvider(null) to reset the
registerBouncyCastle flag, which undid the earlier
setRegisterBouncyCastle(false): sshj then forced every operation through
Bouncy Castle, which cannot sign with Android Keystore keys ("no encoding
for EC private key"), and hardware-backed SSH keys failed to
authenticate. Call the two in the opposite order; SshjConfigTest checks
that sshj leaves provider selection to the JCA.
Verified with the R8 release build on the emulator against the e2e
server: a hardware ECDSA key, a newly generated wrapped Ed25519 key and
an imported OpenSSH Ed25519 key all authenticated and synced.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
security-crypto is deprecated in 1.1.0 and the app was stuck on
1.1.0-alpha06, since the stable release fails the warnings-as-errors
build. It also pulled in Tink for what is a single AES-GCM operation.
KeystorePreferences is a SharedPreferences whose values are AES-GCM
sealed under an Android Keystore key (random IV, entry name as AAD so
values cannot be swapped between entries); a value that fails to
decrypt reads as absent. It backs the Git credentials (git_secrets),
the proxy credentials (proxy_secrets) and the PGP passphrase cache,
whose key needs the screen lock or a strong biometric within 60s and is
recreated if a new biometric enrollment invalidates it. Wrapped Ed25519
SSH keys are sealed the same way into the private key file. Password
generator settings are not secret and move to plain preferences.
Nothing is migrated: removeSecurityCryptoData deletes the old encrypted
preference files, Tink keysets, their Keystore master keys and a
security-crypto wrapped Ed25519 key once on upgrade. Only 0.1.x installs
from the last few hours have such data. Hardware SSH keys and imported
keys are untouched.
Tests: KeystorePreferencesTest (round trip, defaults, no plaintext,
random IVs, AAD binding, tamper rejection, remove/clear) with a software
AES key. Verified on the emulator by upgrading a 0.1.2 debug build that
held a wrapped Ed25519 key, Tink keysets and a cached passphrase: the old
data was deleted, a new Ed25519 key authenticated over SSH after a
fingerprint unlock, and a passphrase cached on first decrypt was reused
on the second with only the fingerprint.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
CryptoRepository.encrypt looked up every .gpg-id recipient and dropped
the ones it could not find, so an entry saved on a device that lacked
one recipient's key was encrypted to the others only. With a store
shared between a phone key and a smartcard key, entries created on the
phone could no longer be decrypted with the smartcard alone.
Fail with the lookup error instead (KeyNotFoundException names the
key), so the user imports the missing public key and saves again.
PasswordCreationActivity also ignored the Result of encrypt and wrote
the output buffer regardless: on any encryption failure it wrote an
empty .gpg file, overwriting the entry when editing, and committed it.
Show the error and leave the file untouched.
CryptoRepositoryTest covers both the missing-recipient failure and the
all-present success path, with keys generated by PGPainless (added as
an app test dependency).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
JGit 4.5.7 dates from 2019. 5.13 is the last line that needs only Java 8
APIs, so it works with Android's desugaring; it also fixes
GHSA-3p86-9955-h393 (arbitrary file overwrite on checkout).
GHSA-vrpq-qp53-qv56 (XXE in repo manifest parsing) has no 5.x fix but
the app never parses repo manifests.
API changes:
- SshSessionFactory now requires getType().
- CheckoutCommand.setForce is deprecated; setForceRefUpdate is its
documented replacement with the same meaning.
JGit 5 references java.lang.management and javax.management, which
Android lacks; R8 flagged them. Both paths are made unreachable rather
than only silenced:
- WindowCache registers JMX statistics by default; Application.onCreate
now installs a WindowCacheConfig with exposeStatsViaJmx = false.
- GC.gc() takes a PID lock that queries ManagementFactory and would
throw NoClassDefFoundError on a device. GcOperation now runs the GC
steps (packRefs, repack, prune) directly; the lock only guards against
concurrent gc processes, which cannot happen in the app. Aggressive
packing is dropped.
The R8 -dontwarn rules and the lint baseline entries are added only for
those two now-unreachable references.
JGitBehaviourTest covers the operations' command chains plus the GC
steps and passes on 5.13.5. It now ignores the developer's global git
config, which JGit 5 reads (commit.gpgsign made test commits try to
sign).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Run the command chains of SyncOperation, PushOperation,
BreakOutOfDetached and ResetToRemoteOperation against a local bare
repository and assert the results GitCommandExecutor branches on:
rebase success, push OK / UP_TO_DATE / REJECTED_NONFASTFORWARD, a
stopped rebase with its branch recoverable, abort and push to a
conflict branch, and hard reset to the remote. Passes on JGit 4.5.7;
it is the safety net for the JGit upgrade.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
When a pull with rebase stops on a conflict, HEAD is detached and
getCurrentBranch() returned null. "Abort rebase and push new branch"
then pushed the local commits to "conflicting-null-<time>" and failed
to switch back with "Branch name <null> is not allowed", leaving the
repository on the conflict branch.
Fall back to the branch JGit records in rebase-merge/head-name (or
rebase-apply/head-name) while a rebase is in progress. Found while
driving the conflict flow on an emulator against the e2e test server;
verified there: the edit is pushed to conflicting-master-<time> and the
operation completes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
DecryptActivity was exported without an intent filter, so any installed
app could start it with arbitrary FILE_PATH/REPO_PATH extras (and crash
it by omitting them). Nothing outside the app needs to launch it:
shortcuts and the decrypt action go through LaunchActivity.
LaunchActivity stays exported, so it now treats FILE_PATH as untrusted:
the path is forwarded only when it canonically resolves to a regular
file inside the password store, and REPO_PATH is always the real store
directory instead of the caller-supplied value. Anything else falls
back to the main screen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* UriTotpFinder: commonize query parameter handling
* gitignore: add more IDEA files
* TotpFinder: add `findIssuer`
* PasswordEntry: don't eagerly fetch TOTP related fields
* format-common: expand SteamGuard workaround
* CHANGELOG: add SteamGuard workaround
|
|
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
|
|
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
|
|
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
|
|
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
|
|
Signed-off-by: SphericalKat <amolele@gmail.com>
|
|
fixes behaviour of getFilesDir
Signed-off-by: SphericalKat <amolele@gmail.com>
|
|
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
|
|
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
|
|
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
|
|
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
|
|
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
|
|
* ui: add skeleton recyclerview to parse extra content
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
* ui: add recyclerview and update PasswordEntry to create map of key-value pairs
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
* password-entry: When key-value pair is not correctly formed, display it as Extra Content
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
* Fix formatting
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
* bug: update otp code on main thread
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
* Add complete string if key-value pair cannot be formed
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
* test: add a few tests for key-value parsing logic
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
* prefs: remove SHOW_EXTRA_CONTENT from shared preferences
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
* Update CHANGELOG.md
* Cleanup and refactor
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* PasswordEntryTest: silence nullability warning
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* PasswordEntry: simplify constructor
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* PasswordEntry: annotate test-enablement visibility
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* Reintroduce the catch-all field
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* update parsing logic
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
* add one more test case
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
* Add missing newlines
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* Remove unnecessary scrollview
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* rv: do not return if hasExtraContent is false
Signed-off-by: Aditya Wasan <adityawasan55@gmail.com>
* Don't anchor RV to bottom
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
|
|
|
|
* idea: default test runner to Gradle
* Kick off package structure revamp
* Reparent all classes under dev.msfjarvis.aps
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
|
|
Fixes #1190
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
|
|
Co-authored-by: Fabian Henneke <FabianHenneke@users.noreply.github.com>
|
|
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
|
|
* Properly handle files without passwords
Fixes #967
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* Fix tests
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* Only look for TOTP URI
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
|
|
|
|
Co-authored-by: Fabian Henneke <fabian@henneke.me>
|
|
|