Compare commits

...

175 Commits

Author SHA1 Message Date
PhilippC
830494851d Merge pull request #2734 from anttiharju/prevent-duplicate-CI-runs
Prevent duplicate CI runs in PRs
2024-12-31 11:34:24 +01:00
anttiharju
6e30dd35ee Prevent duplicate runs in PRs 2024-12-20 08:11:26 +02:00
Philipp Crocoll
dad9b0e53f update minSdk of offline version to 21 (Android 5.0) to simplify the build. 2024-10-22 15:49:08 +02:00
Philipp Crocoll
b2b0b8ddc9 switch to Java 17 in build.yml 2024-10-22 15:23:27 +02:00
Philipp Crocoll
9494f28acf Merge branch 'anttiharju/master' into update-libs-and-tools 2024-10-22 15:11:36 +02:00
Philipp Crocoll
a98cd33cff updating OkHttp, okhttp-digest and dropbox sdk. Removing no longer needed onedrive aar.
I wasn't successful in binding the latest dropbox sdk (7.0) and therefor only updated to 5.4.6 which doesn't require an .aar.
2024-10-22 15:02:10 +02:00
anttiharju
65092dcccf Switch okhttp-digest source to github
as instructed at
https://github.com/rburgst/okhttp-digest?tab=readme-ov-file#use-via-gradle
2024-10-15 22:55:48 +03:00
anttiharju
e464c59796 Downgrade setup-gradle to v3
v3 is node20 and doesn't do validation by default like v4

validation can be disabled in v4 but when that bump is made it's
probably better to resolve the issues rather than ignore them.
2024-10-15 22:48:50 +03:00
anttiharju
7dcccf1105 Bump artifact actions to v4
v4 included breaking changes, but the setup here was compatible
thanks to the usage of `${{ github.job }}`.
https://github.com/actions/upload-artifact/releases/tag/v4.0.0

v3 artifact actions will be deprecated on November 30th
https://github.blog/changelog/2024-04-16-deprecation-notice-v3-of-the-artifact-actions/

node16 actions will be EOL on October 15th
https://github.blog/changelog/2024-09-25-end-of-life-for-actions-node16/

These seem contradictory but I _guess_ on self-hosted runners one
can keep using v3 artifact actions until November 30th.
2024-10-13 15:29:45 +03:00
anttiharju
8d354bb3f0 Update actions/setup-java to v4
Just a node20 update
https://github.com/actions/setup-java/releases/tag/v4.0.0
2024-10-13 15:22:50 +03:00
anttiharju
5882263ee8 Bump microsoft/setup-msbuild to v2 for node20
Just a node20 update
https://github.com/microsoft/setup-msbuild/releases/tag/v2
2024-10-13 15:20:33 +03:00
anttiharju
38e305bb4a Pin a third-party action
This is security hardening, see
https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions#using-third-party-actions
2024-10-13 15:16:37 +03:00
anttiharju
177b1fc9a3 Update al-cheb/configure-pagefile-action to v1.4
Just a node20 update per
https://github.com/al-cheb/configure-pagefile-action/releases/tag/v1.4
2024-10-13 15:15:11 +03:00
anttiharju
8bde5ed262 Use actions/checkout for fetching submodules 2024-10-13 15:10:36 +03:00
anttiharju
247b37262d Bump actions/cache to v4
Just a node20 update per
https://github.com/actions/cache/releases/tag/v4.0.0
2024-10-13 14:58:18 +03:00
anttiharju
84230b32ef Bump gradle/actions/setup-gradle to v4
It includes caching improvements as described here:
https://github.com/gradle/actions/releases/tag/v4.0.0

windows-2022 includes node20 per
https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md#nodejs
2024-10-13 14:56:14 +03:00
anttiharju
a54444e919 Bump gradle-build-action to v3
Gradle v2 uses node16 which will be EOL soon.

"The only major breaking change from gradle-build-action@v2.12.0
is the update to require a Node 20 runtime environment.

Aside from that change, this release should generally serve as a
drop-in replacement for gradle-build-action@v2."

Gradle updated the action name, following the advice from
https://github.com/gradle/gradle-build-action/releases/tag/v3.0.0
2024-10-13 14:42:06 +03:00
anttiharju
4b55e2ce8b Bump checkout from v3 to v4
checkout v3 uses node16 which reaches EOL on 15th of Oct 2024
https://github.blog/changelog/2024-09-25-end-of-life-for-actions-node16/
2024-10-13 14:35:35 +03:00
Philipp Crocoll
5ae718c58e update targetframework for Guava libs 2024-10-08 16:19:24 +02:00
Philipp Crocoll
669022ddf0 update Newtonsoft.Json, FluentFTP and MegaApiClient to the latest versions 2024-10-08 16:07:56 +02:00
Philipp Crocoll
f0fd21a6ec upgrade to Gradle version 8.6 (plugin version 8.4) 2024-10-08 16:03:03 +02:00
Philipp Crocoll
73a8ec27d4 remove no-longer-needed jars from JavaFileStorageBindings 2024-10-08 15:19:23 +02:00
Philipp Crocoll
51902c9bc4 fix build issues related to removal of deprecated OneDrive API jars. onedrive:// is now no longer supported, but has been replaced with onedrive2:// a long time ago already. 2024-10-08 14:59:49 +02:00
PhilippC
32d3abf5d6 Merge pull request #2544 from PhilippC/release-preparation-1-11
Version 1.11-r0
2024-02-20 07:10:16 +01:00
Philipp Crocoll
543eeb69ef manifest for 1.11 2024-02-19 21:07:32 +01:00
PhilippC
ec6e1593b0 Merge pull request #2542 from PhilippC/l10n_master2
New Crowdin updates
2024-02-19 16:18:36 +01:00
PhilippC
ee27bea111 New translations strings.xml (Dutch) 2024-02-19 14:39:34 +01:00
PhilippC
de93b12877 New translations strings.xml (Japanese) 2024-02-19 14:39:33 +01:00
PhilippC
71d2a332c7 New translations strings.xml (German) 2024-02-19 14:38:53 +01:00
PhilippC
37d1481658 Merge pull request #2513 from PhilippC/l10n_master2
New Crowdin updates
2024-02-19 11:45:11 +01:00
PhilippC
a8cc1ad66d New translations strings.xml (Portuguese, Brazilian) 2024-02-16 16:28:07 +01:00
PhilippC
3056ee9d45 New translations strings.xml (Portuguese, Brazilian) 2024-02-16 13:17:44 +01:00
PhilippC
0ec5996c8d New translations strings.xml (Portuguese, Brazilian) 2024-02-16 11:48:14 +01:00
PhilippC
01666d8402 New translations strings.xml (Czech) 2024-02-13 12:46:17 +01:00
PhilippC
422fa01ba1 New translations strings.xml (Czech) 2024-02-13 11:30:21 +01:00
PhilippC
ca9c19e8a9 New translations strings.xml (Turkish) 2024-02-12 16:21:28 +01:00
PhilippC
093f7683b8 New translations strings.xml (German) 2024-02-11 22:31:36 +01:00
PhilippC
d4cf908f4a New translations strings.xml (German) 2024-02-11 21:35:40 +01:00
PhilippC
55d62144fb New translations strings.xml (Portuguese, Brazilian) 2024-02-08 12:03:39 +01:00
PhilippC
c181565aaa New translations strings.xml (Slovenian) 2024-02-07 18:03:13 +01:00
PhilippC
c0c4524562 Merge pull request #2530 from PhilippC/release-preparation-1-11
changelog for version 1.11
2024-02-06 21:46:13 +01:00
PhilippC
eac1803084 New translations strings.xml (German) 2024-02-06 13:47:53 +01:00
PhilippC
58904f1166 New translations strings.xml (German) 2024-02-06 12:09:11 +01:00
Philipp Crocoll
54eb1baee2 changelog for version 1.11 2024-02-06 09:40:54 +01:00
PhilippC
ada01924ba New translations strings.xml (Chinese Simplified) 2024-02-06 04:25:32 +01:00
PhilippC
e38e7df221 Merge pull request #2516 from PhilippC/803--totp-overview
TOTP overview
2024-01-17 18:34:29 +01:00
Philipp Crocoll
fb4ab84ceb Merge branch 'master' of https://github.com/PhilippC/keepass2android into 803--totp-overview 2024-01-17 07:48:06 +01:00
Philipp Crocoll
4475fac51e add missing file for SearchTotpResults, preview TOTPs depending on settings, make TOTP copyable from Entry view
closes #803
2024-01-17 07:46:51 +01:00
Philipp Crocoll
13ef4ca9ff add FAB for TOTP, add activity for showing TOTP entries 2024-01-17 07:35:05 +01:00
Philipp Crocoll
f297ebcd40 * introduce FAB for search
* introduce TOTP preview on PwEntryView

first steps towards #803
2024-01-17 07:07:46 +01:00
PhilippC
a5ef4ccc7a Merge pull request #2514 from PhilippC/1942--fix-text-color-not-themed
Fix bad text color on autofill target preference dialog
2024-01-15 12:30:50 +01:00
Philipp Crocoll
dfd9c32251 Fixes bad text color, closes https://github.com/PhilippC/keepass2android/issues/1942 2024-01-15 11:51:59 +01:00
PhilippC
5397a1c88f New translations strings.xml (Polish) 2024-01-15 09:22:32 +01:00
PhilippC
fdcd4321e0 Merge pull request #2512 from PhilippC/2504--copy-on-longclick
fix merge issue
2024-01-15 08:27:57 +01:00
Philipp Crocoll
11013791ef revert another unintentionally commit change 2024-01-15 08:06:19 +01:00
Philipp Crocoll
6958a2d189 revert unintentionally commited changes to AutofillTest 2024-01-15 07:47:21 +01:00
Philipp Crocoll
94ec8cf1ac fix merge issue 2024-01-15 06:56:32 +01:00
Philipp Crocoll
63631fa81f Merge branch '2504--copy-on-longclick'
# Resolved Conflicts:
#	src/keepass2android/EntryActivity.cs
2024-01-14 21:55:23 +01:00
PhilippC
107d9c6235 Merge pull request #2500 from PhilippC/l10n_master2
New Crowdin updates
2024-01-14 21:52:47 +01:00
PhilippC
8e4ee4f588 Merge pull request #2508 from PhilippC/2507--dialog-behind-keyboard
making activity adjustResize to (hopefully) close #2507
2024-01-14 21:52:39 +01:00
Philipp Crocoll
f0a06faae1 copy text value to clipboard when long-clicking in Entry view. closes #2504 2024-01-14 21:34:19 +01:00
PhilippC
99db263833 Merge branch 'master' into 2507--dialog-behind-keyboard 2024-01-13 11:47:12 +01:00
Philipp Crocoll
e2e42cd177 making activity adjustResize to (hopefully) close #2507 (in some Android versions, it seems like the keyboard from autofill does not get hidden as it should, overlaying the dialog buttons) 2024-01-13 11:45:44 +01:00
PhilippC
a376c6ee0b New translations strings.xml (Japanese) 2024-01-11 14:40:23 +01:00
PhilippC
0326e02ddd New translations strings.xml (Slovenian) 2024-01-09 09:54:12 +01:00
PhilippC
d75482f3bd New translations strings.xml (Dutch) 2024-01-08 13:48:56 +01:00
PhilippC
bca0d042a1 New translations strings.xml (Dutch) 2024-01-08 12:05:55 +01:00
PhilippC
29eaf5f205 New translations strings.xml (Dutch) 2024-01-07 18:14:06 +01:00
PhilippC
78da5e2973 New translations strings.xml (Dutch) 2024-01-07 18:14:05 +01:00
PhilippC
20541618f9 New translations strings.xml (Dutch) 2024-01-07 18:14:04 +01:00
PhilippC
e459d280f2 New translations strings.xml (Dutch) 2024-01-07 17:09:40 +01:00
PhilippC
705e2e4a86 New translations strings.xml (Dutch) 2024-01-07 15:55:10 +01:00
PhilippC
cf9b368afc New translations strings.xml (Dutch) 2024-01-07 14:01:42 +01:00
PhilippC
f1c6a5365c New translations strings.xml (Dutch) 2024-01-07 13:03:09 +01:00
PhilippC
6a61bf6364 New translations strings.xml (Dutch) 2024-01-07 11:14:14 +01:00
PhilippC
814571c746 New translations strings.xml (Dutch) 2024-01-06 21:07:45 +01:00
PhilippC
fc5587260f New translations strings.xml (Dutch) 2024-01-06 19:51:14 +01:00
PhilippC
674ba7bd71 New translations strings.xml (Dutch) 2024-01-06 18:54:57 +01:00
PhilippC
556f82f786 New translations strings.xml (Dutch) 2024-01-06 17:48:44 +01:00
PhilippC
58c5c5882b New translations strings.xml (Chinese Simplified) 2024-01-06 04:27:00 +01:00
PhilippC
a706571e66 New translations strings.xml (Portuguese, Brazilian) 2024-01-05 12:03:52 +01:00
PhilippC
3997b21aec Merge pull request #2502 from PhilippC/totp-improvements
TOTP improvements
2024-01-05 09:28:50 +01:00
Philipp Crocoll
c354612369 catch potential crash when otp data is invalid
closes https://github.com/PhilippC/keepass2android/issues/1602
2024-01-05 09:27:34 +01:00
Philipp Crocoll
4fea731c87 move TOTP field up in EntryActivity and add a progress bar to indicate the time left for using the TOTP
closes https://github.com/PhilippC/keepass2android/issues/2315
2024-01-05 09:01:29 +01:00
Philipp Crocoll
e189776ba9 Merge branch 'master' into totp-improvements 2024-01-05 06:46:04 +01:00
Philipp Crocoll
31255f0c52 move TOTP button on keyboard to third position (after User/Pwd) and disable TOTP "internal fields"
closes #1341
closes #2394
closes #1844
2024-01-04 19:09:24 +01:00
Philipp Crocoll
059280efd0 Introduce preference options to control the behavior when autofilling TOTP entries (show entry notification, activate keyboard, copy TOTP to clipboard)
Required a bit of refactoring to decide when to bring up keyboard selection dialog. Also changed the code so it shows e.g. on Pixel 6a with Android 14, previously did not.
closes #2308
closes #1286 as it now shows up the entry notificaton (unless disabled) and solves the underlying issue in the best found way
2024-01-04 19:06:49 +01:00
Philipp Crocoll
5edc070aa8 show entry notification when autofilling an entry with TOTP (to allow copying TOTP to clipboard)
fixes https://github.com/PhilippC/keepass2android/issues/1272
2024-01-04 08:21:45 +01:00
PhilippC
95843b1134 New translations strings.xml (Dutch) 2024-01-03 23:15:02 +01:00
PhilippC
d2ea9b18a8 New translations strings.xml (Spanish) 2024-01-03 21:44:24 +01:00
PhilippC
828425ab0e New translations strings.xml (Spanish) 2024-01-03 20:48:41 +01:00
PhilippC
4395f422b3 New translations strings.xml (Portuguese, Brazilian) 2024-01-03 11:52:22 +01:00
PhilippC
be2c28811c Merge pull request #2498 from PhilippC/2246--fix-base32-parsing-in-keepass2totp
replace base32 parsing algorithm to fix issue with some TOTP entries using KeePass2 style
2024-01-03 11:27:14 +01:00
Philipp Crocoll
fcc4d44786 replace base32 parsing algorithm to fix issue with some TOTP entries using KeePass2 style
fixes #2020
fixes #2246
2024-01-03 10:17:06 +01:00
PhilippC
337e6324ff Merge pull request #2497 from PhilippC/1248--totp-docs
add TOTP section in Docs
2024-01-03 09:01:45 +01:00
Philipp Crocoll
310143c612 add TOTP section in Docs
closes #1248
2024-01-03 09:00:30 +01:00
PhilippC
49cb33a4da Merge pull request #2496 from PhilippC/2458--seed-only-traytotp-style-entries
make settings field for TrayTotp style otp entries optional
2024-01-03 08:52:22 +01:00
Philipp Crocoll
c934755e1c make settings field for TrayTotp style otp entries optional
closes https://github.com/PhilippC/keepass2android/issues/2458
2024-01-03 08:06:20 +01:00
PhilippC
64355a3da7 Merge pull request #2495 from PhilippC/1949--enable-shared-folders-in-pcloud
update to pcloud 1.9.1 to enable access to shared folders
2024-01-03 06:46:15 +01:00
PhilippC
9579f3bf51 Merge pull request #2463 from PhilippC/l10n_master2
New Crowdin updates
2024-01-03 06:30:55 +01:00
PhilippC
674ae26bd7 Merge pull request #2493 from PhilippC/1327--replace-placeholders-in-more-places
replace placeholder in title for viewing entries and autofill entry a…
2024-01-03 06:30:35 +01:00
PhilippC
d2778e8496 Merge pull request #2494 from PhilippC/2449--ignore-android-settings-for-autofill
ignore Android settings for Autofill, fixes #2449
2024-01-03 06:30:21 +01:00
Philipp Crocoll
cc19e6f326 update to pcloud 1.9.1 to enable access to shared folders
fixes #1949, fixes #2474
fixes https://github.com/pCloud/pcloud-sdk-java/issues/33
2024-01-03 06:29:03 +01:00
Philipp Crocoll
dd7a2718c9 ignore Android settings for Autofill, fixes #2449 2024-01-03 05:50:25 +01:00
PhilippC
9c50d2d98a Merge pull request #2464 from PhilippC/2396--webdav-password-in-logs
avoid passwords appearing in logfiles (#2396)
2024-01-02 21:08:51 +01:00
PhilippC
8ee13acdde Merge pull request #2490 from PhilippC/2488-fix-crash-in-autofill
avoid potentiall null hints in autofill (#2488)
2024-01-02 21:03:30 +01:00
PhilippC
aeda304919 Merge pull request #2492 from PhilippC/2466--reduce-logging
do not log folder name to fix #2466
2024-01-02 21:03:14 +01:00
Philipp Crocoll
9f08e0039b replace placeholder in title for viewing entries and autofill entry as well as in search results, fixes #1327 2024-01-02 21:00:43 +01:00
Philipp Crocoll
dfd101da77 do not log folder name to fix #2466 2024-01-02 16:34:30 +01:00
Philipp Crocoll
f4b5eee171 avoid potentiall null hints in autofill (#2488) 2024-01-02 16:26:02 +01:00
Philipp Crocoll
98e31942e1 remove potential password in logs 2024-01-02 12:40:39 +01:00
PhilippC
385aad8fb0 New translations strings.xml (Portuguese, Brazilian) 2023-12-31 01:42:46 +01:00
PhilippC
3e383d50f8 New translations strings.xml (Portuguese, Brazilian) 2023-12-31 00:44:33 +01:00
PhilippC
8c089a8711 New translations strings.xml (Polish) 2023-12-17 16:05:36 +01:00
PhilippC
098123787d New translations strings.xml (Czech) 2023-12-15 10:06:50 +01:00
PhilippC
a22b8474c3 New translations strings.xml (Polish) 2023-12-11 19:31:51 +01:00
PhilippC
8fc4607a34 New translations strings.xml (Polish) 2023-12-11 18:32:40 +01:00
PhilippC
4b56405960 New translations strings.xml (Portuguese, Brazilian) 2023-12-10 23:11:27 +01:00
PhilippC
c4b41001b3 New translations strings.xml (Portuguese, Brazilian) 2023-12-07 12:13:32 +01:00
PhilippC
cb51be349e New translations strings.xml (Portuguese, Brazilian) 2023-12-03 11:06:26 +01:00
PhilippC
13170bb88c New translations strings.xml (Portuguese, Brazilian) 2023-12-02 14:03:33 +01:00
PhilippC
88a20d947c New translations strings.xml (Portuguese, Brazilian) 2023-12-02 13:07:24 +01:00
PhilippC
4fcc2625c0 New translations strings.xml (Greek) 2023-12-01 12:14:22 +01:00
PhilippC
324cf74a2b New translations strings.xml (Greek) 2023-12-01 10:59:01 +01:00
PhilippC
e3d14221f9 New translations strings.xml (Portuguese, Brazilian) 2023-12-01 00:48:04 +01:00
PhilippC
7d0a43397a New translations strings.xml (Portuguese, Brazilian) 2023-11-30 13:08:04 +01:00
PhilippC
a6d1b26479 New translations strings.xml (Portuguese, Brazilian) 2023-11-30 11:28:31 +01:00
PhilippC
79ad753218 New translations strings.xml (Portuguese, Brazilian) 2023-11-29 13:52:17 +01:00
PhilippC
24ee49ea9f New translations strings.xml (Portuguese, Brazilian) 2023-11-27 12:52:12 +01:00
PhilippC
ab6e8e3685 New translations strings.xml (Portuguese, Brazilian) 2023-11-27 11:08:20 +01:00
PhilippC
81e8820732 New translations strings.xml (Slovenian) 2023-11-24 07:53:52 +01:00
PhilippC
93c72ee04e New translations strings.xml (Chinese Simplified) 2023-11-24 07:53:51 +01:00
PhilippC
8a53357e3d New translations strings.xml (Chinese Simplified) 2023-11-24 06:46:31 +01:00
PhilippC
c12ae13077 New translations strings.xml (Portuguese, Brazilian) 2023-11-21 18:16:54 +01:00
PhilippC
071fc3fd51 New translations strings.xml (Japanese) 2023-11-21 13:38:50 +01:00
Philipp Crocoll
ad6ced3aad addition to last commit: this refers to #2396 2023-11-21 13:33:37 +01:00
Philipp Crocoll
6ef8b8fc3b replace usage of IoConnectionInfo::GetDisplayName() to avoid passwords (as part of the URL) appearing in logfiles 2023-11-21 13:31:54 +01:00
PhilippC
825793f385 New translations strings.xml (Portuguese, Brazilian) 2023-11-21 12:01:55 +01:00
PhilippC
bd6af10fd5 New translations strings.xml (Portuguese, Brazilian) 2023-11-21 10:48:05 +01:00
PhilippC
c719043159 New translations strings.xml (Azerbaijani) 2023-11-21 08:12:31 +01:00
PhilippC
c6e32937ce New translations strings.xml (Croatian) 2023-11-21 08:12:29 +01:00
PhilippC
081b77c2bd New translations strings.xml (Persian) 2023-11-21 08:12:28 +01:00
PhilippC
a950298c11 New translations strings.xml (Indonesian) 2023-11-21 08:12:26 +01:00
PhilippC
eafd3bb702 New translations strings.xml (Galician) 2023-11-21 08:12:25 +01:00
PhilippC
0e53f91d01 New translations strings.xml (Chinese Traditional) 2023-11-21 08:12:24 +01:00
PhilippC
96156bf8b9 New translations strings.xml (Ukrainian) 2023-11-21 08:12:23 +01:00
PhilippC
8efc1f3c1f New translations strings.xml (Turkish) 2023-11-21 08:12:22 +01:00
PhilippC
67d20124ff New translations strings.xml (Swedish) 2023-11-21 08:12:21 +01:00
PhilippC
b93739926d New translations strings.xml (Serbian (Cyrillic)) 2023-11-21 08:12:20 +01:00
PhilippC
4afac75bb4 New translations strings.xml (Slovenian) 2023-11-21 08:12:19 +01:00
PhilippC
cea41d1446 New translations strings.xml (Slovak) 2023-11-21 08:12:18 +01:00
PhilippC
dd5b744bfb New translations strings.xml (Russian) 2023-11-21 08:12:17 +01:00
PhilippC
47cbe5b0ab New translations strings.xml (Portuguese) 2023-11-21 08:12:16 +01:00
PhilippC
99950e3c93 New translations strings.xml (Polish) 2023-11-21 08:12:15 +01:00
PhilippC
df8f375b59 New translations strings.xml (Dutch) 2023-11-21 08:12:14 +01:00
PhilippC
fdc213bfc1 New translations strings.xml (Korean) 2023-11-21 08:12:12 +01:00
PhilippC
428b008017 New translations strings.xml (Japanese) 2023-11-21 08:12:11 +01:00
PhilippC
3d4a0a79f9 New translations strings.xml (Italian) 2023-11-21 08:12:10 +01:00
PhilippC
008e55598c New translations strings.xml (Portuguese, Brazilian) 2023-11-21 08:12:09 +01:00
PhilippC
7c3832830e New translations strings.xml (Vietnamese) 2023-11-21 08:12:08 +01:00
PhilippC
c3e234da25 New translations strings.xml (Chinese Simplified) 2023-11-21 08:12:07 +01:00
PhilippC
6ba0b29c77 New translations strings.xml (Hungarian) 2023-11-21 08:12:06 +01:00
PhilippC
b16f747913 New translations strings.xml (Hebrew) 2023-11-21 08:12:05 +01:00
PhilippC
35ac1cf642 New translations strings.xml (Finnish) 2023-11-21 08:12:04 +01:00
PhilippC
5d2da784b9 New translations strings.xml (Basque) 2023-11-21 08:12:03 +01:00
PhilippC
86b225034c New translations strings.xml (Greek) 2023-11-21 08:12:02 +01:00
PhilippC
727cf74201 New translations strings.xml (German) 2023-11-21 08:12:01 +01:00
PhilippC
6f8ae7be34 New translations strings.xml (Danish) 2023-11-21 08:12:00 +01:00
PhilippC
a84d26b151 New translations strings.xml (Catalan) 2023-11-21 08:11:59 +01:00
PhilippC
6f7419e38a New translations strings.xml (Arabic) 2023-11-21 08:11:57 +01:00
PhilippC
bdb11f4873 New translations strings.xml (Spanish) 2023-11-21 08:11:56 +01:00
PhilippC
87603cd9c1 New translations strings.xml (Romanian) 2023-11-21 08:11:55 +01:00
PhilippC
e6cec96504 New translations strings.xml (Czech) 2023-11-21 08:11:54 +01:00
PhilippC
fb478af6c7 New translations strings.xml (Belarusian) 2023-11-21 08:11:53 +01:00
PhilippC
9991964c9b New translations strings.xml (French) 2023-11-21 08:11:51 +01:00
151 changed files with 3655 additions and 2307 deletions

View File

@@ -1,6 +1,10 @@
name: Build keepass2android app
on: [push, pull_request]
on:
push:
branches:
- main
pull_request:
jobs:
# macos:
@@ -10,16 +14,15 @@ jobs:
# runs-on: macos-12
# steps:
# - uses: actions/checkout@v3
# - name: Fetch submodules
# run: git submodule init && git submodule update
# - uses: actions/checkout@v4
# with:
# submodules: true
# - name: Setup Gradle
# uses: gradle/gradle-build-action@v2
# uses: gradle/actions/setup-gradle@v3
# - name: Cache NuGet packages
# uses: actions/cache@v3
# uses: actions/cache@v4
# with:
# path: ~/.nuget/packages
# key: ${{ runner.os }}-nuget-${{ hashFiles('src/**/*.csproj', 'src/**/packages.config') }}
@@ -52,7 +55,7 @@ jobs:
# # $VM_ASSETS/select-xamarin-sdk-v2.sh --mono=6.12 --android=11.2
# - name: Switch to JDK-11
# uses: actions/setup-java@v3
# uses: actions/setup-java@v4
# with:
# java-version: '11'
# distribution: 'temurin'
@@ -82,7 +85,7 @@ jobs:
# make apk Flavor=Net
# - name: Archive production artifacts (net)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('net' built on ${{ github.job }})
# path: |
@@ -100,7 +103,7 @@ jobs:
# make apk Flavor=NoNet
# - name: Archive production artifacts (nonet)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('nonet' built on ${{ github.job }})
# path: |
@@ -130,16 +133,15 @@ jobs:
# # Build Artifact of xamarin.android-oss dated 2022-02-16, master branch (= version 12.2.99)
# xamarin_url: https://artprodcus3.artifacts.visualstudio.com/Ad0adf05a-e7d7-4b65-96fe-3f3884d42038/6fd3d886-57a5-4e31-8db7-52a1b47c07a8/_apis/artifact/cGlwZWxpbmVhcnRpZmFjdDovL3hhbWFyaW4vcHJvamVjdElkLzZmZDNkODg2LTU3YTUtNGUzMS04ZGI3LTUyYTFiNDdjMDdhOC9idWlsZElkLzU0OTUzL2FydGlmYWN0TmFtZS9pbnN0YWxsZXJzLXVuc2lnbmVkKy0rTGludXg1/content?format=zip
# steps:
# - uses: actions/checkout@v3
# - name: Fetch submodules
# run: git submodule init && git submodule update
# - uses: actions/checkout@v4
# with:
# submodules: true
# - name: Setup Gradle
# uses: gradle/gradle-build-action@v2
# uses: gradle/actions/setup-gradle@v3
# - name: Cache NuGet packages
# uses: actions/cache@v3
# uses: actions/cache@v4
# with:
# path: ~/.nuget/packages
# key: ${{ runner.os }}-nuget-${{ hashFiles('src/**/*.csproj', 'src/**/packages.config') }}
@@ -148,7 +150,7 @@ jobs:
# - name: Cache Xamarin.Android packages
# id: xamarin_cache
# uses: actions/cache@v3
# uses: actions/cache@v4
# with:
# path: ~/xamarin.android-oss
# key: ${{ runner.os }}-xamarin.android-oss-${{ env.xamarin_url }}
@@ -183,7 +185,7 @@ jobs:
# echo "$HOME/xamarin.android-oss/bin/Release/bin" >> $GITHUB_PATH
# - name: Switch to JDK-11
# uses: actions/setup-java@v3
# uses: actions/setup-java@v4
# with:
# java-version: '11'
# distribution: 'temurin'
@@ -217,7 +219,7 @@ jobs:
# make apk Flavor=Net
# - name: Archive production artifacts (net)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('net' built on ${{ github.job }})
# path: |
@@ -235,7 +237,7 @@ jobs:
# make apk Flavor=NoNet
# - name: Archive production artifacts (nonet)
# uses: actions/upload-artifact@v3
# uses: actions/upload-artifact@v4
# with:
# name: signed APK ('nonet' built on ${{ github.job }})
# path: |
@@ -254,39 +256,38 @@ jobs:
runs-on: windows-2022
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: true
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
uses: gradle/actions/setup-gradle@v3
- name: Cache NuGet packages
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('src/**/*.csproj', 'src/**/packages.config') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Fetch submodules
run: git submodule init && git submodule update
# Workaround an issue when building on windows-2022. Error was
# D8 : OpenJDK 64-Bit Server VM warning : INFO: os::commit_memory(0x00000000ae400000, 330301440, 0) failed; error='The paging file is too small for this operation to complete' (DOS error/errno=1455) [D:\a\keepass2android\keepass2android\src\keepass2android\keepass2android-app.csproj]
# C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Xamarin\Android\Xamarin.Android.D8.targets(81,5): error MSB6006: "java.exe" exited with code 1. [D:\a\keepass2android\keepass2android\src\keepass2android\keepass2android-app.csproj]
- name: Configure Pagefile
uses: al-cheb/configure-pagefile-action@v1.3
uses: al-cheb/configure-pagefile-action@a3b6ebd6b634da88790d9c58d4b37a7f4a7b8708 # v1.4
with:
minimum-size: 8GB
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v1.1
uses: microsoft/setup-msbuild@v2
# If we want to also have nmake, use this instead
#uses: ilammy/msvc-dev-cmd@v1
- name: Switch to JDK-11
uses: actions/setup-java@v3
- name: Switch to JDK-17
uses: actions/setup-java@v4
with:
java-version: '11'
java-version: '17'
distribution: 'temurin'
- name: Display java version
@@ -320,7 +321,7 @@ jobs:
make apk Flavor=Net
- name: Archive production artifacts (net)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: signed APK ('net' built on ${{ github.job }})
path: |
@@ -341,7 +342,7 @@ jobs:
make apk Flavor=NoNet
- name: Archive production artifacts (nonet)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: signed APK ('nonet' built on ${{ github.job }})
path: |

1
.gitignore vendored
View File

@@ -176,3 +176,4 @@ src/java/Keepass2AndroidPluginSDK2/build/generated/mockable-Google-Inc.-Google-A
/src/ActionViewFilterTest
/docs/gdrive-verification
/src/MegaTest
*.dtbcache.json

View File

@@ -68,6 +68,9 @@ Please see the [How to use Keepass2Android with YubiKey NEO](How-to-use-Keepass2
## Advanced usage of the Keepass2Android keyboard
Please see the [Advanced usage of the Keepass2Android keyboard](Advanced-usage-of-the-Keepass2Android-keyboard.md) page.
## Using Keepass2Android like an authenticator app to generate Time-based One-Time-Passwords (TOTPs)
Please see [Generating TOTPs with Keepass2Android](Generating-TOTPs.md)
# FAQ
## Should I use the KP2A keyboard for entering passwords?

53
docs/Generating-TOTPs.md Normal file
View File

@@ -0,0 +1,53 @@
## TOTP in brief
TOTP stands for [Time-based One-Time Password algorithm](https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm) which is one of the most common way proposed by websites to do a [two-factor authentication (2FA)](https://en.wikipedia.org/wiki/Multi-factor_authentication).
On these websites, this option will often be mentioned in the 2FA configuration menu as things like "_use code generated by an application_", "_use [Google] Authenticator app_".
You're prompted to scan a QR code with the app, which essentially contains a code called "_seed_", usually with a form like "_AZER TYUI OPQS DFGH JKLM_", used to generate TOTPs. The seed can be also directly copied if there is no scanning option on the app.
Most common apps:
- Google Authenticator
- Authy
- Microsoft Authenticator
- FreeOTP
- LastPass Authenticator
## TOTP in KeePass and benefits
In KeePass (by Dominik Reichl) there is are several ways to enable this Authenticator app ability:
- built-in TOTP support: https://keepass.info/help/base/placeholders.html#otp
- [KeePassOTP plugin](https://keepass.info/plugins.html#kpotp)
- [KeeOtp plugin](https://keepass.info/plugins.html#keeotp)
- [KeeTrayTOTP plugin](https://keepass.info/plugins.html#keetraytotp) (note the name "_TrayTOTP_" on this one for later)
KeePassXC also supports TOTP: https://keepassxc.org/docs/KeePassXC_UserGuide#_adding_totp_to_an_entry
The greatest benefits are:
- the seed stays available contrary to the above apps (for which it's more or less hard to backup/restore/switch with another app)
- TOTPs are available wherever the KeePass database is available. But conceptually it's not really 2FA anymore (all things are stored in the same place).
The different implementations use different ways of storing the TOTP seed (or secret, or key) and optional settings (e.g. the length of the TOTP to generate) within an entry inside the kdbx database. Keepass2Android attempts to be able to read the different formats, but can only write one:
## TOTP in Keepass2Android
If you use any of the tools mentioned above, you can set up TOTP entries with them. Keepass2Android can read those entries and generate TOTPs if any of the following styles are used:
* Keepass2 style: used when there are TimeOtp-Secret(-XXX) fields in the entry
* KeeOtpPlugin style: used when there is an otp field containing a query string in the form of key=abc&step=X&size=Y (step and size are optional)
* KeeWebOtp/Key Uri Format style: used when entry contains a URL starting with otpauth://totp/, e.g. otpauth://totp/?secret=abc (https://github.com/google/google-authenticator/wiki/Key-Uri-Format)
* KeeTrayTotp style:
* requires a non-empty seed field (default key is "TOTP seed", can be changed in KP2A settings), value is base32 encoded data
* requires a non-empty settings field (default key is "TOTP Settings", can be changed as well), value is expected to be a csv-separated array with [Duration];Length(;TimeCorrectionURL). Length is either an integer value or "S" to indicate Steam encoding
In order to view the generated TOTP code in KP2A, open the corresponding entry. You can then
* use a dynamically generated field called "_TOTP_" containing the TOTP or
* use the "Copy TOTP" button on the system notification for the selected entry or
* switch to the KP2A keyboard and use the TOTP button to insert the TOTP value into the target app or browser
If you want to configure an entry to contain the TOTP fields, it is suggested to enter edit mode for the entry. Then click the "Configure TOTP" button. You can either enter the data manually or scan a QR code with the information.
### Spaces in otp field
Make sure that the URI doesn't contain spaces, otherwise KeePass2Android will fail to generate TOTPs as a space is an invalid character. If your URIs have spaces, check [this comment](https://github.com/PhilippC/keepass2android/issues/1248#issuecomment-628035961)._

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.services.msa"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="22" />
<uses-permission android:name="com.sony.mobile.permission.SYSTEM_UI_VISIBILITY_EXTENSION" />
</manifest>

View File

@@ -1 +0,0 @@
int string app_name 0x7f020000

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.services.msa"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="22" />
<uses-permission android:name="com.sony.mobile.permission.SYSTEM_UI_VISIBILITY_EXTENSION" />
</manifest>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- From: file:/C:/Users/pnied/Documents/git/msa-auth-for-android/src/main/res/values/strings.xml -->
<eat-comment/>
<string name="app_name">msa-auth</string>
</resources>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.onedrivesdk"
android:versionCode="10202"
android:versionName="1.2.2" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
</manifest>

View File

@@ -1,22 +0,0 @@
int dimen activity_horizontal_margin 0x7f030000
int dimen activity_vertical_margin 0x7f030001
int id LinearLayout1 0x7f060004
int id com_microsoft_aad_adal_editDummyText 0x7f060002
int id com_microsoft_aad_adal_progressBar 0x7f060003
int id com_microsoft_aad_adal_webView1 0x7f060001
int id editPassword 0x7f060006
int id editUserName 0x7f060005
int id webView1 0x7f060000
int layout activity_authentication 0x7f020000
int layout dialog_authentication 0x7f020001
int layout http_auth_dialog 0x7f020002
int string app_loading 0x7f050000
int string app_name 0x7f050001
int string broker_processing 0x7f050002
int string http_auth_dialog_cancel 0x7f050003
int string http_auth_dialog_login 0x7f050004
int string http_auth_dialog_password 0x7f050005
int string http_auth_dialog_title 0x7f050006
int string http_auth_dialog_username 0x7f050007
int style AppBaseTheme 0x7f040000
int style AppTheme 0x7f040001

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.microsoft.onedrivesdk"
android:versionCode="10202"
android:versionName="1.2.2" >
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
</manifest>

View File

@@ -183,6 +183,7 @@
<LibraryProjectZip Include="..\java\JavaFileStorage\app\build\outputs\aar\JavaFileStorage-debug.aar">
<Link>Jars\JavaFileStorage-debug.aar</Link>
</LibraryProjectZip>
<None Include="app.config" />
<None Include="Jars\AboutJars.txt" />
<None Include="Additions\AboutAdditions.txt" />
<None Include="packages.config" />
@@ -212,12 +213,6 @@
<Name>PCloudBindings</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\msa-auth-0.8.6\classes-msa-auth.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\onedrive-sdk-android-1.2.2\classes-onedrive-sdk.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gdrive\commons-logging-1.1.1.jar" />
</ItemGroup>
@@ -242,21 +237,6 @@
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gdrive\google-http-client-gson-1.16.0-rc.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\jackson-core-2.7.4.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-digest-2.5.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okio-2.9.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-4.10.0-RC1.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedJar Include="Jars\dropbox-core-sdk-4.0.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gson-2.8.6.jar" />
</ItemGroup>
@@ -290,18 +270,30 @@
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gdrive\opencensus-api-0.24.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-4.12.0.jar" />
<EmbeddedReferenceJar Include="Jars\okio-3.6.0.jar" />
<EmbeddedReferenceJar Include="Jars\okio-jvm-3.6.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-digest-3.1.0.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\dropbox-core-sdk-5.4.6.jar" />
<EmbeddedReferenceJar Include="Jars\jackson-core-2.13.5.jar" />
</ItemGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.props'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.props'))" />
<Error Condition="!Exists('..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets'))" />
@@ -326,7 +318,6 @@
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets'))" />
@@ -337,13 +328,14 @@
<Error Condition="!Exists('..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets'))" />
</Target>
<Import Project="..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Migration.1.0.10\build\monoandroid120\Xamarin.AndroidX.Migration.targets')" />
<Import Project="..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets" Condition="Exists('..\packages\Xamarin.Build.Download.0.11.4\build\Xamarin.Build.Download.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets" Condition="Exists('..\packages\Xamarin.AndroidX.MultiDex.2.0.1.13\build\monoandroid12.0\Xamarin.AndroidX.MultiDex.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.FailureAccess.1.0.1.3\build\monoandroid90\Xamarin.Google.Guava.FailureAccess.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.ListenableFuture.1.0.0.9\build\monoandroid12.0\Xamarin.Google.Guava.ListenableFuture.targets')" />
<Import Project="..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets" Condition="Exists('..\packages\Xamarin.Google.Guava.28.2.0.1\build\monoandroid90\Xamarin.Google.Guava.targets')" />
<Import Project="..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets" Condition="Exists('..\packages\Xamarin.Jetbrains.Annotations.23.0.0.4\build\monoandroid12.0\Xamarin.Jetbrains.Annotations.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Common.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Common.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.targets')" />
@@ -368,7 +360,6 @@
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk7.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk7.targets')" />
<Import Project="..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets" Condition="Exists('..\packages\Xamarin.Kotlin.StdLib.Jdk8.1.7.10\build\monoandroid12.0\Xamarin.Kotlin.StdLib.Jdk8.targets')" />
<Import Project="..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets" Condition="Exists('..\packages\Xamarin.KotlinX.Coroutines.Core.Jvm.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Core.Jvm.targets')" />
<Import Project="..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets" Condition="Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.2.5.1\build\monoandroid12.0\Xamarin.AndroidX.Lifecycle.ViewModelSavedState.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Activity.1.6.0\build\monoandroid12.0\Xamarin.AndroidX.Activity.targets')" />
<Import Project="..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets" Condition="Exists('..\packages\Xamarin.AndroidX.Fragment.1.5.3\build\monoandroid12.0\Xamarin.AndroidX.Fragment.targets')" />
@@ -379,4 +370,5 @@
<Import Project="..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Auth.Base.118.0.6\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.Base.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Fido.119.0.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Fido.targets')" />
<Import Project="..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets" Condition="Exists('..\packages\Xamarin.GooglePlayServices.Auth.120.4.0\build\MonoAndroid12.0\Xamarin.GooglePlayServices.Auth.targets')" />
<Import Project="..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets" Condition="Exists('..\packages\Xamarin.KotlinX.Coroutines.Android.1.6.4\build\monoandroid12.0\Xamarin.KotlinX.Coroutines.Android.targets')" />
</Project>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Google.Apis.Auth" publicKeyToken="4b01fa6e34db77ab" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.67.0.0" newVersion="1.67.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -24,8 +24,8 @@
<package id="Xamarin.AndroidX.VersionedParcelable" version="1.1.1.14" targetFramework="monoandroid13.0" />
<package id="Xamarin.AndroidX.ViewPager" version="1.0.0.14" targetFramework="monoandroid13.0" />
<package id="Xamarin.Build.Download" version="0.11.4" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Guava" version="28.2.0.1" targetFramework="monoandroid90" />
<package id="Xamarin.Google.Guava.FailureAccess" version="1.0.1.3" targetFramework="monoandroid90" />
<package id="Xamarin.Google.Guava" version="28.2.0.1" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Guava.FailureAccess" version="1.0.1.3" targetFramework="monoandroid13.0" />
<package id="Xamarin.Google.Guava.ListenableFuture" version="1.0.0.9" targetFramework="monoandroid13.0" />
<package id="Xamarin.GooglePlayServices.Auth" version="120.4.0" targetFramework="monoandroid13.0" />
<package id="Xamarin.GooglePlayServices.Auth.Api.Phone" version="118.0.1.2" targetFramework="monoandroid13.0" />

View File

@@ -27,7 +27,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "keepass2android-app", "keep
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kp2aAutofillParser", "Kp2aAutofillParser\Kp2aAutofillParser.csproj", "{39B12571-BAFE-4D3A-AEE2-4D74F14DFD96}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kp2aAutofillParserTest", "Kp2aAutofillParserTest\Kp2aAutofillParserTest.csproj", "{3D1560FF-86BB-4CB4-8367-80BA13B81C38}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Kp2aAutofillParserTest", "Kp2aAutofillParserTest\Kp2aAutofillParserTest.csproj", "{3D1560FF-86BB-4CB4-8367-80BA13B81C38}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@@ -185,7 +185,7 @@ namespace KeePassLib.Serialization
byte[] pbFile = StrUtil.Utf8.GetBytes(sb.ToString());
s = IOConnection.OpenWrite(iocLockFile);
if(s == null) throw new IOException(iocLockFile.GetDisplayName());
if(s == null) throw new IOException(UrlUtil.GetFileName(iocLockFile.Path));
s.Write(pbFile, 0, pbFile.Length);
}
finally { if(s != null) s.Close(); }
@@ -205,8 +205,7 @@ namespace KeePassLib.Serialization
if(lfiEx != null)
{
m_iocLockFile = null; // Otherwise Dispose deletes the existing one
throw new FileLockException(iocBaseFile.GetDisplayName(),
lfiEx.GetOwner());
throw new FileLockException(UrlUtil.GetFileName(iocBaseFile.Path), lfiEx.GetOwner());
}
LockFileInfo.Create(m_iocLockFile);

View File

@@ -28,6 +28,7 @@ using System.Diagnostics;
using KeePassLib.Resources;
using KeePassLib.Serialization;
using Android.Webkit;
namespace KeePassLib.Utility
{
@@ -411,7 +412,7 @@ Clipboard.SetText(ObjectsToMessage(vLines, true));*/
public static void ShowLoadWarning(IOConnectionInfo ioConnection, Exception ex)
{
if (ioConnection != null)
ShowLoadWarning(ioConnection.GetDisplayName(), ex, false);
ShowLoadWarning(UrlUtil.GetFileName(ioConnection.Path), ex, false);
else ShowWarning(ex);
}
@@ -444,7 +445,7 @@ Clipboard.SetText(ObjectsToMessage(vLines, true));*/
bool bCorruptionWarning)
{
if (ioConnection != null)
ShowSaveWarning(ioConnection.GetDisplayName(), ex, bCorruptionWarning);
ShowSaveWarning(UrlUtil.GetFileName(ioConnection.Path), ex, bCorruptionWarning);
else ShowWarning(ex);
}

View File

@@ -434,7 +434,7 @@ namespace Kp2aAutofillParser
public static List<string> ConvertToCanonicalLowerCaseHints(string[] supportedHints)
{
List<string> result = new List<string>();
foreach (string hint in supportedHints)
foreach (string hint in supportedHints.Where(h => h != null))
{
var canonicalHint = ToCanonicalHint(hint);
result.Add(canonicalHint.ToLower());
@@ -829,7 +829,7 @@ namespace Kp2aAutofillParser
// * if there is no such autofill hint, we use IsPassword to
HashSet<string> autofillHintsOfAllFields = autofillView.InputFields.Where(f => f.AutofillHints != null)
.SelectMany(f => f.AutofillHints).Select(AutofillHintsHelper.ToCanonicalHint).ToHashSet();
.SelectMany(f => f.AutofillHints).Where(x => x != null).Select(AutofillHintsHelper.ToCanonicalHint).ToHashSet();
bool hasLoginAutofillHints = autofillHintsOfAllFields.Intersect(_autofillHintsForLogin).Any();
if (hasLoginAutofillHints)
@@ -839,9 +839,9 @@ namespace Kp2aAutofillParser
string[] viewHints = viewNode.AutofillHints;
if (viewHints == null)
continue;
if (viewHints.Select(AutofillHintsHelper.ToCanonicalHint).Intersect(_autofillHintsForLogin).Any())
if (viewHints.Where(h => h != null).Select(AutofillHintsHelper.ToCanonicalHint).Intersect(_autofillHintsForLogin).Any())
{
AddFieldToHintMap(viewNode, viewHints.Select(AutofillHintsHelper.ToCanonicalHint).ToHashSet().ToArray());
AddFieldToHintMap(viewNode, viewHints.Where(h => h != null).Select(AutofillHintsHelper.ToCanonicalHint).ToHashSet().ToArray());
}
}

View File

@@ -6,7 +6,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>

View File

@@ -71,6 +71,12 @@ namespace Kp2aAutofillParserTest
var resourceName = "Kp2aAutofillParserTest.com-expressvpn-vpn-android13.json";
RunTestFromAutofillInput(resourceName, "com.expressvpn.vpn", null);
}
[Fact]
public void TestIgnoresAndroidSettings()
{
var resourceName = "Kp2aAutofillParserTest.android14-settings.json";
RunTestFromAutofillInput(resourceName, "com.android.settings", null);
}
private void RunTestFromAutofillInput(string resourceName, string expectedPackageName = null, string expectedWebDomain = null)
{

View File

@@ -9,6 +9,7 @@
</PropertyGroup>
<ItemGroup>
<None Remove="android14-settings.json" />
<None Remove="chrome-android10-amazon-it.json" />
<None Remove="com-expressvpn-vpn-android13.json" />
<None Remove="com-ifs-banking-fiid3364-android13.json" />
@@ -19,13 +20,13 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.1.2">
<PackageReference Include="coverlet.collector" Version="6.0.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
@@ -54,6 +55,9 @@
<EmbeddedResource Include="com-servicenet-mobile-no-focus.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="android14-settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="imdb.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>

View File

@@ -0,0 +1,99 @@
{
"InputFields": [
{
"IdEntry": null,
"Hint": null,
"ClassName": "android.widget.FrameLayout",
"AutofillHints": null,
"IsFocused": false,
"InputType": 0,
"HtmlInfoTag": null,
"HtmlInfoTypeAttribute": null
},
{
"IdEntry": "content_parent",
"Hint": null,
"ClassName": "android.widget.LinearLayout",
"AutofillHints": null,
"IsFocused": false,
"InputType": 0,
"HtmlInfoTag": null,
"HtmlInfoTypeAttribute": null
},
{
"IdEntry": "content_frame",
"Hint": null,
"ClassName": "android.widget.FrameLayout",
"AutofillHints": null,
"IsFocused": false,
"InputType": 0,
"HtmlInfoTag": null,
"HtmlInfoTypeAttribute": null
},
{
"IdEntry": "main_content",
"Hint": null,
"ClassName": "android.widget.FrameLayout",
"AutofillHints": null,
"IsFocused": false,
"InputType": 0,
"HtmlInfoTag": null,
"HtmlInfoTypeAttribute": null
},
{
"IdEntry": "password_entry",
"Hint": null,
"ClassName": "android.widget.EditText",
"AutofillHints": [
"passwordAuto"
],
"IsFocused": true,
"InputType": 18,
"HtmlInfoTag": null,
"HtmlInfoTypeAttribute": null,
"ExpectedAssignedHints": [ "password" ]
},
{
"IdEntry": "checkbox",
"Hint": null,
"ClassName": "android.widget.CheckBox",
"AutofillHints": null,
"IsFocused": false,
"InputType": 0,
"HtmlInfoTag": null,
"HtmlInfoTypeAttribute": null
},
{
"IdEntry": "button_bar",
"Hint": null,
"ClassName": "android.widget.RelativeLayout",
"AutofillHints": null,
"IsFocused": false,
"InputType": 0,
"HtmlInfoTag": null,
"HtmlInfoTypeAttribute": null
},
{
"IdEntry": "switch_bar",
"Hint": null,
"ClassName": "android.widget.LinearLayout",
"AutofillHints": null,
"IsFocused": false,
"InputType": 0,
"HtmlInfoTag": null,
"HtmlInfoTypeAttribute": null
},
{
"IdEntry": "action_bar",
"Hint": null,
"ClassName": "android.view.ViewGroup",
"AutofillHints": null,
"IsFocused": false,
"InputType": 0,
"HtmlInfoTag": null,
"HtmlInfoTypeAttribute": null
}
],
"PackageId": "com.android.settings",
"WebDomain": null
}

View File

@@ -124,7 +124,7 @@ namespace keepass2android.Io
&& File.Exists(VersionFilePath(ioc))
&& File.Exists(BaseVersionFilePath(ioc));
Kp2aLog.Log(ioc.GetDisplayName() + " isCached = " + result);
Kp2aLog.Log(GetDisplayName(ioc) + " isCached = " + result);
return result;
}
@@ -598,13 +598,14 @@ namespace keepass2android.Io
public string GetBaseVersionHash(IOConnectionInfo ioc)
{
string hash = File.ReadAllText(BaseVersionFilePath(ioc));
Kp2aLog.Log(ioc.GetDisplayName() + " baseVersionHash = " + hash);
Kp2aLog.Log(GetDisplayName(ioc) + " baseVersionHash = " + hash);
return hash;
}
public string GetLocalVersionHash(IOConnectionInfo ioc)
{
string hash = File.ReadAllText(VersionFilePath(ioc));
Kp2aLog.Log(ioc.GetDisplayName() + " localVersionHash = " + hash);
Kp2aLog.Log(GetDisplayName(ioc) + " localVersionHash = " + hash);
return hash;
}
public bool HasLocalChanges(IOConnectionInfo ioc)

View File

@@ -348,7 +348,7 @@ namespace keepass2android.Io
}
catch (Exception e)
{
throw new Exception("Error finding " + filename + " in " + folderPath.GetDisplayName(), e);
throw new Exception("Error finding " + filename + " in " + GetDisplayName(folderPath), e);
}
}

View File

@@ -1,31 +1,23 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using KeePassLib.Serialization;
#if !EXCLUDE_JAVAFILESTORAGE
using Keepass2android.Javafilestorage;
using Exception = Java.Lang.Exception;
namespace keepass2android.Io
{
public class OneDriveFileStorage: JavaFileStorage
/// <summary>
/// This IFileStorage implementation becomes picked if a user is using a skydrive:// or onedrive:// file.
/// These refer to an old (Java) implementation which was replaced starting in 2019. The successor uses onedrive2:// (see OneDrive2FileStorage)
/// The Java implementation was removed in 2024 when the jar files became unavailable. We are keeping this file to notify any user who haven't updated their
/// file storage within 5 years.
/// This file should be removed around mid 2025.
/// </summary>
public class OneDriveFileStorage: IFileStorage
{
private const string ClientId = "000000004010C234";
public OneDriveFileStorage(Context ctx, IKp2aApp app) :
base(new Keepass2android.Javafilestorage.OneDriveStorage(ctx, ClientId), app)
{
}
public override IEnumerable<string> SupportedProtocols
public IEnumerable<string> SupportedProtocols
{
get
{
@@ -34,10 +26,146 @@ namespace keepass2android.Io
}
}
public override bool UserShouldBackup
private Exception GetDeprecatedMessage()
{
return new Exception(
"You have opened your file through a deprecated Microsoft API. Please select Change database, Open Database and then select One Drive again.");
}
public bool UserShouldBackup
{
get { return false; }
}
}
public void Delete(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool CheckForFileChangeFast(IOConnectionInfo ioc, string previousFileVersion)
{
throw GetDeprecatedMessage();
}
public string GetCurrentFileVersionFast(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public Stream OpenFileForRead(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public IWriteTransaction OpenWriteTransaction(IOConnectionInfo ioc, bool useFileTransaction)
{
throw GetDeprecatedMessage();
}
public string GetFilenameWithoutPathAndExt(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public string GetFileExtension(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool RequiresCredentials(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public void CreateDirectory(IOConnectionInfo ioc, string newDirName)
{
throw GetDeprecatedMessage();
}
public IEnumerable<FileDescription> ListContents(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public FileDescription GetFileDescription(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool RequiresSetup(IOConnectionInfo ioConnection)
{
throw GetDeprecatedMessage();
}
public string IocToPath(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public void StartSelectFile(IFileStorageSetupInitiatorActivity activity, bool isForSave, int requestCode, string protocolId)
{
throw GetDeprecatedMessage();
}
public void PrepareFileUsage(IFileStorageSetupInitiatorActivity activity, IOConnectionInfo ioc, int requestCode,
bool alwaysReturnSuccess)
{
throw GetDeprecatedMessage();
}
public void PrepareFileUsage(Context ctx, IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public void OnCreate(IFileStorageSetupActivity activity, Bundle savedInstanceState)
{
throw GetDeprecatedMessage();
}
public void OnResume(IFileStorageSetupActivity activity)
{
throw GetDeprecatedMessage();
}
public void OnStart(IFileStorageSetupActivity activity)
{
throw GetDeprecatedMessage();
}
public void OnActivityResult(IFileStorageSetupActivity activity, int requestCode, int resultCode, Intent data)
{
throw GetDeprecatedMessage();
}
public string GetDisplayName(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public string CreateFilePath(string parent, string newFilename)
{
throw GetDeprecatedMessage();
}
public IOConnectionInfo GetParentPath(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public IOConnectionInfo GetFilePath(IOConnectionInfo folderPath, string filename)
{
throw GetDeprecatedMessage();
}
public bool IsPermanentLocation(IOConnectionInfo ioc)
{
throw GetDeprecatedMessage();
}
public bool IsReadOnly(IOConnectionInfo ioc, OptionalOut<UiStringKey> reason = null)
{
throw GetDeprecatedMessage();
}
}
}
#endif

View File

@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" InitialTargets="showFlavor">
<Target Name="showFlavor" AfterTargets="Build">
<Message Importance="high" Text="building flavor $(Flavor)"></Message>
</Target>
<Import Project="../build-properties.props"/>
<Target Name="showFlavor" AfterTargets="Build">
<Message Importance="high" Text="building flavor $(Flavor)">
</Message>
</Target>
<Import Project="../build-properties.props" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@@ -182,10 +183,10 @@
</ItemGroup>
<ItemGroup Condition=" '$(Flavor)'!='NoNet' ">
<PackageReference Include="FluentFTP">
<Version>48.0.0</Version>
<Version>51.1.0</Version>
</PackageReference>
<PackageReference Include="MegaApiClient">
<Version>1.10.3</Version>
<Version>1.10.4</Version>
</PackageReference>
<PackageReference Include="Microsoft.Graph">
<Version>1.21.0</Version>
@@ -312,4 +313,4 @@
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

View File

@@ -91,7 +91,29 @@ namespace keepass2android
}
private static String ExtractHost(String url)
public PwGroup SearchForUuid(Database database, string uuid)
{
SearchParameters sp = SearchParameters.None;
sp.SearchInUuids = true;
sp.SearchString = uuid;
if (sp.RegularExpression) // Validate regular expression
{
new Regex(sp.SearchString);
}
string strGroupName = _app.GetResourceString(UiStringKey.search_results);
PwGroup pgResults = new PwGroup(true, true, strGroupName, PwIcon.EMailSearch) { IsVirtual = true };
PwObjectList<PwEntry> listResults = pgResults.Entries;
database.Root.SearchEntries(sp, listResults, new NullStatusLogger());
return pgResults;
}
private static String ExtractHost(String url)
{
return UrlUtil.GetHost(url.Trim());
}

View File

@@ -72,8 +72,9 @@ namespace keepass2android
}
private IDatabaseFormat _databaseFormat = new KdbxDatabaseFormat(KdbxFormat.Default);
private bool? _hasTotpEntries;
public bool ReloadRequested { get; set; }
public bool ReloadRequested { get; set; }
public bool DidOpenFileChange()
{
@@ -104,8 +105,9 @@ namespace keepass2android
SearchHelper = new SearchDbHelper(app);
_databaseFormat = databaseFormat;
_hasTotpEntries = null;
CanWrite = databaseFormat.CanWrite && !fileStorage.IsReadOnly(iocInfo);
CanWrite = databaseFormat.CanWrite && !fileStorage.IsReadOnly(iocInfo);
}
/// <summary>
@@ -174,10 +176,17 @@ namespace keepass2android
PwGroup group = SearchHelper.SearchForExactUrl(this, url);
return group;
}
public PwGroup SearchForHost(String url, bool allowSubdomains) {
}
public PwGroup SearchForUuid(String uuid)
{
PwGroup group = SearchHelper.SearchForUuid(this, uuid);
return group;
}
public PwGroup SearchForHost(String url, bool allowSubdomains) {
PwGroup group = SearchHelper.SearchForHost(this, url, allowSubdomains);
return group;
@@ -193,8 +202,21 @@ namespace keepass2android
trans.CommitWrite();
}
}
_hasTotpEntries = null;
}
public bool HasTotpEntries
{
get
{
if (_hasTotpEntries == null)
{
_hasTotpEntries = true;
}
return _hasTotpEntries.Value;
}
}
private void PopulateGlobals(PwGroup currentGroup, bool checkForDuplicateUuids )
{

Binary file not shown.

Binary file not shown.

View File

@@ -56,7 +56,7 @@
<ItemGroup>
<None Include="Jars\AboutJars.txt" />
<None Include="Additions\AboutAdditions.txt" />
<LibraryProjectZip Include="Jars\pcloud-sdk-android-1.8.1.aar" />
<LibraryProjectZip Include="Jars\pcloud-sdk-android-1.9.1.aar" />
</ItemGroup>
<ItemGroup>
<TransformFile Include="Transforms\Metadata.xml" />
@@ -72,6 +72,6 @@
</Target>
-->
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\pcloud-sdk-java-core-1.8.1.jar" />
<EmbeddedReferenceJar Include="Jars\pcloud-sdk-java-core-1.9.1.jar" />
</ItemGroup>
</Project>

View File

@@ -4,11 +4,10 @@ android {
namespace 'keepass2android.javafilestorage'
compileSdkVersion 33
defaultConfig {
minSdkVersion 15
minSdkVersion 21
targetSdkVersion 33
compileSdk 34
}
buildTypes {
release {
@@ -22,6 +21,10 @@ android {
sourceCompatibility 11
targetCompatibility 11
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
}
}
/*
@@ -30,27 +33,21 @@ NOTE: If you change dependencies here, don't forget to update the jar files in J
dependencies {
implementation 'com.squareup.okhttp3:okhttp:4.10.0-RC1'
implementation 'com.burgstaller:okhttp-digest:2.5'
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
implementation 'io.github.rburgst:okhttp-digest:3.1.0'
implementation 'com.google.http-client:google-http-client-gson:1.20.0'
implementation('com.google.api-client:google-api-client-android:1.30.5') {
exclude group: 'com.google.android.google-play-services'
}
implementation 'com.google.apis:google-api-services-drive:v2-rev102-1.16.0-rc'
implementation 'com.dropbox.core:dropbox-core-sdk:4.0.0'
implementation 'com.dropbox.core:dropbox-core-sdk:5.4.6'
implementation 'com.google.api-client:google-api-client:1.30.5'
implementation 'com.google.api-client:google-api-client-android:1.30.5'
implementation 'com.google.android.gms:play-services-auth:20.4.0'
//onedrive:
implementation('com.onedrive.sdk:onedrive-sdk-android:1.2.0') {
transitive = false
}
implementation 'com.pcloud.sdk:java-core:1.8.1'
implementation 'com.pcloud.sdk:android:1.8.1'
implementation 'com.pcloud.sdk:java-core:1.9.1'
implementation 'com.pcloud.sdk:android:1.9.1'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.microsoft.services.msa:msa-auth:0.8.6'
implementation 'com.microsoft.aad:adal:1.14.0'
}

View File

@@ -1,436 +0,0 @@
package keepass2android.javafilestorage;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import androidx.annotation.NonNull;
import android.util.Log;
import com.onedrive.sdk.core.DefaultClientConfig;
import com.onedrive.sdk.core.IClientConfig;
import com.onedrive.sdk.core.OneDriveErrorCodes;
import com.onedrive.sdk.extensions.IItemCollectionPage;
import com.onedrive.sdk.extensions.IItemCollectionRequestBuilder;
import com.onedrive.sdk.extensions.IOneDriveClient;
import com.onedrive.sdk.extensions.Item;
import com.onedrive.sdk.extensions.OneDriveClient;
import com.onedrive.sdk.http.OneDriveServiceException;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Philipp on 20.11.2016.
*/
public class OneDriveStorage extends JavaFileStorageBase
{
final IClientConfig oneDriveConfig;
final keepass2android.javafilestorage.onedrive.MyMSAAuthenticator msaAuthenticator;
IOneDriveClient oneDriveClient;
public OneDriveStorage(final Context context, final String clientId) {
msaAuthenticator = new keepass2android.javafilestorage.onedrive.MyMSAAuthenticator(context) {
@Override
public String getClientId() {
return clientId;
}
@Override
public String[] getScopes() {
return new String[] { "offline_access", "onedrive.readwrite" };
}
};
oneDriveConfig = DefaultClientConfig.createWithAuthenticator(msaAuthenticator);
initAuthenticator(null);
}
@Override
public boolean requiresSetup(String path) {
return !isConnected(null);
}
@Override
public void startSelectFile(FileStorageSetupInitiatorActivity activity, boolean isForSave, int requestCode) {
initAuthenticator((Activity)activity.getActivity());
String path = getProtocolId()+":///";
Log.d("KP2AJ", "startSelectFile "+path+", connected: "+path);
if (isConnected(null))
{
Intent intent = new Intent();
intent.putExtra(EXTRA_IS_FOR_SAVE, isForSave);
intent.putExtra(EXTRA_PATH, path);
activity.onImmediateResult(requestCode, RESULT_FILECHOOSER_PREPARED, intent);
}
else
{
activity.startSelectFileProcess(path, isForSave, requestCode);
}
}
private boolean isConnected(Activity activity) {
if (oneDriveClient == null)
{
try
{
Log.d("KP2AJ", "trying silent login");
if (msaAuthenticator.loginSilent() != null)
{
Log.d("KP2AJ", "ok: silent login");
oneDriveClient = buildClient(activity);
}
else Log.d("KP2AJ", "trying silent login failed.");
}
catch (Exception e)
{
e.printStackTrace();
}
}
return oneDriveClient != null;
}
private void initAuthenticator(Activity activity) {
msaAuthenticator.init(
oneDriveConfig.getExecutors(),
oneDriveConfig.getHttpProvider(),
activity,
oneDriveConfig.getLogger());
}
@Override
public void prepareFileUsage(FileStorageSetupInitiatorActivity activity, String path, int requestCode, boolean alwaysReturnSuccess) {
initAuthenticator((Activity)activity.getActivity());
if (isConnected((Activity)activity.getActivity()))
{
Intent intent = new Intent();
intent.putExtra(EXTRA_PATH, path);
activity.onImmediateResult(requestCode, RESULT_FILEUSAGE_PREPARED, intent);
}
else
{
activity.startFileUsageProcess(path, requestCode, alwaysReturnSuccess);
}
}
@Override
public String getProtocolId() {
return "onedrive";
}
@Override
public void prepareFileUsage(Context appContext, String path) throws UserInteractionRequiredException {
if (!isConnected(null))
{
throw new UserInteractionRequiredException();
}
}
@Override
public void onCreate(FileStorageSetupActivity activity, Bundle savedInstanceState) {
Log.d("KP2AJ", "OnCreate");
}
@Override
public void onResume(final FileStorageSetupActivity activity) {
}
private IOneDriveClient buildClient(Activity activity) {
return new OneDriveClient.Builder()
.fromConfig(oneDriveConfig)
.loginAndBuildClient(activity);
}
String getPathFromSkydrivePath(String skydrivePath)
{
String path = "";
if (skydrivePath.equals(""))
return "";
String[] parts = skydrivePath.split("/");
for (int i = 0; i < parts.length; i++) {
String part = parts[i];
logDebug("parsing part " + part);
int indexOfSeparator = part.lastIndexOf(NAME_ID_SEP);
if (indexOfSeparator < 0) {
// seems invalid, but we're very generous here
path += "/" + part;
continue;
}
String name = part.substring(0, indexOfSeparator);
try {
name = decode(name);
} catch (UnsupportedEncodingException e) {
// ignore
}
path += "/" + name;
}
logDebug("return " +path + ". original was " + skydrivePath);
return path;
}
String removeProtocol(String path) throws Exception {
if (path == null)
return null;
if (path.startsWith("skydrive"))
return getPathFromSkydrivePath(path.substring("skydrive://".length()));
return path.substring(getProtocolId().length()+3);
}
@Override
public String getDisplayName(String path) {
if (path == null)
return null;
if (path.startsWith("skydrive"))
return getProtocolId()+"://"+getPathFromSkydrivePath(path.substring("skydrive://".length()));
return path;
}
@Override
public String getFilename(String path) throws Exception {
return path.substring(path.lastIndexOf("/")+1);
}
@Override
public boolean checkForFileChangeFast(String path, String previousFileVersion) throws Exception {
return false;
}
@Override
public String getCurrentFileVersionFast(String path) {
return null;
}
@Override
public InputStream openFileForRead(String path) throws Exception {
try {
path = removeProtocol(path);
logDebug("openFileForRead. Path="+path);
InputStream result = oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(path)
.getContent()
.buildRequest()
.get();
logDebug("ok");
return result;
}
catch (OneDriveServiceException e)
{
throw convertException(e);
}
}
private Exception convertException(OneDriveServiceException e) {
if (e.isError(OneDriveErrorCodes.ItemNotFound))
return new FileNotFoundException(e.getMessage());
return e;
}
@Override
public void uploadFile(String path, byte[] data, boolean writeTransactional) throws Exception {
try {
path = removeProtocol(path);
oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(path)
.getContent()
.buildRequest()
.put(data);
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@Override
public String createFolder(String parentPath, String newDirName) throws Exception {
throw new Exception("not implemented.");
}
@Override
public String createFilePath(String parentPath, String newFileName) throws Exception {
String path = parentPath;
if (!path.endsWith("/"))
path = path + "/";
path = path + newFileName;
return path;
}
@Override
public List<FileEntry> listFiles(String parentPath) throws Exception {
try {
ArrayList<FileEntry> result = new ArrayList<FileEntry>();
parentPath = removeProtocol(parentPath);
IItemCollectionPage itemsPage = oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(parentPath)
.getChildren()
.buildRequest()
.get();
if (parentPath.endsWith("/"))
parentPath = parentPath.substring(0,parentPath.length()-1);
while (true)
{
List<Item> items = itemsPage.getCurrentPage();
if (items.isEmpty())
return result;
for (Item i: items)
{
FileEntry e = getFileEntry(parentPath + "/" + i.name, i);
Log.d("KP2AJ", e.path);
result.add(e);
}
IItemCollectionRequestBuilder nextPageReqBuilder = itemsPage.getNextPage();
if (nextPageReqBuilder == null)
return result;
itemsPage = nextPageReqBuilder.buildRequest().get();
}
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@NonNull
private FileEntry getFileEntry(String path, Item i) {
FileEntry e = new FileEntry();
if (i.size != null)
e.sizeInBytes = i.size;
else if ((i.remoteItem != null) && (i.remoteItem.size != null))
e.sizeInBytes = i.remoteItem.size;
e.displayName = i.name;
e.canRead = e.canWrite = true;
e.path = getProtocolId() +"://"+path;
if (i.lastModifiedDateTime != null)
e.lastModifiedTime = i.lastModifiedDateTime.getTimeInMillis();
else if ((i.remoteItem != null)&&(i.remoteItem.lastModifiedDateTime != null))
e.lastModifiedTime = i.remoteItem.lastModifiedDateTime.getTimeInMillis();
e.isDirectory = (i.folder != null) || ((i.remoteItem != null) && (i.remoteItem.folder != null));
return e;
}
@Override
public FileEntry getFileEntry(String filename) throws Exception {
try {
filename = removeProtocol(filename);
Item item = oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(filename)
.buildRequest()
.get();
return getFileEntry(filename, item);
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@Override
public void delete(String path) throws Exception {
try {
path = removeProtocol(path);
oneDriveClient.getDrive()
.getRoot()
.getItemWithPath(path)
.buildRequest()
.delete();
} catch (OneDriveServiceException e) {
throw convertException(e);
}
}
@Override
public void onStart(final FileStorageSetupActivity activity) {
Log.d("KP2AJ", "onStart");
if (activity.getProcessName().equals(PROCESS_NAME_SELECTFILE))
activity.getState().putString(EXTRA_PATH, activity.getPath());
JavaFileStorage.FileStorageSetupActivity storageSetupAct = activity;
if (oneDriveClient != null) {
Log.d("KP2AJ", "auth successful");
try {
finishActivityWithSuccess(activity);
return;
} catch (Exception e) {
Log.d("KP2AJ", "finish with error: " + e.toString());
finishWithError(activity, e);
return;
}
}
{
Log.d("KP2AJ", "Starting auth");
new AsyncTask<Object, Object, Object>() {
@Override
protected Object doInBackground(Object... params) {
try {
return buildClient((Activity) activity);
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(Object o) {
if (o == null)
{
Log.i(TAG, "authenticating not successful");
Intent data = new Intent();
data.putExtra(EXTRA_ERROR_MESSAGE, "authenticating not succesful");
((Activity)activity).setResult(Activity.RESULT_CANCELED, data);
((Activity)activity).finish();
}
else
{
Log.i(TAG, "authenticating successful");
oneDriveClient = (IOneDriveClient) o;
finishActivityWithSuccess(activity);
}
}
}.execute();
}
}
@Override
public void onActivityResult(FileStorageSetupActivity activity, int requestCode, int resultCode, Intent data) {
}
}

View File

@@ -1,102 +0,0 @@
package keepass2android.javafilestorage.onedrive;
/**
* Created by Philipp on 22.11.2016.
*/
import com.microsoft.services.msa.LiveConnectSession;
import com.onedrive.sdk.authentication.AccountType;
import com.onedrive.sdk.authentication.IAccountInfo;
import com.onedrive.sdk.authentication.MSAAccountInfo;
import com.onedrive.sdk.authentication.MSAAuthenticator;
import com.onedrive.sdk.logger.ILogger;
import com.microsoft.services.msa.LiveConnectSession;
import com.onedrive.sdk.logger.ILogger;
/**
* Account information for a MSA based account.
*/
public class MyMSAAccountInfo implements IAccountInfo {
/**
* The service root for the OneDrive personal API.
*/
public static final String ONE_DRIVE_PERSONAL_SERVICE_ROOT = "https://api.onedrive.com/v1.0";
/**
* The authenticator that can refresh this account.
*/
private final MyMSAAuthenticator mAuthenticator;
/**
* The session this account is based off of.
*/
private LiveConnectSession mSession;
/**
* The logger.
*/
private final ILogger mLogger;
/**
* Creates an MSAAccountInfo object.
* @param authenticator The authenticator that this account info was created from.
* @param liveConnectSession The session this account is based off of.
* @param logger The logger.
*/
public MyMSAAccountInfo(final MyMSAAuthenticator authenticator,
final LiveConnectSession liveConnectSession,
final ILogger logger) {
mAuthenticator = authenticator;
mSession = liveConnectSession;
mLogger = logger;
}
/**
* Get the type of the account.
* @return The MicrosoftAccount account type.
*/
@Override
public AccountType getAccountType() {
return AccountType.MicrosoftAccount;
}
/**
* Get the access token for requests against the service root.
* @return The access token for requests against the service root.
*/
@Override
public String getAccessToken() {
return mSession.getAccessToken();
}
/**
* Get the OneDrive service root for this account.
* @return the OneDrive service root for this account.
*/
@Override
public String getServiceRoot() {
return ONE_DRIVE_PERSONAL_SERVICE_ROOT;
}
/**
* Indicates if the account access token is expired and needs to be refreshed.
* @return true if refresh() needs to be called and
* false if the account is still valid.
*/
@Override
public boolean isExpired() {
return mSession.isExpired();
}
/**
* Refreshes the authentication token for this account info.
*/
@Override
public void refresh() {
mLogger.logDebug("Refreshing access token...");
final MyMSAAccountInfo newInfo = (MyMSAAccountInfo)mAuthenticator.loginSilent();
mSession = newInfo.mSession;
}
}

View File

@@ -1,446 +0,0 @@
package keepass2android.javafilestorage.onedrive;
/**
* Created by Philipp on 22.11.2016.
*/
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import com.microsoft.onedrivesdk.BuildConfig;
import com.microsoft.services.msa.LiveAuthClient;
import com.microsoft.services.msa.LiveAuthException;
import com.microsoft.services.msa.LiveAuthListener;
import com.microsoft.services.msa.LiveConnectSession;
import com.microsoft.services.msa.LiveStatus;
import com.onedrive.sdk.authentication.ClientAuthenticatorException;
import com.onedrive.sdk.authentication.IAccountInfo;
import com.onedrive.sdk.authentication.IAuthenticator;
import com.onedrive.sdk.authentication.MSAAccountInfo;
import com.onedrive.sdk.concurrency.ICallback;
import com.onedrive.sdk.core.ClientException;
import com.onedrive.sdk.concurrency.SimpleWaiter;
import com.onedrive.sdk.concurrency.IExecutors;
import com.onedrive.sdk.core.OneDriveErrorCodes;
import com.onedrive.sdk.http.IHttpProvider;
import com.onedrive.sdk.logger.ILogger;
import java.security.InvalidParameterException;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference;
/**
* Wrapper around the MSA authentication library.
* https://github.com/MSOpenTech/msa-auth-for-android
*/
@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
public abstract class MyMSAAuthenticator implements IAuthenticator {
private final Context mContext;
public MyMSAAuthenticator(Context context)
{
mContext = context;
}
/**
* The sign in cancellation message.
*/
private static final String SIGN_IN_CANCELLED_MESSAGE = "The user cancelled the login operation.";
/**
* The preferences for this authenticator.
*/
private static final String MSA_AUTHENTICATOR_PREFS = "MSAAuthenticatorPrefs";
/**
* The key for the user id.
*/
private static final String USER_ID_KEY = "userId";
/**
* The key for the version code
*/
public static final String VERSION_CODE_KEY = "versionCode";
/**
* The default user id
*/
private static final String DEFAULT_USER_ID = "@@defaultUser";
/**
* The active user id.
*/
private final AtomicReference<String> mUserId = new AtomicReference<>();
/**
* The executors.
*/
private IExecutors mExecutors;
/**
* Indicates whether this authenticator has been initialized.
*/
private boolean mInitialized;
/**
* The context UI interactions should happen with.
*/
private Activity mActivity;
/**
* The logger.
*/
private ILogger mLogger;
/**
* The client id for this authenticator.
* https://dev.onedrive.com/auth/msa_oauth.htm#to-register-your-app
* @return The client id.
*/
public abstract String getClientId();
/**
* The scopes for this application.
* https://dev.onedrive.com/auth/msa_oauth.htm#authentication-scopes
* @return The scopes for this application.
*/
public abstract String[] getScopes();
/**
* The live authentication client.
*/
private LiveAuthClient mAuthClient;
/**
* Initializes the authenticator.
* @param executors The executors to schedule foreground and background tasks.
* @param httpProvider The http provider for sending requests.
* @param activity The activity to create interactive UI on.
* @param logger The logger for diagnostic information.
*/
@Override
public synchronized void init(final IExecutors executors,
final IHttpProvider httpProvider,
final Activity activity,
final ILogger logger) {
mActivity = activity;
if (mInitialized) {
return;
}
mExecutors = executors;
mLogger = logger;
mInitialized = true;
mAuthClient = new LiveAuthClient(mContext, getClientId(), Arrays.asList(getScopes()));
final SharedPreferences prefs = getSharedPreferences();
mUserId.set(prefs.getString(USER_ID_KEY, null));
}
/**
* Starts an interactive login asynchronously.
* @param emailAddressHint The hint for the email address during the interactive login.
* @param loginCallback The callback to be called when the login is complete.
*/
@Override
public void login(final String emailAddressHint, final ICallback<IAccountInfo> loginCallback) {
Log.d("KP2AJ", "login()");
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
if (loginCallback == null) {
throw new InvalidParameterException("loginCallback");
}
mLogger.logDebug("Starting login async");
mExecutors.performOnBackground(new Runnable() {
@Override
public void run() {
try {
mExecutors.performOnForeground(login(emailAddressHint), loginCallback);
} catch (final ClientException e) {
mExecutors.performOnForeground(e, loginCallback);
}
}
});
}
/**
* Starts an interactive login.
* @param emailAddressHint The hint for the email address during the interactive login.
* @return The account info.
* @throws ClientException An exception occurs if the login was unable to complete for any reason.
*/
@Override
public synchronized IAccountInfo login(final String emailAddressHint) throws ClientException {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
mLogger.logDebug("Starting login");
final AtomicReference<ClientException> error = new AtomicReference<>();
final SimpleWaiter waiter = new SimpleWaiter();
final LiveAuthListener listener = new LiveAuthListener() {
@Override
public void onAuthComplete(final LiveStatus liveStatus,
final LiveConnectSession liveConnectSession,
final Object o) {
if (liveStatus == LiveStatus.NOT_CONNECTED) {
mLogger.logDebug("Received invalid login failure from silent authentication with MSA, ignoring.");
} else {
mLogger.logDebug("Successful interactive login");
waiter.signal();
}
}
@Override
public void onAuthError(final LiveAuthException e,
final Object o) {
OneDriveErrorCodes code = OneDriveErrorCodes.AuthenticationFailure;
if (e.getError().equals(SIGN_IN_CANCELLED_MESSAGE)) {
code = OneDriveErrorCodes.AuthenticationCancelled;
}
error.set(new ClientAuthenticatorException("Unable to login with MSA", e, code));
mLogger.logError(error.get().getMessage(), error.get());
waiter.signal();
}
};
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mAuthClient.login(mActivity, /* scopes */null, /* user object */ null, emailAddressHint, listener);
}
});
mLogger.logDebug("Waiting for MSA callback");
waiter.waitForSignal();
final ClientException exception = error.get();
if (exception != null) {
throw exception;
}
final String userId;
if (emailAddressHint != null) {
userId = emailAddressHint;
} else {
userId = DEFAULT_USER_ID;
}
mUserId.set(userId);
final SharedPreferences prefs = getSharedPreferences();
prefs.edit()
.putString(USER_ID_KEY, mUserId.get())
.putInt(VERSION_CODE_KEY, BuildConfig.VERSION_CODE)
.apply();
return getAccountInfo();
}
/**
* Starts a silent login asynchronously.
* @param loginCallback The callback to be called when the login is complete.
*/
@Override
public void loginSilent(final ICallback<IAccountInfo> loginCallback) {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
if (loginCallback == null) {
throw new InvalidParameterException("loginCallback");
}
mLogger.logDebug("Starting login silent async");
mExecutors.performOnBackground(new Runnable() {
@Override
public void run() {
try {
mExecutors.performOnForeground(loginSilent(), loginCallback);
} catch (final ClientException e) {
mExecutors.performOnForeground(e, loginCallback);
}
}
});
}
/**
* Starts a silent login.
* @return The account info.
* @throws ClientException An exception occurs if the login was unable to complete for any reason.
*/
@Override
public synchronized IAccountInfo loginSilent() throws ClientException {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
mLogger.logDebug("Starting login silent");
final int userIdStoredMinVersion = 10112;
if (getSharedPreferences().getInt(VERSION_CODE_KEY, 0) >= userIdStoredMinVersion
&& mUserId.get() == null) {
mLogger.logDebug("No login information found for silent authentication");
return null;
}
final SimpleWaiter loginSilentWaiter = new SimpleWaiter();
final AtomicReference<ClientException> error = new AtomicReference<>();
final boolean waitForCallback = mAuthClient.loginSilent(new LiveAuthListener() {
@Override
public void onAuthComplete(final LiveStatus liveStatus,
final LiveConnectSession liveConnectSession,
final Object o) {
if (liveStatus == LiveStatus.NOT_CONNECTED) {
error.set(new ClientAuthenticatorException("Failed silent login, interactive login required",
OneDriveErrorCodes.AuthenticationFailure));
mLogger.logError(error.get().getMessage(), error.get());
} else {
mLogger.logDebug("Successful silent login");
}
loginSilentWaiter.signal();
}
@Override
public void onAuthError(final LiveAuthException e,
final Object o) {
OneDriveErrorCodes code = OneDriveErrorCodes.AuthenticationFailure;
if (e.getError().equals(SIGN_IN_CANCELLED_MESSAGE)) {
code = OneDriveErrorCodes.AuthenticationCancelled;
}
error.set(new ClientAuthenticatorException("Login silent authentication error", e, code));
mLogger.logError(error.get().getMessage(), error.get());
loginSilentWaiter.signal();
}
});
if (!waitForCallback) {
mLogger.logDebug("MSA silent auth fast-failed");
return null;
}
mLogger.logDebug("Waiting for MSA callback");
loginSilentWaiter.waitForSignal();
final ClientException exception = error.get();
if (exception != null) {
throw exception;
}
return getAccountInfo();
}
/**
* Log the current user out.
* @param logoutCallback The callback to be called when the logout is complete.
*/
@Override
public void logout(final ICallback<Void> logoutCallback) {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
if (logoutCallback == null) {
throw new InvalidParameterException("logoutCallback");
}
mLogger.logDebug("Starting logout async");
mExecutors.performOnBackground(new Runnable() {
@Override
public void run() {
try {
logout();
mExecutors.performOnForeground((Void) null, logoutCallback);
} catch (final ClientException e) {
mExecutors.performOnForeground(e, logoutCallback);
}
}
});
}
/**
* Log the current user out.
* @throws ClientException An exception occurs if the logout was unable to complete for any reason.
*/
@Override
public synchronized void logout() throws ClientException {
if (!mInitialized) {
throw new IllegalStateException("init must be called");
}
mLogger.logDebug("Starting logout");
final SimpleWaiter logoutWaiter = new SimpleWaiter();
final AtomicReference<ClientException> error = new AtomicReference<>();
mAuthClient.logout(new LiveAuthListener() {
@Override
public void onAuthComplete(final LiveStatus liveStatus,
final LiveConnectSession liveConnectSession,
final Object o) {
mLogger.logDebug("Logout completed");
logoutWaiter.signal();
}
@Override
public void onAuthError(final LiveAuthException e, final Object o) {
error.set(new ClientAuthenticatorException("MSA Logout failed",
e,
OneDriveErrorCodes.AuthenticationFailure));
mLogger.logError(error.get().getMessage(), error.get());
logoutWaiter.signal();
}
});
mLogger.logDebug("Waiting for logout to complete");
logoutWaiter.waitForSignal();
mLogger.logDebug("Clearing all MSA Authenticator shared preferences");
final SharedPreferences prefs = getSharedPreferences();
prefs.edit()
.clear()
.putInt(VERSION_CODE_KEY, BuildConfig.VERSION_CODE)
.apply();
mUserId.set(null);
final ClientException exception = error.get();
if (exception != null) {
throw exception;
}
}
/**
* Gets the current account info for this authenticator.
* @return NULL if no account is available.
*/
@Override
public IAccountInfo getAccountInfo() {
final LiveConnectSession session = mAuthClient.getSession();
if (session == null) {
return null;
}
return new MyMSAAccountInfo(this, session, mLogger);
}
/**
* Gets the shared preferences for this authenticator.
* @return The shared preferences.
*/
private SharedPreferences getSharedPreferences() {
return mContext.getSharedPreferences(MSA_AUTHENTICATOR_PREFS, Context.MODE_PRIVATE);
}
}

View File

@@ -6,7 +6,7 @@ buildscript {
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
}
}

View File

@@ -1 +1,2 @@
org.gradle.jvmargs=-Xmx1536m
android.useAndroidX=true

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -1,13 +1,3 @@
package com.crocoapps.javafilestoragetest2;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
*/
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
}

View File

@@ -145,7 +145,9 @@ import java.util.ArrayList;
import java.util.List;
//import keepass2android.javafilestorage.DropboxCloudRailStorage;
import keepass2android.javafilestorage.DropboxV2Storage;
import keepass2android.javafilestorage.GoogleDriveAppDataFileStorage;
import keepass2android.javafilestorage.ICertificateErrorHandler;
import keepass2android.javafilestorage.JavaFileStorage;
import keepass2android.javafilestorage.JavaFileStorage.FileEntry;
import keepass2android.javafilestorage.PCloudFileStorage;
@@ -347,7 +349,7 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
fileList = fs.listFiles(path);
checkFileList(path, fileList, false, true); //second param indicates the file must be gone
Log.d("KP2AJ", "Delete a folder recursive");
Log.d("KP2AJ", "xDelete a folder recursive: " + subfolderPath);
fs.delete(subfolderPath);
Log.d("KP2AJ", "List files again to check if deleting the folder was successful:");
@@ -540,12 +542,12 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
static JavaFileStorage createStorageToTest(Context ctx, Context appContext, boolean simulateRestart) {
//storageToTest = new SftpStorage(ctx.getApplicationContext());
storageToTest = new PCloudFileStorage(ctx, "FLm22de7bdS", "pcloud", "pcloudtest");
//storageToTest = new PCloudFileStorage(ctx, "FLm22de7bdS", "pcloud", "pcloudtest");
//storageToTest = new SkyDriveFileStorage("000000004010C234", appContext);
//storageToTest = new GoogleDriveAppDataFileStorage();
/*storageToTest = new WebDavStorage(new ICertificateErrorHandler() {
storageToTest = new WebDavStorage(new ICertificateErrorHandler() {
@Override
public boolean onValidationError(String error) {
return false;
@@ -555,7 +557,7 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
public boolean alwaysFailOnValidationError() {
return false;
}
});*/
});
//storageToTest = new DropboxV2Storage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);
//storageToTest = new DropboxFileStorage(ctx,"4ybka4p4a1027n6", "1z5lv528un9nre8", !simulateRestart);

View File

@@ -15,7 +15,7 @@
android:layout_height="wrap_content"
android:singleLine="true"
android:inputType="textNoSuggestions"
android:text="https://daigers.diskstation.me:5006/Keepass2Android/Apps/Keepass2Android/"
android:text="https://webdav.hidrive.ionos.com/users/philippcro"
android:hint="Server URL" />
</LinearLayout>
<EditText
@@ -23,7 +23,7 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="Keepass"
android:text="PhilippCro"
android:hint="@string/hint_username" />
<EditText
@@ -32,7 +32,7 @@
android:layout_height="wrap_content"
android:inputType="textPassword"
android:singleLine="true"
android:text="$T3st17$"
android:text="WSBa1wh4o4YyLK"
android:hint="@string/hint_pass"
android:importantForAccessibility="no" />

View File

@@ -7,7 +7,7 @@ buildscript {
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -4,11 +4,13 @@ android {
namespace 'keepass2android.kp2akeytransform'
compileSdkVersion 33
defaultConfig {
ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
minSdkVersion 21
targetSdkVersion 34
compileSdk 34
}

View File

@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
}
}

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -3,10 +3,12 @@ android {
namespace 'keepass2android.softkeyboard'
compileSdkVersion 33
defaultConfig {
minSdkVersion 18
minSdkVersion 21
compileSdk 34
targetSdk 34
}
buildTypes {

View File

@@ -47,15 +47,15 @@
<!-- Category title for text prediction -->
<string name="prediction_category">Instellingen voor woordsuggesties</string>
<!-- Description for text prediction -->
<string name="prediction_summary">Automatisch voltooien tijdens typen inschakelen</string>
<string name="prediction_summary">Automatisch aanvullen tijdens typen inschakelen</string>
<!-- Dialog title for auto complete choices -->
<string name="auto_complete_dialog_title">Automatisch voltooien</string>
<string name="auto_complete_dialog_title">Automatisch aanvullen</string>
<!-- Option to enable text prediction in landscape -->
<string name="prediction_landscape">Tekstveld vergroten</string>
<!-- Description for text prediction -->
<string name="prediction_landscape_summary">Woordsuggesties verbergen in liggende weergave</string>
<!-- Option to enable auto capitalization of sentences -->
<string name="auto_cap">Auto-hoofdlettergebruik</string>
<string name="auto_cap">Automatisch hoofdlettergebruik</string>
<!-- Description for auto cap -->
<string name="auto_cap_summary">Hoofdletter gebruiken aan het begin van een zin</string>
<!-- Option to enable auto punctuate -->
@@ -64,15 +64,15 @@
<!-- Option to enable quick fixes -->
<string name="quick_fixes">Snelle oplossingen</string>
<!-- Description for quick fixes -->
<string name="quick_fixes_summary">Hiermee worden veelvoorkomende typefouten gecorrigeerd</string>
<string name="quick_fixes_summary">Corrigeert veelgemaakte typefouten</string>
<!-- Option to enable showing suggestions -->
<string name="show_suggestions">Suggesties weergeven</string>
<!-- Description for show suggestions -->
<string name="show_suggestions_summary">Voorgestelde woorden weergeven tijdens typen</string>
<string name="show_suggestions_summary">Woordsuggesties tijdens het typen tonen</string>
<!-- Option to enable auto completion -->
<string name="auto_complete">Auto-aanvullen</string>
<!-- Description for auto completion -->
<string name="auto_complete_summary">Gemarkeerd woord automatisch invoegen met spatiebalk en interpunctie</string>
<string name="auto_complete_summary">Spatiebalk en interpunctie voegen automatisch gemarkeerd woord in</string>
<!-- Option to show/hide the settings key -->
<string name="prefs_settings_key">Instellingscode weergeven</string>
<!-- Array of the settings key mode values -->

View File

@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
}
}

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -18,6 +18,10 @@ android {
debuggable false
}
}
buildFeatures {
buildConfig true
}
compileOptions {
targetCompatibility 11
sourceCompatibility 11

View File

@@ -42,7 +42,7 @@
<string name="afc_pmsg_file_has_been_deleted">%1$s「%2$s」が削除されました</string>
<string name="afc_pmsg_filename_is_directory">「%1$s」はフォルダーです</string>
<string name="afc_pmsg_filename_is_invalid">ファイル名「%1$s」は無効です</string>
<string name="afc_pmsg_max_file_count_allowed">ファイルが多すぎます。最大: %1$,d</string>
<string name="afc_pmsg_max_file_count_allowed">…のファイルが多すぎます。最大: %1$,d</string>
<string name="afc_pmsg_unknown_error">不明なエラー: %1$s</string>
<string name="afc_root">ルート</string>
<string name="afc_title_advanced_selection">選択…</string>

View File

@@ -36,9 +36,9 @@
<string name="afc_pmsg_cannot_access_dir">Geen toegang tot \"%1$s\"</string>
<string name="afc_pmsg_cannot_create_folder">Kan map \"%1$s\" niet maken</string>
<string name="afc_pmsg_cannot_delete_file">Kan %1$s \"%2$s\" niet verwijderen</string>
<string name="afc_pmsg_confirm_delete_file">Weet je zeker dat je deze %1$s wilt verwijderen: \"%2$s\"?</string>
<string name="afc_pmsg_confirm_delete_file">Weet je zeker dat je dit wilt verwijderen: %1$s \"%2$s\"?</string>
<string name="afc_pmsg_confirm_replace_file">Het bestand \"%1$s\" bestaat al.\n\nWilt u het vervangen?</string>
<string name="afc_pmsg_deleting_file">%1$s \"%2$s\" verwijderen</string>
<string name="afc_pmsg_deleting_file">Verwijdert %1$s \"%2$s\" …</string>
<string name="afc_pmsg_file_has_been_deleted">%1$s \"%2$s\" is verwijderd</string>
<string name="afc_pmsg_filename_is_directory">\"%1$s\" is een map</string>
<string name="afc_pmsg_filename_is_invalid">Bestandsnaam \"%1$s\" is ongeldig</string>
@@ -56,15 +56,15 @@
<string name="afc_title_sort_by">Sorteer op…</string>
<string name="afc_yesterday">Gisteren</string>
<plurals name="afc_title_choose_directories">
<item quantity="one">Kies map&#8230;</item>
<item quantity="other">Kies mappen&#8230;</item>
<item quantity="one">Kies map</item>
<item quantity="other">Kies mappen</item>
</plurals>
<plurals name="afc_title_choose_files">
<item quantity="one">Kies bestand&#8230;</item>
<item quantity="other">Kies bestanden&#8230;</item>
<item quantity="one">Kies bestand</item>
<item quantity="other">Kies bestanden</item>
</plurals>
<plurals name="afc_title_choose_files_directories">
<item quantity="one">Kies bestand/ map&#8230;</item>
<item quantity="other">Kies bestanden/ mappen&#8230;</item>
<item quantity="one">Kies bestand/ map</item>
<item quantity="other">Kies bestanden/ mappen</item>
</plurals>
</resources>

View File

@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
classpath "com.android.tools.build:gradle:8.4.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View File

@@ -1,6 +1,6 @@
#Tue Sep 20 20:32:06 CEST 2016
#Tue Oct 08 15:41:22 CEST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip

View File

@@ -27,6 +27,7 @@ namespace keepass2android
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(ctx, Android.Resource.Style.ThemeHoloLightDialog));
builder.SetTitle(ctx.GetString(Resource.String.ChangeLog_title));
List<string> changeLog = new List<string>{
BuildChangelogString(ctx, new List<int>{Resource.Array.ChangeLog_1_11,Resource.Array.ChangeLog_1_11_net}, "1.11"),
BuildChangelogString(ctx, Resource.Array.ChangeLog_1_10, "1.10"),
BuildChangelogString(ctx, Resource.Array.ChangeLog_1_09e, "1.09e"),
BuildChangelogString(ctx, Resource.Array.ChangeLog_1_09d, "1.09d"),
@@ -122,21 +123,32 @@ namespace keepass2android
}
private static string BuildChangelogString(Context ctx, int changeLogResId, string version)
{
string result = "Version " + version + "\n";
{
return BuildChangelogString(ctx, new List<int>() { changeLogResId }, version);
}
private static string BuildChangelogString(Context ctx, List<int> changeLogResIds, string version)
{
string result = "Version " + version + "\n";
string previous = "";
foreach (var item in ctx.Resources.GetStringArray(changeLogResId))
foreach (var changeLogResId in changeLogResIds)
{
if (item == previous) //there was some trouble with crowdin translations, remove duplicates
continue;
result += " * " + item + "\n";
previous = item;
foreach (var item in ctx.Resources.GetStringArray(changeLogResId))
{
if (item == previous) //there was some trouble with crowdin translations, remove duplicates
continue;
result += " * " + item + "\n";
previous = item;
}
}
return result;
return result;
}
}
private const string HtmlStart = @"<html>
private const string HtmlStart = @"<html>
<head>
<style type='text/css'>
a { color:#000000 }

View File

@@ -32,6 +32,7 @@ using Android.Text.Method;
using System.Globalization;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using Android.Content.PM;
using Android.Webkit;
using Android.Graphics;
@@ -49,7 +50,9 @@ using PluginTOTP;
using File = Java.IO.File;
using Uri = Android.Net.Uri;
using keepass2android.fileselect;
using KeeTrayTOTP.Libraries;
using Boolean = Java.Lang.Boolean;
using Android.Util;
namespace keepass2android
{
@@ -286,6 +289,8 @@ namespace keepass2android
extraGroup.AddView(view.View);
}
SetPasswordStyle();
//update the Entry output in the App database and notify the CopyToClipboard service
if (App.Kp2a.LastOpenedEntry != null)
@@ -488,10 +493,11 @@ namespace keepass2android
_pluginFieldReceiver = new PluginFieldReceiver(this);
RegisterReceiver(_pluginFieldReceiver, new IntentFilter(Strings.ActionSetEntryField));
new Thread(NotifyPluginsOnOpen).Start();
var notifyPluginsOnOpenThread = new Thread(NotifyPluginsOnOpen);
notifyPluginsOnOpenThread.Start();
//the rest of the things to do depends on the current app task:
AppTask.CompleteOnCreateEntryActivity(this);
AppTask.CompleteOnCreateEntryActivity(this, notifyPluginsOnOpenThread);
}
private void RemoveFromHistory()
@@ -664,7 +670,7 @@ namespace keepass2android
EditModeBase editMode = new DefaultEdit();
if (KpEntryTemplatedEdit.IsTemplated(App.Kp2a.CurrentDb, this.Entry))
editMode = new KpEntryTemplatedEdit(App.Kp2a.CurrentDb, this.Entry);
foreach (var key in editMode.SortExtraFieldKeys(Entry.Strings.GetKeys().Where(key=> !PwDefs.IsStandardField(key))))
foreach (var key in editMode.SortExtraFieldKeys(Entry.Strings.GetKeys().Where(key=> !PwDefs.IsStandardField(key) && key != Kp2aTotp.TotpKey)))
{
if (editMode.IsVisible(key))
{
@@ -715,7 +721,7 @@ namespace keepass2android
var stringView = new ExtraStringView(layout, valueView, valueViewVisible, keyView);
_stringViews.Add(key, stringView);
RegisterTextPopup(valueViewContainer, valueViewContainer.FindViewById(Resource.Id.extra_vdots), key, isProtected);
RegisterTextPopup(valueViewContainer, valueViewContainer.FindViewById(Resource.Id.extra_vdots), key, isProtected, layout);
return stringView;
@@ -725,6 +731,7 @@ namespace keepass2android
private List<IPopupMenuItem> RegisterPopup(string popupKey, View clickView, View anchorView)
{
clickView.Click += (sender, args) =>
{
ShowPopup(anchorView, popupKey);
@@ -840,7 +847,7 @@ namespace keepass2android
{
if (!_showPassword.ContainsKey(protectedTextView))
{
_showPassword[protectedTextView] = fieldKey == UpdateTotpTimerTask.TotpKey ? _showTotpDefault : _showPasswordDefault;
_showPassword[protectedTextView] = fieldKey == Kp2aTotp.TotpKey ? _showTotpDefault : _showPasswordDefault;
}
var protectedTextviewGroup = new ProtectedTextviewGroup { ProtectedField = protectedTextView, VisibleProtectedField = visibleTextView};
_protectedTextViews.Add(protectedTextviewGroup);
@@ -937,34 +944,41 @@ namespace keepass2android
iv.SetImageDrawable(Resources.GetDrawable(Resource.Drawable.ic00));
}
SupportActionBar.Title = Entry.Strings.ReadSafe(PwDefs.TitleField);
SupportActionBar.SetDisplayHomeAsUpEnabled(true);
SupportActionBar.Title = SprEngine.Compile(SupportActionBar.Title, new SprContext(Entry, App.Kp2a.CurrentDb.KpDatabase, SprCompileFlags.All));
SupportActionBar.SetDisplayHomeAsUpEnabled(true);
SupportActionBar.SetHomeButtonEnabled(true);
PopulateGroupText (Resource.Id.entry_group_name, Resource.Id.entryfield_group_container, KeyGroupFullPath);
PopulateStandardText(Resource.Id.entry_user_name, Resource.Id.entryfield_container_username, PwDefs.UserNameField);
PopulateStandardText(Resource.Id.entry_url, Resource.Id.entryfield_container_url, PwDefs.UrlField);
PopulateStandardText(new List<int> { Resource.Id.entry_password, Resource.Id.entry_password_visible}, Resource.Id.entryfield_container_password, PwDefs.PasswordField);
PopulateStandardText(new List<int> { Resource.Id.entry_totp, Resource.Id.entry_totp_visible }, Resource.Id.entryfield_container_totp, Kp2aTotp.TotpKey);
PopulateStandardText(new List<int> { Resource.Id.entry_password, Resource.Id.entry_password_visible}, Resource.Id.entryfield_container_password, PwDefs.PasswordField);
RegisterProtectedTextView(PwDefs.PasswordField, FindViewById<TextView>(Resource.Id.entry_password), FindViewById<TextView>(Resource.Id.entry_password_visible));
RegisterProtectedTextView(Kp2aTotp.TotpKey, FindViewById<TextView>(Resource.Id.entry_totp), FindViewById<TextView>(Resource.Id.entry_totp_visible));
RegisterTextPopup(FindViewById<RelativeLayout> (Resource.Id.groupname_container),
FindViewById (Resource.Id.entry_group_name), KeyGroupFullPath);
RegisterTextPopup(FindViewById<RelativeLayout> (Resource.Id.groupname_container),
FindViewById (Resource.Id.entry_group_name), KeyGroupFullPath,
FindViewById(Resource.Id.entryfield_group_container));
RegisterTextPopup(FindViewById<RelativeLayout>(Resource.Id.username_container),
FindViewById(Resource.Id.username_vdots), PwDefs.UserNameField);
FindViewById(Resource.Id.username_vdots), PwDefs.UserNameField,
FindViewById(Resource.Id.entryfield_container_username));
RegisterTextPopup(FindViewById<RelativeLayout>(Resource.Id.url_container),
FindViewById(Resource.Id.url_vdots), PwDefs.UrlField)
FindViewById(Resource.Id.url_vdots), PwDefs.UrlField,
FindViewById(Resource.Id.entryfield_container_url))
.Add(new GotoUrlMenuItem(this, PwDefs.UrlField));
RegisterTextPopup(FindViewById<RelativeLayout>(Resource.Id.password_container),
FindViewById(Resource.Id.password_vdots), PwDefs.PasswordField);
FindViewById(Resource.Id.password_vdots), PwDefs.PasswordField,
FindViewById(Resource.Id.entryfield_container_password));
RegisterTextPopup(FindViewById<RelativeLayout>(Resource.Id.totp_container),
FindViewById(Resource.Id.totp_vdots), Kp2aTotp.TotpKey, FindViewById(Resource.Id.entryfield_container_totp));
PopulateText(Resource.Id.entry_created, Resource.Id.entryfield_container_created, getDateTime(Entry.CreationTime));
PopulateText(Resource.Id.entry_created, Resource.Id.entryfield_container_created, getDateTime(Entry.CreationTime));
PopulateText(Resource.Id.entry_modified, Resource.Id.entryfield_container_modified, getDateTime(Entry.LastModificationTime));
if (Entry.Expires)
@@ -978,7 +992,8 @@ namespace keepass2android
}
PopulateStandardText(Resource.Id.entry_comment, Resource.Id.entryfield_container_comment, PwDefs.NotesField);
RegisterTextPopup(FindViewById<RelativeLayout>(Resource.Id.comment_container),
FindViewById(Resource.Id.comment_vdots), PwDefs.NotesField);
FindViewById(Resource.Id.comment_vdots), PwDefs.NotesField,
FindViewById(Resource.Id.entryfield_container_comment));
PopulateText(Resource.Id.entry_tags, Resource.Id.entryfield_container_tags, concatTags(Entry.Tags));
PopulateText(Resource.Id.entry_override_url, Resource.Id.entryfield_container_overrideurl, Entry.OverrideUrl);
@@ -991,6 +1006,40 @@ namespace keepass2android
SetPasswordStyle();
}
private async Task UpdateTotpCountdown()
{
if (App.Kp2a.LastOpenedEntry == null)
return;
var totpData = new Kp2aTotp().TryGetTotpData(App.Kp2a.LastOpenedEntry);
if (totpData == null || !totpData.IsTotpEntry)
return;
var totpProvider = new TOTPProvider(totpData);
var progressBar = FindViewById<ProgressBar>(Resource.Id.TotpCountdownProgressBar);
int lastSecondsLeft = -1;
while (!isPaused && progressBar != null)
{
int secondsLeft = totpProvider.Timer;
if (secondsLeft != lastSecondsLeft)
{
lastSecondsLeft = secondsLeft;
// Update the progress bar on the UI thread
RunOnUiThread(() =>
{
progressBar.Progress = secondsLeft;
progressBar.Max = totpProvider.Duration;
});
}
await Task.Delay(1000);
}
}
private void PopulatePreviousVersions()
{
@@ -1041,12 +1090,12 @@ namespace keepass2android
SendBroadcast(i);
}
}
private List<IPopupMenuItem> RegisterTextPopup(View container, View anchor, string fieldKey)
private List<IPopupMenuItem> RegisterTextPopup(View container, View anchor, string fieldKey, View outerContainer)
{
return RegisterTextPopup(container, anchor, fieldKey, Entry.Strings.GetSafe(fieldKey).IsProtected);
return RegisterTextPopup(container, anchor, fieldKey, Entry.Strings.GetSafe(fieldKey).IsProtected || fieldKey == Kp2aTotp.TotpKey, outerContainer);
}
private List<IPopupMenuItem> RegisterTextPopup(View container, View anchor, string fieldKey, bool isProtected)
private List<IPopupMenuItem> RegisterTextPopup(View container, View anchor, string fieldKey, bool isProtected, View outerContainer)
{
string popupKey = Strings.PrefixString + fieldKey;
var popupItems = RegisterPopup(
@@ -1056,10 +1105,20 @@ namespace keepass2android
popupItems.Add(new CopyToClipboardPopupMenuIcon(this, _stringViews[fieldKey], isProtected));
if (isProtected)
{
var valueView = container.FindViewById<TextView>(fieldKey == PwDefs.PasswordField ? Resource.Id.entry_password : Resource.Id.entry_extra);
var valueView = container.FindViewById<TextView>(fieldKey switch
{
PwDefs.PasswordField => Resource.Id.entry_password,
Kp2aTotp.TotpKey => Resource.Id.entry_totp,
_ => Resource.Id.entry_extra
});
popupItems.Add(new ToggleVisibilityPopupMenuItem(this, valueView));
}
//copy text to clipboard when the outer container (including the field icon on the left) or the inner container
// (containing the textview and the vertical dots for the popup menu) is long-clicked.
RegisterCopyOnLongClick(outerContainer, fieldKey, isProtected);
RegisterCopyOnLongClick(container, fieldKey, isProtected);
if (fieldKey != PwDefs.UrlField //url already has a go-to-url menu
&& (_stringViews[fieldKey].Text.StartsWith(KeePass.AndroidAppScheme)
|| _stringViews[fieldKey].Text.StartsWith("http://")
@@ -1070,6 +1129,11 @@ namespace keepass2android
return popupItems;
}
private void RegisterCopyOnLongClick(View container, string fieldKey, bool isProtected)
{
container.LongClick += (sender, args) =>
CopyToClipboardService.CopyValueToClipboardWithTimeout(this, _stringViews[fieldKey].Text, isProtected);
}
private void ShowPopup(View anchor, string popupKey)
@@ -1136,6 +1200,8 @@ namespace keepass2android
value = SprEngine.Compile(value, new SprContext(Entry, App.Kp2a.CurrentDb.KpDatabase, SprCompileFlags.All));
PopulateText(viewIds, containerViewId, value);
_stringViews.Add(key, new StandardStringView(viewIds, containerViewId, this));
}
private void PopulateGroupText(int viewId, int containerViewId, String key)
@@ -1283,11 +1349,16 @@ namespace keepass2android
return base.OnPrepareOptionsMenu(menu);
}
bool isPaused = false;
protected override void OnPause()
{
base.OnPause();
isPaused = true;
}
private void UpdateTogglePasswordMenu()
private void UpdateTogglePasswordMenu()
{
IMenuItem togglePassword = _menu.FindItem(Resource.Id.menu_toggle_pass);
if (_showPassword.Values.All(x => x))
@@ -1324,7 +1395,9 @@ namespace keepass2android
ClearCache();
base.OnResume();
_activityDesign.ReapplyTheme();
}
isPaused = false;
Task.Run(UpdateTotpCountdown);
}
public void ClearCache()
{

View File

@@ -39,6 +39,9 @@ using Android.Support.V4.View;
using Android.Views.Autofill;
using CursorAdapter = Android.Support.V4.Widget.CursorAdapter;
using Object = Java.Lang.Object;
using Android.Text;
using keepass2android.search;
using KeeTrayTOTP.Libraries;
namespace keepass2android
{
@@ -115,6 +118,8 @@ namespace keepass2android
FindViewById(Resource.Id.fabAddNewEntry).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabAddNew).Visibility = (showAddGroup || showAddEntry) ? ViewStates.Visible : ViewStates.Gone;
FindViewById(Resource.Id.fabSearch).Visibility = (showAddGroup || showAddEntry) ? ViewStates.Visible : ViewStates.Gone;
FindViewById(Resource.Id.fabTotpOverview).Visibility = CanShowTotpFab() ? ViewStates.Visible : ViewStates.Gone;
}
UpdateBottomBarElementVisibility(Resource.Id.insert_element, false);
@@ -262,6 +267,7 @@ namespace keepass2android
private bool hasCalledOtherActivity = false;
private IMenuItem searchItem;
private IMenuItem searchItemDummy;
private bool isPaused;
protected override void OnResume()
{
@@ -281,8 +287,39 @@ namespace keepass2android
RefreshIfDirty();
SetSearchItemVisibility();
}
isPaused = false;
System.Threading.Tasks.Task.Run(UpdateTotpCountdown);
}
private async System.Threading.Tasks.Task UpdateTotpCountdown()
{
while (!isPaused )
{
RunOnUiThread(() =>
{
var listView = FragmentManager.FindFragmentById<GroupListFragment>(Resource.Id.list_fragment)
.ListView;
if (listView != null)
{
int count = listView.Count;
for (int i = 0; i < count; i++)
{
var item = listView.GetChildAt(i);
if (item is PwEntryView)
{
var entryView = (PwEntryView)item;
entryView.UpdateTotp();
}
}
}
});
await System.Threading.Tasks.Task.Delay(1000);
}
}
private void UpdateInfotexts()
{
@@ -390,6 +427,13 @@ namespace keepass2android
}
protected override void OnPause()
{
base.OnPause();
isPaused = true;
}
private void UpdatePostNotificationsPermissionInfo(bool hideForever=false)
{
const string prefsKey = "DidShowNotificationPermissionInfo";
@@ -572,6 +616,25 @@ namespace keepass2android
};
}
if (FindViewById(Resource.Id.fabSearch) != null)
{
FindViewById(Resource.Id.fabSearch).Click += (sender, args) =>
{
if (searchView?.Iconified != false)
ActivateSearchView();
else
searchView.Iconified = true;
};
}
if (FindViewById(Resource.Id.fabTotpOverview) != null)
{
FindViewById(Resource.Id.fabTotpOverview).Click += (sender, args) =>
{
SearchTotpResults.Launch(this, this.AppTask);
};
}
if (FindViewById(Resource.Id.fabCancelAddNew) != null)
{
FindViewById(Resource.Id.fabAddNew).Click += (sender, args) =>
@@ -580,6 +643,8 @@ namespace keepass2android
FindViewById(Resource.Id.fabAddNewGroup).Visibility = AddGroupEnabled ? ViewStates.Visible : ViewStates.Gone;
FindViewById(Resource.Id.fabAddNewEntry).Visibility = AddEntryEnabled ? ViewStates.Visible : ViewStates.Gone;
FindViewById(Resource.Id.fabAddNew).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabSearch).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabTotpOverview).Visibility = ViewStates.Gone;
};
FindViewById(Resource.Id.fabCancelAddNew).Click += (sender, args) =>
@@ -588,6 +653,8 @@ namespace keepass2android
FindViewById(Resource.Id.fabAddNewGroup).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabAddNewEntry).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabAddNew).Visibility = ViewStates.Visible;
FindViewById(Resource.Id.fabSearch).Visibility = ViewStates.Visible;
FindViewById(Resource.Id.fabTotpOverview).Visibility = CanShowTotpFab() ? ViewStates.Visible : ViewStates.Gone;
};
@@ -667,7 +734,12 @@ namespace keepass2android
}
protected virtual bool CanShowTotpFab()
{
return App.Kp2a.CurrentDb.HasTotpEntries && Group == App.Kp2a.CurrentDb.Root;
}
private bool IsTimeForInfotext(out string lastInfoText)
{
DateTime lastDisplayTime = new DateTime(_prefs.GetLong("LastInfoTextTime", 0));
@@ -1028,6 +1100,7 @@ namespace keepass2android
searchView.Iconified = false;
AppTask.CanActivateSearchViewOnStart = false;
}
@@ -1067,6 +1140,15 @@ namespace keepass2android
public abstract ElementAndDatabaseId FullGroupId { get; }
public virtual bool MayPreviewTotp
{
get
{
return !PreferenceManager.GetDefaultSharedPreferences(this).GetBoolean(GetString(Resource.String.masktotp_key),
Resources.GetBoolean(Resource.Boolean.masktotp_default));
}
}
public override bool OnPrepareOptionsMenu(IMenu menu)
{
@@ -1267,6 +1349,7 @@ namespace keepass2android
FindViewById(Resource.Id.fabAddNewGroup).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabAddNewEntry).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabAddNew).Visibility = ViewStates.Gone;
FindViewById(Resource.Id.fabSearch).Visibility = ViewStates.Gone;
UpdateBottomBarElementVisibility(Resource.Id.insert_element, true);
UpdateBottomBarElementVisibility(Resource.Id.cancel_insert_element, true);
@@ -1330,6 +1413,7 @@ namespace keepass2android
}
ListView.ItemClick += (sender, args) => ((GroupListItemView)args.View).OnClick();
StyleListView();

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="198"
android:versionName="1.10-pre"
android:versionCode="200"
android:versionName="1.11-r0"
package="keepass2android.keepass2android"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="auto">

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="197"
android:versionName="1.09e-r7"
android:versionCode="200"
android:versionName="1.11-r0"
package="keepass2android.keepass2android_nonet"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="auto">
@@ -40,7 +40,7 @@
</intent>
</queries>
<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="33" />
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
<permission android:description="@string/permission_desc2" android:icon="@drawable/ic_launcher_offline" android:label="KP2A entry search" android:name="keepass2android.keepass2android_nonet.permission.KP2aInternalSearch" android:protectionLevel="signature" />
<permission android:description="@string/permission_desc3" android:icon="@drawable/ic_launcher_offline" android:label="KP2A choose autofill dataset" android:name="keepass2android.keepass2android_nonet.permission.Kp2aChooseAutofill" android:protectionLevel="signature" />
<application

View File

@@ -140,7 +140,7 @@ namespace keepass2android
//will return the results later
Intent i = new Intent(this, typeof (SelectCurrentDbActivity));
//don't show user notifications when an entry is opened.
var task = new SearchUrlTask() {UrlToSearchFor = _requestedUrl, ShowUserNotifications = ShowUserNotificationsMode.WhenTotp};
var task = new SearchUrlTask() {UrlToSearchFor = _requestedUrl, ShowUserNotifications = ActivationCondition.WhenTotp, ActivateKeyboard = ActivationCondition.Never };
task.ToIntent(i);
StartActivityForResult(i, RequestCodeQuery);
_startedQuery = true;

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -61,6 +61,28 @@
android:layout_width="wrap_content"
android:text="group detail"
style="@style/GroupDetailInSearchResult" />
<LinearLayout
android:id="@+id/totp_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/totp_text"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:text=""/>
<ProgressBar
android:id="@+id/TotpCountdownProgressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="30dp" />
</LinearLayout>
</LinearLayout>
<ImageView android:id="@+id/right_arrow"

View File

@@ -184,6 +184,68 @@
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/entryfield_container_totp"
style="@style/EntryEditSingleLine_container">
<ImageView
style="@style/EntryEditSingleLine_ImageView"
android:src="@drawable/ic_entry_totp" />
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="vertical">
<!-- TOTP -->
<TextView
android:id="@+id/entry_totp_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/TOTP"
style="@style/EntryFieldHeader" />
<RelativeLayout
android:id="@+id/totp_container"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal"
android:clickable="true"
android:background="?android:attr/selectableItemBackground">
<ImageView
android:id="@+id/totp_vdots"
android:layout_width="wrap_content"
android:layout_height="15dp"
android:src="@drawable/vdots"
android:gravity="right|bottom"
android:layout_alignParentRight="true" />
<TextView
android:id="@+id/entry_totp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:password="true"
android:typeface="monospace"
android:layout_toLeftOf="@id/totp_vdots"
style="@style/EntryItem" />
<TextView
android:id="@+id/entry_totp_visible"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/totp_vdots"
style="@style/EntryItem" />
</RelativeLayout>
<ProgressBar
android:id="@+id/TotpCountdownProgressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="30dp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/entryfield_container_comment"
style="@style/EntryEditSingleLine_container">

View File

@@ -400,5 +400,23 @@
android:layout_marginRight="16dp"
android:layout_marginBottom="160dp"
android:visibility="gone"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fabSearch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom|right"
android:src="@drawable/ic_fab_search"
android:layout_marginRight="16dp"
android:layout_marginBottom="88dp"
android:visibility="gone"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fabTotpOverview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom|right"
android:src="@drawable/ic_fab_totp"
android:layout_marginRight="16dp"
android:layout_marginBottom="160dp"
android:visibility="gone"/>
</android.support.design.widget.CoordinatorLayout>
</RelativeLayout>

View File

@@ -22,8 +22,8 @@
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">مهلة التطبيق</string>
<string name="app_timeout_summary">المدة الزمنية قبل تأمين قاعدة البيانات في حال كان التطبيق غير نشط.</string>
<string name="kill_app_label">إنهاء عملية التطبيق</string>
<string name="show_kill_app">زر الإغلاق</string>
<string name="kill_app_label">إنهاء عملية التطبيق</string>
<string name="show_kill_app_summary">عرض زر في شاشة كلمة المرور للإقاف معالجة التطبيق (للمستخدمين المتخوفين)</string>
<string name="application">التطبيق</string>
<string name="application_settings">إعدادات التطبيق</string>
@@ -667,32 +667,7 @@
<item>قم بالتبديل إلى API BometricPrompt لتحسين تجربة المستخدم مع فتح بصمة الإصبع والسماح باستخدام إلغاء قفل الوجه، على سبيل المثال على Pixel 4.</item>
<item>إصلاح الأخطاء</item>
</string-array>
<string name="ChangeLog_0_8_3"><b>الإصدار 0.8.3</b>\n
* يتم عرض رقم التسلسل لاسم المستخدم/\"رقم العملية\" في قائمة القيود\n
* يمكن إنشاء القيود عندما لا يقوم البحث في المتصفح بعرض نتائج\n
* لوحة مفاتيح KP2A تقدم إمكانية البحث عن بيانات الدخول للتطبيق الحالي\n
* يتم إغلاق التطبيق تلقائيًا عند تحديد قيد للاستخدام في لوحة المفاتيح\n
* صندوق اختيار لوحة المفاتيح يظهر تلقائيًا بعد البحث عن رابط (راجع الإعدادات)\n
* يتم استبدال نصوص التلميح في حقول القيد قبل النسخ (يدعم معظم نصوص التلميح)\n
* إصلاحات لبعض الأخطاء البسيطة </string>
<string name="ChangeLog_keptDonate">تمديد إمكانية التبرع ببيرة أو أي شيء آخر</string>
<string name="ChangeLog_0_7"><b>الإصدار 0.7</b>\n
* زيادة سرعة التحميل: التحويلات الأساسية الآن ×10 مرات أسرع!\n
* إضافة لوحة مفاتيح Keepass2Android: بدّل إلى هذه اللوحة عند أدخال بيانات الدخول. يحميك هذا من برامج التقاط نقرات لوحة المفاتيح (عطّل إشعارات حافظة لوحة المفاتيح القديمة في الخيارات)\n
* إضافة زر للتبرع ببيرة أو أي شيء آخر (انظر للقائمة)</string>
<string name="ChangeLog"><b>الإصدار 0.6.2</b>\n
* التكامل مع Google Drive/Dropbox...: استخدم تطبيق Google Drive وDropbox الرسمي وقم بفتح ملفات (.kdbx). الآن هذا سيقوم بفتح KP2A.\n
*تحسين صندوق حوار البحث\n
* تحسين نتائج البحث لـ \"مشاركة رابط\" مع نطاقات فرعية\n
* إضافة خيارات لتقديم الآراء، التقييمات وترجمة التطبيق في القائمة\n
\n
<b>الإصدار 0.6.1</b>\n
* يتم الآن الكشف عن التغييرات الخارجية على قاعدة البيانات (مثال: بسبب المزامنة)\n
* تحسين البحث عن الروابط من المتصفح\n
* صندوق حوار للتأكيد على تجاهل التغييرات\n
\n
<b>الإصدار 0.6</b>\n
أول إصدار علني </string>
<string-array name="clipboard_timeout_options">
<item>30 ثانية</item>
<item>دقيقة</item>

View File

@@ -17,8 +17,8 @@
<string name="app_name_nonet">Keepass2Android Xətdən Kənar</string>
<string name="short_app_name_nonet">KP2A Xətdən Kənar</string>
<string name="app_timeout">Tətbiq istifadə vaxtı</string>
<string name="kill_app_label">Tətbiqi bağla</string>
<string name="show_kill_app">Bağla düyməsi</string>
<string name="kill_app_label">Tətbiqi bağla</string>
<string name="application">Tətbiq</string>
<string name="application_settings">Tətbiq tənzimləmələri</string>
<string name="ShowGroupnameInSearchResult_title">Qrup adını axtarış nəticələrində göstər</string>

View File

@@ -22,8 +22,8 @@
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">Час чакання праграмы</string>
<string name="app_timeout_summary">Час да блакавання базы даных пры бяздзейнасці.</string>
<string name="kill_app_label">Прымусовае спыненне</string>
<string name="show_kill_app">Кнопка закрыцця</string>
<string name="kill_app_label">Прымусовае спыненне</string>
<string name="show_kill_app_summary">Паказваць на экране пароля кнопку закрыцця праграмы</string>
<string name="application">Праграма</string>
<string name="application_settings">Налады праграмы</string>
@@ -726,34 +726,7 @@
<item>Пераключэнне на BiometricPrompt API для паляпшэння ўзаемадзеяння з дапамогай разблакавання адбіткам пальца і тварам, напрыклад на Pixel 4.</item>
<item>Выпраўленні хібаў</item>
</string-array>
<string name="ChangeLog_0_8_3"><b>Version 0.8.3</b>\n
* Username/TAN index displayed in entry list (see settings)\n
* Entries can be created if search from browser doesn\'t return results\n
* KP2A keyboard provides possibility to search for credentials for current app\n
* App automatically closes after selecting an entry for use in keyboard\n
* Keyboard selection dialog automatically opens after search for URL (see settings)\n
* Placeholders in entry fields are replaced before copying (most placeholders supported)\n
* minor bug fixes
</string>
<string name="ChangeLog_keptDonate">Дадатковыя спосабы ахвяравання</string>
<string name="ChangeLog_0_7"><b>Version 0.7</b>\n
* Increased loading speed: key transformations now 10x faster!\n
* Added Keepass2Android soft-keyboard: Switch to this keyboard for entering credentials. Shields you from clipboard-based password sniffers (disable old clipboard notifications in the options)\n
* Added option to donate a beer or something else (see menu)</string>
<string name="ChangeLog"><b>Version 0.6.2</b>\n
* Google Drive/Dropbox/... integration: Use the official Google Drive or Dropbox App and open any .kdbx-file. This will now bring up KP2A.\n
* Improved Search Dialog \n
* Improved search results for Share URL with subdomains\n
* Added options to give feedback, and rate and translate the app in the menu\n
\n
<b>Version 0.6.1</b>\n
* Detect when database changes in the background (i.e. due to activity of a sync app)\n
* Improved searching for URLs from the browser\n
* Confirm dialog when discarding changes\n
\n
<b>Version 0.6</b>\n
Initial public release
</string>
<string-array name="clipboard_timeout_options">
<item>30 секунд</item>
<item>1 хвіліна</item>

View File

@@ -22,8 +22,8 @@
<string name="short_app_name_nonet">KP2A fora de línia</string>
<string name="app_timeout">Temps límit de resposta de l\'aplicació</string>
<string name="app_timeout_summary">Temps abans de bloquejar la base de dades quan l\'aplicació està inactiva.</string>
<string name="kill_app_label">Matar el procés de l\'aplicació</string>
<string name="show_kill_app">Botó de tancament</string>
<string name="kill_app_label">Matar el procés de l\'aplicació</string>
<string name="show_kill_app_summary">Mostra un botó a la pantalla de contrasenya per matar el procés de l\'aplicació (per a usuaris paranoics)</string>
<string name="application">Aplicació</string>
<string name="application_settings">Configuració de l\'aplicació</string>
@@ -639,34 +639,7 @@
<item>Correcció d\'errors</item>
<item>Correcció d\'errors</item>
</string-array>
<string name="ChangeLog_0_8_3"><b>Version 0.8.3</b>\n
* Username/TAN index displayed in entry list (see settings)\n
* Entries can be created if search from browser doesn\'t return results\n
* KP2A keyboard provides possibility to search for credentials for current app\n
* App automatically closes after selecting an entry for use in keyboard\n
* Keyboard selection dialog automatically opens after search for URL (see settings)\n
* Placeholders in entry fields are replaced before copying (most placeholders supported)\n
* minor bug fixes
</string>
<string name="ChangeLog_keptDonate">Estesa possibilitat de donar una cervesa o una altra cosa</string>
<string name="ChangeLog_0_7"><b>Version 0.7</b>\n
* Increased loading speed: key transformations now 10x faster!\n
* Added Keepass2Android soft-keyboard: Switch to this keyboard for entering credentials. Shields you from clipboard-based password sniffers (disable old clipboard notifications in the options)\n
* Added option to donate a beer or something else (see menu)</string>
<string name="ChangeLog"><b>Version 0.6.2</b>\n
* Integració amb Google Drive/Dropbox/... : Compatible amb l\'APP oficial Google Drive o Dropbox i permet obrir el fitxer .kdbx que necessitis. Suport el teclat KP2A.\n
* Dialeg de cerca millorat \n
* Resultats de cerca millorats per a poder compartir URLs amb subdominis\n
* Opcions de feedback afegides per reportar problemes, i valoració i traducció de l\'aplicació al mateix menú\n
\n
<b>Version 0.6.1</b>\n
* Detecta quan la base de dades canvia en segon pla (per exemple degut a l\'activitat de sincronització de l\'aplicació)\n
* Cerca millorada per a URLs des de l\'explorador d\'internet\n
* Dialeg de confirmació quan descartes canvis\n
\n
<b>Version 0.6</b>\n
Revisió inicial per al públic
</string>
<string-array name="clipboard_timeout_options">
<item>30 segons</item>
<item>1 minut</item>

View File

@@ -22,8 +22,8 @@
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">Vypršel časový limit aplikace</string>
<string name="app_timeout_summary">Čas, po který, při neaktivitě aplikace, databáze zůstane odemčená.</string>
<string name="kill_app_label">Ukončit proces aplikace</string>
<string name="show_kill_app">Tlačítko Zavřít</string>
<string name="kill_app_label">Ukončit proces aplikace</string>
<string name="show_kill_app_summary">Zobrazit tlačítko pro ukončení aplikace na obrazovce s heslem (pro paranoidní uživatele)</string>
<string name="application">Aplikace</string>
<string name="application_settings">Nastavení aplikace</string>
@@ -402,6 +402,14 @@
<string name="ShowSeparateNotifications_summary">Zobrazit oddělená upozornění pro kopírování uživatelského jména a hesla do schránky a pro aktivování klávesnice.</string>
<string name="AccServiceAutoFill_prefs">Služba automatického doplňování</string>
<string name="AutoFill_prefs">Služba automatického vyplňování</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">Při automatickém vyplňování položky pomocí TOTP zobrazit oznámení položky s tlačítkem Kopírovat TOTP.</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">Zobrazit oznámení položky</string>
<string name="AutoFillTotp_prefs_title">Automatické vyplňování položek TOTP</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">Zkopírovat TOTP do schránky</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">Při automatickém vyplňování položky pomocí TOTP zkopírujte TOTP do schránky</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">Při automatickém vyplňování položky pomocí TOTP aktivujte vestavěnou klávesnici. Klávesnice má tlačítko TOTP.</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">Aktivace vestavěné klávesnice</string>
<string name="TotpCopiedToClipboard">Zkopírováno TOTP do schránky</string>
<string name="ShowKp2aKeyboardNotification_title">Notifikace klávesnice KP2A</string>
<string name="ShowKp2aKeyboardNotification_summary">Zpřístupnit celý záznam pomocí klávesnice KP2A (doporučeno).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Přepnout klávesnici</string>
@@ -589,6 +597,7 @@
<string name="CouldntLoadChalAuxFile_Hint">Použijte zásuvný modul KeeChallenge v KeePass 2.x (PC) pro konfiguraci databáze k používání s odpověďmi na výzvy!</string>
<string name="ErrorUpdatingChalAuxFile">Chyba při aktualizaci pomocného souboru OTP!</string>
<string name="TrayTotp_SeedField_title">Název \"seed\" položky TOTP</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">Pokud používáte Keepass 2 modul \"TrayTotp\" v ne-výchozím nastavení, zadejte název položky \"seed\" podle nastavení na PC.</string>
<string name="TrayTotp_SettingsField_title">Nastavení jména TOTP položky</string>
<string name="TrayTotp_SettingsField_summary">Zde zadejte název položky \"nastavení\" pro TrayTotp.</string>
@@ -664,6 +673,24 @@
<string name="Continue">Pokračovat</string>
<string name="NoFilenameWarning">Adresa URI, kterou jste zadali, nevypadá jako název souboru. Jste si jistí, že je to platný soubor?</string>
<string name="FirstInvalidCompositeKeyError">Neplatný složený klíč! Zkuste to znovu.</string>
<string name="RepeatedInvalidCompositeKeyHelp">Neplatný složený klíč! Prosím, vyzkoušejte následující kroky k odemknutí databáze:\n
• Ujistěte se, že jste zadali správné heslo. Použitím ikonky s okem odkryjete vložené heslo.\n
• Ujistěte se, že jste použili správný typ hesla. Ujistěte se, že tento typ odpovídá typu použitému při vytváření databáze.\n
• Ujistěte se, že jste použili správný soubor databáze.</string>
<string name="HintLocalBackupInvalidCompositeKey"> \n
&#8226; Nápověda: Pokud si myslíte že by soubor databáze mohl být poškozený, nebo si nepamatujete hlavní klíč, můžete zkusit poslední úspěšně otevřenou verzi souboru kliknutím \"%1$s\" a zvolením místní zálohy.</string>
<string name="HintLocalBackupOtherError"> \n
&#8226; Nápověda: Keepass2Android uložil poslední úspěšně otevřenou verzi souboru do interního úložiště. Můžete ji otevřít klepnutím na \"%1$s\" a výběrem místní zálohy.
</string>
<string name="CorruptDatabaseHelp"> Soubor je poškozený. \n
Zde je několik rad, které vám mohou pomoci zjistit příčinu problému:\n
• Pokud jste soubor kopírovali přes USB (v MTP módu), zkuste to, prosím, znovu pomocí nástroje jako například MyPhoneExplorer. MTP v některý případech soubory ořezává.\n
• Pokud nemůžete ten samý soubor otevřít ani ve svém PC, je velmi pravděpodobné, že je soubor doopravdy poškozený. V tom případě použijte záložní soubor. Pokud předpokládáte, že soubor byl poškozen v Keepass2Android, kontaktujte, prosím, podporu.\n
• Jestliže můžete otevřít soubor na vašem PC, kontaktujte, prosím, podporu. Můžete se pokusit na vašem PC uložit soubor s rozdílným nastavením (např. nezazipovaný) a znovu se jej pokusit otevřít v Keepass2Android.
</string>
<string name="open_other_db">Otevřít další databázi…</string>
<string name="select_database">Vybrat databázi</string>
<string name="configure_child_dbs">Konfigurace dceřiné databáze…</string>
@@ -691,6 +718,26 @@
<string name="EntryChannel_desc">Upozornění pro usnadnění přístupu k momentálně zvolené položce.</string>
<string name="CloseDbAfterFailedAttempts">Zavřít databázi po třech neúspěšných pokusech o odemknutí.</string>
<string name="WarnFingerprintInvalidated">Varování! Biometrické ověření může být zneplatněno Androidem, např. po přidání nového otisku prstu do nastavení zařízení. Ujistěte se, že vždy víte, jak odemknout pomocí hlavního hesla!</string>
<string-array name="ChangeLog_1_11">
<item>Přidána plovoucí akční tlačítka pro vyhledávání a přehled TOTP (pokud jsou přítomny položky TOTP).</item>
<item>Vylepšeno zobrazení polí TOTP přidáním indikátoru časového limitu a jeho výraznějším zobrazením.</item>
<item>TOTP lze nyní zobrazit v zobrazení skupiny.</item>
<item>Kopírování textové hodnoty do schránky při dlouhém stisknutí v zobrazení položky.</item>
<item>Usnadnění přístupu k TOTP na vestavěné klávesnici.</item>
<item>Zobrazení upozornění na položku při automatickém vyplňování položky TOTP. To umožňuje zkopírovat TOTP do schránky. Konfiguraci chování naleznete v předvolbách.</item>
<item>Aktualizovaná implementace TOTP řeší problémy s kompatibilitou s KeePass2 a TrayTOTP</item>
<item>Drobná vylepšení</item>
</string-array>
<string-array name="ChangeLog_1_11_net">
<item>Aktualizace pCloud SDK pro zajištění přístupu ke sdíleným složkám</item>
</string-array>
<string-array name="ChangeLog_1_10">
<item>Přidání podpory oprávnění pro oznámení v systému Android 13+</item>
<item>Zlepšení implementace FTP a SFTP</item>
<item>Přidání přístupu k plnému pCloudu</item>
<item>Povolení výběru jazyka systému v dialogovém okně jazyka</item>
<item>Oprava problému se zapamatováním typu souboru klíče + Challenge</item>
</string-array>
<string-array name="ChangeLog_1_09e">
<item>Opravy pádů a nečekaného odhlašování</item>
<item>Přepnutí na novou implementaci SFTP, podporující moderní algoritmy pro veřejné klíče jako rsa-sha2-256</item>
@@ -756,6 +803,224 @@
<item>Opravy chyb</item>
<item>Opravy chyb</item>
</string-array>
<string name="ChangeLog_1_07b"> Verze 1.07b-pre\n
* Vylepšení výkonu Argon2 pomocí vlastní implementace (Díky Chih-Hsuan Yen!)\n
* Možnost zakázání čtečky otisků poklepáním na ikonu otisku. Umožňuje obejít problémy při používání pod-displejového snímače. (Díky marcoDallas!)\n
* Vrácení pozice ukazatele při přepínání viditelnosti hesla (Díky DDoSolitary!)\n
* Vylepšení implementace pCloud (Znovu díky gilbsgilbs!)\n
* Přidána podpora AutoFill pro více prohlížečů \n
* Nová implementace OneDrive: Podpora OneDrive pro firmy, sdílené soubory, volitelné rozsahy přístupu, více účtů a opravy problémů při offline přístupu\n
* Oprava chyb
</string>
<string name="ChangeLog_1_07"> Version 1.07\n
* Opravuje padání aplikace na Samsung Android 9\n
* Umožňuje otevření více než jednoho souboru databáze, kompatibilní s KeeAutoExec\n
* SFTP: Povolit ověření veřejným klíčem při změně klíče na hostiteli\n
* Podpora pro pCloud - díky gilbsgilbs!\n
* Explicitní podpora pro Nextcloud\n
* Vylepšení ukládání a aktualizování příloh\n
* Více možností pro osobní předvolby\n
* SSL: Důvěřovat uživatelským certifikátům\n
* Vylepšení Automatického doplňování (nyní funguje ve Firefoxu, umožňuje omezení vyskakovacích oken)\n
* Opravy chyb\n
</string>
<string name="ChangeLog_1_06"> Verze 1.06\n
* Změna na ykDroid místo YubiChallenge pro Yubikey Výzva-Odpověď.\n
* Implementována podpora pro Výzva-Odpověď typu KeepassXC. Poznámka: Databáze musí být ve formátu KDBX4!\n
* Odmítání načtení souborů z Google Drive přesunutých do koše\n
* Změna implementace TLS pro FTPS, přidán workaround pro JSch bug pro servery podporující gssapi-with-mic\n
* Opravy chyb\n
</string>
<string name="ChangeLog_1_05"> Verze 1.05\n
* Použití kanálů upozornění pro Android 8. Toto umožní nastavení skrz nastavení systému.\n
* Ukazuje ikonu vstupu v upozornění.\n
* Použití Adaptivních ikon pro Android 8 a kulatých ikon pro Android 7.\n
* Možnost povolit hledání po odemknutí (viz nastavení).\n
* Změněn způsob zápisu pomocí Storage Access Frameworku, tato úprava opravuje problémy s aktualizací souborů na Google Disku které byly otevřeny pomocí výběru v systému souborů.\n
* Přidány některé vysvětlující texty k zamezení častých nedorozumění.\n
* Tvorba záloh úspěšně otevřených databází k omezení rizika ztráty dat.\n
* Aktualizován JSch pro podporu novějších SSH šifer.\n
* Povolení pro úpravu nastavení připojení, např. když je změněno heslo pro službu WebDav.\n
* Přidána podpora pro Yubikey Neo (mód statického hesla).\n
* Možnost zákazu návrhů pro automatické vyplňování.\n
* Oprava úniku dat do logu. (záznam výkon)\n
* Oprava chyb.\n
</string>
<string name="ChangeLog_1_04b"> Verze 1.04b\n
* Oprava pádů při aktivaci automatického vyplňování na zařízeních Huawei.\n
</string>
<string name="ChangeLog_1_04"> Verze 1.04\n
* Přidána funkce automatického doplňování pro Android 8.0 a novější.\n
* Aktualizovány knihovny, nástroje pro sestavení a cílová verze SDK.\n
</string>
<string name="ChangeLog_1_03">Verze 1.03\n
* Odstraněny služby zpřístupnění pro AutoFill dle požadavku Googlu. Podívejte se do nastavení přistupu hesel k nalezení doplňku poskytujícího předchozí funkci.\n
* Znovu povoleny aplikace třetích stran pro ukládání\n
* Vestavěný prohlížeč obrázků pro prohlížení připojených obrázku bez přenosu do jiných aplikací\n
* Aktualizované OkHttp pro opravu problémů s některými spojeními\n
* Podpora pro KeeTrayTOTP položky, nyní podporuje i Stream\n
</string>
<string name="ChangeLog_1_02"> Verze 1.02\n
* Různá bezpečnostní vylepšení. Děkuji za bezpečnostní hlášení od jean-baptiste.cayrou@thalesgroup.com a vincent.fargues@thalesgroup.com a za jejich spolupráci!\n
* Podpora zásuvného modulu KeyboardSwap (viz nastavení přístupového hesla): umožňuje automaticky přepnout metodu zadávání na zařízeních bez rootu. Děkuji Mishaalu Rahmanovi z XDA-Developers za spolupráci.\n
* Oprava pro službu dostupnosti s posledními verzemi Chrome\n
* Oprava nepotřebného čištění dat z čtečky otisků prstů\n
* Oprava menších pádů\n
* Aktualizované Dropbox SDK pro zajištění budoucí kompaktibility\n
* Odstraněno hlášení chyb pomocí Xamarin Insights\n
* Aktualizované nástroje pro překlad\n
</string>
<string name="ChangeLog_1_01g"> Verze 1.01-g\n
* Oprava pádu při pokusu o práci offline\n
* Oprava nesprávného kódování přihlašovacích údajů pro FTP(S)\n
* Oprava pádů při používání OneDrive na starších verzích Androidu\n
* Zobrazení času coby lokálního času na zadávacích obrazovkách\n
</string>
<string name="ChangeLog_1_01d"> Verze 1.01-d\n
* Oprava výpisu souborů na OneDrive\n
* Umožnění ignorování chyb certifikátu pokud současně selže i ověření názvu hosta (nedoporučuje se pro produkční využití)\n
* Oprava občasného selhání Rychlého Odemknutí při zadání správného kódu\n
</string>
<string name="ChangeLog_0_9_8c">Verze 0.9.8c\n
* Oprava chyby zabezpečení SSL v Microsoft Live SDK (používá se při přístupu k souborům přes OneDrive) \n
* Oprava: Předchozí vydání obsahovalo dvě vstupní metody (jedna padala) \n </string>
<string name="ChangeLog_1_01"> Verze 1.01\n
* přidána podpora pro nový formát KDBX-4 (kompaktuibilní s Keepass 2.35) včetně odvozování klíčů Argon2 key a ChaCha20 šifrování.\n
* Nová implementace WebDav úložiště, nyní umožňuje procházení souborů a podporuje moderní šifrování.\n
* Nová implementace FTP úložiště, nyní umožňuje procházení souborů a podporuje šifrování (FTPS).\n
* Aktulizace na OneDrive SDK (dříve používané Live SDK již nění aktualizováno)\n
* Aktualizace na Dropbox SDK verze 2 (dříve používaná verze 1 je zastarallá).\n
* Přidána podpora pro OwnCloud.\n
* Dotaz na práva k úložišti před otevíráním lokáních souborů
</string>
<string name="ChangeLog_1_0_0e"> Verze 1.0.0e\n
* oprava odemykání otiskem prstu na starších zařízeních Samsung s Android 6\n
* přidána nativní podpora pro x86 zařízení\n
* umožnění skrytí softwarové klávesnice během skenování otisku prstu\n
* aktualizace build systému
</string>
<string name="ChangeLog_1_0_0"> Verze 1.0.0\n
* Odemknutí dotykem prstu (vyžaduje Android 6.0+ nebo zařízení Samsung)\n
* Přidána služba automatického doplňování (vyžaduje Android 5.0+)\n
* Přidána podpora šablon\n
* Přidán mód \"pracovat offline\"\n
* Umožněno kopírování položek\n
* Mód automatického doplňování pro názvy polí\n
* Umožněno odstraňování položek ze seznamu předcházejících souborů\n
* Vyžadování oprávnění za běhu v Android 6.0\n
* Opravy chyb (ve vestavěné klávesnici, při výběru ikon)\n
* Doplněna možnost odeslání chybového hlášení\n
* Na různých místech doplněna nápověda\n
</string>
<string name="ChangeLog_0_9_9">Verze 0.9.9\n
* Kompletní přepracování vzhledu aplikace. Velké díky Stefanu Pignatarovi (http://www.spstudio.at) za jeho podporu! \n
* Možnost přidávat vlastní ikony\n
* Přidání podpory režimu více oken na zařízeních Samsung\n
* Navýšení výchozího počtu šifrovacích cyklů pro nové databáze\n
* Zjišťování duplicitních klíčů dodatečných polí, aby nedocházelo ke ztrátě dat\n</string>
<string name="ChangeLog_0_9_9c"> Verze 0.9.9c\n
* Tmavý vzhled je zpátky\n
* Můžete nainstalovat další balíčky ikon (staré ikony ve stylu Windowsjsou dostupné v obchodu Play)\n
* Doplněno potvrzení při mazání položek bez použití odpadkového koše.\n
* Opravy chyb (chybné zobrazení OTP tajného kódování, na několika místech špatná ikona aplikace)\n
</string>
<string name="ChangeLog_0_9_8b">Verze 0.9.8b\n
* Opravy chyb (uložení selhávalo pro některé databáze, nefungoval export do místního zařízení, výběr některých možností v nastavení shazoval aplikaci) \n</string>
<string name="ChangeLog_0_9_8">Verze 0.9.8\n
* Podpora Storage Access Frameworku (umožňuje zápis na SD kartu a na Google Drive z KP2A Offline) \n
* Pokus o detekci chybného uživatelského vstupu při zadávání URL adresy WebDAV (adresář místo souboru) \n
* Změna fontu pro hesla\n
* Umožnění změny účtu Dropbox\n
* Oprava chyby: Pamatování OTP hesla nyní funguje\n</string>
<string name="ChangeLog_0_9_7b">Verze 0.9.7b\n
* aktualizovány překlady\n
* opravy chyb: Chybějící font pro hesla ve verzi 0.9.7, řazení podle názvu neřadilo skupiny\n</string>
<string name="ChangeLog_0_9_7">Verze 0.9.7\n
* podpora zápisu pro databáze Keepass 1 (kdb) (beta!)\n
* lepší přepínání zpět na předešlou klávesnici (funguje i na zařízeních bez rootu)\n
* podpora pro KeeChallenge s proměnnou délkou výzev\n
* zabránění snímání obrazovky na obrazovce Rychlého odemknutí a obrazovkách s hesly\n
* obrácení směru řazení při řazení podle data změny (nyní sestupně)\n
* opravy chyb: Zobrazení poznámek se nyní korektně aktualizuje po provedení změn, Obrazovky s hesly nyní správně skrývají hesla na (snad) všech zařízeních, Opraven problém, který umožňoval přidat záznam dvakrát, Opraven problém se zobrazováním varování na duplicitní UUID i po opravení databáze\n</string>
<string name="ChangeLog_0_9_6">Version 0.9.6\n
* allow to import key file and/or local database file to app internal directory (see settings)\n
* allow different sorting options\n
* improved preferences for automatic keyboard switching\n
* updated app logo and notification design, design by Stefano Pignataro (http://www.spstudio.at)\n
* password generator remembers last settings\n
* set notification visibility for Android 5 lock screen\n
* now clearing master password field when leaving the app without tapping OK\n
* fixed issue with missing input languages in keyboard setting on some devices\n
* fixed issue with automatic keyboard switching on rooted devices\n
* added check for corrupt databases (duplicate UUIDs)\n
* automatically reload database when change detected, solves security concern about revealing master password\n
* improved polish small keyboard layout, fixed keyboard settings theme (thanks to Wiktor Ławski)\n</string>
<string name="ChangeLog_0_9_5"> <b>Verze 0.9.5</b> \n * opraveny problémy s procházením souborů (zejména pokud jde o Android 4.4) \n * opraven problém s načítáním souborů .kdb (Keepass 1) na 5 Nexus s Android Lollipop\n * přidána možnost zabránit sejmutí screenshotu nebo zobrazení aplikace v seznamu posledních aplikací\n * opraven problém s Google Drive úložištěm (obyčejná edice) \n * povoleno uložení souborů s klíči na zvoleném úložišti (obyčejná edice) \n * aktualizováno Dropbox SDK obsahující oficiální bezpečnostní opravy (obyčejná edice) \n * aktualizovány vývojové nástroje--&gt; velikost apk se zvýšila:-(\nSlíbil jsem nějaké další změny, ty budou v dalším vydání, omlouvám se, chtěl jsem co nejrychleji zveřejnit tyto opravy.</string>
<string name="ChangeLog_0_9_4"><b>Verze 0.9.4</b>\n
* doplněna podpora zásuvných modulů. Prohlédněte Nastavení pro jejich získání\n
* uvolněn modul pro QR kód (načítání hesel, zobrazení hesel jako QR kód, přenos záznamů mezi zařízeními)\n
* uvolněn modul InputStick (přenost pověření do PC pomocí bluetooth - vyžaduje InputStick USB)\n
* aplikace třetích stran nyní mohou využívat KP2A pro dotazy na údaje. Jste-li vývojář, využijte toho ve vaší aplikaci!\n
* přidána podpora pro TOTP (kompatibilní s KeeOTP a TrayTotp)\n
* aplikace by již neměla být nuceně ukončena při otevřenédatabázi\n
* databáze již není uzamčena při opuštění aplikace tlačítkem zpět (viz nastavení)\n
* zobrazení názvu kategorie ve výsledcích hledání (*)\n
* doplněno kontextové menu ve výsledcích hledání. Mimojiné obsahuje volbu \"Navigovat na zdroj\" (*)\n
* doplnena volba pro zobrazení názvu kategorie při prohlížení záznamu (*)\n
* (*) tyto funkce doplnil Matthieu, díky!\n
* doplněna podpora pro KeeChallenge (s Yubikey NEO). Konektor doplnil Ben Rush, díky!\n
* zlepšení uživatelského rozhraní\n
* opravena chyba v rozhraní ke Google Drive\n
* doplněna možnost ke skrytí tlačítka pro příspěvek\n
* Ikona QuickUnlock icon je nyní na zařízeních s Android 4.2+ standardně skryta\n </string>
<string name="ChangeLog_0_9_3_r5"> <b>Verze 0.9.3 r5</b>\n
* Integrované opravy od uživatele Xamarin: Keepass2Android je nyní kompatibilní s ART na Android 4.4.2. Konečně!\n
* Opravy chyb: chyby v synchronizaci (obnovování obrazovky, správna kontrola změn přes http), chyby na zařízeních Android 2.x, chyby v implementacích úložišť Google Drive a SkyDrive, vyčištění schránky při zavření databáze, chyba při otvírání příloh, problémy při zobrazení s klávesnicí\n</string>
<string name="ChangeLog_0_9_3"><b>Verze 0.9.3</b>\n
* Nová klávesnice s mnoha vylepšeními. Viz nastavení.\n
* Podpora pro čtení souborů kdb (Keepass 1). Experimentální!\n
* Doplněna podpora SFTP\n
* Doplněn trik pro obejití chyby při využití ART (Android 4.4.2)\n
* Opravy chyb\n</string>
<string name="ChangeLog_0_9_2"> <b>Verze 0.9.2</b> \n
* Přidána podpora OTP (kompatibilní s OtpKeyProv pluginem) \n
* Integrována podpora NFC pro OTP z YubiKey NEO \n
* Několik vylepšení uživatelského rozhraní \n
* Integrována knihovna KeePass 2.24 \n
* Přidána možnost zabít proces aplikace (viz Nastavení) \n
* Opravy chyb \n</string>
<string name="ChangeLog_0_9_1"><b>Verze 0.9.1</b>\n
* Přidána podpora SkyDrive (pouze Keepass2Android normální edice)\n
* Oprava problémů s integrací Google Drive\n
* Přidána podpora NTLM</string>
<string name="ChangeLog_0_9"> <b>Verze 0.9</b> \n
* integrace podpory Dropbox a Google Drive (čtení/zápis databáze; Keepass2Android pouze normální verze) \n
* podpora vlastního prohlížeče souborů (založen na android-filechooser HBA) \n
* vylepšené uživatelské rozhraní pro vytváření nových databází\n
* zahrnuto vlastní písmo DejaVu Sans Mono pro zobrazování hesel\n
* opravy chyb</string>
<string name="ChangeLog_0_8_6"> <b>Verze 0.8.6</b> \n
* podpora Twofish šifry\n
* možnost editace skupin\n
* možnost přesunu položek a skupin\n
* Ikona Rychlého odemknutí může být zprůhledněna (viz nastavení)\n
* opravy chyb</string>
<string name="ChangeLog_0_8_5"><b>Version 0.8.5</b>\n
* Remote files are stored in the local app cache to allow offline usage (including editing and later synchronization). See settings. \n
* Notification icon to visualize the lock-state of the database (see settings)\n
* Improved determination of lock-state in some situations\n
* Database files are loaded to memory while you are typing your password for increased loading speed (see settings)\n
* Entries can be added to root group\n
* Bug fixes (resolving reference fields, problems with keyboard on Italian and Chinese devices)</string>
<string name="ChangeLog_0_8_4"><b>Verze 0.8.4</b> \n
* Detekce a uložení změn v externích databázích při ukládání \n
* Zrychlení načítání \n
* Vylepšený nástroj hledání s doporučeními \n
* Nové App logo \n
* Přidána podpora pro formát .kdbp pro rychlejší otvírání/ukládání \n
* Vylepšená editace doplňujících textů a skrytý disple v chráněném móodu \n
Díky Alex Vallat za příspěvky v kódu! \n
Díky Niki Hüttner (www.close-cut.de) za nové logo! \n</string>
<string name="ChangeLog_0_8_3"><b>Verze 0.8.3</b>\n
* Uživatelské jméno/TAN index je zobrazen v seznamu položek (viz nastavení)\n
* Pokud hledání z prohlížeče nenalezne žádný záznam, je možno vytvořit nové polžky\n
@@ -765,6 +1030,18 @@
* Zástupné a popisné položky ve vstupních polích jsou nahrazeny před kopírováním (většina popisků podporována)\n
* opravy drobných chyb
  </string>
<string name="ChangeLog_0_8_2"><b>Verze 0.8.2</b>\n
* podpora pro ověřování algoritmem Digest Authentication pro WebDAV\n
* Opravy chyb (správce souborů, otevřít adresu URL)</string>
<string name="ChangeLog_0_8_1"><b>Verze 0.8.1</b>\n
* KP2A Offline a \"Online\" mohou opět být nainstalovány společně\n
* Přidány nové překlady (díky všem přispěvatelům!)</string>
<string name="ChangeLog_0_8"><b>Verze 0.8</b>\n
* Vylepšené uživatelské rozhraní, obzvláště pro zařízení s Android 4.x\n
* Volitelná volba správce souborů pro výběr existujících souborů\n
* Přidán bezpečnější způsob otevírání příloh (za pomocí adresáře mezipaměti)\n
* opraveny chyby v Editaci aktivit\n
* pravděpodobně zaneseny nové chyby :-)</string>
<string name="ChangeLog_keptDonate">Rozšířené možnosti přispět na pivo nebo něco jiného</string>
<string name="ChangeLog_0_7"><b>Verze 0.7</b>\n
* Zrychlení načítání: klíčové transformace jsou nyní 10x rychlejší!\n

View File

@@ -22,8 +22,8 @@
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">App-timeuot</string>
<string name="app_timeout_summary">Tidsforløb inden databasen låses, når app\'en er inaktiv.</string>
<string name="kill_app_label">Stands app-proces</string>
<string name="show_kill_app">Luk-knap</string>
<string name="kill_app_label">Stands app-proces</string>
<string name="show_kill_app_summary">Vis en knap på adgangskodeskærmen til standsning af app-processen (til paranoide brugere)</string>
<string name="application">App</string>
<string name="application_settings">App-indstillinger</string>

View File

@@ -23,8 +23,8 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">Zeitsperre für Anwendung</string>
<string name="app_timeout_summary">Bei inaktiver Anwendung wird die Datenbank nach Ablauf der eingestellten Zeit automatisch gesperrt.</string>
<string name="kill_app_label">App-Prozess beenden</string>
<string name="show_kill_app">Schließen-Button</string>
<string name="kill_app_label">App-Prozess beenden</string>
<string name="show_kill_app_summary">Eine Schaltfläche auf dem Passwortbildschirm anzeigen, um den App-Prozess zu beenden (für paranoide Benutzer)</string>
<string name="application">Anwendung</string>
<string name="application_settings">Anwendungseinstellungen</string>
@@ -69,7 +69,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="clipboard_timeout">Zeitsperre für Zwischenablage</string>
<string name="clipboard_timeout_summary">Zeit bis zum Löschen der Zwischenablage nach dem Kopieren von Benutzername oder Passwort</string>
<string name="copy_username">Benutzername in die Zwischenablage kopieren</string>
<string name="copy_password">Kennwort in die Zwischenablage kopieren</string>
<string name="copy_password">Passwort in die Zwischenablage kopieren</string>
<string name="copy_totp">TOTP in die Zwischenablage zu kopieren</string>
<string name="available_through_keyboard">Eintrag ist über die KP2A-Tastatur verfügbar</string>
<string name="app_language_pref_title">App Sprache</string>
@@ -96,13 +96,13 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="enable_fingerprint_unlock">Komplettes biometrisches Entsperren aktivieren</string>
<string name="enable_fingerprint_quickunlock">Biometrisches Entsperren für QuickUnlock</string>
<string name="fingerprint_unlock_failed">Biometrisches Entsperren fehlgeschlagen. Entschlüsselungsschlüssel wurde vom Android-System für ungültig erklärt. Das kommt üblicherweise vor, wenn die Biometrische Authentifizierung oder die Sicherheitseinstellungen geändert wurden. </string>
<string name="fingerprint_disabled_wrong_masterkey">Entsperren der Datenbank fehlgeschlagen: Ungültiger zusammengesetzter Schlüssel. Biometrisches Entsperren wurde deaktiviert, da das gespeicherte Masterpasswort nicht länger gültig ist.</string>
<string name="fingerprint_disabled_wrong_masterkey">Entsperren der Datenbank fehlgeschlagen: Ungültiger zusammengesetzter Schlüssel. Biometrisches Entsperren wurde deaktiviert, da das gespeicherte Hauptpasswort nicht länger gültig ist.</string>
<string name="fingerprint_reenable">Bitte Biometrisches Entsperren für das neue Hauptpasswort erneut aktivieren.</string>
<string name="fingerprint_reenable2">Bitte mit Passwort entsperren und anschließend in den Datenbankeinstellungen das Biometrische Entsperren erneut aktivieren.</string>
<string name="FingerprintInitFailed">Initialisierung der biometrischen Authentifizierung fehlgeschlagen. </string>
<string name="FingerprintSetupFailed">Daten konnten nicht verschlüsselt werden. Dies kann passieren, wenn Fingerabdrücke in den Systemeinstellungen hinzugefügt oder gelöscht wurden, während Keepass2Android auf deinen Fingerabdruck wartet.</string>
<string name="enable_fingerprint_unlock_Info">Mit dieser Option wird das Hauptpasswort verschlüsselt im Android-Keystore auf dem Gerät gespeichert, geschützt durch einen Fingerabdruck. Dadurch kann die Datenbank per biometrischer Authentifizierung entsperrt werden.</string>
<string name="enable_fingerprint_quickunlock_Info">Erlaubt es, den biometrische Authentifizierung anstelle des QuickUnlock-Codes zu nutzen. Speichert keine Informationen bezüglich des Masterpassworts.</string>
<string name="enable_fingerprint_quickunlock_Info">Erlaubt es, die biometrische Authentifizierung anstelle des QuickUnlock-Codes zu nutzen. Speichert keine Informationen bezüglich des Hauptpassworts.</string>
<string name="enter_filename">Dateinamen der Datenbank eingeben</string>
<string name="entry_accessed">Letzter Zugriff</string>
<string name="entry_cancel">Abbrechen</string>
@@ -135,7 +135,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="error_invalid_db">Ungültige Datenbank.</string>
<string name="error_invalid_path">Ungültiger Pfad.</string>
<string name="error_no_name">Ein Name ist erforderlich.</string>
<string name="error_nopass">Ein Kennwort oder eine Schlüsseldatei wird benötigt.</string>
<string name="error_nopass">Ein Passwort oder eine Schlüsseldatei ist erforderlich.</string>
<string name="error_pass_gen_type">Mindestens eine Form der Passwort-Generierung muss ausgewählt werden</string>
<string name="error_pass_match">Die Passwörter stimmen nicht überein.</string>
<string name="error_rounds_not_number">Anzahl der Wiederholungen muss eine Zahl sein.</string>
@@ -148,7 +148,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="group">Gruppe</string>
<string name="hint_comment">Notizen</string>
<string name="hint_conf_pass">Passwort bestätigen</string>
<string name="hint_generated_password">Erzeugtes Kennwort</string>
<string name="hint_generated_password">Erzeugtes Passwort</string>
<string name="hint_group_name">Name der Gruppe</string>
<string name="hint_keyfile">Schlüsseldatei</string>
<string name="hint_length">Länge</string>
@@ -193,7 +193,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="menu_navigate">Zur übergeordneten Gruppe navigieren</string>
<string name="menu_donate">Spendiere ein Bier...</string>
<string name="menu_edit">Bearbeiten</string>
<string name="menu_hide_password">Kennwort verstecken</string>
<string name="menu_hide_password">Passwort verbergen</string>
<string name="menu_lock">Datenbank sperren</string>
<string name="menu_open">Öffnen</string>
<string name="menu_close">Schließen</string>
@@ -369,12 +369,12 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="UseFileTransactions_summary">Dateitransaktionen beim Schreiben von Datenbank-Dateien verwenden</string>
<string name="LockWhenScreenOff_title">Sperren, wenn Bildschirm ausgeschaltet</string>
<string name="LockWhenScreenOff_summary">Sperre die Datenbank wenn der Bildschirm ausgeschaltet wird.</string>
<string name="ClearPasswordOnLeave_title">Eingegebenes Master-Passwort-Feld leeren</string>
<string name="ClearPasswordOnLeave_summary">Leere das Eingabefeld für das Master-Passwort, wenn der Passwort-Eingabebildschirm verlassen wird, ohne dass die Datenbank entsperrt wurde.</string>
<string name="ClearPasswordOnLeave_title">Eingegebenes Hauptpasswort-Feld leeren</string>
<string name="ClearPasswordOnLeave_summary">Leere das Eingabefeld für das Hauptpasswort, wenn der Passwort-Eingabebildschirm verlassen wird, ohne dass die Datenbank entsperrt wurde.</string>
<string name="LockWhenNavigateBack_title">Beim Verlassen der App sperren</string>
<string name="LockWhenNavigateBack_summary">Datenbank sperren, wenn die App mit dem Zurück-Knopf verlassen wird.</string>
<string name="UseKp2aKeyboardInKp2a_title">Integrierte Tastatur in Keepass2Android verwenden</string>
<string name="UseKp2aKeyboardInKp2a_summary">Wenn Sie ihrer Standardtastatur nicht vertrauen, setzen Sie diese Option, um die Built-In-Tastatur beim Eingeben des Masterkennworts oder beim Bearbeiten von Einträgen zu benutzen.</string>
<string name="UseKp2aKeyboardInKp2a_summary">Wenn du deiner Standardtastatur nicht vertraust, aktiviere diese Option, um die integrierte Tastatur beim Eingeben des Hauptpassworts oder beim Bearbeiten von Einträgen zu benutzen.</string>
<string name="ActivateSearchViewOnStart_title">Suchfeld beim Start aktivieren</string>
<string name="ActivateSearchViewOnStart_summary">Aktiviert das Suchfeld in der Gruppenansicht nach dem Entsperren oder wenn ein Eintrag gesucht wird.</string>
<string name="NoDonateOption_title">Spenden-Option ausblenden</string>
@@ -403,6 +403,14 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="ShowSeparateNotifications_summary">Getrennte Benachrichtigungen zum Kopieren von Benutzername und Passwort in die Zwischenablage und zur Aktivierung der Eingabemethode anzeigen.</string>
<string name="AccServiceAutoFill_prefs">AutoFill Accessibility-Service</string>
<string name="AutoFill_prefs">AutoFill-Dienst</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">Eintragsbenachrichtigung mit einem Kopieren-Button anzeigen, wenn Autofill für einen Eintrag mit TOTP durchgeführt wird.</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">Eintragsbenachrichtigung anzeigen</string>
<string name="AutoFillTotp_prefs_title">Autofill für TOTP-Einträge</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">TOTP in Zwischenablage kopieren</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">TOTP in die Zwischenablage kopieren bei Autofill eines Eintrags mit TOTP</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">Integrierte Tastatur aktivieren bei Autofill eines Eintrags mit TOTP. Die Tastatur hat einen TOTP-Button.</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">Integrierte Tastatur aktivieren</string>
<string name="TotpCopiedToClipboard">TOTP in Zwischenablage kopiert</string>
<string name="ShowKp2aKeyboardNotification_title">KP2A-Tastatur-Benachrichtigung</string>
<string name="ShowKp2aKeyboardNotification_summary">Kompletten Eintrag über die KP2A-Tastatur bereitstellen (empfohlen).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Tastatur umschalten</string>
@@ -564,7 +572,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="help_master_password">Die eigene Datenbank wird mit dem hier eingegebenen Passwort verschlüsselt. Dazu ein starkes Passwort verwenden, um die Datenbank abzusichern! Tipp: Sich ein oder zwei Sätze ausdenken und die Anfangsbuchstaben als Passwort nutzen. Auch die Satzzeichen mit einschließen.</string>
<string name="hint_master_password">Wähle ein Master-Passwort, mit dem deine Datenbank geschützt wird:</string>
<string name="key_file">Schlüsseldatei</string>
<string name="help_key_file">Eine Schlüsseldatei ist im Grunde ein Kennwort, das in einer Datei gespeichert ist. Schlüsseldateien sind üblicherweise stärker als Kennwörter, weil sie deutlich komplexer sein können; allerdings ist es schwerer, sie geheim zu halten. Wird die Datenbank in der Cloud gespeichert, sollte die Schlüsseldatei keinesfalls ebenfalls dort abgelegt werden! Das würde sie völlig nutzlos machen! Wichtig: Den Inhalt der Schlüsseldatei nicht mehr ändern, nachdem die Datenbank angelegt wurde!</string>
<string name="help_key_file">Eine Schlüsseldatei ist im Grunde ein Passwort, das in einer Datei gespeichert ist. Schlüsseldateien sind üblicherweise stärker als Passwörter, weil sie deutlich komplexer sein können; allerdings ist es schwerer, sie geheim zu halten. Wird die Datenbank in der Cloud gespeichert, sollte die Schlüsseldatei keinesfalls ebenfalls dort abgelegt werden! Das würde sie völlig nutzlos machen! Wichtig: Den Inhalt der Schlüsseldatei nicht mehr ändern, nachdem die Datenbank angelegt wurde!</string>
<string name="hint_key_file">Wählen, ob eine Schlüsseldatei zusätzlich zum Hauptpasswort verwendet werden soll:</string>
<string name="use_key_file">Schlüsseldatei verwenden</string>
<string name="error_adding_keyfile">Fehler beim Hinzufügen der Schlüsseldatei!</string>
@@ -590,6 +598,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="CouldntLoadChalAuxFile_Hint">Bitte das KeeChallenge-Plugin in KeePass 2.x (PC) verwenden, um die Datenbank für die Verwendung von Challenge-Response zu konfigurieren!</string>
<string name="ErrorUpdatingChalAuxFile">Fehler beim Aktualisieren der OTP-Hilfsdatei!</string>
<string name="TrayTotp_SeedField_title">TOTP-Seed-Feldname</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">Wenn das Keepass2-Plugin „TrayTotp“ nicht mit Standardeinstellungen verwendet wird, den Feldnamen für das Seed-Feld entsprechend der Einstellungen am PC angeben.</string>
<string name="TrayTotp_SettingsField_title">Feldname für TOTP-Einstellungen</string>
<string name="TrayTotp_SettingsField_summary">Feldnamen für TOTP-Einstellungen entsprechend den TrayTotp-Einstellungen eingeben.</string>
@@ -665,6 +674,22 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="Continue">Fortfahren</string>
<string name="NoFilenameWarning">Der eingegebene Pfad scheint kein gültiger Dateiname zu sein. Ist dies wirklich eine gültige Datei?</string>
<string name="FirstInvalidCompositeKeyError">Ungültiger zusammengesetzter Schlüssel! Bitte erneut probieren.</string>
<string name="RepeatedInvalidCompositeKeyHelp">Ungültiger zusammengesetzter Schlüssel! Bitte folgenden Schritte probieren, um die Datenbank zu entsperren:\n
• Sicherstellen, dass das richtige Passwort eingegeben wurde. Das Augensymbol dafür nutzen, um das eingegebene Passwort anzuzeigen.\n
• Sicherstellen, dass der richtigen Passworttyp ausgewählt wurde. Er muss mit dem Typ übereinstimmen, der beim Erstellen der Datenbank gewählt wurde.\n
• Sicherstellen, dass die richtige Datenbankdatei gewählt wurde.
</string>
<string name="HintLocalBackupInvalidCompositeKey"> \n
&#8226; Tipp: Wenn die Vermutung besteht, die eigene Datenbankdatei könnte beschädigt sein oder sich nach einer Änderung nicht mehr an den Hauptschlüssel erinnern wird, kann man es mit der zuletzt erfolgreich geöffnete Dateiversion versuchen, indem auf „%1$s“ getippt und die lokale Sicherung ausgewählt wird.</string>
<string name="HintLocalBackupOtherError">\n
&#8226; Tipp: Keepass2Android hat die zuletzt erfolgreich geöffnete Dateiversion im internen Speicher gesichert. Diese kann geöffnet werden, indem „%1$s“ angetippt und das lokale Backup gewählte wird.</string>
<string name="CorruptDatabaseHelp">Die Datei ist beschädigt.\n
Anbei einige Tipps, die bei der Diagnose des Problems helfen können:\n
• Wenn die Datei über USB kopiert wurde (MTP-Modus), es noch einmal mit Tools wie MyPhoneExplorer versuchen. MTP schneidet in manchen Fällen die Dateien ab.\n
• Wenn sich die Datei vom gleichen Speicherort nicht auf dem PC öffnen lässt, ist es sehr wahrscheinlich, dass die Datei tatsächlich beschädigt ist. Bitte in diesem Fall eine Datenbanksicherung verwenden. Wenn der Verdacht besteht, dass Keepass2Android die Datei beschädigt hat, bitte Kontakt mit dem Support aufnehmen.\n
• Wenn sich die Datei auf dem PC noch öffnen lässt, bitte Kontakt mit dem Support aufnehmen. Man kann versuchen, die Datei mit anderen Einstellungen auf dem PC zu speichern (z. B. unkomprimiert) und sie dann noch einmal in Keepass2Android zu öffnen. </string>
<string name="open_other_db">Weitere Datenbank öffnen …</string>
<string name="select_database">Datenbank auswählen</string>
<string name="configure_child_dbs">Kinddatenbanken konfigurieren …</string>
@@ -692,6 +717,26 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="EntryChannel_desc">Benachrichtigung zum schnellen Zugriff auf den aktuell gewählten Eintrag.</string>
<string name="CloseDbAfterFailedAttempts">Datenbank nach drei fehlgeschlagenen biometrischen Entsperrversuchen schließen.</string>
<string name="WarnFingerprintInvalidated">Achtung! Die biometrische Authentifizierung kann von Android ungültig gemacht werden, z. B. nach dem Hinzufügen eines neuen Fingerabdrucks in den Geräteeinstellungen. Bitte sicherstellen, dass jederzeit klar ist, wie mit dem eigenen Hauptpasswort entsperrt werden kann!</string>
<string-array name="ChangeLog_1_11">
<item>Buttons für die Suche und eine TOTP-Übersicht hinzugefügt (falls TOTP-Einträge vorhanden sind)</item>
<item>Darstellung von TOTP-Feldern verbessert: Timeout-Anzeige hinzugefügt und besser sichtbar gemacht.</item>
<item>TOTPs sind nun aus der Gruppenansicht zu sehen.</item>
<item>Werte in der Eintrags-Ansicht können mittels langem Antippen in die Zwischenablage kopiert werden.</item>
<item>TOTPs einfacher aus der integrierten Tastatur heraus zugänglich gemacht.</item>
<item>Eintrags-Benachrichtigung wird angezeigt beim Autofill von TOTP-Einträgen. Dies erlaubt es, die TOTP in die Zwischenablage zu kopieren. Konfiguration des Verhaltens ist in den Einstellungen möglich.</item>
<item>TOTP-Implementierung aktualisiert, um Kompatibilitätsprobleme mit KeePass2 und TrayTOTP zu beheben.</item>
<item>Kleinere Verbesserungen</item>
</string-array>
<string-array name="ChangeLog_1_11_net">
<item>pCloud-SDK aktualisiert um den Zugriff auf geteilte Ordner zu ermöglichen.</item>
</string-array>
<string-array name="ChangeLog_1_10">
<item>Unterstützung für Benachrichtigungsrechte für Android 13+ implementiert</item>
<item>Verbesserung der FTP- und SFTP-Implementierung</item>
<item>Zugriff zur vollständigen pCloud hinzugefügt</item>
<item>Auswahl der Systemsprache im Sprachdialog erlaubt</item>
<item>Problem beim Speichern der Schlüsseldatei + Challenge-Passwort-Typ behoben</item>
</string-array>
<string-array name="ChangeLog_1_09e">
<item>Fehlerbehebung, um Abstürze und unerwartetes Abmelden zu vermeiden</item>
<item>Wechsel auf eine neue SFTP-Implementierung, jetzt mit Unterstützung von modernen Public-Key-Algorithmen wie rsa-sha2-256</item>
@@ -757,6 +802,221 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<item>Wechsel zur BiometricPrompt-API, um die Fingerabdruckentsperrung zu verbessern; erlaubt die Verwendung von Face-Unlock z. B. auf Pixel 4.</item>
<item>Fehlerkorrekturen</item>
</string-array>
<string name="ChangeLog_1_07b"> Version 1.07b\n
* Verbesserung der Leistung von Argon2 durch die Verwendung einer nativen Implementierung (Danke an Chih-Hsuan Yen!)\n
* Der Fingerabdruck-Leser kann durch Anklicken des Fingerabdrucksymbols deaktiviert werden (das vermeidet Probleme mit Lesern unter der Displayoberfläche, Danke an marcoDallas!)\n
* Cursorposition wird nach Änderung der Sichtbarkeit von Kennwörtern wiederhergestellt (Danke an DDoSolitary!)\n
* Verbesserungen bei der pCloud-Implementierung (noch einmal Danke an gilbsgilbs!)\n
* AutoFill-Unterstützung für verschiedene weitere Browser hinzugefügt \n
* Neue Implementierung für OneDrive: einschließlich Unterstützung für OneDrive for Business, geteilte Dateien, auswählbare Zugriffsbereiche, mehrere Konten und Behebung von Problemen mit Offline-Zugriff\n
* Fehlerkorrekturen
</string>
<string name="ChangeLog_1_07">Version 1.07\n
* Abstürze unter Samsung\'s Android 9 behoben\n
* Zulassen, dass mehrere Datenbanken geöffnet werden können. Kompatibel mit KeeAutoExec\n
* SFTP: Erlaubt Authentifizierung durch das Public-Key Verfahren. Überprüft, ob sich der Hostschlüssel geändert hat\n
* Einführung von pCloud-Unterstützung - Danke an gilbsgilbs!\n
* Direkte Nextcloud-Unterstützung\n
* Verbessertes Speichern und Aktualisieren von Eintragsanhängen\n
* Zusätzliche Optionen, um Verhalten an persönliche Vorlieben anzupassen\n
* SSL: Vertraue Benutzerzertifikaten\n
* Verbesserung der AutoFill-Funktion (Funktioniert nun mit Firefox, Anzahl an Popups kann reduziert werden, mehr Optionen)\n
* Fehlerbehebungen\n </string>
<string name="ChangeLog_1_06">Version 1.06\n
* Wechsel zu ykDroid statt YubiChallenge als App für Yubikey Challenge-Response.\n
* Unterstützung für KeepassXC-style Challenge-Response implementiert. Hinweis: Datenbankformat muss KDBX4 sein!\n
* Auf Google Drive gelöschte Dateien werden nicht mehr geladen.\n
* TLS-Implementierung für FTPS gewechselt, Workaround wegen eines JSch-Bugs integriert (betrifft Server, die gssapi-with-mic unterstützen)\n
* Fehler behoben\n </string>
<string name="ChangeLog_1_05">Version 1.05\n
* Verwendung von Benachrichtigungskanälen in Android 8. So können Benachrichtigungen über die Systemeinstellungen konfiguriert werden.\n
* Eintrags-Icon wird in Benachrichtigungen angezeigt\n
* Adaptive App-Launcher-Icons für Android 8 und rundes App-Launcher-Icon für Android 7\n
* Suche kann nach dem Entsperren aktiviert werden (s. Einstellungen)\n
* Fehler beim Schreiben von Dateien über das Storage-Access-Framework behoben. Dadurch wird ein Problem behoben, wenn Dateien über den Android-Dateibrowser aus Google Drive geöffnet werden.\n
* Einige Infotexte ergänzt, um häufig auftretende Missverständnisse zu vermeiden.\n
* Nach erfolgreichem Öffnen wird eine lokale Sicherungskopie der Datenbank angelegt, um das Risiko von Datenverlust zu reduzieren.\n
* JSch aktualisiert um aktuelle SSH-Verschlüsselungsalgorithmen zu unterstützen\n
* Unterstützung für den statischen Passwortmodus des Yubikey Neo integriert.\n
* Die Autofill-Empfehlung kann leichter deaktiviert werden\n
* Fix für u.U. nach Logcat geschriebene private Daten.\n
* Bugfixes\n </string>
<string name="ChangeLog_1_04b">Version 1.04b\n
• Korrektur für App-Crash beim Aktivieren von Autofill auf Huawei-Geräten.\n </string>
<string name="ChangeLog_1_04"> Version 1.04\n
• Autofill-Dienst für Android 8.0 und höher implementiert.\n
• Bibliotheken und Build-Tools aktualisiert.\n
</string>
<string name="ChangeLog_1_03">Version 1.03\n
* Accessibility-Service für AutoFill entfernt, da dies von Google gefordert wurde. Unter Passwortzugangseinstellungen findet sich ein Plugin, das die frühere Funktionalität nachbildet.\n
* Drittanwendungen können wieder genutzt werden, um Dateien zu öffnen\n
* Bildbetrachter integriert, um angehängte Bilder zu öffnen, ohne diese in andere Apps übertragen zu müssen\n
* OkHttp aktualisiert, um Probleme mit manchen Verbindungen zu beheben.\n
* Unterstützung für KeeTrayTOTP-Einträge, so dass jetzt auch Steam-Einträge möglich sind\n </string>
<string name="ChangeLog_1_02">Version 1.02\n
* Mehrere Sicherheitsverbesserungen. Danke an jean-baptiste.cayrou@thalesgroup.com und vincent.fargues@thalesgroup.com für die Analyse und Zusammenarbeit!\n
* Unterstützung für KeyboardSwapPlugin (siehe Passworteingabe-Optionen): erlaubt es, die Eingabemethode automatisch auf die KP2A-Tastatur zu wechseln, auch ohne gerootetes Gerät. Danke an Mishaal Rahman von XDA-Developers! \n
* Korrektur für Accessibility-Service mit neueren Chrome-Versionen\n
* Korrektur für unnötiges Löschen der Fingerabdruckdaten\n
* Korrektur für kleinere Crashes\n
* Dropbox-SDK aktualisiert, um zukünftige Kompatibilität zu gewährleisten \n
* Fehlerberichterstattung mittels Xamarin Insights entfernt\n
* Build-Tools aktualisiert\n </string>
<string name="ChangeLog_1_01g">Version 1.01-g\n
* Korrektur für Absturz, wenn „Offline-Arbeiten“ aktviert ist\n
* Korrektur für Encoding der FTP(S)-Zugangsdaten\n
* Korrektur für Abstürze bei Verwendung von OneDrive und auf älteren Android-Versionen\n
* Zeiten werden als lokale Zeiten dargestellt\n </string>
<string name="ChangeLog_1_01d">Version 1.01-d\n
* Fix beim Auflisten von Dateien mit OneDrive\n
* Erlaube das Ignorieren von Zertifikatsfehlern, auch wenn Host-Name-Verification fehlschlägt (nicht für produktiven Einsatz empfohlen)\n
* Fix: QuickUnlock schlug manchmal fehl trotz korrektem Entsperr-Code\n </string>
<string name="ChangeLog_0_9_8c"> Version 0.9.8c\n
* Fix für SSL-Schwachstelle im Microsoft Live-SDK (wird benutzt beim Zugriff auf Dateien mit OneDrive)\n
* Bugfix: Vorige Veröffentlichung enthielt zwei Eingabemethoden (eine funktionierte nicht)\n
</string>
<string name="ChangeLog_1_01">Version 1.01\n
* Unterstützung für das neue KDBX-4-Format hinzugefügt (kompatibel mit Keepass 2.35), inkl. Argon2-Schlüsselableitung und ChaCha20-Verschlüsselung.\n
* WebDav-Zugriff neu implementiert, erlaubt nun Browsen in Ordnern und unterstützt moderne Verschlüsselung.\n
* FTP-Zugriff neu implementiert, erlaubt nun Browsen in Ordnern und unterstützt verschlüsselung (FTPS).\n
* OneDrive-SDK aktualisiert (zuvor verwendetes Live-SDK wird nicht mehr aktualisiert)\n
* Update auf Dropbox-SDK Version 2 (zuvor verwendete Version 1 ist veraltet).\n
* Unterstützung für OwnCloud integriert.\n
* Frage nach Speicherzugriffsberechtigung vor dem Öffnen von lokalen Dateien.</string>
<string name="ChangeLog_1_0_0e">Version 1.0.0e\n
* Fehlerkorrektur für Fingerabdruckerkennung auf älteren Samsunggeräten mit Android 6\n
* Native x86-Unterstützung hinzugefügt\n
* Bildschirmtastatur kann während Fingerabdruckerkennung deaktiviert werden\n
* Update des Buildsystems </string>
<string name="ChangeLog_1_0_0">Version 1.0.0\n
* Entsperren mit Fingerabdruck (benötigt Android 6.0+ oder ein Samsung-Gerät)\n
* Autofill-Dienst hinzugefügt (benötigt Android 5.0+)\n
* Unterstützung für Eintragsvorlagen hinzugefügt\n
* Modus „Offline arbeiten“ hinzugefügt\n
* Kopieren von Einträgen ermöglicht\n
* Automatische Vervollständigung für Feldnamen\n
* Einträge können aus der Liste der zuletzt verwendeten Dateien entfernt werden\n
* Rechte werden in Android 6.0 zur Laufzeit angefragt\n
* Fehlerbehebungen (integrierte Tastatatur wenn Symbole ausgewählt werden)\n
* Option zum Senden von Fehlerberichten hinzugefügt\n
* Hilfemeldungen an verschiedenen Stellen hinzugefügt\n \n</string>
<string name="ChangeLog_0_9_9">Version 0.9.9\n
* Komplett neues Design. Vielen Dank an Stefano Pignataro (http://www.spstudio.at) für seine Unterstützung!\n
* Möglichkeit eigene Icons für Einträge hinzuzufügen\n
* Unterstützung des Multi-Window-Modus auf Samsung-Geräten\n
* Standard-Anzahl der Verschlüsselungsrunden für neue Datenbanken erhöht\n
* Prüfung nach mehrfach vorkommenden Schlüsseln von zusätzlichen Feldern um Datenverlust zu verhindern\n
</string>
<string name="ChangeLog_0_9_9c">Version 0.9.9c\n
* Dark Theme ist zurück\n
* Man kann jetzt weitere Icon-Packs installieren (Symbole im alten Windows-Stil sind im Play Store verfügbar)\n
* Bestätigungsabfrage für das Löschen von Elementen ohne Papierkorb hinzugefügt\n
* Fehlerbehebungen (falsche Anzeige des OTP Secret Encoding, falsches Appsymbol an manchen Stellen)\n </string>
<string name="ChangeLog_0_9_8b">Version 0.9.8b\n
* Fehlerkorrektur (Speichern funktionierte bei einigen Datenbanken nicht, Export zum lokalen Gerät funktionierte nicht, einige Einstellungsoptionen verursachten einen Absturz der App)\n</string>
<string name="ChangeLog_0_9_8">Version 0.9.8\n
* Unterstützung des Storage Access Framework (erlaubt schreiben auf SD Kartr und Google Drive in KP2A Offline)\n
* Versuche, fehlerhafte Nutzereingaben bei der Eingabe von WebDAV URLs zu erkennen (Verzeichnis statt Datei)\n
* Passwort Schriftart geändert\n
* Möglichkeit, das Dropbox-Konto zu ändern\n
* Bug Fix: Speichern des OTP-Passwort-Modus</string>
<string name="ChangeLog_0_9_7b">Version 0.9.7b\n
* Übersetzungen aktualisiert\n
* Fehlr behoben: Passwortschriftart fehlte in 0.9.7, Gruppen wurden nicht sortiert, wenn „Sortieren nach Namen“ ausgewählt war\n</string>
<string name="ChangeLog_0_9_7">Version 0.9.7\n
* Schreibunterstützung für Keepass 1 (kdb) Datenbanken (Beta!)\n
* Verbessertes Zurückschalten zur vorherigen Eingabemethode (funktioniert auch auf nicht gerooteten Geräten)\n
* Unterstützung für KeeChallenge mit variablen Challenge-Längen\n
* Screenshots vom QuickUnlock-Bildschirm und Passworteingabebildschirm nicht mehr möglich\n
* Sortierreihenfolge bei Sortierung nach Änderungsdatum (jetzt absteigend)\n
* Fehlerkorrektur: Notizansicht wird nach Änderung korrekt aktualisiert; Passwortfelder sollten nun auf allen Geräten korrekt versteckt werden; Problem behoben, wegen dem ein Eintrag doppelt angelegt werden konnte; Problem mit Anzeige der Warnung wegen doppelten UUIDs behoben\n</string>
<string name="ChangeLog_0_9_6">Version 0.9.6\n
* Schlüsseldatei und/oder lokale Datenbank können in ein App-internes Verzeichnis kopiert werden (siehe Einstellungen)\n
* verschiedene Sortieroptionen\n
* Einstellungen für automatisches Tastatur-Umschalten verbessert\n
* App-Logo und Benachrichtigungsdesign aktualisiert, Design von Stefano Pignataro (http://www.spstudio.at)\n
* Keepass2Android merkt sich die letzten Einstellungen\n
* Sichtbarkeit von Benachrichtigungen unter Android 5 gesetzt \n
* Eingegebenes Hauptpasswort wird gelöscht, wenn die App verlassen wird, ohne OK zu drücken\n
* Problem mit fehlenden Tastatur-Eingabesprachen auf manchen Geräten behoben\n
* Problem mit automatischem Tastatur-Umschalten behoben\n
* Prüfung auf korrupte Datenbanken mit doppelten UUIDs\n
* Datenbank wird automatisch neu geladen, wenn eine Änderung erkannt wird (löst Sicherheitsbedenken bzgl. Möglichkeit, Hauptpasswort sehen zu können)\n
* Design der Tastatureinstellungen korrigiert (danke an Wiktor Ławski)\n</string>
<string name="ChangeLog_0_9_5"><b>Version 0.9.5</b>\n
* Probleme bei Dateiauswahl behoben (bes. auf Android 4.4)\n
* Problem beim Laden von .kdb-Dateien (Keepass 1) auf Nexus 5 mit Android Lollipop behoben\n
* Option hinzugefügt, um Screenshots und Darstellungen in der Liste der letzten Apps zu verhindern (standardmäßig aktiviert)\n
* Problem mit Google Drive behoben \n
* Schlüsseldateien können auf beliebigen Speicherorten abgelegt werden\n
* Dropbox-SDK aktualisiert, um offiziellen Sicherheitspatch zu integrieren\n
* Build-Tools aktualisiert -&gt; APK-Größe leider gewachsen, sorry :-(\n
Ich hatte noch weitere Änderungen versprochen. Diese kommen mit dem nächsten Release, dieses muss wegen aktueller Probleme so früh wie möglich veröffentlicht werden.</string>
<string name="ChangeLog_0_9_4"><b>Version 0.9.4</b> \n
* Plugin-Unterstützung hinzugefügt: siehe Einstellungen, um Plugins zu bekommen! \n
* QR-Plugin veröffentlicht (Passwörter erfassen, Passwörter als QR-Code anzeigen, Einträge auf andere KP2A-Geräte übertragen)\n
* InputStick-Plugin veröffentlicht (Anmeldeinformationen per Bluetooth auf den PC übertragen erfordert InputStick-USB-Stick)\n
* Apps von Drittanbieter können nun einfach Funktionen implementieren, um Anmeldeinformationen direkt von KP2A abzufragen. Selbst ein Entwickler? Dies bitte in die eigene App einbauen, wenn sie sich dafür eignet!\n
* TOTP-Unterstützung hinzugefügt (kompatibel mit KeeOTP und TrayTotp)\n
* App sollte von Android nicht mehr beendet werden, wenn die Datenbank geöffnet ist\n
* Datenbank ist nicht mehr gesperrt, wenn die App mit dem Zurück-Knopf verlassen wird (siehe Einstellungen)\n
* Gruppennamen können in Suchergebnissen angezeigt werden (*)\n
* Kontextmenü in der Ergebnisansicht der Suche hinzugefügt, einschließlich der Option „Zu übergeordneter Gruppe navigieren“ (*)\n
* Option zum Anzeigen des Gruppennamen von Einträgen (*)\n
* (*) Danke an Matthieu für die Umsetzung dieser Features!\n
* Unterstützung von KeeChallenge (mit Yubikey NEO). Danke an Ben Rush für die Implementierung des Connectors!\n
* verbesserte Benutzerschnittstelle.\n
* Fehler in der Google-Drive-Schnittstelle behoben.\n
* Option zum Deaktivieren der „Spenden“-Option hinzugefügt\n
* QuickUnlock-Symbol jetzt standardmäßig ausgeblendet bei Geräten mit Android 4.2+\n</string>
<string name="ChangeLog_0_9_3_r5"><b>Version 0.9.3 r5</b>\n
* Korrekturen von Xamarin übernommen: Keepass2Android ist jetzt kompatibel mit ART auf Android 4.4.2. Endlich!\n
* Fehlerkorrekturen: Fehler bei der Synchronization (Anzeigeaktualisierung, korrekte Prüfung auf Änderungen über HTTP), Fehler auf Android-2.x-Geräten, Fehler in den Implementierungen für Google Drive und OneDrive, Zwischenablage wird beim Schließen der Datenbank geleert, Fehler beim Öffnen von Anhängen, Anzeigeprobleme mit der Tastatur\n</string>
<string name="ChangeLog_0_9_3"><b>Version 0.9.3</b>\n
* Neue Tastatur mit einigen Verbesserungen. Siehe Einstellungen zum personalisieren.\n
* Leseunterstützung für kdb (Keepass-1-Dateien). Experimentell!\n
* SFTP-Unterstützung\n
* Workaround für Fehler in ART (Android 4.4.2) eingebaut\n
* Fehler korrigiert\n</string>
<string name="ChangeLog_0_9_2"><b>Version 0.9.2</b>\n
* Unterstützung für OTPs (One Time Passwords) integriert (kompatibel zum OtpKeyProv-Plugin)\n
* NFC-Support zur Eingabe von OTPs über YubiKey NEO integriert\n
* Verbesserungen an der Benutzeroberfläche\n
* Keepass-2.24-Bibliothek integriert \n
* Option zum Beenden des App-Prozesses eingebaut (s. Einstellungen)\n
* Fehler behoben\n</string>
<string name="ChangeLog_0_9_1"><b>Version 0.9.1</b>\n
* SkyDrive-Unterstützung integriert (Nur in der Nicht-Offline-Version von Keepass2Android)\n
* Probleme mit Google Drive Integration behoben\n
* NTLM-Unterstützung integriert</string>
<string name="ChangeLog_0_9"><b>Version 0.9</b>\n
* Unterstützung für Dropbox und Google Drive integriert (Datenbank lesen und schreiben; Nur in der Nicht-Offline-Version von Keepass2Android)\n
* Dateibrowser integriert (basiert auf android-filechooser von HBA)\n
* Verbesserte Benutzeroberfläche zum Anlegen von Datenbanken\n
* Schriftart DejaVu Sans Mono integriert zur Anzeige von Passwörtern\n
* Fehlerkorrekturen</string>
<string name="ChangeLog_0_8_6"><b>Version 0.8.6</b>\n
* Unterstützung für Twofish-Verschlüsselung\n
* Bearbeiten von Gruppen ermöglicht\n
* Verschieben von Einträgen und Gruppen ermöglicht\n
* Das QuickUnlock-Symbol kann transparent gemacht werden (s. Einstellungen)\n
* Bugs behoben</string>
<string name="ChangeLog_0_8_5"><b>Version 0.8.5</b>\n
* Remote-Dateien werden im lokalen Cache gespeichert. Das erlaubt Offline-Nutzung (inkl. Bearbeiten und späterem Synchronisieren). S. Einstellungen.\n
* Benachrichtigungssymbol zum Visualisieren des Sperrzustands (s. Einstellungen)\n
* Verbesserungen, um die Datenbank zur richtigen Zeit zu sperren\n
* Datenbankdateien werden in den Speicher geladen, während du das Passwort eingibst. Dadurch erhöhte Ladegeschwindigkeit.\n
* Einträge können zur Root-Gruppe hinzugefügt werden.\n
* Fehlerkorrekturen (Auflösen von von Referenzfeldern, Probleme mit der Tastatur auf italienischen und chinesischen Geräten)</string>
<string name="ChangeLog_0_8_4"><b>Version 0.8.4</b>\n
* Externe Änderungen an der Datenbank werden erkannt und beim Speichern zusammengeführt\n
* Verbesserte Geschwindigkeit beim Starten\n
* Verbesserte Suchleiste mit Vorschlägen\n
* Neues App-Logo!\n
* Unterstützung für .kdbp-Format für schnelleres Laden und Speichern hinzugefügt\n
* Verbesserung beim Bearbeiten von zusätzlichen Feldern und versteckte Darstellung von geschützten Feldern\n
Danke an Alex Vallat für seine Mitwirkung beim Code!\n
Danke an Niki Hüttner (www.close-cut.de) für das neue Logo!\n</string>
<string name="ChangeLog_0_8_3"><b>Version 0.8.3</b>\n
* Benutzername/TAN-Index wird in Liste der Einträge angezeigt (s. Einstellungen)\n
* Einträge können neu angelegt werden, wenn Suche aus Browser kein Ergebnis gebracht hat\n
@@ -765,6 +1025,18 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
* Dialog zur Tastaturauswahl öffnet sich automatisch nach Suche nach einer URL (s. Einstellungen)\n
* Platzhalter in Eintragsfeldern werden vor dem Kopieren ersetzt (die meisten Platzhalter werden unterstützt)\n
* kleinere Fehlerkorrekturen</string>
<string name="ChangeLog_0_8_2"><b>Version 0.8.2</b>\n
* Unterstützung für Digest Authentication in WebDAV\n
* Fehlerkorrekturen (OI File manager, URL öffnen)</string>
<string name="ChangeLog_0_8_1"><b>Version 0.8.1</b>\n
* KP2A Offline and „Online“ können wieder parallel zueinander installiert werden\n
* Neue Übersetzungen hinzugefügt (Danke an alle Helfer!)</string>
<string name="ChangeLog_0_8"><b>Version 0.8</b>\n
* Verbesserte Benutzeroberfläche, vor allem für Android 4.x-Geräte\n
* Möglichkeit, Dateimanager zur Auswahl von existierenden Dateien zu verwenden\n
* Sicherer Weg zum Öffnen von Anhängen hinzugefügt (über das Cache-Verzeichnis)\n
* Fehler beim Bearbeiten von Einträgen korrigiert\n
* vermutlich neue Fehler eingeführt :-)</string>
<string name="ChangeLog_keptDonate">Erweiterte Möglichkeit, ein Bier oder etwas anderes zu spenden</string>
<string name="ChangeLog_0_7"><b>Version 0.7</b>\n
* Erhöhte Ladegeschwindigkeit: Schlüsseltransformationen sind jetzt 10× schneller!\n
@@ -827,7 +1099,7 @@ Erstes öffentliches Release</string>
<item>Passwort und Challenge-Response</item>
<item>Passwort und Challenge-Response-Secret (Recovery-Modus)</item>
<item>Passwort und Challenge-Response für Keepass XC</item>
<item>Kennwort und Schlüsseldatei und Challenge-Response für Keepass XC</item>
<item>Passwort und Schlüsseldatei und Challenge-Response für Keepass XC</item>
</string-array>
<string-array name="sftp_auth_modes">
<item>Passwort</item>

View File

@@ -22,8 +22,8 @@
<string name="short_app_name_nonet">KP2A χωρίς σύνδεση</string>
<string name="app_timeout">Λήξη χρονικού ορίου εφαρμογής</string>
<string name="app_timeout_summary">Χρόνος πριν το κλείδωμα της βάσης δεδομένων όταν η εφαρμογή είναι ανενεργή.</string>
<string name="kill_app_label">Τερματισμός διεργασίας</string>
<string name="show_kill_app">Κουμπί τερματισμού</string>
<string name="kill_app_label">Τερματισμός διεργασίας</string>
<string name="show_kill_app_summary">Προβάλει κουμπί στην οθόνη συνθηματικού που τερματίζει τη διεργασία της εφαρμογής (για παρανοϊκούς χρήστες)</string>
<string name="application">Εφαρμογή</string>
<string name="application_settings">Ρυθμίσεις εφαρμογής</string>
@@ -152,6 +152,7 @@
<string name="hint_keyfile">αρχείο κλειδιού</string>
<string name="hint_length">μήκος</string>
<string name="hint_pass">συνθηματικό</string>
<string name="hint_keyfile_path">Διαδρομή ιδιωτικού κλειδιού SSH</string>
<string name="hint_login_pass">Συνθηματικό</string>
<string name="hint_title">όνομα</string>
<string name="hint_url">URL</string>
@@ -417,6 +418,7 @@
<string name="ShowUnlockedNotification_summary">Προβολή εικονιδίου ειδοποίησης, ενόσω η βάση δεδομένων είναι ξεκλείδωτη.</string>
<string name="IconVisibilityInfo_Android8_text">Το Android 8 εισήγαγε νέα συμπεριφορά για τις ειδοποιήσεις. Απόκρυψη του εικονιδίου των ειδοποιήσεων του Keepass2Android γίνεται από τις ρυθμίσεις συστήματος. Ορίστε τη σημαντικότητα της κατηγορίας ειδοποιήσεων στο Ελάχιστο.</string>
<string name="IconVisibilityInfo_Android8_btnSettings">Άνοιγμα ρυθμίσεων</string>
<string name="PostNotificationsPermissionInfo_text">Το Keepass2Android μπορεί να εμφανίζει μια ειδοποίηση συστήματος ενόσω η βάση δεδομένων σας παραμένει ξεκλείδωτη. Για να λειτουργήσει αυτό, χορηγήστε την άδεια.</string>
<string name="DontCare">Δεν με νοιάζει</string>
<string name="DocumentAccessRevoked">Το αρχείο δεν είναι πλέον προσπελάσιμο στο Keepass2Android. Είτε διαγράφτηκε ή ανακηθηκαν τα δικαιώματα πρόσβασης. Δοκιμάστε να ξανα-ανοίξετε το αρχείο, πχ με Αλλαγή βάσης δεδομένων.</string>
<string name="PreloadDatabaseEnabled_title">Προ-φόρτωση αρχείου βάσης δεδομένων</string>
@@ -501,9 +503,27 @@
<string name="hint_sftp_host">κόμβος (πχ 192.168.0.1)</string>
<string name="hint_sftp_port">θύρα</string>
<string name="initial_directory">Αρχικός κατάλογος (προαιρετικό):</string>
<string name="connect_timeout">Χρονικό όριο σύνδεσης σε δευτερόλεπτα (προαιρετικό)</string>
<string name="enter_sftp_login_title">Εισάγετε στοιχεία σύνδεσης SFTP:</string>
<string name="sftp_auth_mode">Τρόπος αυθεντικοποίησης</string>
<string name="send_public_key">Αποστολή δημόσιου κλειδιού...</string>
<string name="select_private_keyfile">Επιλέξτε ιδιωτικό κλειδί...</string>
<string name="hint_sftp_key_name">Νέο όνομα κλειδιού</string>
<string name="hint_sftp_key_content">Νέο περιεχόμενο κλειδιού</string>
<string name="private_key_saved">Το ιδιωτικό κλειδί αποθηκεύτηκε</string>
<string name="private_key_save_failed">ΑΠΟΤΥΧΙΑ αποθήκευσης του ιδιωτικού κλειδιού: %1$s</string>
<string name="private_key_info">Εισάγετε όνομα και περιεχόμενο του κλειδιού για αποθήκευση</string>
<string name="private_key_delete">Διαγράφηκε το ιδιωτικό κλειδί: %1$s</string>
<string name="private_key_delete_failed">ΑΠΟΤΥΧΙΑ διαγραφής του ιδιωτικού κλειδιού: %1$s</string>
<string name="save_key">Αποθήκευση ιδιωτικού κλειδιού</string>
<string name="delete_key">Διαγραφή ιδιωτικού κλειδιού </string>
<string name="private_key_select">Επιλέξτε ιδιωτικό κλειδί</string>
<string name="private_key_create_new">[Προσθήκη νέου...]</string>
<string name="hint_sftp_key_passphrase">Συνθηματικό κλειδιού (προαιρετικό)</string>
<string name="sftp_kex_title">Αλγόριθμος ανταλλαγής κλειδιών (προαιρετικά)</string>
<string name="hint_sftp_kex">Όνομα / προσδιορισμός διαχωρισμένα με κόμμα</string>
<string name="sftp_shk_title">Αλγόριθμος για το κλειδί του διακομιστή (προαιρετικά)</string>
<string name="hint_sftp_shk">Όνομα / προσδιορισμός διαχωρισμένα με κόμμα</string>
<string name="enter_ftp_login_title">Εισαγωγή δεδομένων εισόδου FTP:</string>
<string name="enter_mega_login_title">Εισάγετε τα δεδομένα εισόδου για το λογαριασμό MEGA:</string>
<string name="select_storage_type">Επιλέξτε τύπο αποθήκευσης:</string>
@@ -521,7 +541,9 @@
<string name="filestoragename_gdrive">Google Drive</string>
<string name="filestoragename_gdriveKP2A">Google Drive (αρχεία KP2A)</string>
<string name="filestoragehelp_gdriveKP2A">Αν δεν θέλετε να δώσετε πρόσβαση KP2A πρόσβαση σε όλο το Google Drive σας, μπορείτε να επιλέξετε αυτή την επιλογή. Σημειώστε ότι πρέπει να δημιουργήσετε ένα αρχείο βάσης δεδομένων πρώτα - τα υπάρχοντα αρχεία δεν είναι ορατά στην εφαρμογή. Επιλέξτε αυτή την επιλογή από την οθόνη Δημιουργία βάσης δεδομένων ή, αν έχετε ήδη ανοίξει μια βάση δεδομένων, με την εξαγωγή της βάσης δεδομένων επιλέγοντας αυτή την επιλογή.</string>
<string name="filestoragename_pcloud">PCloud (φάκελος KP2A)</string>
<string name="filestoragehelp_pcloud">Αυτός ο τύπος αποθήκευσης θα ζητήσει πρόσβαση μόνο στον pCloud φάκελο \"Applications/Keepass2Android\". Αν θέλετε να χρησιμοποιήσετε μια υπάρχουσα βάση δεδομένων από τον pCloud λογαριασμό σας, βεβαιωθείτε ότι το αρχείο έχει τοποθετηθεί σε αυτόν τον φάκελο.</string>
<string name="filestoragename_pcloudall">PCloud (πλήρης πρόσβαση)</string>
<string name="filestoragename_onedrive">OneDrive</string>
<string name="filestoragename_onedrive2">OneDrive</string>
<string name="filestoragename_onedrive2_full">Όλα τα αρχεία και τα κοινά αρχεία</string>
@@ -573,6 +595,7 @@
<string name="TrayTotp_prefs">TrayTotp</string>
<string name="DebugLog_prefs_prefs">Αρχείο καταγραφών για αποσφαλμάτωση</string>
<string name="DebugLog_title">Χρήση αρχείου καταγραφών</string>
<string name="FtpDebug_title">Καταγραφή σφαλμάτων FTP/SFTP</string>
<string name="DebugLog_summary">Καταγραφή στοιχείων της εφαρμογής σε τοπικό αρχείο καταγραφών</string>
<string name="DebugLog_send">Αποστολή αρχείων καταγραφής εκσφαλμάτωσης...</string>
<string name="loading">Φόρτωση…</string>
@@ -641,6 +664,21 @@
<string name="Continue">Συνέχεια</string>
<string name="NoFilenameWarning">Το URI που έχετε εισάγατε δεν μοιάζει με όνομα αρχείου. Είστε βέβαιοι ότι είναι έγκυρο αρχείο;</string>
<string name="FirstInvalidCompositeKeyError">Μη έγκυρο σύνθετο κλειδί! Παρακαλώ δοκιμάστε ξανά.</string>
<string name="RepeatedInvalidCompositeKeyHelp">Μη έγκυρο σύνθετο κλειδί! Δοκιμάστε τα ακόλουθα βήματα για να ξεκλειδώσετε τη βάση δεδομένων: \n
* Βεβαιωθείτε ότι έχετε πληκτρολογήσει το σωστό συνθηματικό. Χρησιμοποιήστε το εικονίδιο \'μάτι\' για να αποκαλυφθεί το συνθηματικό που εισάγατε. \n
* Βεβαιωθείτε ότι έχετε επιλέξει σωστό τύπο συνθηματικού. Βεβαιωθείτε ότι ταιριάζει με τον τύπο που χρησιμοποιήθηκε κατά τη δημιουργία της βάσης δεδομένων. \n
* Βεβαιωθείτε ότι έχετε επιλέξει το σωστό αρχείο βάσης δεδομένων.</string>
<string name="HintLocalBackupInvalidCompositeKey"> \n
&#8226; Υπόδειξη: Αν νομίζεις ότι η βάση δεδομένων σου έχει καταστραφεί, ή δεν θυμάσαι το κύριο κλειδί μετά την αλλαγή του, μπορείς να δοκιμάσεις την τελευταία έκδοση του αρχείου που άνοιξες με επιτυχία πατώντας \"%1$s\" και επιλέγοντας το τοπικό αντίγραφο.</string>
<string name="HintLocalBackupOtherError"> \n
&#8226; Υπόδειξη: Το Keepass2Android έχει αποθηκεύσει την τελευταία έκδοση του αρχείου που ανοίχτηκε στην εσωτερική μνήμη. Μπορείς να την ανοίξεις πατώντας \"%1$s\" και επιλέγοντας το τοπικό αντίγραφο. </string>
<string name="CorruptDatabaseHelp">Το αρχείο είναι κατεστραμμένο. \n
Ακολουθούν υποδείξεις για τη διάγνωση του προβλήματος: \n
Αν αντιγράψατε το αρχείο μέσω USB (MTP-Mode), προσπαθήστε ξανά με εργαλεία όπως το MyPhoneExplorer. Το MTP περικόπτει τα αρχεία σε ορισμένες περιπτώσεις. \n
Αν δεν μπορείτε να ανοίξετε το αρχείο από την ίδια θέση στον υπολογιστή σας, είναι πολύ πιθανό ότι το αρχείο είναι πράγματι κατεστραμμένο. Χρησιμοποιήστε αντίγραφο ασφαλείας της βάσης δεδομένων. Αν πιστεύετε ότι το Keepass2Android καταστρέφει το αρχείο, επικοινωνήστε με την ομάδα υποστήριξης. \n
Αν μπορείτε να ανοίξετε το αρχείο στον υπολογιστή σας, επικοινωνήστε με την ομάδα υποστήριξης. Μπορείτε να δοκιμάσετε να το αποθηκεύσετε με διαφορετικές ρυθμίσεις (π.χ. unzipped) στο PC και προσπαθήστε ξανά να ανοίξετε στο Keepass2Android. </string>
<string name="open_other_db">Ανοίξτε μια άλλη βάση δεδομένων…</string>
<string name="select_database">Επιλέξτε τη βάση δεδομένων</string>
<string name="configure_child_dbs">Προσαρμογή παράγωγων βάσεων δεδομένων…</string>
@@ -668,6 +706,13 @@
<string name="EntryChannel_desc">Ειδοποίηση για απλοποιημένη πρόσβαση στην τρέχουσα καταχώριση.</string>
<string name="CloseDbAfterFailedAttempts">Κλείσιμο της βάσης δεδομένων μετά από 3 ανεπιτυχείς προσπάθειες βιομετρικού ξεκλειδώματος.</string>
<string name="WarnFingerprintInvalidated">Προσοχή! Ο βιομετρικός έλεγχος ταυτότητας μπορεί να ακυρωθεί από το Android, π.χ. μετά την προσθήκη ενός νέου δακτυλικού αποτυπώματος στις ρυθμίσεις της συσκευής σας. Βεβαιωθείτε ότι ξέρετε πάντα πώς να ξεκλειδώσετε με τον κύριο κωδικό πρόσβασης!</string>
<string-array name="ChangeLog_1_10">
<item>Προσθήκη υποστήριξης για δικαιώματα ειδοποίησης στο Android 13+</item>
<item>Βελτίωση της υλοποίησης FTP και SFTP</item>
<item>Προσθήκη πρόσβασης σε πλήρες pCloud</item>
<item>Επιτρέπει την επιλογή γλώσσας συστήματος στο μενού της γλώσσας</item>
<item>Διόρθωση προβλήματος με την απομνημόνευση Keyfile + ερώτηση για τον τύπο του κωδικού πρόσβασης</item>
</string-array>
<string-array name="ChangeLog_1_09e">
<item>Διόρθωση σφάλματος για απότομα κλεισίματα εφαρμογής και μη αναμενόμενες αποσυνδέσεις</item>
<item>Μετάβαση σε νέα υλοποίηση SFTP, υποστηρίζοντας σύγχρονους αλγόριθμους δημόσιου κλειδιού όπως rsa-sha2-256</item>
@@ -733,34 +778,7 @@
<item>Διορθώσεις σφαλμάτων</item>
<item>Διορθώσεις σφαλμάτων</item>
</string-array>
<string name="ChangeLog_0_8_3">Έκδοση 0.8.3\n
* Username/TAN index displayed in entry list (see settings)\n
* Entries can be created if search from browser doesn\'t return results\n
* KP2A keyboard provides possibility to search for credentials for current app\n
* App automatically closes after selecting an entry for use in keyboard\n
* Keyboard selection dialog automatically opens after search for URL (see settings)\n
* Placeholders in entry fields are replaced before copying (most placeholders supported)\n
* minor bug fixes
</string>
<string name="ChangeLog_keptDonate">Εκτεταμένη δυνατότητα προσφοράς μπύρας ή κάτι άλλου</string>
<string name="ChangeLog_0_7">Έκδοση 0.7\n
* Increased loading speed: key transformations now 10x faster!\n
* Added Keepass2Android soft-keyboard: Switch to this keyboard for entering credentials. Shields you from clipboard-based password sniffers (disable old clipboard notifications in the options)\n
* Added option to donate a beer or something else (see menu)</string>
<string name="ChangeLog">Έκδοση 0.6.2\n
* Google Drive/Dropbox/... integration: Use the official Google Drive or Dropbox App and open any .kdbx-file. This will now bring up KP2A.\n
* Improved Search Dialog \n
* Improved search results for Share URL with subdomains\n
* Added options to give feedback, and rate and translate the app in the menu\n
\n
<b>Version 0.6.1</b>\n
* Detect when database changes in the background (i.e. due to activity of a sync app)\n
* Improved searching for URLs from the browser\n
* Confirm dialog when discarding changes\n
\n
<b>Version 0.6</b>\n
Initial public release
</string>
<string-array name="clipboard_timeout_options">
<item>30 δευτερόλεπτα</item>
<item>1 λεπτό</item>
@@ -828,6 +846,8 @@ Initial public release
<string name="autofill_enable_for">Ενεργοποίηση AutoFill για %1$s</string>
<string name="invalid_link_association">Δεν σχετίζεται το web domain %1$s με την εφαρμογή %2$s</string>
<string name="enable_fingerprint_hint">Το Keepass2Android ανίχνευσε βιομετρικό εξοπλισμό. Θέλετε να ενεργοποιήσετε βιομετρικό ξεκλείδωμα για αυτή τη βάση δεδομένων;</string>
<string name="post_notifications_dialog_disable">Απενεργοποιήστε αυτό το χαρακτηριστικό</string>
<string name="post_notifications_dialog_notnow">Όχι τώρα</string>
<string name="understand">Καταλαβαίνω</string>
<string name="dont_show_again">Να μην εμφανιστεί ξανά</string>
<string name="masterkey_infotext_head">Θυμάστε το κύριο συνθηματικό σας;</string>

View File

@@ -22,8 +22,8 @@
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">Tiempo de espera de la aplicación</string>
<string name="app_timeout_summary">Tiempo antes de bloquear la base de datos cuando la aplicación está inactiva.</string>
<string name="kill_app_label">Cerrar el proceso de la aplicación</string>
<string name="show_kill_app">Botón de cerrado</string>
<string name="kill_app_label">Cerrar el proceso de la aplicación</string>
<string name="show_kill_app_summary">Mostrar un botón en la pantalla de contraseña para cerrar el proceso (para usuarios paranoicos)</string>
<string name="application">Aplicación</string>
<string name="application_settings">Configuración de la aplicación</string>
@@ -541,7 +541,9 @@
<string name="filestoragename_gdrive">Google Drive</string>
<string name="filestoragename_gdriveKP2A">Google Drive (archivos KP2A)</string>
<string name="filestoragehelp_gdriveKP2A">Si no deseas brindarle acceso completo a KP2A para acceder a todos los archivos en Google Drive, debes seleccionar esta opción. Recuerda que primero debes crear una base de datos y los archivos existentes no son visibles para la aplicación. Selecciona esta opción desde la pantalla de \"Crear una base de datos\" o, si ya abriste una base de datos, puedes exportarla seleccionando esta opción.</string>
<string name="filestoragename_pcloud">PCloud (carpeta de KP2A)</string>
<string name="filestoragehelp_pcloud">Este tipo de almacenamiento sólo solicitará acceso a la carpeta de pCloud \"Aplicaciones/Keepass2Android\". Si desea utilizar una base de datos existente de su cuenta pCloud, asegúrese de que el archivo se coloca en dicha carpeta de pCloud.</string>
<string name="filestoragename_pcloudall">PCloud (acceso sin restricciones)</string>
<string name="filestoragename_onedrive">OneDrive</string>
<string name="filestoragename_onedrive2">OneDrive</string>
<string name="filestoragename_onedrive2_full">Todos los archivos y archivos compartidos</string>
@@ -593,6 +595,7 @@
<string name="TrayTotp_prefs">TrayTotp</string>
<string name="DebugLog_prefs_prefs">Fichero registro para Depuración</string>
<string name="DebugLog_title">Usar el archivo de registro</string>
<string name="FtpDebug_title">Registro de depuración FTP/SFTP</string>
<string name="DebugLog_summary">Escribir salida de app a fichero local de log</string>
<string name="DebugLog_send">Enviar registro de depuración...</string>
<string name="loading">Cargando…</string>
@@ -661,6 +664,15 @@
<string name="Continue">Continuar</string>
<string name="NoFilenameWarning">El URI que ha introducido no parece ser un nombre de archivo. ¿Está seguro que es un archivo válido?</string>
<string name="FirstInvalidCompositeKeyError">Clave compuesta no válida! Por favor, inténtelo de nuevo.</string>
<string name="RepeatedInvalidCompositeKeyHelp">¡Clave compuesta incorrecta! Por favor, sigue los siguientes pasos para desbloquear la Base de Datos:\n
&#8226; Asegúrate de haber puesto la contraseña correcta. Utiliza el icono del ojo para ver la contraseña.\n
&#8226; Asegúrate de haber seleccionado el tipo de contraseña correcta. Debe coincidir con el tipo usado al crear la Base de Datos.\n
&#8226; Asegúrate de haber seleccionado la Base de Datos correcta.
</string>
<string name="HintLocalBackupInvalidCompositeKey"> \n
&#8226; Sugerencia: Si piensas que la Base de Datos está dañada o no recuerdas la contraseña maestra después de cambiarla, inténtalo con la última versión de la Base de Datos abierta con éxito pulsando en \"%1$s\" y seleccionando la copia local.
</string>
<string name="open_other_db">Abrir otrar base de datos…</string>
<string name="select_database">Seleccione base de datos</string>
<string name="configure_child_dbs">Configure bases de datos hijas…</string>
@@ -753,33 +765,7 @@
<item>Corrección de errores</item>
<item>Correcciones de errores</item>
</string-array>
<string name="ChangeLog_0_8_3"><b>Versión 0.8.3</b>\n
* Indice de Nombre de usuario/TAN mostrado en la lista de entradas (ver la configuración)\n
* Las entradas pueden ser creadas si una búsqueda desde el navegador no devuelve resultados\n
* El teclado KP2A provee la posibilidad de buscar credenciales para la aplicación actual\n
* La aplicación se cierra automáticamente después de seleccionar una entrada para usar desde el teclado\n
* El diálogo de selección de teclado se abre automáticamente luego de buscar una URL (Ver la configuración)\n
* Los placeholders en los campos de las entradas son reemplazados antes de copiarlos (la mayor parte de los placeholders son soportados)\n
* Corrección de errores menores
  </string>
<string name="ChangeLog_keptDonate">Ofrecemos la posibilidad de donarnos una cerveza u otra cosa</string>
<string name="ChangeLog_0_7"><b>Versión 0.7</b> \n
* Velocidad de carga aumentada: transformaciones de llaves 10 veces más rápido! \n
* Nuevo Teclado Keepass2Android: cambia a este teclado para introducir credenciales. Le protege de sniffers de contraseñas basados en el portapapeles (desactiva las notificaciones anteriores del portapapeles en las opciones) \n
* Añadida opción de donar una cerveza u otra cosa (ver menú)</string>
<string name="ChangeLog"><b>Versión 0.6.2</b> \n
* Integración con Google Drive/Dropbox /... : Utilice las Apps oficiales de Google Drive o Dropbox para abrir cualquier archivo de .kdbx. Esto abrirá ahora KP2A.\n
* Cuadro de búsqueda mejorado \n
* Resultados de la búsqueda mejorados para URLs compartidas con subdominios\n
* Opciones para enviar retroalimentación, calificar y traducir la aplicación en el menú\n
\n
<b>versión 0.6.1</b> \n
* Detecta cuando cambia la base de datos en el fondo (es decir, debido a la actividad de una aplicación de sincronización) \n
* Búsqueda de URLs del navegador\n
* Diálogo de confirmación cuando se deshaga de cambios\n
\n
<b>versión 0.6</b> \n
Publicación inicial</string>
<string-array name="clipboard_timeout_options">
<item>30 segundos</item>
<item>1 minuto</item>

View File

@@ -19,8 +19,8 @@
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">Aplikazioa denboraz kanpo</string>
<string name="app_timeout_summary">Aplikazioa inaktibo dagoenean datu-basea blokeatzeko denbora.</string>
<string name="kill_app_label">Aplikazioaren prozesua hil</string>
<string name="show_kill_app">Itxi-botoia</string>
<string name="kill_app_label">Aplikazioaren prozesua hil</string>
<string name="show_kill_app_summary">Erakutsi botoi bat pasahitzaren pantailan aplikazioaren prozesua hiltzeko (erabiltzaile paranoikoentzat)</string>
<string name="application">Aplikazioa</string>
<string name="application_settings">Aplikazioaren ezarpenak</string>

View File

@@ -23,8 +23,8 @@ JCraft ایجاد شده است. تحت مجوز BSD.</string>
<string name="short_app_name_nonet">KP2A آفلاین</string>
<string name="app_timeout">مهلت برنامه</string>
<string name="app_timeout_summary">در صورتی که نرم افزار در این مدت فعالیتی نداشته باشد پایگاه داده قفل می شود.</string>
<string name="kill_app_label">قطع کردن پروسه پردازش نرم افزار</string>
<string name="show_kill_app">دکمهٔ بستن</string>
<string name="kill_app_label">قطع کردن پروسه پردازش نرم افزار</string>
<string name="show_kill_app_summary">در صفحهٔ نمایش گذرواژه، دکمه‌ای برای بستن کامل برنامه اضافه می‌کند (برای کاربران بدگمان)</string>
<string name="application">برنامه</string>
<string name="application_settings">تنظیمات برنامه</string>

View File

@@ -22,8 +22,8 @@
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">Aika-katkaisu</string>
<string name="app_timeout_summary">Aika, jonka jälkeen tietokanta lukkiutuu automaattisesti jos ohjelmaa ei käytetä.</string>
<string name="kill_app_label">Lopeta sovelluksen prosessi</string>
<string name="show_kill_app">Sulje-painike</string>
<string name="kill_app_label">Lopeta sovelluksen prosessi</string>
<string name="show_kill_app_summary">Näytä \"Lopeta sovelluksen prosessi\" painike (vainoharhaisille käyttäjille)</string>
<string name="application">Sovellus</string>
<string name="application_settings">Sovellusasetukset</string>
@@ -683,33 +683,7 @@
<item>Switch to BiometricPrompt API to improve user experience with fingerprint unlock and allow to use face unlock, e.g. on Pixel 4.</item>
<item>Bugikorjaukset</item>
</string-array>
<string name="ChangeLog_0_8_3"><b>Versio 0.8.3</b> \n
* Käyttäjätunnus/TAN hakemiston merkintä luettelossa (Katso asetukset) \n
* Merkinnät voidaan luoda, jos haku selaimessa ei tuota tuloksia\n
* KP2A näppäimistö antaa mahdollisuuden etsiä tunnistetiedot nykyiselle sovellukselle\n
* Sovellus automaattisesti sulkeutuu valittuasi kohteen käytettäväksi näppäimistöltä\n
* Näppäimistö-valintaikkuna avautuu automaattisesti haettuasi URL: lia (Katso asetukset) \n
* Paikkamerkit korvataan ennen kopiointia (useimpia paikkamerkkejä tuetaan) \n
* Pieniä bugi korjauksia </string>
<string name="ChangeLog_keptDonate">Laajennettu mahdollisuus lahjoittaa olutta tai jotain muuta</string>
<string name="ChangeLog_0_7"><b>Versio 0.7</b> \n
* Lisätään lastausnopeutta: avain muutokset nyt 10 kertaa nopeampia! \n
* Lisätty Keepass2Android soft-näppäimistö: Vaihda tähän näppäimistöön valitaksesi tunnisteet.
Suojelee sinua Leikepöytään perustuvalta salasana sniffaukselta (Poista vanhan Leikepöydän ilmoitukset asetuksista) \n
* Lisätty mahdollisuus lahjoittaa olutta tai jotain muuta (Katso valikko)</string>
<string name="ChangeLog"><b>Versio 0.6.2</b>\n
* Google Drive/Dropbox/... integraatio: Käytä virallista Google Drive tai Dropbox sovellusta ja avaa mikä tahansa .kdbx-tiedosto. Tämä avaa nyt KP2A:in.\n
* Paranneltu Hakudialogi \n
* Paranneltu hakutuloksia Jaa URL aliverkkotunnuksille\n
* Lisätty Palaute-toiminto, sekä Arvostele ja Käännä sovellus valikkoon\n
\n
<b>Versio 0.6.1</b>\n
* Tunnista tietokannan muutokset taustalla (eli synkronoinnin johdosta)\n
* Paranneltu URL-haku selaimesta\n
* Vahvistusdialogi muutoksia peruttaessa\n
\n
<b>Versio 0.6</b>\n
Alustava julkaisu </string>
<string-array name="clipboard_timeout_options">
<item>30 sekuntia</item>
<item>1 minuutti</item>

Some files were not shown because too many files have changed in this diff Show More