Compare commits

...

97 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
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
107 changed files with 2462 additions and 1553 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

@@ -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

@@ -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

@@ -20,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>

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 )
{

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.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

@@ -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);
@@ -946,24 +953,32 @@ namespace keepass2android
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)
@@ -977,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);
@@ -990,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()
{
@@ -1040,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(
@@ -1055,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://")
@@ -1069,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)
@@ -1135,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)
@@ -1282,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))
@@ -1323,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

@@ -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>
@@ -709,6 +718,19 @@
<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>
@@ -781,7 +803,264 @@
<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
* KP2A klávesnice nabízí možnost hledání jména/hesla pro aktuálně používanou aplikaci\n
* Aplikace se automaticky zavře po výběru položky pro použití v klávesnici\n
* Dialog výběru klávesnice se automaticky otevírá po hledání adresy URL (viz nastavení)\n
* 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
* Přidán Keepass2Android soft-keyboard: Přepněte se na tuto klávesnici pro vložení údajů pověření. Ochraňuje před útoky založenými na skenování schránky (vypněte starý systém upozornění v nastavení)\n
* Doplněna položka menu Přispět na pivo nebo na něco jiného</string>
<string name="ChangeLog"><b>Verze 0.6.2</b>\n
* Integrace Google Drive/Dropbox/... : Využívá oficiální Google Drive nebo Dropbox aplikace k otevření .kdbx-soubor, poté spustí KP2A.\n
* Vylepšení Vyhledávací dialog \n
* Vylepšené výsledky hledání pro Sdílené adresy Share URL s pod-doménami\n
* Doplnení možností pro připomínky a hodnocení aplikace\n
\n
<b>Verze 0.6.1</b>\n
* Detekce změn databáze na pozadí (i.e. např. díky synchronizaci)\n
* Vylepšeno vyhledávání adres URL z prohlížeče\n
* Potvrzovací dialog zahození změn\n
\n
<b>Verze 0.6</b>\n
První veřejné vydání
</string>
<string-array name="clipboard_timeout_options">
<item>30 sekund</item>
<item>1 minuta</item>

View File

@@ -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,7 +802,259 @@ 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
* KP2A-Tastatur erlaubt Suche nach Zugangsdaten für die aktive App\n
* App schließt sich automatisch nach Auswahl eines Eintrags über die Tastatur\n
* 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
* Neu: Keepass2Android-Software-Tastatur: Zu dieser Tastatur wechseln, um die Zugangsdaten einzugeben. Das schützt vor Zwischenablage-basierten Passwort-Sniffern! (die bisherigen Benachrichtigungen für das Kopieren in die Zwischenablage lassen sich in den Einstellungen deaktivieren)\n
* Option eingefügt, um mir ein Bier oder was anderes zu spendieren (s. Menü)</string>
<string name="ChangeLog"><b>Version 0.6.2</b>\n
* Integration für Google Drive/Dropbox/…: Die offizielle App für Google Drive oder Dropbox nutzen und daraus die .kdbx-Datei öffnen. Das startet dann KP2A.\n
* Verbesserter Suchdialog \n
* Verbesserte Suche bei „Teilen“ mit Subdomains\n
* Optionen für Feedback, Bewerten und Übersetzen zum Menü hinzugefügt\n
\n
<b>Version 0.6.1</b>\n
* Erkennung, wenn sich eine Datenbank im Hingrund ändert (z. B. durch eine Sync-App)\n
* Suche aus dem Browser verbessert\n
* Bestätigungsdialog, wenn Änderungen verworfen werden sollen\n
\n
<b>Version 0.6</b>\n
Erstes öffentliches Release</string>
<string-array name="clipboard_timeout_options">
<item>30 Sekunden</item>
<item>1 Minute</item>
@@ -802,7 +1099,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<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

@@ -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>

View File

@@ -402,6 +402,14 @@
<string name="ShowSeparateNotifications_summary">ユーザー名やパスワードをクリップボードへコピーするための通知とキーボード変更のための通知を分割して表示します。</string>
<string name="AccServiceAutoFill_prefs">自動入力ユーザー補助サービス</string>
<string name="AutoFill_prefs">自動入力サービス</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">TOTP を含むエントリーを自動入力する場合、TOTP をコピーボタンをエントリーの通知に表示します</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">エントリーの通知を表示</string>
<string name="AutoFillTotp_prefs_title">TOTP エントリーの自動入力</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">クリップボードに TOTP をコピー</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">TOTP を含むエントリーを自動入力する場合、 クリップボードに TOTP をコピーします</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">TOTP を含むエントリーを自動入力する場合、TOTP ボタン付きの内蔵キーボードを起動します。</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">内蔵キーボードを起動</string>
<string name="TotpCopiedToClipboard">クリップボードに TOTP をコピーしました</string>
<string name="ShowKp2aKeyboardNotification_title">KP2A キーボードの通知</string>
<string name="ShowKp2aKeyboardNotification_summary">KP2A のキーボードからすべてのエントリーにアクセスできるようにします (推奨)</string>
<string name="OpenKp2aKeyboardAutomatically_title">キーボード切り替え</string>
@@ -589,6 +597,7 @@
<string name="CouldntLoadChalAuxFile_Hint">KeePass 2.x (PC) の KeeChallenge プラグインを使用して、チャレンジレスポンスを使うようにデータベースを構成してください!</string>
<string name="ErrorUpdatingChalAuxFile">OTP 補助ファイルの更新にエラーが発生しました!</string>
<string name="TrayTotp_SeedField_title">TOTP シード フィールド名</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">デフォルト以外の設定で Keepass 2 プラグイン「TrayTotp」を使用している場合、PC での設定に従ってシード フィールドのフィールド名を入力してください。</string>
<string name="TrayTotp_SettingsField_title">TOTP 設定フィールド名</string>
<string name="TrayTotp_SettingsField_summary">ここに TrayTotp の設定フィールドのフィールド名を入力してください。</string>

View File

@@ -2,8 +2,8 @@
<!--Generated by crowdin.net-->
<resources>
<string name="about_feedback">Terugkoppeling</string>
<string name="AboutText">Keepass2Android is een wachtwoordmanager voor Android die KeePass 2.x databases kan lezen en schrijven.</string>
<string name="CreditsText">De gebruikersinterface is gebaseerd op KeepassDroid, een port ontwikkeld door Brian Pellin. Code voor de database operaties is gebaseerd op KeePass door Dominik Reichl. De Android robot is gereproduceerd of aangepast van werk gemaakt en gedeeld door Google en gebruikt in overeenstemming met de voorwaarden beschreven in de Creative Commons 3.0 Attribution License.</string>
<string name="AboutText">Keepass2Android is een wachtwoordbeheerder die lees-/schrijftoegang biedt tot KeePass 2.x-databases op Android.</string>
<string name="CreditsText">De gebruikersinterface is gebaseerd op een port van KeepassDroid ontwikkeld door Brian Pellin. De code voor databasebewerkingen is gebaseerd op KeePass van Dominik Reichl. De Android robot is gereproduceerd of aangepast van werk gemaakt en gedeeld door Google en gebruikt volgens de voorwaarden beschreven in de Creative Commons 3.0 Naamsvermelding Licentie.</string>
<string name="CreditsTextSFTP">SFTP ondersteuning is geïmplementeerd door middel van de JSch-bibliotheek onder BSD-licentie, gemaakt door JCraft, Inc.</string>
<string name="CreditsIcons">Het hamer-pictogram is gemaakt door John Caserta van het Noun Project. Het pinguïn-pictogram is gemaakt door Adriano Emerick van het Noun Project. Het veer-pictogram is gemaakt door Jon Testa van het Noun Project. Het Apple-pictogram is gemaakt door Ava Rowell van het Noun Project. Het afbeelding-pictogram komt van https://icons8.com/icon/5570/Picture.</string>
<string name="accept">Accepteren</string>
@@ -20,20 +20,20 @@
<string name="short_app_name">KP2A</string>
<string name="app_name_nonet">Keepass2Android Offline</string>
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">App timeout</string>
<string name="app_timeout_summary">Tijd tot het vergrendelen van de database bij inactiviteit van de app.</string>
<string name="app_timeout">App time-out</string>
<string name="app_timeout_summary">Tijd voordat de database wordt vergrendeld als de app inactief is.</string>
<string name="show_kill_app">Sluiten-Knop</string>
<string name="kill_app_label">App-proces afsluiten</string>
<string name="show_kill_app_summary">Een knop weergeven in het wachtwoordscherm om de applicatie te beëindigen (voor paranoïde gebruikers)</string>
<string name="show_kill_app_summary">Toon een knop in het wachtwoordscherm om het app-proces te beëindigen (voor paranoïde gebruikers)</string>
<string name="application">App</string>
<string name="application_settings">App-instellingen</string>
<string name="ShowGroupnameInSearchResult_title">Toon groepsnaam in zoekresultaat</string>
<string name="ShowGroupnameInSearchResult_resume">Toon groepsnaam onder item namen in zoekresultaten. Handig als verschillende items dezelfde naam hebben.</string>
<string name="NavigationToGroupCompleted_message">Getoonde groep is nu: %1$s</string>
<string name="AutofillDisabledQueriesPreference_title">Automatisch invullen is uitgeschakeld voor</string>
<string name="AutofillDisabledQueriesPreference_summary">Toont een lijst van apps en websites waarvoor automatisch invullen is uitgeschakeld</string>
<string name="OfferSaveCredentials_summary">Indien ingeschakeld, zal Android vragen of je de gegevens wilt opslaan nadat je handmatig gegevens hebt aangepast in auto-vulbare velden.</string>
<string name="OfferSaveCredentials_title">Bied het opslaan van wachtwoordgegevens aan</string>
<string name="AutofillDisabledQueriesPreference_summary">Toont een lijst van apps en websites waarvoor Automatisch Invullen is uitgeschakeld</string>
<string name="OfferSaveCredentials_summary">Bij inschakelen vraagt Android of je gegevens wilt opslaan nadat je handmatig gegevens hebt ingevoerd in automatisch invulbare velden.</string>
<string name="OfferSaveCredentials_title">Opslaan van wachtwoordgegevens aanbieden</string>
<string name="ShowGroupInEntry_title">Toon groepsnaam in item venster</string>
<string name="unknown_uri_scheme">Sorry! Keepass2Android kan niet overweg met de ontvangen URI %1$s. Neem contact op met de ontwikkelaar!</string>
<string name="Entry_singular">Eén item</string>
@@ -43,29 +43,29 @@
<string name="security_prefs">Beveiliging</string>
<string name="display_prefs">Weergave</string>
<string name="password_access_prefs">Wachtwoordtoegang</string>
<string name="QuickUnlock_prefs">Snel Openen</string>
<string name="FileHandling_prefs">Omgang met bestanden</string>
<string name="QuickUnlock_prefs">SnelOpenen</string>
<string name="FileHandling_prefs">Bestandsbeheer</string>
<string name="keyboard_prefs">Toetsenbord</string>
<string name="export_prefs">Database exporteren...</string>
<string name="fingerprint_prefs">Ontgrendelen met biometrie</string>
<string name="import_db_prefs">Database importeren naar interne map</string>
<string name="import_keyfile_prefs">Sleutelbestand importeren</string>
<string name="export_keyfile_prefs">Exporteer sleutelbestand vanuit interne map</string>
<string name="import_keyfile_prefs">Sleutelbestand naar interne map importeren</string>
<string name="export_keyfile_prefs">Sleutelbestand vanuit interne map exporteren</string>
<string name="keyboardswitch_prefs">Toetsenbord wisselen</string>
<string name="OnlyAvailableForLocalFiles">Alleen beschikbaar voor lokale bestanden.</string>
<string name="FileIsInInternalDirectory">Bestand is opgeslagen in interne map.</string>
<string name="DatabaseFileMoved">De database is geïmporteerd. Druk op Oké om de database te openen van de nieuwe locatie. Let op: Vergeet niet om regelmatig de database te exporteren!</string>
<string name="KeyfileMoved">Sleutelbestand geïmporteerd. Zorg voor een back-up voordat je het bestand verwijdert!</string>
<string name="KeyfileMoveRequiresRememberKeyfile">Om de interne map te gebruiken moet de locatie van het sleutelbestand bewaard blijven. Pas uw beveiligingsinstellingen aan.</string>
<string name="DatabaseFileMoved">Database is gekopieerd naar interne map. Met Ok kunt u het bestand openen vanaf de nieuwe locatie. NB: Vergeet niet de database regelmatig naar een veilige opslagplaats te exporteren!</string>
<string name="KeyfileMoved">Sleutelbestand is gekopieerd naar interne map. Maak een veilige back-up voordat het bestand is verwijderd van de huidige locatie!</string>
<string name="KeyfileMoveRequiresRememberKeyfile">Om de interne map te gebruiken moet de locatie van het sleutelbestand bewaard blijven. Pas de beveiligingsinstellingen aan.</string>
<string name="unlock_database_button">Openen</string>
<string name="unlock_database_title">Database openen</string>
<string name="brackets">Haakjes</string>
<string name="cancel">Annuleren</string>
<string name="Ok">Oké</string>
<string name="Ok">Ok</string>
<string name="disable_sensor">Sensor uitschakelen</string>
<string name="enable_sensor">Sensor inschakelen</string>
<string name="ClearClipboard">Klembord gewist.</string>
<string name="clipboard_timeout">Klembordtimeout</string>
<string name="clipboard_timeout">Klembord time-out</string>
<string name="clipboard_timeout_summary">Tijd tussen het kopiëren van gebruikersnaam of wachtwoord en het wissen van het klembord</string>
<string name="copy_username">Selecteer om gebruikersnaam naar klembord te kopiëren</string>
<string name="copy_password">Selecteer om wachtwoord naar klembord te kopiëren</string>
@@ -80,11 +80,11 @@
<string name="current_group_root">Huidige groep: Root</string>
<string name="database">Database</string>
<string name="digits">Cijfers</string>
<string name="disclaimer_formal">Keepass2Android biedt GEEN ENKELE GARANTIE; Dit is gratis software, je mag deze software verspreiden onder de voorwaarden van de GPL versie 2 of recenter.</string>
<string name="disclaimer_formal">Keepass2Android biedt GEEN ENKELE GARANTIE; Dit is gratis software, je mag dhet verspreiden onder de voorwaarden van de GPL versie 2 of recenter.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Kopieer naar klembord</string>
<string name="SystemLanguage">Systeemtaal</string>
<string name="fingerprint_description">Verifiëren om door te gaan</string>
<string name="fingerprint_description">Authenticeer om door te gaan</string>
<string name="fingerprint_fatal">Biometrische ontgrendeling kan niet worden ingesteld:</string>
<string name="fingerprint_not_recognized">Biometrische authenticatie mislukt. Probeer opnieuw.</string>
<string name="fingerprint_success">Biometrische authenticatie geslaagd</string>
@@ -93,15 +93,15 @@
<string name="fingerprint_no_enrolled">Je hebt biometrische authenticatie nog niet geconfigureerd op dit apparaat. Ga eerst naar de systeeminstellingen.</string>
<string name="disable_fingerprint_unlock">Biometrische ontgrendeling uitschakelen</string>
<string name="enable_fingerprint_unlock">Volledige Biometrische ontgrendeling inschakelen</string>
<string name="enable_fingerprint_quickunlock">Biometrische ontgrendeling voor QuickUnlock inschakelen</string>
<string name="fingerprint_unlock_failed">Biometrische Ontgrendel is mislukt. Decryptie sleutel is ongeldig gemaakt door Android OS. Dit gebeurt meestal als biometrische authenticatie of veiligheidsinstellingen zijn gewijzigd. </string>
<string name="fingerprint_disabled_wrong_masterkey">Ontgrendelen van de database mislukt: Ongeldige sleutel. Biometrische ontgrendelen is uitgeschakeld omdat het hoofdwachtwoord niet meer geldig is. </string>
<string name="enable_fingerprint_quickunlock">Biometrische ontgrendeling voor SnelOpenen inschakelen</string>
<string name="fingerprint_unlock_failed">Biometrische ontgrendeling is mislukt. Ontcijferingssleutel is ongeldig gemaakt door Android OS. Dit gebeurt meestal als biometrische authenticatie of veiligheidsinstellingen werden gewijzigd. </string>
<string name="fingerprint_disabled_wrong_masterkey">Ontgrendelen van de database mislukt: Ongeldige samengestelde sleutel. Biometrische ontgrendeling is uitgeschakeld omdat het opgeslagen hoofdwachtwoord blijkbaar niet langer geldig is.</string>
<string name="fingerprint_reenable">Schakel de Biometrische ontgrendeling opnieuw in voor het nieuwe hoofdwachtwoord.</string>
<string name="fingerprint_reenable2">Ontgrendelen met jouw wachtwoord, schakel daarna de Biometrische ontgrendeling opnieuw in in de instellingen van de database.</string>
<string name="FingerprintInitFailed">Mislukt om biometrische authenticatie te initialiseren. </string>
<string name="fingerprint_reenable2">Ontgrendel met je wachtwoord en schakel Biometrische ontgrendeling opnieuw in bij de database-instellingen.</string>
<string name="FingerprintInitFailed">Initialiseren biometrische authenticatie faalde. </string>
<string name="FingerprintSetupFailed">Kan gegevens niet versleutelen. Dit kan gebeuren als je vingerafdrukken toevoegt of verwijdert in de systeeminstellingen terwijl Keepass2Android luistert naar je vingerafdruk.</string>
<string name="enable_fingerprint_unlock_Info">Dit zal je hoofdwachtwoord op dit apparaat opslaan. Het wordt versleuteld door de Android Keystore en beschermd door authenticatie met jouw vingerafdruk. Dit geeft de mogelijkheid de database enkel met jouw vingerafdruk te ontgrendelen.</string>
<string name="enable_fingerprint_quickunlock_Info">Gebruik biometrische authenticatie in plaats van de QuickUnlock code. Dit slaat geen informatie op die gerelateerd is aan je hoofdwachtwoord.</string>
<string name="enable_fingerprint_unlock_Info">Dit zal je hoofdwachtwoord op dit apparaat opslaan. Het wordt versleuteld door de Android Keystore en beschermd door biometrische authenticatie. Dit geeft de mogelijkheid de database enkel met jouw vingerafdruk te ontgrendelen.</string>
<string name="enable_fingerprint_quickunlock_Info">Maakt het mogelijk om biometrische authenticatie te gebruiken in plaats van de SnelOpenen-code. Slaat geen informatie over het hoofdwachtwoord op.</string>
<string name="enter_filename">Voer databasebestandsnaam in</string>
<string name="entry_accessed">Geopend op</string>
<string name="entry_cancel">Annuleren</string>
@@ -152,6 +152,7 @@
<string name="hint_keyfile">sleutelbestand</string>
<string name="hint_length">lengte</string>
<string name="hint_pass">wachtwoord</string>
<string name="hint_keyfile_path">SSH-privésleutel pad</string>
<string name="hint_login_pass">Wachtwoord</string>
<string name="hint_title">naam</string>
<string name="hint_url">URL</string>
@@ -314,26 +315,26 @@
<string name="start_create_import">Bestand importeren naar nieuwe database...</string>
<string name="enter_filename_details_url">De volledige URL moet worden opgegeven inclusief protocol zoals http://.</string>
<string name="enter_filename_details_create_import">Te importeren bestand zal in de volgende stap geselecteerd worden.</string>
<string name="enable_quickunlock">Snel Openen inschakelen</string>
<string name="QuickUnlock_label">Voer de laatste %1$d karakters van je wachtwoord in:</string>
<string name="QuickUnlock_label_secure">Snel Openen code invoeren:</string>
<string name="QuickUnlock_button">Snel Openen!</string>
<string name="enable_quickunlock">SnelOpenen inschakelen</string>
<string name="QuickUnlock_label">Vul de laatste %1$d tekens van uw wachtwoord in:</string>
<string name="QuickUnlock_label_secure">SnelOpenen code invoeren:</string>
<string name="QuickUnlock_button">SnelOpenen!</string>
<string name="QuickUnlock_lockButton">Database sluiten</string>
<string name="QuickUnlockDefaultEnabled_title">Snel Openen standaard ingeschakeld</string>
<string name="QuickUnlockDefaultEnabled_summary">Hiermee definieert u of Snel Openen standaard is ingeschakeld of niet.</string>
<string name="QuickUnlockDefaultEnabled_title">SnelOpenen standaard inschakelen</string>
<string name="QuickUnlockDefaultEnabled_summary">Bepaalt of SnelOpenen standaard is ingeschakeld of niet.</string>
<string name="ViewDatabaseSecure_title">Bescherm weergeven database</string>
<string name="ViewDatabaseSecure_summary">Wanneer ingeschakeld is het maken van screenshots niet toegestaan en zal geen miniatuur van de app worden weergegeven in de lijst met recente apps.</string>
<string name="QuickUnlockIconHidden_title">Snel Openen pictogram verbergen</string>
<string name="QuickUnlockIconHidden_summary">Snel Openen helaas werkt niet zonder een notificatiepictogram weer te geven. Selecteer deze optie om een transparant pictogram te gebruiken.</string>
<string name="QuickUnlockIconHidden16_title">Snel Openen pictogram verbergen</string>
<string name="QuickUnlockIconHidden16_summary">QuickUnlock vereist een notificatie om goed te werken. Selecteer deze optie om de notificatie pictogram niet te tonen.</string>
<string name="QuickUnlockLength_title">Lengte van sleutel voor Snel Openen</string>
<string name="QuickUnlockLength_summary">Maximum aantal tekens gebruikt voor Snel Openen wachtwoord.</string>
<string name="QuickUnlockHideLength_title">Verberg Snel Openen lengte</string>
<string name="QuickUnlockHideLength_summary">Als ingeschakeld, wordt de lengte van de Snel Openen code niet weergegeven in het Snel Openen scherm.</string>
<string name="QuickUnlockKeyFromDatabase_title">Snelle deblokkeercode uit database item</string>
<string name="QuickUnlockKeyFromDatabase_summary">Als de actieve database een item met titel QuickUnlock in de hoofdgroep bevat, wordt het wachtwoord van dit item gebruikt als snelle deblokkeer code.</string>
<string name="QuickUnlock_fail">Snel Openen is mislukt: verkeerd wachtwoord!</string>
<string name="QuickUnlockIconHidden_title">Verberg pictogram SnelOpenen</string>
<string name="QuickUnlockIconHidden_summary">SnelOpenen werkt helaas niet zonder een meldingspictogram weer te geven. Kies deze optie om een transparant pictogram te gebruiken.</string>
<string name="QuickUnlockIconHidden16_title">Verberg pictogram SnelOpenen</string>
<string name="QuickUnlockIconHidden16_summary">SnelOpenen vereist een melding om juist te werken. Kies deze optie om een melding zonder pictogram weer te geven.</string>
<string name="QuickUnlockLength_title">Lengte van SnelOpenen sleutel</string>
<string name="QuickUnlockLength_summary">Maximum aantal tekens dat wordt gebruikt als SnelOpenen-wachtwoord.</string>
<string name="QuickUnlockHideLength_title">Verberg SnelOpenen lengte</string>
<string name="QuickUnlockHideLength_summary">Indien geactiveerd, wordt de lengte van de SnelOpenen code niet weergegeven op het SnelOpenen scherm.</string>
<string name="QuickUnlockKeyFromDatabase_title">SnelOpenen sleutel uit database invoer</string>
<string name="QuickUnlockKeyFromDatabase_summary">Als de actieve database een item bevat met de titel \"SnelOpenen\" in de hoofdgroep, wordt het wachtwoord van dit item gebruikt als SnelOpenen code.</string>
<string name="QuickUnlock_fail">SnelOpenen is mislukt: wachtwoord onjuist!</string>
<string name="SaveAttachmentDialog_title">Bijlage opslaan</string>
<string name="SaveAttachmentDialog_text">Selecteer waar u de bijlage wilt opslaan.</string>
<string name="SaveAttachmentDialog_save">Exporteer naar bestand...</string>
@@ -360,7 +361,7 @@
<string name="totp_length">Lengte van de code</string>
<string name="totp_scan">Scan QR code</string>
<string name="delete_extra_string">Extra waarde verwijderen</string>
<string name="database_loaded_quickunlock_enabled">%1$s: vergrendeld. Snel Openen ingeschakeld.</string>
<string name="database_loaded_quickunlock_enabled">%1$s: vergrendeld. SnelOpenen ingeschakeld.</string>
<string name="database_loaded_unlocked">%1$s: Ontgrendeld.</string>
<string name="credentials_dialog_title">Voer server inloggegevens in</string>
<string name="UseFileTransactions_title">Bestandshandelingen</string>
@@ -381,7 +382,7 @@
<string name="NoDonationReminder_title">Nooit vragen om een donatie</string>
<string name="NoDonationReminder_summary">Ik geef je nog geen dubbeltje of ik heb al gedoneerd. Niet vragen om een donatie, zelfs niet op de verjaardag van de auteur.</string>
<string name="UseOfflineCache_title">Database caching</string>
<string name="UseOfflineCache_summary">Houd een kopie van de database-bestanden in de cache-map van de app. Dit maakt het mogelijk om databases te gebruiken, zelfs als het database-bestand niet toegankelijk is.</string>
<string name="UseOfflineCache_summary">Bewaar een kopie van de databasebestanden in de cache-map van de app. Dit maakt het mogelijk databases te gebruiken, zelfs als het databasebestand niet toegankelijk is.</string>
<string name="CreateBackups_title">Lokale back-ups</string>
<string name="CreateBackups_summary">Maak een lokale back-up na het goed openen van een database.</string>
<string name="UpdatingBackup">Lokale back-up bijwerken...</string>
@@ -401,6 +402,14 @@
<string name="ShowSeparateNotifications_summary">Toon afzonderlijke notificaties voor het kopiëren van gebruikersnaam en wachtwoord en voor het inschakelen van het toetsenbord.</string>
<string name="AccServiceAutoFill_prefs">Toegankelijkheid service voor automatisch invullen</string>
<string name="AutoFill_prefs">Service voor automatisch invullen</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">Laat bij het automatisch invullen van een invoer met TOTP de invoer-melding zien met een knop Kopieer TOTP</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">Toon de invoer-melding</string>
<string name="AutoFillTotp_prefs_title">Automatisch invullen voor TOTP-invoer</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">TOTP naar klembord kopiëren</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">Kopieer de TOTP naar het klembord bij het automatisch aanvullen met TOTP. </string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">Activeer het ingebouwde toetsenbord bij het automatisch invoeren van TOTP. Het toetsenbord heeft een TOTP-toets.</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">Activeer het ingebouwde toetsenbord</string>
<string name="TotpCopiedToClipboard">TOTP naar klembord gekopieerd</string>
<string name="ShowKp2aKeyboardNotification_title">KP2A toetsenbordmelding</string>
<string name="ShowKp2aKeyboardNotification_summary">Maak het volledige item toegankelijk via het toetsenbord van de KP2A (aanbevolen).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Wissel toetsenbord</string>
@@ -417,12 +426,13 @@
<string name="ShowUnlockedNotification_summary">Toon doorlopend bericht terwijl de database ontgrendeld is.</string>
<string name="IconVisibilityInfo_Android8_text">Android 8 introduceert nieuw gedrag voor meldingen. Als je het pictogram van Keepass2Android\'s meldingen wilt verbergen kunt je dit wijzigen in de systeeminstellingen. Stel de prioriteit van de meldingencategorie op het minimum in.</string>
<string name="IconVisibilityInfo_Android8_btnSettings">Instellingen openen</string>
<string name="PostNotificationsPermissionInfo_text">Keepass2Android kan het systeem een melding laten geven als uw database niet is vergrendeld. U moet voor deze functie toestemming geven.</string>
<string name="DontCare">Maakt me niet uit</string>
<string name="DocumentAccessRevoked">Dit bestand is niet meer toegangelijk voor Keepass2Android. Het is verwijderd of de toegangsrechten zijn ingetrokken. Probeer opnieuw te openen, bijv. met \'Wijzig database\'.</string>
<string name="PreloadDatabaseEnabled_title">Pre-load van databasebestand</string>
<string name="PreloadDatabaseEnabled_summary">Start laden op de achtergrond of het downloaden van het databasebestand tijdens het wachtwoord invoeren.</string>
<string name="SyncAfterQuickUnlock_title">Synchroniseer na Snel Openen</string>
<string name="SyncAfterQuickUnlock_summary">Synchroniseer de database met externe bestanden na het ontgrendelen met QuickUnlock.</string>
<string name="SyncAfterQuickUnlock_title">Synchroniseer na SnelOpenen</string>
<string name="SyncAfterQuickUnlock_summary">Synchroniseer database met extern bestand na ontgrendeling met SnelOpenen.</string>
<string name="AskOverwriteBinary">Wil je het bestaande binaire bestand met dezelfde naam overschrijven?</string>
<string name="AskOverwriteBinary_title">Overschrijf bestaande bestand?</string>
<string name="AskOverwriteBinary_yes">Overschrijven</string>
@@ -501,9 +511,27 @@
<string name="hint_sftp_host">host (bijv: 192.168.0.1)</string>
<string name="hint_sftp_port">poort</string>
<string name="initial_directory">Initiële map (optioneel):</string>
<string name="connect_timeout">Time-out verbinding in seconden (optie)</string>
<string name="enter_sftp_login_title">SFTP logingegevens invoeren:</string>
<string name="sftp_auth_mode">Authenticatiemodus</string>
<string name="send_public_key">Zend publieke sleutel...</string>
<string name="select_private_keyfile">Kies privé sleutel...</string>
<string name="hint_sftp_key_name">Nieuwe sleutelnaam</string>
<string name="hint_sftp_key_content">Nieuwe sftp-sleutel inhoud</string>
<string name="private_key_saved">Privésleutel opgeslagen</string>
<string name="private_key_save_failed">GEEN privé-sleutel opgeslagen: %1$s</string>
<string name="private_key_info">Sleutelnaam en inhoud voor opslag invoeren</string>
<string name="private_key_delete">Privé sleutel verwijderd: %1$s</string>
<string name="private_key_delete_failed">GEEN privé-sleutel opgeslagen: %1$s</string>
<string name="save_key">Sla persoonlijke sleutel op</string>
<string name="delete_key">Wis privésleutel</string>
<string name="private_key_select">Kies privésleutel</string>
<string name="private_key_create_new">[]Voeg nieuwe toe]</string>
<string name="hint_sftp_key_passphrase">Wachtwoordzin voor sleutel (optie)</string>
<string name="sftp_kex_title">Sleuteluitwisseling (KEX) algoritme(n) (optie)</string>
<string name="hint_sftp_kex">Komma-gescheiden (CSV)namen/spec</string>
<string name="sftp_shk_title">Server hostsleutel algoritme(n) (optie)</string>
<string name="hint_sftp_shk">Komma-gescheiden (CSV)namen/spec</string>
<string name="enter_ftp_login_title">SFTP logingegevens invoeren:</string>
<string name="enter_mega_login_title">Voer je MEGA account login gegevens in:</string>
<string name="select_storage_type">Selecteer het opslagtype:</string>
@@ -521,7 +549,9 @@
<string name="filestoragename_gdrive">Google Drive</string>
<string name="filestoragename_gdriveKP2A">Google Drive (KP2A bestanden)</string>
<string name="filestoragehelp_gdriveKP2A">Als je KP2A geen toegang wilt geven tot je volledige Google Drive, kunt je deze optie selecteren. Merk op dat je eerst een databasebestand moet aanmaken, bestaande bestanden zijn niet zichtbaar voor de app. Kies deze optie uit het database scherm aanmaken, of als je al een database hebt geopend door de database te exporteren die voor deze optie wordt gekozen.</string>
<string name="filestoragename_pcloud">PCloud (KP2A map)</string>
<string name="filestoragehelp_pcloud">Dit opslagtype zal alleen toegang vragen tot de pCloud map \"Applications/Keepass2Android\". Als je een bestaande database uit jouw PCloud account wil gebruiken, zorg dan dat het bestand in die pCloud map wordt geplaatst.</string>
<string name="filestoragename_pcloudall">PCloud (Full access)</string>
<string name="filestoragename_onedrive">OneDrive</string>
<string name="filestoragename_onedrive2">OneDrive</string>
<string name="filestoragename_onedrive2_full">Alle bestanden en gedeelde bestanden</string>
@@ -530,13 +560,13 @@
<string name="filestoragename_sftp">SFTP (SSH File Transfer)</string>
<string name="filestoragename_mega">MEGA</string>
<string name="filestoragehelp_mega">Let op: Keepass2Android moet de lijst van alle bestanden in jouw Mega account downloaden om goed te werken. Om deze reden kan het benaderen van accounts met veel bestanden traag zijn.</string>
<string name="filestoragename_content">Systeem bestand kiezer</string>
<string name="filestoragename_content">Systeem bestandskiezer</string>
<string name="filestorage_setup_title">Bestandstoegang initaliseren</string>
<string name="database_location">Database locatie</string>
<string name="help_database_location">Je kunt jouw database lokaal op je Android toestel of in de cloud opslaan (alleen de niet-Offline versie). Keepass2Android maakt de database beschikbaar, zelfs als je offline bent. Omdat de database veilig is versleuteld met AES 256 bit encryptie, kan niemand toegang krijgen tot jouw wachtwoorden behalve jij. We adviseren Dropbox te kiezen: het is beschikbaar op al je apparaten en voorziet zelfs in back-ups van vorige bestandsversies.</string>
<string name="hint_database_location">Selecteer waar je de database wilt opslaan:</string>
<string name="button_change_location">Locatie wijzigen</string>
<string name="help_quickunlock">Wanneer ingeschakeld zal Keepass2Android in de achtergrond blijven draaien, zelfs wanneer de database vergrendeld is. Hierdoor kan de database later met slechts een klein gedeelte van het hoofdwachtwoord worden ontgrendeld.</string>
<string name="help_quickunlock">Bij inschakelen blijft Keepass2Android op de achtergrond draaien, ook al is de database vergrendeld. Hierdoor kan de database op een later tijdstip worden ontgrendeld met slechts een kort deel van het hoofdwachtwoord.</string>
<string name="master_password">Hoofdwachtwoord</string>
<string name="help_master_password">De database is versleuteld met het hier ingevoerde wachtwoord. Kies een sterk wachtwoord om de database te beveiligen! Tip: Bedenk een zin of twee en gebruik de eerste letters van de woorden als wachtwoord. Gebruik ook de leestekens.</string>
<string name="hint_master_password">Kies een hoofdwachtwoord om jouw database te beschermen:</string>
@@ -546,7 +576,7 @@
<string name="use_key_file">Gebruik sleutelbestand</string>
<string name="error_adding_keyfile">Fout tijdens het toevoegen van het sleutelbestand!</string>
<string name="init_otp">Laad OTP hulpbestand…</string>
<string name="otp_explanation">Voer de volgende One-time-passwords (OTPs) in. Veeg je Yubikey NEO langs de achterkant van het apparaat om via NFC in te voeren (Yubiclip app vereist).</string>
<string name="otp_explanation">Voer de volgende One-time-passwords (OTPs) in. Veeg je Yubikey NEO langs de achterkant van het apparaat om via NFC in te voeren (vereist Yubiclip).</string>
<string name="otp_hint">OTP %1$d</string>
<string name="CouldntLoadOtpAuxFile">Kan het OTP hulpbestand niet laden!</string>
<string name="CouldntLoadOtpAuxFile_Hint">Gebruik de OtpKeyProv plugin in KeePass 2.x (PC) om jouw database in te stellen voor gebruik met OTPs!</string>
@@ -567,12 +597,14 @@
<string name="CouldntLoadChalAuxFile_Hint">Gebruik de KeeChallenge plugin in KeePass 2.x (PC) om de database in te stellen voor gebruik met challenge/response!</string>
<string name="ErrorUpdatingChalAuxFile">Fout bijwerken OTP hulpbestand!</string>
<string name="TrayTotp_SeedField_title">Veldnaam van TOTP-bron</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">Wanneer je met Keepass 2 (PC) de plugin \"TrayTotp\" met afwijkende instellingen gebruikt, geef dan hier de naam van de willekeurige bron.</string>
<string name="TrayTotp_SettingsField_title">Veldnaam TOTP-instellingen</string>
<string name="TrayTotp_SettingsField_summary">Geef de veldnaam van het instellingenveld van TrayTotp.</string>
<string name="TrayTotp_prefs">TrayTotp</string>
<string name="DebugLog_prefs_prefs">Logboekbestand voor foutopsporing</string>
<string name="DebugLog_title">Gebruik logboekbestand</string>
<string name="FtpDebug_title">FTP/SFTP debug logging</string>
<string name="DebugLog_summary">App uitvoer naar een lokaal logboekbestand schrijven</string>
<string name="DebugLog_send">Logboekbestand voor foutopsporing opsturen...</string>
<string name="loading">Laden…</string>
@@ -593,9 +625,9 @@
<string name="SCOPE_CURRENT_ENTRY_title">Gegevens huidige item</string>
<string name="SCOPE_CURRENT_ENTRY_explanation">De plug-in zal alle data van het huidige database item krijgen en kan acties aanbieden en de weergave van het item wijzigen.</string>
<string name="SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_title">Zoek eigen inloggegevens</string>
<string name="SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_explanation">De plug-in wordt toegestaan om te zoeken naar de inloggegevens die gekoppeld zijn met zijn eigen applicatie.</string>
<string name="SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_explanation">De plugin mag de logingegevens opvragen die zijn gekoppeld aan zijn eigen app-pakket.</string>
<string name="SCOPE_QUERY_CREDENTIALS_title">Zoek inloggegevens</string>
<string name="SCOPE_QUERY_CREDENTIALS_explanation">De plug-in zal worden toegestaan te zoeken naar inloggegevens voor specifieke websites of programma\'s.</string>
<string name="SCOPE_QUERY_CREDENTIALS_explanation">De plugin mag inloggegevens opvragen voor bewuste websites of apps.</string>
<string name="get_regular_version">Verkrijg meer opslagmethodes</string>
<string name="CertificateWarning">Waarschuwing: Server certificaat validatie mislukt: %1$s. Installeer een passend root-certificaat op je apparaat of zie instellingen!</string>
<string name="CertificateFailure">Fout: Server certificaat validatie mislukt! Installeer een passend root-certificaat op je apparaat of zie instellingen!</string>
@@ -641,6 +673,24 @@
<string name="Continue">Ga verder</string>
<string name="NoFilenameWarning">De URI die je hebt ingevoerd lijkt niet in een bestandsnaam. Weet je zeker dat dit een geldig bestand is?</string>
<string name="FirstInvalidCompositeKeyError">Ongeldige sleutelcombinatie! Probeer het opnieuw.</string>
<string name="RepeatedInvalidCompositeKeyHelp"> Ongeldige samengestelde sleutel! Probeer de volgende stappen om uw database te ontgrendelen:\n
&#8226; Controleer of het juiste wachtwoord is ingevuld. Gebruik het oogsymbool om het ingevoerde wachtwoord te onthullen.\n
&#8226; Controleer of het juiste wachtwoordtype is gebruikt. Let erop dat dit overeenkomt met het type dat is gekozen bij het aanmaken van de database.\n
&#8226; Controleer of de juiste database is gekozen.
</string>
<string name="HintLocalBackupInvalidCompositeKey">Tip: Als de database mogelijk corrupt is of na het wijzigen de hoofdsleutel niet meer bekend is, kunt u het proberen met de laatst geopende versie van het bestand door op \"%1$s\" te tikken en de lokale back-up te selecteren.</string>
<string name="HintLocalBackupOtherError"> \n
&#8226; Tip: Keepass2Android heeft de laatst succesvol geopende bestandsversie opgeslagen op de interne opslag. U kunt deze openen door op \"%1$s\" te tikken en de lokale back-up te selecteren.
</string>
<string name="CorruptDatabaseHelp"> Bestand is beschadigd. \n
Hier zijn enkele tips die kunnen helpen bij het opsporen van het probleem:\n
&#8226; Als het bestand via USB (MTP-modus) is gekopieerd, probeer het dan opnieuw met een programma zoals MyPhoneExplorer. MTP kort bestanden in bepaalde gevallen in.\n
&#8226; Als het bestand niet vanaf dezelfde locatie op je pc kan worden geopend, is het waarschijnlijk beschadigd. Gebruik dan een database back-up. Als je vermoedt dat Keepass2Android het bestand heeft beschadigd, raadpleeg dan het ondersteuningsteam.\n
&#8226; Kunt u het bestand nog steeds openen op uw pc, neem dan contact op met het ondersteuningsteam. U kunt proberen het bestand op te slaan met andere instellingen ( bijv. uitgepakt) op de pc en opnieuw proberen te openen in Keepass2Android.
</string>
<string name="open_other_db">Een andere database openen…</string>
<string name="select_database">Selecteer database</string>
<string name="configure_child_dbs">Kind-databases configureren…</string>
@@ -662,12 +712,19 @@
<string name="remove_history">Deze versie verwijderen</string>
<string name="DbUnlockedChannel_name">Database geopend</string>
<string name="DbUnlockedChannel_desc">Melding bij het openen van de database</string>
<string name="DbQuicklockedChannel_name">Snel Openen</string>
<string name="DbQuicklockedChannel_desc">Meldingen over het openen van de database met Snel Openen</string>
<string name="DbQuicklockedChannel_name">SnelOpenen</string>
<string name="DbQuicklockedChannel_desc">Melding over vergrendeling van de database met Snelopenen</string>
<string name="EntryChannel_name">Item meldingen</string>
<string name="EntryChannel_desc">Melding voor vereenvoudigde toegang van het nu geselecteerde item.</string>
<string name="CloseDbAfterFailedAttempts">Sluit de database na drie mislukte biometrische ontgrendelpogingen.</string>
<string name="WarnFingerprintInvalidated">Waarschuwing! Biometrische authenticatie wordt uitgeschakeld door Android, bijv. na het toevoegen van een nieuwe vingerafdruk in de instellingen van jouw apparaat. Zorg ervoor dat je de database altijd kunt ontgrendelen met het hoofdwachtwoord!</string>
<string-array name="ChangeLog_1_10">
<item>Machtiging voor meldingen op Android 13+ toevoegen</item>
<item>De FTP en SFTP implementatie verbeteren</item>
<item>Toegang toevoegen tot volledige pCloud</item>
<item>Systeemtaal laten kiezen in het taalvenster</item>
<item>Probleem met onthouden van type sleutelbestand + wachtwoord oplossen</item>
</string-array>
<string-array name="ChangeLog_1_09e">
<item>Bug fix op crashes en onverwachte log-outs</item>
<item>Schakel over naar nieuwe SFTP-implementatie ter ondersteuning van moderne publieke sleutel algoritmen zoals rsa-sha2-256</item>
@@ -686,7 +743,7 @@
<item>Repareer de automatische invulprompt in Firefox</item>
<item>Integreer suggesties met toetsenbord (met Android 11+)</item>
<item>Toestaan om de app taal te wijzigen in de instellingen</item>
<item>Optie toevoegen om database te synchroniseren na Snel Openen</item>
<item>Optie toevoegen om database te synchroniseren na SnelOpenen</item>
<item>Bug fix: Maak geen kleine bestandsnamen bij het opslaan naar Dropbox</item>
</string-array>
<string-array name="ChangeLog_1_09a">
@@ -696,7 +753,7 @@
<item>Verbeteringen van Autofill (pop-up werd niet weergegeven in Chrome, betere subdomein ondersteuning)</item>
<item>Verbeteringen in de OneDrive implementatie: grootte limiet verwijderd, geen overbodige authenticatieverzoeken meer</item>
<item>Optie toegevoegd om licht/donker ontwerp te selecteren uit systeeminstellingen inclusief nachtplannen, vereist Android 10+</item>
<item>Update de Dropbox-implementatie om de nieuwe verificatiemethode te ondersteunen.</item>
<item>Update de Dropbox-implementatie om de nieuwe authenticatiemethode te ondersteunen.</item>
<item>Nieuw ingestelde vingerafdrukontgrendeling wordt ongeldig na het toevoegen van een vingerafdruk in systeeminstellingen voor meer veiligheid.</item>
<item>Toestaan om bestanden te openen via de systeem bestandskiezer, waarbij de alleen-lezen vlag genegeerd wordt</item>
<item>Sta toe om items te verplaatsen vanuit het item weergave menu</item>
@@ -713,7 +770,7 @@
</string-array>
<string-array name="ChangeLog_1_08c">
<item>Pakketnamen van Android-apps worden niet meer opgeslagen in het URL-veld</item>
<item>Vergrendelgedrag verbeterd - biometrische prompt wordt niet langer weergeven direct na ontgrendelen</item>
<item>Verbeterde vergrendeling - niet langer biometrische prompt direct na ontgrendeling</item>
<item>OkHttp bijgewerkt om HTTP/2 te ondersteunen</item>
<item>Ontbrekende vertaling(en) verbeterd</item>
</string-array>
@@ -733,6 +790,103 @@
<item>Bugs opgelost</item>
<item>Bugs opgelost</item>
</string-array>
<string name="ChangeLog_1_07b"> Versie 1.07b\n
* Verbeter de prestaties van Argon2 door de oorspronkelijke implementatie te gebruiken (Met dank aan Chih-Hsuan Yen!)\n
* Toestaan om vingerafdruk uit te schakelen door op het vingerafdrukpictogram te klikken (voorkomt probleem met vingerafdruklezers onder het scherm, met dank aan marcoDallas!)\n
* Herstel cursorpositie bij het wisselen van de zichtbaarheid van het wachtwoord (met dank aan DDoSolitary!)\n
* Verbeteringen van de pCloud-implementatie (met weer dank aan gilbsgilbs!)\n
* Automatisch invullen ondersteunen voor meer browsers\n
* Nieuwe implementatie voor OneDrive: Ondersteuning voor OneDrive for Business, gedeelde bestanden, selecteerbare toegangsbereiken, meerdere accounts en oplossing voor problemen met offline toegang.\n
* Fout oplossingen
</string>
<string name="ChangeLog_1_07"> Versie 1.07\n
* Oplossing voor crashes op Samsung\'s Android 9\n
* Je kunt nu meer dan 1 database openen, compatibel met KeeAutoExec\n
* SFTP: public key authenticatie, controle op verandering van server sleutel\n
* Introductie van pCloud ondersteuning - dank aan gilbsgilbs!\n
* NextCloud ondersteuning expliciet gemaakt\n
* Opslaan en bijwerken van invoerbijlagen verbeteren\n
* Meer opties voor het aanpassen van app gedrag in persoonlijke voorkeuren\n
* SSL: vertrouw gebruiker certicaten\n
* Automatisch invullen verbeterd (werkt nu met Firefox, minder popups)\n
* Fout oplossingen\n
</string>
<string name="ChangeLog_1_06"> Versie 1.06\n
* Gebruik van ykDroid in plaats van YubiChallenge als app voor Yubikey challenge/response.\n
* Ondersteuning voor KeepassXC-stijl challenge/response. Let op: de database-indeling moet KDBX4 zijn!\n
* Weiger verwijderde bestanden te laden van Google Drive\n
* Andere TLS implementatie voor FTPS, om een JSch bug heen gewerkt voor servers die gssapi-with-mic ondersteunen\n
* problemen opgelost\n
</string>
<string name="ChangeLog_1_05"> Versie 1.05\n
* Gebruik melding kanalen op Android 8 met configuratie via systeem instellingen\n
* Toon pictogram in melding\n
* Gebruik adaptieve pictogrammen voor Android 8, gebruik rond launcherpictogram voor Android 7\n
* Optie om direct te zoeken na openen (see instellingen)\n
* De manier waarop bestanden worden geschreven via Storage Access Framework is veranderd, dit lost problemen op met het schrijven van bestanden op Google Drive die geopend waren via de Systeem bestandsbeheerder\n
* Informatieteksten toegevoegd om vaak voorkomende misverstanden te voorkomen\n
* Maak lokaal een back-up van correct geopende databases om kans op dataverlies te verkleinen\n
* JSch bijgewerkt om recentere SSH ciphers te ondersteunen\n
* Mogelijk gemaakt om verbindingsinstellingen te wijzigen, bijvoorbeeld als het WebDav wachtwoord veranderde\n
* Ondersteuning voor Yubikey Neo\'s static password mode toegevoegd\n
* Automatisch invullen suggestie kan uitgezet worden\n
* Data lek naar logcat opgelost\n
* Diverse bugs opgelost\n
ChangeLog_1_05 </string>
<string name="ChangeLog_1_04b">Versie 1.04b\n
* Voorkom vastlopen bij automatisch invullen op Huawei apparaten.\n
</string>
<string name="ChangeLog_1_04">Versie 1.04\n
* Automatisch invullen toegevoegd voor Android 8.0 en hoger.\n
* Bibliotheken, gereedschap en SDK-versie bijgewerkt.\n
</string>
<string name="ChangeLog_1_03">Versie 1.03\n
* Toegankelijkheid service voor automatisch invullen verwijderd zoals gevraagd door Google. Raadpleeg de wachtwoord toegangsinstellingen om een plugin te vinden die de vorige functionaliteit biedt.\n
* Derde partij apps weer toegevoegd als opslag optie\n
* Geïntegreerde afbeeldingsweergave van gekoppelde beelden zonder deze over te dragen aan andere apps\n
* OkHttp opgewaardeerd om problemen op te lossen met sommige verbindingen\n
* Steun voor KeeTrayTOTP items, ondersteund nu Steam items\n
</string>
<string name="ChangeLog_1_02">Versie 1.02\n
* Verschillende beveiligingsverbeteringen. Dank gaat uit naar jean-baptiste.cayrou@thalesgroup.com en vincent.fargues@thalesgroup.com voor hun veiligheidsrapport en samenwerking!\n
* Ondersteuning voor KeyboardSwapPlugin (zie verder wachtwoord toegang opties): staat automatisch wisselen van een input methode toe op non-rooted apparaten. Met dank aan Mishaal Rahman van XDA-Developers die dit mogelijk maakte.\n
* Fix voor toegankelijkheids service met recente Chrome versies.\n
* Fix om onnodig wissen van de vingerafdrukdata te voorkomen\n
* Fix voor onbelangrijke chrashes\n
* Dropbox SDK bijgewerkt om compabiliteit in de toekomst te garanderen\n
* Fout rapporten van Xamarin Insights verwijderd\n
* Ontwikkeltools geupdated\n </string>
<string name="ChangeLog_1_01g"> Versie 1.01-g\n
* Oplossing voor een crash tijdens offline werken\n
* Oplossing voor onjuiste codering van FTP(S) inloggegevens\n
* Oplossing voor crashes bij het gebruik van OneDrive op oudere Android versies\n
* Tijden weergegeven als lokale tijd in beginscherm\n
</string>
<string name="ChangeLog_1_01"> Versie 1.01\n
* * ondersteuning toegevoegd voor het nieuwe KDBX-4-formaat (compatibel met Keepass 2.35) inclusief Argon2-sleutelafleiding en ChaCha20-codering.\n
* WebDav bestandsopslag opnieuw geïmplementeerd, maakt nu bladeren door bestanden mogelijk en ondersteunt moderne codering.\n
* Opnieuw geïmplementeerde FTP bestandsopslag, maakt nu bladeren door bestanden mogelijk en ondersteunt versleuteling (FTPS).\n
* Bijgewerkt naar OneDrive SDK (eerder gebruikte Live SDK is niet langer bijgewerkt)\n
* Bijgewerkt naar Dropbox SDK versie 2 (eerder gebruikte versie 1 SDK is verouderd).\n
* Ondersteuning toegevoegd voor OwnCloud.\n
* Vragen om opslagtoestemming voordat lokale bestanden worden geopend
</string>
<string name="ChangeLog_0_9_9"> Versie 0.9.9\n
* Volledig herontwerp van de UI. Met veel dank aan Stefano Pignataro (http://www.spstudio.at) for his support!\n
* Aangepaste pictogrammen toestaan\n
* Ondersteuning voor de Multi Window-modus op Samsung-apparaten\n
* Verhoogd standaard aantal coderingsronden voor nieuwe databases\n
* Controleer op dubbele sleutels van extra velden om gegevensverlies te voorkomen\n
</string>
<string name="ChangeLog_0_9_8"> Versie 0.9.8\n
* Ondersteuning voor Storage Access Framework (maakt schrijven naar SD-kaart en Google Drive mogelijk in KP2A Offline)\n
* Probeer foutieve gebruikersinvoer te detecteren bij het invoeren van WebDAV URL\'s (map in plaats van bestand)\n
* Wachtwoordlettertype gewijzigd\n
* Het wijzigen van Dropbox-account toestaan\n
* Fout verholpen: Onthoudt nu OTP-wachtwoord
</string>
<string name="ChangeLog_keptDonate">Uitgelezen kans om biertje te schenken of iets anders</string>
<string-array name="clipboard_timeout_options">
<item>30 seconden</item>
@@ -782,8 +936,8 @@
</string-array>
<string-array name="sftp_auth_modes">
<item>Wachtwoord</item>
<item>KP2A Private/Public key</item>
<item>Custom Private key</item>
<item>KP2A privé/publieke sleutel</item>
<item>Aangepaste privésleutel</item>
</string-array>
<string-array name="AcceptAllServerCertificates_options">
<item>Negeer mislukte certificaat validaties</item>
@@ -801,11 +955,16 @@
<string name="autofill_enable_for">Automatisch invullen inschakelen voor %1$s</string>
<string name="invalid_link_association">Kon domein %1$s niet koppelen met app %2$s</string>
<string name="enable_fingerprint_hint">Keepass2Android heeft biometrische hardware gedetecteerd. Wil je Biometrische ontgrendeling voor deze database inschakelen?</string>
<string name="post_notifications_dialog_title">Meldingen toestaan</string>
<string name="post_notifications_dialog_message">Keepass2Android kan meldingen weergeven met knoppen om waarden zoals wachtwoorden en TOTP\'s naar het klembord te kopiëren, of om het ingebouwde toetsenbord op te roepen. Dit is handig om waarden over te brengen naar andere apps zonder herhaaldelijk naar Keepass2Android over te schakelen. Wilt u dergelijke meldingen inschakelen?</string>
<string name="post_notifications_dialog_allow">Meldingen toestaan</string>
<string name="post_notifications_dialog_disable">Schakel deze functie uit</string>
<string name="post_notifications_dialog_notnow">Niet nu</string>
<string name="understand">Ik begrijp het</string>
<string name="dont_show_again">Niet meer tonen</string>
<string name="masterkey_infotext_head">Weet je het hoofdwachtwoord nog?</string>
<string name="masterkey_infotext_main">Merk op dat zonder hoofdwachtwoord de database niet te openen is. Er is geen manier om het hoofdwachtwoord te \"resetten\".</string>
<string name="masterkey_infotext_fingerprint_note">Houd er ook rekening mee dat Biometrische ontgrendeling werkt door de hoofdsleutel op te slaan in de veilige opslag van Android. Deze opslag kan op elk moment door Android worden verwijderd, bijvoorbeeld wanneer je een nieuwe vingerafdruk toevoegt in de systeeminstellingen. Vertrouw dus niet op Biometrische ontgrendeling maar onthoud a.u.b. je hoofdwachtwoord!</string>
<string name="masterkey_infotext_fingerprint_note">Houd er ook rekening mee dat biometrische ontgrendeling werkt door opslaan van de hoofdsleutel in de beveiligde opslag van Android. Deze opslag kan op elk moment door Android worden verwijderd, bijvoorbeeld als je een nieuwe vingerafdruk toevoegt in de systeeminstellingen. Vertrouw dus niet op biometrische ontgrendeling, maar onthoud je hoofdwachtwoord!</string>
<string name="backup_infotext_head">Worden er back-ups gemaakt van jouw database?</string>
<string name="backup_infotext_main">Keepass2Android bewaart je wachtwoorden in een file op een door jou gekozen locatie. Weet je zeker dat je deze file nog steeds hebt als je telefoon verloren raakt, of gestolen, of als de file gewist wordt? Zorg alsjeblieft altijd voor een recente back-up op een veilige plaats!</string>
<string name="backup_infotext_note">Om nu een back-up te maken, ga naar %1$s &gt; %2$s &gt; %3$s.</string>

View File

@@ -402,6 +402,14 @@
<string name="ShowSeparateNotifications_summary">Pokaż oddzielne powiadomienia dla kopiowania nazwy użytkownika i hasła do schowka oraz aktywacji klawiatury.</string>
<string name="AccServiceAutoFill_prefs">Autouzupełnienie usługa dostępności</string>
<string name="AutoFill_prefs">Usługa autouzupełnienia</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">Podczas autouzupełniania wpisu TOTP, pokaż powiadomienie o wpisie z przyciskiem Kopiuj TOTP</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">Pokaż powiadomienie o wpisie</string>
<string name="AutoFillTotp_prefs_title">Autouzupełnianie wpisów TOTP</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">Skopiuj TOTP do schowka</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">Podczas autouzupełniania wpisu TOTP, skopiuj TOTP do schowka</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">Podczas autouzupełniania wpisu TOTP, aktywuj wbudowaną klawiaturę. Klawiatura ma przycisk TOTP.</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">Aktywuj wbudowaną klawiaturę</string>
<string name="TotpCopiedToClipboard">Skopiowano TOTP do schowka</string>
<string name="ShowKp2aKeyboardNotification_title">Powiadomienie klawiatury KP2A</string>
<string name="ShowKp2aKeyboardNotification_summary">Udostępnij pełny wpis przez klawiaturę KP2A (zalecane).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Przełącz klawiaturę</string>
@@ -589,6 +597,7 @@
<string name="CouldntLoadChalAuxFile_Hint">Proszę użyć wtyczki KeeChallenge w KeePass 2.x (PC) do konfiguracji twojej bazy danych dla używania z twoją odpowiedzią na wyzwanie!</string>
<string name="ErrorUpdatingChalAuxFile">Błąd aktualizacji pomocniczego pliku OTP!</string>
<string name="TrayTotp_SeedField_title">Nazwa pola ziarna TOTP</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">Jeżeli używasz wtyczki \"TrayTotp\" dla Keepass2 z ustawieniami innymi niż domyślne, wpisz tutaj nazwę pola dla pola ziarna zgodnie z ustawieniami na komputerze.</string>
<string name="TrayTotp_SettingsField_title">Nazwa pola ustawień TOTP</string>
<string name="TrayTotp_SettingsField_summary">Wpisz tutaj nazwę pola dla pola ustawień TrayTotp.</string>

View File

@@ -404,6 +404,14 @@
<string name="ShowSeparateNotifications_summary">Exibir notificações separadas para copiar nome de usuário e senha para área de transferência e ativar o teclado.</string>
<string name="AccServiceAutoFill_prefs">Serviço de Acessibilidade para Autopreenchimento</string>
<string name="AutoFill_prefs">Serviço de Autopreenchimento</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">Ao preencher automaticamente uma entrada com TOTP, mostre a notificação de entrada com um botão Copiar TOTP</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">Mostrar notificação da entrada</string>
<string name="AutoFillTotp_prefs_title">Preenchimento automático para entradas TOTP</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">Copiar TOTP para a área de transferência</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">Ao preencher automaticamente uma entrada com TOTP, copie o TOTP para a área de transferência</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">Ao preencher automaticamente uma entrada com TOTP, ative o teclado integrado. O teclado possui um botão TOTP.</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">Ativar teclado integrado</string>
<string name="TotpCopiedToClipboard">Copiado TOTP para a área de transferência</string>
<string name="ShowKp2aKeyboardNotification_title">Notificação do teclado KP2A</string>
<string name="ShowKp2aKeyboardNotification_summary">Tornar toda a entrada disponível através do teclado KP2A (recomendado).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Trocar teclado</string>
@@ -591,6 +599,7 @@
<string name="CouldntLoadChalAuxFile_Hint">Por favor, use o plugin KeeChallenge no KeePass 2.x (PC) para configurar seu banco de dados para uso com desafio-resposta!</string>
<string name="ErrorUpdatingChalAuxFile">Erro ao atualizar o arquivo OTP auxiliar!</string>
<string name="TrayTotp_SeedField_title">Nome do campo da semente TOTP</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">Se você estiver usando o plugin Keepass 2 \"TrayTotp\" com configurações não-padrão, digite o nome do campo para o campo de semente aqui de acordo com as configurações no PC.</string>
<string name="TrayTotp_SettingsField_title">TOTP configurações nome do campo</string>
<string name="TrayTotp_SettingsField_summary">Digite o nome do campo do campo de configurações para TrayTotp aqui.</string>
@@ -713,6 +722,19 @@
<string name="EntryChannel_desc">Notificação para simplificar o acesso à entrada selecionada.</string>
<string name="CloseDbAfterFailedAttempts">Fechar banco de dados após três tentativas de desbloqueio biométrico falhadas.</string>
<string name="WarnFingerprintInvalidated">Alerta! Autenticação biométrica pode ser invalidada pelo Android, por exemplo: depois de adicionar uma nova digital nas configurações do seu dispositivo. Esteja certo de sempre saber como desbloquear com sua senha mestra!</string>
<string-array name="ChangeLog_1_11">
<item>Adicionados botões de ação flutuantes para pesquisa e visão geral do TOTP (se entradas TOTP estiverem presentes).</item>
<item>Exibição aprimorada de campos TOTP adicionando um indicador de tempo limite e mostrando-o com mais destaque.</item>
<item>O TOTP agora pode ser visto na exibição do grupo.</item>
<item>Copie o valor do texto para a área de transferência pressionando longamente na exibição da entrada.</item>
<item>Torne o TOTP mais facilmente acessível no teclado integrado.</item>
<item>Mostrar notificação de entrada ao preencher automaticamente uma entrada TOTP. Isso permite copiar o TOTP para a área de transferência. Veja as preferências para configurar o comportamento.</item>
<item>Implementação TOTP atualizada para resolver problemas de compatibilidade com KeePass2 e TrayTOTP</item>
<item>Pequenas melhorias</item>
</string-array>
<string-array name="ChangeLog_1_11_net">
<item>Atualizado o pCloud SDK para fornecer acesso a pastas compartilhadas</item>
</string-array>
<string-array name="ChangeLog_1_10">
<item>Adicionado suporte para permissões de notificação no Android 13+</item>
<item>Melhorado a implementação de FTP e SFTP</item>
@@ -944,7 +966,135 @@
* recarrega automaticamente o banco de dados quando uma alteração é detectada, resolve problemas de segurança relacionados à revelação da senha mestra\n
* layout de teclado pequeno aprimorado e tema de configurações de teclado fixo (graças a Wiktor Ławski)\n
</string>
<string name="ChangeLog_0_9_5"> <b>Versão 0.9.5</b>\n
* Corrigidos problemas com a navegação de arquivos (especialmente no Android 4.4)\\n
* Corrigido problema ao carregar arquivos .kdb (Keepass 1) no Nexus 5 com Android Lollipop\\n
* Adicionada opção para evitar capturas de tela/exibição de aplicativos na lista de aplicativos recentes\\n
* Corrigido problema com armazenamento de arquivos do Google Drive (edição regular)\\n
* Permitir arquivos importantes em tipos de armazenamento deliberados (edição regular)\\n
* SDK do Dropbox atualizado para incluir um patch de segurança oficial (edição regular)\\n
* Ferramentas de compilação atualizadas --&gt; tamanho do apk aumentado :-(\n
Eu prometi mais algumas mudanças. Eles virão no próximo lançamento - desculpe. Eu queria publicar esses hot fixes o mais rápido possível.
</string>
<string name="ChangeLog_0_9_4"> <b>Versão 0.9.4</b>\n
* suporte a plug-ins adicionado: veja as configurações para obter plugins!\n
* plugin QR publicado (digitalizar senhas, exibir senhas como código QR, transferir entradas para outros dispositivos KP2A)\n
* plugin InputStick publicado (transfira credenciais para o seu PC via bluetooth - requer pendrive InputStick)\n
* Aplicativos de terceiros agora podem simplesmente implementar a consulta de credenciais do KP2A. Você é um desenvolvedor? Adicione isso ao seu aplicativo, se for adequado!\n
* adicionado suporte TOTP (compatível com KeeOTP e TrayTotp)\n
* o aplicativo não deve mais ser eliminado pelo Android quando o banco de dados estiver aberto\n
* o banco de dados não fica mais bloqueado ao sair do aplicativo com o botão Voltar (veja configurações)\n
* exibir nomes de grupos na visualização dos resultados da pesquisa (*)\n
* menu de contexto adicionado na visualização dos resultados da pesquisa, incluindo a opção \'Navegar até o pai\' (*)\n
* adicionada opção para exibir o nome do grupo na visualização de entrada (*)\n
* (*) obrigado ao Matthieu por implementar esses recursos!\n
* suporte KeeChallenge (com Yubikey NEO). Agradecemos a Ben Rush por implementar o conector!\n
* interface de usuário aprimorada\n
* corrigido um bug na interface do Google Drive\n
* adicionada opção para desativar a opção \'doar\'\n
* Ícone QuickUnlock agora oculto em dispositivos Android 4.2+ por padrão\n
</string>
<string name="ChangeLog_0_9_3_r5"> <b>Versão 0.9.3 r5</b>\n
* Correções incorporadas do Xamarin: Keepass2Android agora compatível com ART no Android 4.4.2. Finalmente!\n
* Correções de bugs: bugs na sincronização (atualização de exibição, verificação correta de alterações em http), bugs em dispositivos Android 2.x, bugs nas implementações de armazenamento do Google Drive e OneDrive, limpeza da área de transferência no banco de dados próximo, bug na abertura de anexos, problemas de exibição com teclado\n
</string>
<string name="ChangeLog_0_9_3"> <b>Versão 0.9.3</b>\n
* Novo teclado com muitas melhorias. Veja as configurações para personalizar.\n
* Suporte somente leitura para kdb (arquivos Keepass 1). Experimental!\n
* Adicionado suporte a SFTP\n
* Adicionada solução alternativa para bug no ART (Android 4.4.2)\n
* Correções de bugs\n
</string>
<string name="ChangeLog_0_9_2"> <b>Versão 0.9.2</b>\n
* Adicionado suporte OTP (compatível com o plugin OtpKeyProv)\n
* Suporte NFC integrado para OTPs da YubiKey NEO \n
* Várias melhorias na interface do usuário\n
* Biblioteca Keepass 2.24 integrada\n
* Adicionada opção para encerrar o processo do aplicativo (veja configurações)\n
* Validação aprimorada de certificado SSL\n
* Correções de bugs\n
</string>
<string name="ChangeLog_0_9_1"> <b>Versão 0.9.1</b>\n
* Suporte integrado ao SkyDrive (somente edição regular do Keepass2Android)\n
* Corrigidos problemas com a integração do Google Drive\n
* Adicionado suporte NTLM
</string>
<string name="ChangeLog_0_9"> <b>Versão 0.9</b>\n
* Suporte integrado ao Dropbox e ao Google Drive (leitura/gravação de bancos de dados; somente edição regular do Keepass2Android)\n
* Navegador de arquivos personalizado integrado (baseado no android-filechooser da HBA)\n
* Interface de usuário aprimorada para criação de novos bancos de dados\n
* Fonte personalizada DejaVu Sans Mono incluída para exibição de senhas\n
* Correções de bugs
</string>
<string name="ChangeLog_0_8_6"> <b>Versão 0.8.6</b>\n
* Suporte para cifra Twofish\n
* Permitir edição de grupos\n
* Permitir movimentação de entradas e grupos\n
* O ícone do QuickUnlock pode ficar transparente (consulte as configurações)\n
* Correções de bugs
</string>
<string name="ChangeLog_0_8_5"> <b>Versão 0.8.5</b>\n
* Os arquivos remotos são armazenados no cache local do aplicativo para permitir o uso offline (incluindo edição e sincronização posterior). Veja configurações. \n
* Ícone de notificação para visualizar o estado de bloqueio do banco de dados (ver configurações)\n
* Melhor determinação do estado de bloqueio em algumas situações\n
* Os arquivos do banco de dados são carregados na memória enquanto você digita sua senha para aumentar a velocidade de carregamento (consulte as configurações)\n
* As entradas podem ser adicionadas ao grupo raiz\n
* Correções de bugs (resolvendo campos de referência, problemas com teclado em dispositivos italianos e chineses)
</string>
<string name="ChangeLog_0_8_4"> <b>Versão 0.8.4</b>\n
* Alterações externas no banco de dados são detectadas e mescladas ao salvar\n
* Melhor desempenho de carregamento\n
* Barra de ferramentas de pesquisa aprimorada com sugestões\n
* Novo logotipo do aplicativo!\n
* Adicionado suporte ao formato .kdbp para carregamento/salvamento mais rápido\n
* Edição aprimorada de campos extras e exibição oculta quando protegida\n
Agradecemos a Alex Vallat por suas contribuições de código!\n
Obrigado a Niki Hüttner (www.close-cut.de) pelo novo logotipo!\n
</string>
<string name="ChangeLog_0_8_3"> <b>Versão 0.8.3</b>\n
* Nome de usuário/índice TAN exibido na lista de entradas (veja configurações)\n
* As entradas poderão ser criadas se a pesquisa no navegador não retornar resultados\n
* O teclado KP2A oferece a possibilidade de pesquisar credenciais do aplicativo atual\n
* O aplicativo fecha automaticamente após selecionar uma entrada para uso no teclado\n
* A caixa de diálogo de seleção do teclado é aberta automaticamente após a pesquisa do URL (consulte as configurações)\n
* Os espaços reservados nos campos de entrada são substituídos antes da cópia (a maioria dos espaços reservados é compatível)\n
* pequenas correções de bugs
</string>
<string name="ChangeLog_0_8_2"> <b>Versão 0.8.2</b>\n
* Suporte para autenticação Digest em WebDAV\n
* Correções de bugs (Gerenciador de arquivos OI, Abrir URL)
</string>
<string name="ChangeLog_0_8_1"> <b>Versão 0.8.1</b>\n
* KP2A Offline e \'Online\' podem ser instalados novamente\n
* Adicionadas novas traduções (obrigado a todos os colaboradores!)
</string>
<string name="ChangeLog_0_8"> <b>Versão 0.8</b>\n
* Interface de usuário aprimorada especialmente para dispositivos Android 4.x\n
* Permitir o uso de gerenciadores de arquivos deliberados para selecionar arquivos existentes\n
* Adicionada uma maneira mais segura de abrir anexos (através do diretório de cache)\n
* bugs corrigidos na atividade de edição\n
* provavelmente introduziu novos bugs :-)
</string>
<string name="ChangeLog_keptDonate">Estendida a possibilidade de doar uma cerveja ou outra coisa</string>
<string name="ChangeLog_0_7"> <b>Versão 0.7</b>\n
* Maior velocidade de carregamento: transformações principais agora 10 vezes mais rápidas!\n
* Adicionado teclado virtual Keepass2Android: mude para este teclado para inserir credenciais. Protege você contra detectores de senha baseados na área de transferência (desative as notificações antigas da área de transferência nas opções)\n
* Adicionada opção de doar uma cerveja ou outra coisa (ver o menu)
</string>
<string name="ChangeLog"> <b>Versão 0.6.2</b>\n
* Integração Google Drive/Dropbox/...: Use o aplicativo oficial Google Drive ou Dropbox e abra qualquer arquivo .kdbx. Isso agora abrirá o KP2A.\n
* Caixa de diálogo de pesquisa aprimorada \n
* Resultados de pesquisa aprimorados para Compartilhar URL com subdomínios\n
* Adicionadas opções para dar feedback, avaliar e traduzir o app no menu\n
\n
<b>Versão 0.6.1</b>\n
* Detectar quando o banco de dados for alterado em segundo plano (ou seja, devido à atividade de um aplicativo de sincronização)\n
* Pesquisa aprimorada de URLs no navegador\n
* Caixa de diálogo de confirmação ao descartar alterações\n
\n
<b>Versão 0.6</b>\n
Lançamento público inicial
</string>
<string-array name="clipboard_timeout_options">
<item>30 segundos</item>
<item>1 minuto</item>

View File

@@ -402,6 +402,14 @@
<string name="ShowSeparateNotifications_summary">Prikaži ločena obvestila za kopiranje uporabniškega imena in gesla na odložišče in omogočanje tipkovnice.</string>
<string name="AccServiceAutoFill_prefs">Storitev za samodejno izpolnjevanje</string>
<string name="AutoFill_prefs">Storitev samodejnega izpolnjevanja</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">Pri samodejnem izpolnjevanju vnosa s TOTP prikažite obvestilo o vnosu z gumbom Kopiraj TOTP</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">Prikaži obvestilo o vstopu</string>
<string name="AutoFillTotp_prefs_title">Samodejno izpolnjevanje vnosov TOTP</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">Kopiraj TOTP v odložišče</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">Pri samodejnem izpolnjevanju vnosa s TOTP kopirajte TOTP v odložišče</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">Pri samodejnem izpolnjevanju vnosa s TOTP aktivirajte vgrajeno tipkovnico. Tipkovnica ima gumb TOTP.</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">Aktivirajte vgrajeno tipkovnico</string>
<string name="TotpCopiedToClipboard">TOTP kopiran v odložišče</string>
<string name="ShowKp2aKeyboardNotification_title">Obvestilo tipkovnice KP2A</string>
<string name="ShowKp2aKeyboardNotification_summary">Naredi poln vnos dostopen preko tipkovnice KP2A (priporočljivo).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Preklopi tipkovnico</string>
@@ -589,6 +597,7 @@
<string name="CouldntLoadChalAuxFile_Hint">Uporabite vtičnik KeeChallenge v KeePassu 2.x (PC), da nastavite svojo podatkovno zbirko za uporabo z odgovorom izziva!</string>
<string name="ErrorUpdatingChalAuxFile">Napaka pri posodabljanju pomožne datoteke OTP!</string>
<string name="TrayTotp_SeedField_title">Ime polja semena TOTP</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">Če uporabljate vtičnik KeePassa 2 \"TrayTotp\" s samo privzetimi nastavitvami, tu vnesite ime polja semena glede na nastavitve na računalniku.</string>
<string name="TrayTotp_SettingsField_title">Ime polja nastavitev TOTP</string>
<string name="TrayTotp_SettingsField_summary">Tu vnesite ime polja nastavitev za TrayTotp.</string>
@@ -711,6 +720,19 @@
<string name="EntryChannel_desc">Obvestilo o enostavnem dostopu do trenutno izbranega vnosa.</string>
<string name="CloseDbAfterFailedAttempts">Zaprite bazo podatkov po treh neuspelih poskusih biometričnega odklepanja.</string>
<string name="WarnFingerprintInvalidated">Opozorilo! Biometrično overjanje lahko Android razveljavi, npr. po dodajanju novega prstnega odtisa v nastavitvah naprave. Poskrbite, da boste vedno vedeli odkleniti z glavnim geslom!</string>
<string-array name="ChangeLog_1_11">
<item>Dodani so plavajoči gumbi za iskanje in pregled TOTP (če so prisotni vnosi TOTP).</item>
<item>Izboljšanje prikaza polj TOTP z dodajanjem kazalnika časovne omejitve in njegovim vidnejšim prikazom.</item>
<item>TOTP je zdaj viden v pogledu skupine.</item>
<item>Kopiranje vrednosti besedila v odložišče ob dolgem pritisku v prikazu vnosa.</item>
<item>Na vgrajeni tipkovnici omogočen lažji dostop do TOTP.</item>
<item>Prikaži obvestilo o vnosu pri samodejnem izpolnjevanju vnosa TOTP. To omogoča kopiranje vnosa TOTP v odložišče. Za nastavitev glejte nastavitve.</item>
<item>Posodobljeno izvajanje TOTP za odpravo težav z združljivostjo s KeePass2 in TrayTOTP</item>
<item>Manjše izboljšave</item>
</string-array>
<string-array name="ChangeLog_1_11_net">
<item>Posodobitev pCloud SDK za zagotavljanje dostopa do map v skupni rabi</item>
</string-array>
<string-array name="ChangeLog_1_10">
<item>Dodajanje podpore za dovoljenja za obvestila v operacijskem sistemu Android 13+</item>
<item>Izboljšanje izvajanja FTP in SFTP</item>

View File

@@ -793,6 +793,7 @@
<string name="autofill_enable_for">%1$s karşılığında otomatik doldurmayı etkinleştir</string>
<string name="invalid_link_association">Web alanı ilişkilendirmek Could %1$s uygulaması ile %2$s</string>
<string name="enable_fingerprint_hint">Keepass2Android biyometrik donanım tespit etti. Bu veri tabanı için Biyometrik Kilit Açma özelliğini etkinleştirmek ister misiniz?</string>
<string name="post_notifications_dialog_notnow">Şimdi değil</string>
<string name="understand">Anladım</string>
<string name="dont_show_again">Tekrar gösterme</string>
<string name="masterkey_infotext_head">Ana parolanızı hatırlıyor musunuz?</string>

View File

@@ -402,6 +402,14 @@
<string name="ShowSeparateNotifications_summary">为复制账户信息和激活键盘分别显示通知</string>
<string name="AccServiceAutoFill_prefs">自动填充服务(辅助功能)</string>
<string name="AutoFill_prefs">自动填充服务</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">当用TOTP自动填充条目时显示带“复制TOTP”按钮的条目通知</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">显示条目通知</string>
<string name="AutoFillTotp_prefs_title">自动填充TOTP条目</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">复制TOTP到剪贴板</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">当使用TOTP自动填充条目时复制TOTP到剪贴板</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">当用TOTP自动填充条目时激活内置键盘。键盘有一个TOTP按钮。</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">激活内置键盘</string>
<string name="TotpCopiedToClipboard">已复制TOTP到剪贴板</string>
<string name="ShowKp2aKeyboardNotification_title">KP2A 键盘通知</string>
<string name="ShowKp2aKeyboardNotification_summary">使整个条目可通过 KP2A 键盘获取(推荐)。</string>
<string name="OpenKp2aKeyboardAutomatically_title">切换键盘</string>
@@ -589,6 +597,7 @@
<string name="CouldntLoadChalAuxFile_Hint">请在 KeePass 2.x (PC) 中使用 KeeChallenge 插件,以使用挑战—响应配置您的数据库!</string>
<string name="ErrorUpdatingChalAuxFile">更新一次性密码辅助文件时出错 </string>
<string name="TrayTotp_SeedField_title">一次性密码种子字段名称</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">如果您在使用 Keepass 2 插件 \"TrayTotp\" 为非默认设置,在电脑上输入设置种子字段的字段名称。</string>
<string name="TrayTotp_SettingsField_title">TOTP 字段名称设置</string>
<string name="TrayTotp_SettingsField_summary">在这里输入设置字段的字段名称 TrayTotp</string>
@@ -711,6 +720,13 @@
<string name="EntryChannel_desc">选定条目快速进入通知</string>
<string name="CloseDbAfterFailedAttempts">三次失败的生物识别解锁后关闭数据库。</string>
<string name="WarnFingerprintInvalidated">警告!生物识别认证可能会被Android系统作废例如在你的设备设置中添加一个新的指纹后。确保你总是知道如何用你的主密码解锁</string>
<string-array name="ChangeLog_1_10">
<item>在 Android 13+ 上添加对通知权限的支持</item>
<item>改善FTP和SFTP的代码实现</item>
<item>Add access to full pCloud</item>
<item>Allow to select System language in the language dialog</item>
<item>Fix issue with remembering Keyfile + Challenge password type</item>
</string-array>
<string-array name="ChangeLog_1_09e">
<item>修复崩溃和意外注销的 bug</item>
<item>切换到新的 SFTP 实现,支持现代公钥算法,例如 rsa-sha2-256</item>
@@ -776,6 +792,15 @@
<item>BUG修复</item>
<item>Bug 修复</item>
</string-array>
<string name="ChangeLog_1_07b"> 版本 1.07b\n
* 采用原生实现改进 Argon2 性能(感谢 Chih-Hsuan Yen!\n
* 允许点按指纹图标来禁用指纹(避免屏下指纹识别的问题,感谢 marcoDallas!\n
* 切换密码可见性时恢复光标位置(感谢 DDoSolitary!\n
* 改进 pCloud 实现(再次感谢 gilbsgilbs again!\n
* 为更多的数个浏览器增加自动填写支持 \n
* 新的 OneDrive 实现:支持 OneDrive for Business、共享文件、可选权限范围、多账户以及修复离线访问问题\n
* 其他问题修复
</string>
<string name="ChangeLog_keptDonate">捐出一杯啤酒或别的来支持我们的发展吧。</string>
<string-array name="clipboard_timeout_options">
<item>30秒</item>

View File

@@ -47,6 +47,7 @@
<string name="oi_filemanager_web">https://openintents.googlecode.com/files/FileManager-2.0.2.apk</string>
<string name="permission_desc2">KP2A Search</string>
<string name="permission_desc3">KP2A Choose autofill dataset</string>
<string name="AutoFillTotp_prefs_screen_key">AutoFillTotp_prefs_screen_key</string>
<!-- Preference settings -->

View File

@@ -402,6 +402,16 @@
<string name="ShowSeparateNotifications_summary">Show separate notifications for copying username and password to clipboard and activating the keyboard.</string>
<string name="AccServiceAutoFill_prefs">AutoFill Accessibility-Service</string>
<string name="AutoFill_prefs">AutoFill Service</string>
<string name="AutoFillTotp_prefs_ShowNotification_summary">When autofilling an entry with TOTP, show the entry notification with a Copy TOTP button</string>
<string name="AutoFillTotp_prefs_ShowNotification_title">Show entry notification</string>
<string name="AutoFillTotp_prefs_title">Autofill for TOTP entries</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_title">Copy TOTP to clipboard</string>
<string name="AutoFillTotp_prefs_CopyTotpToClipboard_summary">When autofilling an entry with TOTP, copy the TOTP to the clipboard</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_summary">When autofilling an entry with TOTP, activate the built-in keyboard. The keyboard has a TOTP button.</string>
<string name="AutoFillTotp_prefs_ActivateKeyboard_title">Activate built-in keyboard</string>
<string name="TotpCopiedToClipboard">Copied TOTP to clipboard</string>
<string name="ShowKp2aKeyboardNotification_title">KP2A keyboard notification</string>
<string name="ShowKp2aKeyboardNotification_summary">Make full entry accessible through the KP2A keyboard (recommended).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Switch keyboard</string>
@@ -589,6 +599,7 @@
<string name="CouldntLoadChalAuxFile_Hint">Please use the KeeChallenge plugin in KeePass 2.x (PC) to configure your database for use with challenge-response!</string>
<string name="ErrorUpdatingChalAuxFile">Error updating OTP auxiliary file!</string>
<string name="TrayTotp_SeedField_title">TOTP Seed field name</string>
<string name="TOTP">TOTP</string>
<string name="TrayTotp_SeedField_summary">If you are using the Keepass 2 plugin "TrayTotp" with non-default settings, enter the field name for the seed field here according to the settings on the PC.</string>
<string name="TrayTotp_SettingsField_title">TOTP Settings field name</string>
<string name="TrayTotp_SettingsField_summary">Enter the field name of the settings field for TrayTotp here.</string>
@@ -716,6 +727,21 @@
<string name="CloseDbAfterFailedAttempts">Close database after three failed biometric unlock attempts.</string>
<string name="WarnFingerprintInvalidated">Warning! Biometric authentication can be invalidated by Android, e.g. after adding a new fingerprint in your device settings. Make sure you always know how to unlock with your master password!</string>
<string-array name="ChangeLog_1_11">
<item>Added floating action buttons for search and TOTP overview (if TOTP entries are present).</item>
<item>Improved display of TOTP fields by adding a timeout indicator and showing it more prominently.</item>
<item>TOTP can now be seen from the group view.</item>
<item>Copy text value to clipboard on long-press in entry view.</item>
<item>Make TOTP more easily accessible on the built-in keyboard.</item>
<item>Show entry notification when autofilling a TOTP entry. This allows to copy the TOTP to clipboard. See preferences to configure the behavior.</item>
<item>Updated TOTP implementation to resolve compatibility issues with KeePass2 and TrayTOTP</item>
<item>Minor improvements</item>
</string-array>
<string-array name="ChangeLog_1_11_net">
<item>Update pCloud SDK to provide access to shared folders</item>
</string-array>
<string-array name="ChangeLog_1_10">
<item>Add support for notification permissions on Android 13+</item>
<item>Improve the FTP and SFTP implementation</item>

View File

@@ -461,7 +461,8 @@
android:defaultValue="false"
android:title="@string/LogAutofillView_title"
android:key="@string/LogAutofillView_key" />
<CheckBoxPreference
android:enabled="true"
@@ -476,6 +477,38 @@
android:summary="@string/AutofillDisabledQueriesPreference_summary"
android:persistent="false"
android:key="AutofillDisabledQueriesPreference_key"/>
<PreferenceScreen
android:key="@string/AutoFillTotp_prefs_screen_key"
android:title="@string/AutoFillTotp_prefs_title"
>
<keepass2android.ToolbarPreference
android:key="@string/AutoFillTotp_prefs_screen_key"
android:title="@string/AutoFillTotp_prefs_title" />
<CheckBoxPreference android:key="AutoFillTotp_prefs_ShowNotification_key"
android:enabled="true"
android:persistent="true"
android:summary="@string/AutoFillTotp_prefs_ShowNotification_summary"
android:defaultValue="true"
android:title="@string/AutoFillTotp_prefs_ShowNotification_title"
/>
<CheckBoxPreference android:key="AutoFillTotp_prefs_CopyTotpToClipboard_key"
android:enabled="true"
android:persistent="true"
android:summary="@string/AutoFillTotp_prefs_CopyTotpToClipboard_summary"
android:defaultValue="true"
android:title="@string/AutoFillTotp_prefs_CopyTotpToClipboard_title"
/>
<CheckBoxPreference android:key="AutoFillTotp_prefs_ActivateKeyboard_key"
android:enabled="true"
android:persistent="true"
android:summary="@string/AutoFillTotp_prefs_ActivateKeyboard_summary"
android:defaultValue="false"
android:title="@string/AutoFillTotp_prefs_ActivateKeyboard_title"
/>
</PreferenceScreen>
</PreferenceScreen>

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
@@ -306,7 +307,27 @@ namespace keepass2android
}
else if (Intent.Action == Intent.ActionSend)
{
AppTask = new SearchUrlTask { UrlToSearchFor = Intent.GetStringExtra(Intent.ExtraText) };
ActivationCondition activationCondition = ActivationCondition.Never;
ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this);
if (prefs.GetBoolean("kp2a_switch_rooted", false))
{
activationCondition = ActivationCondition.Always;
}
else
{
//if the app is about to be closed again (e.g. after searching for a URL and returning to the browser:
// automatically bring up the Keyboard selection dialog
if (prefs.GetBoolean(this.GetString(Resource.String.OpenKp2aKeyboardAutomatically_key), this.Resources.GetBoolean(Resource.Boolean.OpenKp2aKeyboardAutomatically_default)))
{
activationCondition = ActivationCondition.Always;
}
}
AppTask = new SearchUrlTask()
{
UrlToSearchFor = Intent.GetStringExtra(Intent.ExtraText),
ActivateKeyboard = activationCondition
};
}
}

View File

@@ -63,6 +63,12 @@ namespace keepass2android
launchMode.Launch(act, i);
}
public static void Launch(Activity act, OpenSpecificEntryTask task, ActivityLaunchMode launchMode)
{
Intent i = new Intent(act, typeof(ShareUrlResults));
task.ToIntent(i);
launchMode.Launch(act, i);
}
public override bool IsSearchResult
{
@@ -76,21 +82,15 @@ namespace keepass2android
//if user presses back to leave this activity:
SetResult(Result.Canceled);
UpdateBottomBarElementVisibility(Resource.Id.select_other_entry, true);
UpdateBottomBarElementVisibility(Resource.Id.add_url_entry, true);
if (App.Kp2a.DatabaseIsUnlocked)
{
var searchUrlTask = ((SearchUrlTask)AppTask);
String searchUrl = searchUrlTask.UrlToSearchFor;
Query(searchUrl, searchUrlTask.AutoReturnFromQuery);
Query();
}
// else: LockCloseListActivity.OnResume will trigger a broadcast (LockDatabase) which will cause the activity to be finished.
}
protected override void OnSaveInstanceState(Bundle outState)
@@ -99,12 +99,25 @@ namespace keepass2android
AppTask.ToBundle(outState);
}
private void Query(string url, bool autoReturnFromQuery)
private void Query()
{
bool canAutoReturnFromQuery = true;
bool shouldAutoReturnFromQuery = true;
try
{
Group = GetSearchResultsForUrl(url);
if (AppTask is SearchUrlTask searchUrlTask)
{
String searchUrl = searchUrlTask.UrlToSearchFor;
canAutoReturnFromQuery = searchUrlTask.AutoReturnFromQuery;
shouldAutoReturnFromQuery = PreferenceManager.GetDefaultSharedPreferences(this)
.GetBoolean(GetString(Resource.String.AutoReturnFromQuery_key), true);
Group = GetSearchResultsForUrl(searchUrl);
}
else if (AppTask is OpenSpecificEntryTask openEntryTask)
{
Group = GetSearchResultsForUuid(openEntryTask.EntryUuid);
}
} catch (Exception e)
{
Toast.MakeText(this, e.Message, ToastLength.Long).Show();
@@ -114,7 +127,7 @@ namespace keepass2android
}
//if there is exactly one match: open the entry
if ((Group.Entries.Count() == 1) && autoReturnFromQuery && PreferenceManager.GetDefaultSharedPreferences(this).GetBoolean(GetString(Resource.String.AutoReturnFromQuery_key),true))
if ((Group.Entries.Count() == 1) && canAutoReturnFromQuery && shouldAutoReturnFromQuery)
{
LaunchActivityForEntry(Group.Entries.Single(),0);
return;
@@ -131,32 +144,57 @@ namespace keepass2android
FragmentManager.FindFragmentById<GroupListFragment>(Resource.Id.list_fragment).ListAdapter = new PwGroupListAdapter(this, Group);
View selectOtherEntry = FindViewById (Resource.Id.select_other_entry);
View createUrlEntry = FindViewById(Resource.Id.add_url_entry);
var newTask = new SearchUrlTask() {AutoReturnFromQuery = false, UrlToSearchFor = url};
if (AppTask is SelectEntryTask currentSelectTask)
newTask.ShowUserNotifications = currentSelectTask.ShowUserNotifications;
selectOtherEntry.Click += (sender, e) => {
GroupActivity.Launch (this, newTask, new ActivityLaunchModeRequestCode(0));
if (AppTask is OpenSpecificEntryTask)
{
selectOtherEntry.Visibility = ViewStates.Gone;
createUrlEntry.Visibility = ViewStates.Gone;
}
else
{
var searchUrlTask = AppTask as SearchUrlTask;
String searchUrl = searchUrlTask.UrlToSearchFor;
selectOtherEntry.Visibility = ViewStates.Visible;
SearchUrlTask newTask;
if (AppTask is SelectEntryTask currentSelectTask)
{
newTask = new SearchUrlTask() { AutoReturnFromQuery = false, UrlToSearchFor = searchUrl, ActivateKeyboard = currentSelectTask.ActivateKeyboard };
newTask.ShowUserNotifications = currentSelectTask.ShowUserNotifications;
newTask.ActivateKeyboard = currentSelectTask.ActivateKeyboard;
newTask.CopyTotpToClipboard = currentSelectTask.CopyTotpToClipboard;
}
else
newTask = new SearchUrlTask() { AutoReturnFromQuery = false, UrlToSearchFor = searchUrl, ActivateKeyboard = ActivationCondition.Never };
selectOtherEntry.Click += (sender, e) => {
GroupActivity.Launch(this, newTask, new ActivityLaunchModeRequestCode(0));
};
if (App.Kp2a.OpenDatabases.Any(db => db.CanWrite))
{
createUrlEntry.Visibility = ViewStates.Visible;
createUrlEntry.Click += (sender, e) =>
{
GroupActivity.Launch(this, new CreateEntryThenCloseTask { Url = searchUrl, ShowUserNotifications = (AppTask as SelectEntryTask)?.ShowUserNotifications ?? ActivationCondition.Always }, new ActivityLaunchModeRequestCode(0));
Toast.MakeText(this, GetString(Resource.String.select_group_then_add, new Java.Lang.Object[] { GetString(Resource.String.add_entry) }), ToastLength.Long).Show();
};
}
else
{
createUrlEntry.Visibility = ViewStates.Gone;
}
}
};
View createUrlEntry = FindViewById (Resource.Id.add_url_entry);
if (App.Kp2a.OpenDatabases.Any(db => db.CanWrite))
{
createUrlEntry.Visibility = ViewStates.Visible;
createUrlEntry.Click += (sender, e) =>
{
GroupActivity.Launch(this, new CreateEntryThenCloseTask { Url = url, ShowUserNotifications = (AppTask as SelectEntryTask)?.ShowUserNotifications ?? ShowUserNotificationsMode.Always }, new ActivityLaunchModeRequestCode(0));
Toast.MakeText(this, GetString(Resource.String.select_group_then_add, new Java.Lang.Object[] { GetString(Resource.String.add_entry) }), ToastLength.Long).Show();
};
}
else
{
createUrlEntry.Visibility = ViewStates.Gone;
}
Util.MoveBottomBarButtons(Resource.Id.select_other_entry, Resource.Id.add_url_entry, Resource.Id.bottom_bar, this);
}
@@ -201,6 +239,31 @@ namespace keepass2android
return resultsGroup;
}
public static PwGroup GetSearchResultsForUuid(string uuid)
{
PwGroup resultsGroup = null;
foreach (var db in App.Kp2a.OpenDatabases)
{
var resultsForThisDb = db.SearchForUuid(uuid);
if (resultsGroup == null)
{
resultsGroup = resultsForThisDb;
}
else
{
foreach (var entry in resultsForThisDb.Entries)
{
resultsGroup.AddEntry(entry, false, false);
}
}
}
return resultsGroup;
}
public override bool OnSearchRequested()
{
Intent i = new Intent(this, typeof(SearchActivity));

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using Android.Content;
using keepass2android;
using KeePassLib.Collections;
namespace PluginTOTP
@@ -39,23 +40,34 @@ namespace PluginTOTP
{
TotpData res = new TotpData();
string data;
if (!_entryFields.TryGetValue("otp", out data))
var otpKey = "otp";
if (!_entryFields.TryGetValue(otpKey, out data))
{
return res;
}
NameValueCollection parameters = ParseQueryString(data);
res.InternalFields.Add(otpKey);
if (parameters[KeyParameter] == null)
{
return res;
}
res.TotpSeed = parameters[KeyParameter];
try
{
res.TotpSeed = parameters[KeyParameter];
res.Duration = GetIntOrDefault(parameters, StepParameter, 30).ToString();
res.Length = GetIntOrDefault(parameters, SizeParameter, 6).ToString();
res.IsTotpEntry = true;
}
catch (Exception e)
{
Kp2aLog.Log("Cannot parse seed");
}
res.Duration = GetIntOrDefault(parameters, StepParameter, 30).ToString();
res.Length = GetIntOrDefault(parameters, SizeParameter, 6).ToString();
res.IsTotpEntry = true;
return res;
}

View File

@@ -16,6 +16,7 @@ namespace keepass2android
{
return res;
}
res.InternalFields.Add("otp");
string otpUriStart = "otpauth://totp/";

View File

@@ -5,6 +5,7 @@ using keepass2android;
using KeePassLib;
using KeePassLib.Cryptography;
using KeePassLib.Utility;
using KeeTrayTOTP.Libraries;
namespace PluginTOTP
{
@@ -13,14 +14,18 @@ namespace PluginTOTP
public TotpData GetTotpData(IDictionary<string, string> entryFields, Context ctx, bool muteWarnings)
{
TotpData res = new TotpData();
byte[] pbSecret = (GetOtpSecret(entryFields, "TimeOtp-") ?? MemUtil.EmptyByteArray);
byte[] pbSecret = (GetOtpSecret(entryFields, "TimeOtp-", out string secretFieldKey) ?? MemUtil.EmptyByteArray);
if (pbSecret.Length == 0)
return res;
res.InternalFields.Add(secretFieldKey);
string strPeriod;
uint uPeriod = 0;
if (entryFields.TryGetValue("TimeOtp-Period", out strPeriod))
{
res.InternalFields.Add("TimeOtp-Period");
uint.TryParse(strPeriod, out uPeriod);
}
@@ -33,6 +38,7 @@ namespace PluginTOTP
uint uLength = 0;
if (entryFields.TryGetValue("TimeOtp-Length", out strLength))
{
res.InternalFields.Add("TimeOtp-Length");
uint.TryParse(strLength, out uLength);
}
@@ -41,6 +47,8 @@ namespace PluginTOTP
string strAlg;
entryFields.TryGetValue("TimeOtp-Algorithm", out strAlg);
if (!string.IsNullOrEmpty(strAlg))
res.InternalFields.Add("TimeOtp-Algorithm");
res.HashAlgorithm = strAlg;
res.TotpSecret = pbSecret;
@@ -51,32 +59,37 @@ namespace PluginTOTP
}
private static byte[] GetOtpSecret(IDictionary<string, string> entryFields, string strPrefix)
private static byte[] GetOtpSecret(IDictionary<string, string> entryFields, string strPrefix, out string secretFieldKey)
{
try
{
string str;
entryFields.TryGetValue(strPrefix + "Secret", out str);
if (!string.IsNullOrEmpty(str))
secretFieldKey = strPrefix + "Secret";
entryFields.TryGetValue(secretFieldKey, out str);
if (!string.IsNullOrEmpty(str))
return StrUtil.Utf8.GetBytes(str);
entryFields.TryGetValue(strPrefix + "Secret-Hex", out str);
secretFieldKey = strPrefix + "Secret-Hex";
entryFields.TryGetValue(secretFieldKey, out str);
if (!string.IsNullOrEmpty(str))
return MemUtil.HexStringToByteArray(str);
entryFields.TryGetValue(strPrefix + "Secret-Base32", out str);
secretFieldKey = strPrefix + "Secret-Base32";
entryFields.TryGetValue(secretFieldKey, out str);
if (!string.IsNullOrEmpty(str))
return MemUtil.ParseBase32(str);
return Base32.Decode(str);
entryFields.TryGetValue(strPrefix + "Secret-Base64", out str);
secretFieldKey = strPrefix + "Secret-Base64";
entryFields.TryGetValue(secretFieldKey, out str);
if (!string.IsNullOrEmpty(str))
return Convert.FromBase64String(str);
}
catch (Exception e)
{
Kp2aLog.LogUnexpectedError(e);
}
secretFieldKey = null;
return null;
}
}

View File

@@ -10,8 +10,9 @@ namespace keepass2android
{
class Kp2aTotp
{
public const string TotpKey = "TOTP";
readonly ITotpPluginAdapter[] _pluginAdapters = new ITotpPluginAdapter[]
readonly ITotpPluginAdapter[] _pluginAdapters = new ITotpPluginAdapter[]
{
new TrayTotpPluginAdapter(),
new KeeOtpPluginAdapter(),
@@ -46,7 +47,7 @@ namespace keepass2android
foreach (ITotpPluginAdapter adapter in _pluginAdapters)
{
TotpData totpData = adapter.GetTotpData(
App.Kp2a.LastOpenedEntry.OutputStrings.ToDictionary(pair => StrUtil.SafeXmlString(pair.Key),
entry.OutputStrings.ToDictionary(pair => StrUtil.SafeXmlString(pair.Key),
pair => pair.Value.ReadString()), LocaleManager.LocalizedAppContext, false);
if (totpData.IsTotpEntry)
{

View File

@@ -31,12 +31,14 @@ namespace PluginTOTP
public string TimeCorrectionUrl { get; set; }
public string HashAlgorithm { get; set; }
public bool IsDefaultRfc6238
{
get { return Length == "6" && Duration == "30" && (HashAlgorithm == null || HashAlgorithm == HashSha1); }
}
public List<string> InternalFields { get; set; } = new List<string>();
public static TotpData MakeDefaultRfc6238()
{
return new TotpData()

View File

@@ -31,17 +31,8 @@ namespace PluginTOTP
_muteWarnings = muteWarnings;
}
/// <summary>
/// Check if specified Entry contains Settings that are not null.
/// </summary>
internal bool SettingsCheck(IDictionary<string, string> entryFields)
{
string settings;
entryFields.TryGetValue(SettingsFieldName, out settings);
return !String.IsNullOrEmpty(settings);
}
internal bool SeedCheck(IDictionary<string, string> entryFields)
internal bool HasSeed(IDictionary<string, string> entryFields)
{
string seed;
entryFields.TryGetValue(SeedFieldName, out seed);
@@ -100,21 +91,23 @@ namespace PluginTOTP
}
private string[] SettingsGet(IDictionary<string, string> entryFields)
{
return entryFields[SettingsFieldName].Split(';');
}
{
return entryFields.TryGetValue(SettingsFieldName, out var settings) ? settings.Split(';') : new[] { "30", "6" };
}
public TotpData GetTotpData(IDictionary<string, string> entryFields)
{
TotpData res = new TotpData();
if (SettingsCheck(entryFields) && SeedCheck(entryFields))
if (HasSeed(entryFields))
{
bool ValidInterval; bool ValidLength; bool ValidUrl;
if (SettingsValidate(entryFields, out ValidInterval, out ValidLength, out ValidUrl))
{
bool NoTimeCorrection = false;
string[] Settings = SettingsGet(entryFields);
res.InternalFields.Add(SettingsFieldName);
res.InternalFields.Add(SeedFieldName);
res.Duration = Settings[0];
res.Length = Settings[1];
if (res.Length == "S")

View File

@@ -13,7 +13,7 @@ namespace PluginTOTP
{
class UpdateTotpTimerTask: TimerTask
{
public const string TotpKey = "TOTP";
public const string TotpKey = Kp2aTotp.TotpKey;
private readonly Context _context;
private readonly ITotpPluginAdapter _adapter;

View File

@@ -828,7 +828,7 @@ namespace keepass2android
new DropboxAppFolderFileStorage(LocaleManager.LocalizedAppContext, this),
GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(LocaleManager.LocalizedAppContext)==ConnectionResult.Success ? new GoogleDriveFileStorage(LocaleManager.LocalizedAppContext, this) : null,
GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(LocaleManager.LocalizedAppContext)==ConnectionResult.Success ? new GoogleDriveAppDataFileStorage(LocaleManager.LocalizedAppContext, this) : null,
new OneDriveFileStorage(LocaleManager.LocalizedAppContext, this),
new OneDriveFileStorage(),
new OneDrive2FullFileStorage(),
new OneDrive2MyFilesFileStorage(),
new OneDrive2AppFolderFileStorage(),

View File

@@ -6,9 +6,13 @@ using Android.OS;
using Android.Widget;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using KeePassLib;
using KeePassLib.Security;
using KeePassLib.Utility;
using KeeTrayTOTP.Libraries;
using Android.Content.Res;
using Android.Preferences;
namespace keepass2android
{
@@ -339,9 +343,17 @@ namespace keepass2android
}
public virtual void CompleteOnCreateEntryActivity(EntryActivity activity)
public virtual void CompleteOnCreateEntryActivity(EntryActivity activity, Thread notifyPluginsOnOpenThread)
{
activity.StartNotificationsService(false);
//this default implementation is executed when we're opening an entry manually, i.e. without search/autofill.
//We only activate the keyboard if this is enabled in "silent mode"
ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(activity);
bool activateKeyboard = prefs.GetBoolean("kp2a_switch_rooted", false) &&
!prefs.GetBoolean(
activity.GetString(Resource.String
.OpenKp2aKeyboardAutomaticallyOnlyAfterSearch_key), false);
activity.StartNotificationsService(activateKeyboard);
}
public virtual void PopulatePasswordAccessServiceIntent(Intent intent)
@@ -353,7 +365,8 @@ namespace keepass2android
protected static bool GetBoolFromBundle(Bundle b, string key, bool defaultValue)
{
bool boolValue;
if (!Boolean.TryParse(b.GetString(key), out boolValue))
string stringValue = b.GetString(key);
if (!Boolean.TryParse(stringValue, out boolValue))
{
boolValue = defaultValue;
}
@@ -363,7 +376,8 @@ namespace keepass2android
protected static int GetIntFromBundle(Bundle b, string key, int defaultValue)
{
int intValue;
if (!Int32.TryParse(b.GetString(key), out intValue))
var strValue = b.GetString(key);
if (!Int32.TryParse(strValue, out intValue))
{
intValue = defaultValue;
}
@@ -383,7 +397,7 @@ namespace keepass2android
/// User is about to search an entry for a given URL
/// </summary>
/// Derive from SelectEntryTask. This means that as soon as an Entry is opened, we're returning with
/// ExitAfterTaskComplete. This also allows te specify the flag if we need to display the user notifications.
/// ExitAfterTaskComplete. This also allows to specify the flag if we need to display the user notifications.
public class SearchUrlTask: SelectEntryTask
{
public SearchUrlTask()
@@ -392,8 +406,9 @@ namespace keepass2android
}
public const String UrlToSearchKey = "UrlToSearch";
public const String AutoReturnFromQueryKey = "AutoReturnFromQuery";
public string UrlToSearchFor
public string UrlToSearchFor
{
get;
set;
@@ -416,7 +431,7 @@ namespace keepass2android
}
}
public const String AutoReturnFromQueryKey = "AutoReturnFromQuery";
public bool AutoReturnFromQuery { get; set; }
@@ -424,15 +439,19 @@ namespace keepass2android
{
if (String.IsNullOrEmpty(UrlToSearchFor))
{
GroupActivity.Launch(act, new SelectEntryTask() { ShowUserNotifications = ShowUserNotifications}, new ActivityLaunchModeRequestCode(0));
GroupActivity.Launch(act, new SelectEntryTask() {
ShowUserNotifications = ShowUserNotifications,
CopyTotpToClipboard = CopyTotpToClipboard,
ActivateKeyboard = ActivateKeyboard
},
new ActivityLaunchModeRequestCode(0));
}
else
{
ShareUrlResults.Launch(act, this, new ActivityLaunchModeRequestCode(0));
}
//removed. this causes an issue in the following workflow:
//removed. this causes an issue in the following workflow:
//When the user wants to find an entry for a URL but has the wrong database open he needs
//to switch to another database. But the Task is removed already the first time when going through PasswordActivity
// (with the wrong db).
@@ -453,7 +472,7 @@ namespace keepass2android
intent.PutExtra(UrlToSearchKey, UrlToSearchFor);
}
public override void CompleteOnCreateEntryActivity(EntryActivity activity)
public override void CompleteOnCreateEntryActivity(EntryActivity activity, Thread notifyPluginsOnOpenThread)
{
if (App.Kp2a.LastOpenedEntry != null)
App.Kp2a.LastOpenedEntry.SearchUrl = UrlToSearchFor;
@@ -462,18 +481,18 @@ namespace keepass2android
//if the database is readonly (or no URL exists), don't offer to modify the URL
if ((App.Kp2a.CurrentDb.CanWrite == false) || (String.IsNullOrEmpty(UrlToSearchFor) || keepass2android.ShareUrlResults.GetSearchResultsForUrl(UrlToSearchFor).Entries.Any(e => e == activity.Entry) ))
{
base.CompleteOnCreateEntryActivity(activity);
base.CompleteOnCreateEntryActivity(activity, notifyPluginsOnOpenThread);
return;
}
AskAddUrlThenCompleteCreate(activity, UrlToSearchFor);
AskAddUrlThenCompleteCreate(activity, UrlToSearchFor, notifyPluginsOnOpenThread);
}
/// <summary>
/// brings up a dialog asking the user whether he wants to add the given URL to the entry for automatic finding
/// </summary>
public void AskAddUrlThenCompleteCreate(EntryActivity activity, string url)
public void AskAddUrlThenCompleteCreate(EntryActivity activity, string url, Thread notifyPluginsOnOpenThread)
{
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.SetTitle(activity.GetString(Resource.String.AddUrlToEntryDialog_title));
@@ -482,12 +501,13 @@ namespace keepass2android
builder.SetPositiveButton(activity.GetString(Resource.String.yes), (dlgSender, dlgEvt) =>
{
activity.AddUrlToEntry(url, (EntryActivity thenActiveActivity) => base.CompleteOnCreateEntryActivity(thenActiveActivity));
activity.AddUrlToEntry(url, (EntryActivity thenActiveActivity) => base.CompleteOnCreateEntryActivity(thenActiveActivity, notifyPluginsOnOpenThread
));
});
builder.SetNegativeButton(activity.GetString(Resource.String.no), (dlgSender, dlgEvt) =>
{
base.CompleteOnCreateEntryActivity(activity);
base.CompleteOnCreateEntryActivity(activity, notifyPluginsOnOpenThread);
});
Dialog dialog = builder.Create();
@@ -495,8 +515,46 @@ namespace keepass2android
}
}
public class OpenSpecificEntryTask : SelectEntryTask
{
public OpenSpecificEntryTask()
{
}
public enum ShowUserNotificationsMode
public const String EntryUuidKey = "EntryUuid";
public string EntryUuid
{
get;
set;
}
public override void Setup(Bundle b)
{
base.Setup(b);
EntryUuid = b.GetString(EntryUuidKey);
}
public override IEnumerable<IExtra> Extras
{
get
{
foreach (IExtra e in base.Extras)
yield return e;
yield return new StringExtra { Key = EntryUuidKey, Value = EntryUuid };
}
}
public override void LaunchFirstGroupActivity(Activity act)
{
ShareUrlResults.Launch(act, this, new ActivityLaunchModeRequestCode(0));
}
}
public enum ActivationCondition
{
Never,
WhenTotp,
@@ -509,29 +567,34 @@ namespace keepass2android
{
public SelectEntryTask()
{
ShowUserNotifications = ShowUserNotificationsMode.Always;
ShowUserNotifications = ActivationCondition.Always;
CloseAfterCreate = true;
ActivateKeyboard = true;
ActivateKeyboard = ActivationCondition.Never;
CopyTotpToClipboard = false;
}
public const String ShowUserNotificationsKey = "ShowUserNotifications";
public ShowUserNotificationsMode ShowUserNotifications { get; set; }
public ActivationCondition ShowUserNotifications { get; set; }
public const String CloseAfterCreateKey = "CloseAfterCreate";
public const String ActivateKeyboardKey = "ActivateKeyboard";
public const String CopyTotpToClipboardKey = "CopyTotpToClipboard";
public bool CloseAfterCreate { get; set; }
public bool ActivateKeyboard { get; set; }
public ActivationCondition ActivateKeyboard { get; set; }
public bool CopyTotpToClipboard { get; set; }
public override void Setup(Bundle b)
{
ShowUserNotifications = (ShowUserNotificationsMode) GetIntFromBundle(b, ShowUserNotificationsKey, (int)ShowUserNotificationsMode.Always);
ShowUserNotifications = (ActivationCondition) GetIntFromBundle(b, ShowUserNotificationsKey, (int)ActivationCondition.Always);
CloseAfterCreate = GetBoolFromBundle(b, CloseAfterCreateKey, true);
ActivateKeyboard = GetBoolFromBundle(b, ActivateKeyboardKey, true);
ActivateKeyboard = (ActivationCondition)GetIntFromBundle(b, ActivateKeyboardKey, (int)ActivationCondition.Always);
CopyTotpToClipboard = GetBoolFromBundle(b, CopyTotpToClipboardKey, false);
}
@@ -541,31 +604,59 @@ namespace keepass2android
{
yield return new StringExtra { Key = ShowUserNotificationsKey, Value = ((int)ShowUserNotifications).ToString() };
yield return new StringExtra { Key = CloseAfterCreateKey, Value = CloseAfterCreate.ToString() };
yield return new StringExtra { Key = ActivateKeyboardKey, Value = ActivateKeyboard.ToString() };
yield return new StringExtra { Key = ActivateKeyboardKey, Value = ((int)ActivateKeyboard).ToString() };
yield return new StringExtra { Key = CopyTotpToClipboardKey, Value = CopyTotpToClipboard.ToString() };
}
}
public override void CompleteOnCreateEntryActivity(EntryActivity activity)
public override void CompleteOnCreateEntryActivity(EntryActivity activity, Thread notifyPluginsOnOpenThread)
{
Context ctx = activity;
if (ctx == null)
ctx = LocaleManager.LocalizedAppContext;
if ((ShowUserNotifications == ShowUserNotificationsMode.Always)
|| ((ShowUserNotifications == ShowUserNotificationsMode.WhenTotp) && new Kp2aTotp().TryGetAdapter(new PwEntryOutput(activity.Entry, App.Kp2a.CurrentDb)) != null))
{
//show the notifications
activity.StartNotificationsService(ActivateKeyboard);
}
var pwEntryOutput = new PwEntryOutput(activity.Entry, App.Kp2a.CurrentDb);
var totpPluginAdapter = new Kp2aTotp().TryGetAdapter(pwEntryOutput);
bool isTotpEntry = totpPluginAdapter != null;
bool activateKeyboard = ActivateKeyboard == ActivationCondition.Always || (ActivateKeyboard == ActivationCondition.WhenTotp && isTotpEntry);
if ((ShowUserNotifications == ActivationCondition.Always)
|| ((ShowUserNotifications == ActivationCondition.WhenTotp) && isTotpEntry)
|| activateKeyboard)
{
//show the notifications
activity.StartNotificationsService(activateKeyboard);
}
else
{
//to avoid getting into inconsistent state (LastOpenedEntry and Notifications): clear notifications:
CopyToClipboardService.CancelNotifications(activity);
}
if (CloseAfterCreate)
{
//close
activity.CloseAfterTaskComplete();
if (CopyTotpToClipboard && isTotpEntry)
{
Dictionary<string, string> entryFields = pwEntryOutput.OutputStrings.ToDictionary(pair => StrUtil.SafeXmlString(pair.Key), pair => pair.Value.ReadString());
var totpData= totpPluginAdapter.GetTotpData(entryFields, activity, true);
if (totpData.IsTotpEntry)
{
TOTPProvider prov = new TOTPProvider(totpData);
string totp = prov.GenerateByByte(totpData.TotpSecret);
CopyToClipboardService.CopyValueToClipboardWithTimeout(activity, totp, true);
Toast.MakeText(activity, activity.GetString(Resource.String.TotpCopiedToClipboard),
ToastLength.Long).Show();
}
}
if (CloseAfterCreate)
{
//give plugins and TOTP time to do their work:
notifyPluginsOnOpenThread.Join(TimeSpan.FromSeconds(1));
//close
activity.CloseAfterTaskComplete();
}
}
}
@@ -629,8 +720,8 @@ namespace keepass2android
public class CreateEntryThenCloseTask: AppTask
{
public CreateEntryThenCloseTask()
{
ShowUserNotifications = ShowUserNotificationsMode.Always;
{
ShowUserNotifications = ActivationCondition.Always;
}
public override bool CanActivateSearchViewOnStart
@@ -670,13 +761,13 @@ namespace keepass2android
public IList<string> ProtectedFieldsList { get; set; }
public ShowUserNotificationsMode ShowUserNotifications { get; set; }
public ActivationCondition ShowUserNotifications { get; set; }
public override void Setup(Bundle b)
{
ShowUserNotifications = (ShowUserNotificationsMode)GetIntFromBundle(b,ShowUserNotificationsKey, (int)ShowUserNotificationsMode.Always);
ShowUserNotifications = (ActivationCondition)GetIntFromBundle(b,ShowUserNotificationsKey, (int)ActivationCondition.Always);
Url = b.GetString(UrlKey);
AllFields = b.GetString(AllFieldsKey);
@@ -724,15 +815,15 @@ namespace keepass2android
public override void AfterAddNewEntry(EntryEditActivity entryEditActivity, PwEntry newEntry)
{
EntryActivity.Launch(entryEditActivity, newEntry, -1,
new SelectEntryTask { ShowUserNotifications = this.ShowUserNotifications},
new SelectEntryTask() { ShowUserNotifications = this.ShowUserNotifications, ActivateKeyboard = ActivationCondition.Never },
ActivityFlags.ForwardResult);
//no need to call Finish here, that's done in EntryEditActivity ("closeOrShowError")
}
public override void CompleteOnCreateEntryActivity(EntryActivity activity)
public override void CompleteOnCreateEntryActivity(EntryActivity activity, Thread notifyPluginsOnOpenThread)
{
//if the user selects an entry before creating the new one, we're not closing the app
base.CompleteOnCreateEntryActivity(activity);
base.CompleteOnCreateEntryActivity(activity, notifyPluginsOnOpenThread);
}
}

View File

@@ -88,7 +88,7 @@
</Choose>
<ItemGroup Condition=" '$(Flavor)'=='NoNet' ">
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
<Version>13.0.3</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
@@ -227,6 +227,7 @@
<Compile Include="fileselect\FileSelectActivity.cs" />
<Compile Include="fileselect\FileDbHelper.cs" />
<Compile Include="search\SearchProvider.cs" />
<Compile Include="search\SearchTotpResults.cs" />
<Compile Include="SelectStorageLocationActivity.cs" />
<Compile Include="services\AutofillBase\AutofillFieldMetadata.cs" />
<Compile Include="services\AutofillBase\AutofillFieldMetadataCollection.cs" />
@@ -1985,6 +1986,21 @@
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\ic_storage_pcloudall.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\ic_entry_totp.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\ic_fab_search.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\ic_fab_search.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-mdpi\ic_fab_totp.png" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable-xhdpi\ic_fab_totp.png" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -0,0 +1,162 @@
/*
This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file is based on Keepassdroid, Copyright Brian Pellin.
Keepass2Android is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Keepass2Android is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Keepass2Android. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Linq;
using System.Text.RegularExpressions;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Preferences;
using Android.Views;
using Android.Widget;
using keepass2android.view;
using KeePassLib;
namespace keepass2android.search
{
/// <summary>
/// Activity to show search results
/// </summary>
[Activity(Label = "@string/app_name", Theme = "@style/MyTheme_ActionBar", LaunchMode = Android.Content.PM.LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)]
public class SearchTotpResults : GroupBaseActivity
{
public static void Launch(Activity act, AppTask appTask, ActivityFlags? flags = null)
{
Intent i = new Intent(act, typeof(SearchTotpResults));
if (flags != null)
i.SetFlags((ActivityFlags)flags);
appTask.ToIntent(i);
if (flags != null && (((ActivityFlags)flags) | ActivityFlags.ForwardResult) == ActivityFlags.ForwardResult)
act.StartActivity(i);
else
act.StartActivityForResult(i, 0);
}
public override bool MayPreviewTotp
{
get
{
return true;
}
}
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
if ( IsFinishing ) {
return;
}
SetResult(KeePass.ExitNormal);
// Likely the app has been killed exit the activity
if (!App.Kp2a.DatabaseIsUnlocked)
{
Finish();
}
Group = new PwGroup()
{
Name = GetString(Resource.String.TOTP)
};
try
{
foreach (var db in App.Kp2a.OpenDatabases)
{
foreach (var entry in db.EntriesById.Values)
{
var totpData = new Kp2aTotp().TryGetTotpData(new PwEntryOutput(entry, db));
if (totpData?.IsTotpEntry == true)
Group.AddEntry(entry, false);
}
}
}
catch (Exception e)
{
Kp2aLog.LogUnexpectedError(e);
Toast.MakeText(this, e.Message, ToastLength.Long).Show();
Finish();
return;
}
if (Group == null || (!Group.Entries.Any()))
{
SetContentView(Resource.Layout.group_empty);
}
SetGroupTitle();
FragmentManager.FindFragmentById<GroupListFragment>(Resource.Id.list_fragment).ListAdapter = new PwGroupListAdapter(this, Group);
}
public override bool EntriesBelongToCurrentDatabaseOnly
{
get { return false; }
}
public override ElementAndDatabaseId FullGroupId
{
get { return null; }
}
public override void OnCreateContextMenu(IContextMenu menu, View v,
IContextMenuContextMenuInfo menuInfo)
{
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) menuInfo;
ClickView cv = (ClickView) acmi.TargetView;
cv.OnCreateMenu(menu, menuInfo);
}
public override bool OnContextItemSelected(IMenuItem item) {
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo)item.MenuInfo;
ClickView cv = (ClickView) acmi.TargetView;
bool result;
return cv.OnContextItemSelected(item);
}
public override bool OnSearchRequested()
{
Intent i = new Intent(this, typeof(SearchActivity));
this.AppTask.ToIntent(i);
i.SetFlags(ActivityFlags.ForwardResult);
StartActivity(i);
return true;
}
public override bool IsSearchResult
{
get { return true; }
}
}
}

View File

@@ -20,6 +20,7 @@ using AndroidX.AutoFill.Inline;
using AndroidX.AutoFill.Inline.V1;
using Java.Util.Concurrent.Atomic;
using keepass2android.services.AutofillBase.model;
using KeePassLib;
using Kp2aAutofillParser;
namespace keepass2android.services.AutofillBase
@@ -29,7 +30,7 @@ namespace keepass2android.services.AutofillBase
PendingIntent GetAuthPendingIntentForResponse(Context context, string query, string queryDomain, string queryPackage,
bool isManualRequest, bool autoReturnFromQuery, AutofillServiceBase.DisplayWarning warning);
PendingIntent GetAuthPendingIntentForWarning(Context context, string query, string queryDomain, string queryPackage, AutofillServiceBase.DisplayWarning warning);
PendingIntent GetAuthPendingIntentForWarning(Context context, PwUuid entryUuid, AutofillServiceBase.DisplayWarning warning);
PendingIntent GetDisablePendingIntentForResponse(Context context, string query,
bool isManualRequest, bool isDisable);
@@ -262,33 +263,42 @@ namespace keepass2android.services.AutofillBase
{
List<Dataset> result = new List<Dataset>();
Kp2aLog.Log("AF: BuildEntryDatasets");
var suggestedEntries = GetSuggestedEntries(query).ToDictionary(e => e.DatasetName, e => e);
Dictionary<PwEntryOutput, FilledAutofillFieldCollection<ViewNodeInputField>> suggestedEntries = GetSuggestedEntries(query);
Kp2aLog.Log("AF: BuildEntryDatasets found " + suggestedEntries.Count + " entries");
int count = 0;
foreach (var filledAutofillFieldCollection in suggestedEntries.Values)
var totpHelper = new Kp2aTotp();
foreach (var kvp in suggestedEntries)
{
var filledAutofillFieldCollection = kvp.Value;
PwEntryOutput entry = kvp.Key;
if (filledAutofillFieldCollection == null)
continue;
var inlinePresentationSpec = AutofillHelper.ExtractSpec(inlinePresentationSpecs, count);
if (warning == DisplayWarning.None)
if ((warning == DisplayWarning.None)
&& (totpHelper.TryGetAdapter(entry) == null))
{
//no special dataset, we can immediately return the field collection
FilledAutofillFieldCollection<ViewNodeInputField> partitionData =
AutofillHintsHelper.FilterForPartition(filledAutofillFieldCollection, parser.AutofillFields.FocusedAutofillCanonicalHints);
Kp2aLog.Log("AF: Add dataset");
result.Add(AutofillHelper.NewDataset(this, parser.AutofillFields, partitionData, IntentBuilder,
result.Add(AutofillHelper.NewDataset(this, parser.AutofillFields, partitionData, IntentBuilder,
inlinePresentationSpec));
}
else
{
//return an "auth" dataset (actually for just warning the user in case domain/package dont match)
//return an "auth" dataset (actually for just warning the user in case domain/package dont match and/or to make sure that we open the EntryActivity,
// thus opening the entry notification in case of TOTP)
PendingIntent pendingIntent =
IntentBuilder.GetAuthPendingIntentForWarning(this, query, queryDomain, queryPackage, warning);
IntentBuilder.GetAuthPendingIntentForWarning(this, entry.Uuid, warning);
var datasetName = filledAutofillFieldCollection.DatasetName;
if (datasetName == null)
{
@@ -320,7 +330,7 @@ namespace keepass2android.services.AutofillBase
}
protected abstract List<FilledAutofillFieldCollection<ViewNodeInputField>> GetSuggestedEntries(string query);
protected abstract Dictionary<PwEntryOutput, FilledAutofillFieldCollection<ViewNodeInputField>> GetSuggestedEntries(string query);
public enum DisplayWarning
{

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