Compare commits

...

645 Commits

Author SHA1 Message Date
Philipp Crocoll
8fbeb5c409 upgrading build tools and NuGet packages. switching to Xamarin's Biometric Bindings (even though this reverts from 1.0.1 to 1.0.0) because of build issues/incompatibilities 2020-03-02 10:07:55 +01:00
Philipp Crocoll
e1416b984e Apply password font in EditText views, closes #404 2020-02-15 10:05:27 +01:00
Philipp Crocoll
ff95c32c2d Request focus before calling ShowInputMethod, closes #1132 2020-02-15 09:35:49 +01:00
Philipp Crocoll
2b2deb291a catch invalid dates, closes #868 2020-02-15 04:15:35 +01:00
Philipp Crocoll
e51999ea1f display notifications to allow copying TOTP to clipboard when autofilling, closes #1072 2020-02-15 03:55:43 +01:00
Philipp Crocoll
7ba17b8552 start implementing notifications when searching, e.g. for Autofill 2020-02-15 03:26:35 +01:00
Philipp Crocoll
406723fab0 manifest for 1.08-r1 2020-02-15 03:24:52 +01:00
Philipp Crocoll
e1ea3a1502 Merge branch 'master' of https://github.com/PhilippC/keepass2android 2020-02-13 21:35:02 +01:00
Philipp Crocoll
3f101c070d update to biometric-1.0.1 2020-02-13 21:34:10 +01:00
Philipp Crocoll
dd49cc9324 Merge branch 'master' of c:/ph/keepass2android 2020-02-10 11:00:59 +01:00
Philipp Crocoll
d607151734 changelog for 1.08-r0 2020-02-10 11:00:51 +01:00
Philipp Crocoll
9b780cb216 update version for 1.08-r0 2020-02-10 10:07:13 +01:00
Philipp Crocoll
bd4c01c630 add missing files, ignore some files 2020-02-10 10:06:59 +01:00
Philipp Crocoll
7f4a151a63 manifest for 1.08-r0 2020-01-31 06:20:04 +01:00
PhilippC
d6174dc69e Merge pull request #1135 from PhilippC/l10n_master
New Crowdin translations
2020-01-31 06:21:24 +01:00
PhilippC
61cd5775a2 New translations strings.xml (German) 2020-01-31 06:20:09 +01:00
Philipp Crocoll
69b4828add Merge branch 'master' of https://github.com/PhilippC/keepass2android 2020-01-31 05:24:06 +01:00
Philipp Crocoll
ca09103e98 removed no longer needed subfolder 2020-01-31 05:22:53 +01:00
PhilippC
efadf03238 Merge pull request #1127 from PhilippC/l10n_master
New Crowdin translations
2020-01-31 05:22:14 +01:00
Philipp Crocoll
11727b80f2 simplify code for ftp transaction commit 2020-01-31 05:21:35 +01:00
PhilippC
e57b7179e3 New translations strings.xml (Basque) 2020-01-24 00:30:06 +01:00
PhilippC
1c720ddb7d New translations strings.xml (Basque) 2020-01-24 00:20:07 +01:00
PhilippC
d19396e542 Merge pull request #1107 from PhilippC/l10n_master
New Crowdin translations
2020-01-16 20:15:28 +01:00
PhilippC
ae436249b7 New translations strings.xml (Portuguese, Brazilian) 2020-01-16 20:15:05 +01:00
PhilippC
4518a87f24 New translations strings.xml (Portuguese) 2020-01-16 20:14:41 +01:00
PhilippC
4cc0359c4d New translations strings.xml (Vietnamese) 2020-01-15 20:48:09 +01:00
PhilippC
ec122e078b New translations strings.xml (Greek) 2020-01-15 20:48:07 +01:00
PhilippC
bbc0ba7b3c New translations strings.xml (Croatian) 2020-01-15 20:47:53 +01:00
PhilippC
c4ba08db15 New translations strings.xml (Czech) 2020-01-15 20:47:49 +01:00
PhilippC
75ab8d4eed New translations strings.xml (Danish) 2020-01-15 20:47:44 +01:00
PhilippC
d91cfe7cb0 New translations strings.xml (Dutch) 2020-01-15 20:47:39 +01:00
PhilippC
037c7d35d7 New translations strings.xml (Finnish) 2020-01-15 20:47:35 +01:00
PhilippC
6fd0ab790c New translations strings.xml (French) 2020-01-15 20:47:32 +01:00
PhilippC
1a578ca68e New translations strings.xml (Polish) 2020-01-15 20:47:29 +01:00
PhilippC
60ea6cef08 New translations strings.xml (Hebrew) 2020-01-15 20:47:25 +01:00
PhilippC
d795dbffee New translations strings.xml (Hungarian) 2020-01-15 20:47:23 +01:00
PhilippC
a5163df44c New translations strings.xml (Indonesian) 2020-01-15 20:47:20 +01:00
PhilippC
9fd62088ab New translations strings.xml (Galician) 2020-01-15 20:47:16 +01:00
PhilippC
1f162c85d8 New translations strings.xml (Korean) 2020-01-15 20:47:13 +01:00
PhilippC
9ac6a6a770 New translations strings.xml (Turkish) 2020-01-15 20:47:09 +01:00
PhilippC
78de922261 New translations strings.xml (Swedish) 2020-01-15 20:47:07 +01:00
PhilippC
76c839b091 New translations strings.xml (Spanish) 2020-01-15 20:47:03 +01:00
PhilippC
b5294d6d25 New translations strings.xml (Slovenian) 2020-01-15 20:46:58 +01:00
PhilippC
764963b087 New translations strings.xml (Japanese) 2020-01-15 20:46:54 +01:00
PhilippC
0f7ce379d6 New translations strings.xml (Serbian (Cyrillic)) 2020-01-15 20:46:53 +01:00
PhilippC
1d066f13ba New translations strings.xml (Russian) 2020-01-15 20:46:49 +01:00
PhilippC
1c9450ca10 New translations strings.xml (Slovak) 2020-01-15 20:46:47 +01:00
PhilippC
4f4f9405fe New translations strings.xml (Portuguese, Brazilian) 2020-01-15 20:46:43 +01:00
PhilippC
284e5e472f New translations strings.xml (Portuguese) 2020-01-15 20:46:39 +01:00
PhilippC
14c1026ad1 New translations strings.xml (Persian) 2020-01-15 20:46:34 +01:00
PhilippC
a6f69cc433 New translations strings.xml (Norwegian Bokmal) 2020-01-15 20:46:28 +01:00
PhilippC
dfb50586aa New translations strings.xml (Romanian) 2020-01-15 20:46:26 +01:00
PhilippC
4f1358ffc7 New translations strings.xml (Catalan) 2020-01-15 20:46:22 +01:00
PhilippC
1d12b1c925 New translations strings.xml (Basque) 2020-01-15 20:46:19 +01:00
PhilippC
de8202554a New translations strings.xml (Azerbaijani) 2020-01-15 20:46:17 +01:00
PhilippC
80655e1ca7 New translations strings.xml (Arabic) 2020-01-15 20:46:12 +01:00
PhilippC
4148399f6d New translations strings.xml (Chinese Simplified) 2020-01-15 20:46:10 +01:00
PhilippC
0bcba06ebf New translations strings.xml (Chinese Traditional) 2020-01-15 20:46:09 +01:00
PhilippC
c2cc965c21 New translations strings.xml (Bulgarian) 2020-01-15 20:46:04 +01:00
Philipp Crocoll
dd0c950474 unregister receiver in SelectCurrentDbActivity, closes https://github.com/PhilippC/keepass2android/issues/1111 2020-01-15 05:30:36 +01:00
Philipp Crocoll
b7c8baacc9 OneDrive: improve logging on error; fix creating new file paths, closes https://github.com/PhilippC/keepass2android/issues/1053 2020-01-15 05:18:46 +01:00
PhilippC
5e2fa65a4c New translations strings.xml (Ukrainian) 2020-01-14 00:30:07 +01:00
Philipp Crocoll
52676eb113 make sure we ask if user wants to remember the selected entry even when he didn't select "Choose another entry" (but used search directly), closes https://github.com/PhilippC/keepass2android/issues/742 2020-01-13 13:13:54 +01:00
Philipp Crocoll
bf5ca8908e don't search in groups with the "search disabled flag" when searching for host (i.e. when Share URL is used), closes https://github.com/PhilippC/keepass2android/issues/691 2020-01-13 12:23:45 +01:00
PhilippC
acbe62d6ed New translations strings.xml (Ukrainian) 2020-01-13 11:00:08 +01:00
PhilippC
79ec921abc New translations strings.xml (Ukrainian) 2020-01-13 10:50:09 +01:00
Philipp Crocoll
65bd88af72 changes to search provider, mainly removing special characters from suggestion as several users are reporting crashes on Android 9 when Tabs are in the notes 2020-01-11 17:14:27 +01:00
Philipp Crocoll
0273b4d2bb AndroidContentStorage: truncate file before writing, closes #583 2020-01-08 21:21:36 +01:00
PhilippC
63ef21287a New translations strings.xml (Italian) 2020-01-08 16:00:10 +01:00
PhilippC
1be320b755 New translations strings.xml (Ukrainian) 2020-01-08 11:40:07 +01:00
PhilippC
abcad958ab New translations strings.xml (German) 2020-01-06 14:40:09 +01:00
PhilippC
35b4350455 New translations strings.xml (German) 2020-01-06 14:30:07 +01:00
Philipp Crocoll
8f1251e59b set "no personalized learning" flag for IMEs when entering data to the database, closing #718 2020-01-06 11:57:07 +01:00
Philipp Crocoll
0400ab3c53 upgrade okhttp-digest to 2.0 to fix #1032 2020-01-06 11:21:14 +01:00
Philipp Crocoll
2f3d614ac0 shorten string for Send action to close #734 2019-12-18 05:28:40 +01:00
Philipp Crocoll
fd90b10444 make notes field selectable to close #595 2019-12-16 12:48:36 +01:00
Philipp Crocoll
7f5ec35ada trim TOTP seed to close #340 2019-12-16 12:39:20 +01:00
Philipp Crocoll
b7f7b0d470 allow to add custom fields when editing a template entry, closes #840 2019-12-16 12:32:53 +01:00
Philipp Crocoll
97fb35db90 urldecode display name in WebDavStorage to close #792 2019-12-16 12:18:02 +01:00
Philipp Crocoll
69abcd0786 remove reference to old NetFtp, as this was exchanged for FluentFTP; fix issue with paths that need url encoding, closing #736, closing #615 2019-12-16 12:09:41 +01:00
Philipp Crocoll
d697b93f6a allow to show attachments for template entries 2019-12-16 12:05:10 +01:00
Philipp Crocoll
2290b35317 add jp.hazuki.yuzubrowser to list of trusted browsers, closing #1067 2019-12-08 20:31:15 +01:00
Philipp Crocoll
d838ff0cd9 add support for Lightning browser to close #1034 2019-11-12 06:15:46 +01:00
Philipp Crocoll
a2aa9d61a9 read the reply after writing the file as stated in the docs 2019-11-07 20:09:42 +01:00
Philipp Crocoll
056d791ae9 fix typo on new string, fix compiler error 2019-11-06 22:08:56 +01:00
Philipp Crocoll
d3acacb20b update strings from fingerprint to biometric authentication 2019-11-06 21:56:59 +01:00
Philipp Crocoll
bb74305b26 remove accidentally commited code, was for testing only (into 1.08-pre3) 2019-11-06 20:52:55 +01:00
Philipp Crocoll
32549c9eff make sure biometric prompt does not show up directly after authentication (into 1.08-pre3) 2019-11-06 19:31:57 +01:00
Philipp Crocoll
83b5aa7d7b don't require confirmation for face unlock, as suggested in #795; makes it into pre3 2019-11-06 18:52:34 +01:00
Philipp Crocoll
640a2c7e88 manifest for 1.08-pre3 2019-11-06 18:28:04 +01:00
Philipp Crocoll
31aad963d6 Merge branch 'master' of https://github.com/PhilippC/keepass2android 2019-11-06 18:27:37 +01:00
Philipp Crocoll
326f4282d7 fix potential crash (opening an activity without NewTask flag) 2019-11-06 18:27:24 +01:00
Philipp Crocoll
e5b3cf3db6 trust more Opera browsers 2019-11-06 17:46:26 +01:00
PhilippC
ca3e4a5135 Merge pull request #1023 from squabbi/patch-1
Update How-to-create-a-plug-in_.md
2019-11-06 11:37:50 -05:00
Jayden
c1607bbfb3 Update How-to-create-a-plug-in_.md
Fix malformed link for QR code Play Store link
2019-11-06 16:05:24 +11:00
Philipp Crocoll
0639201b4c add compatibility with steam encoding for OTPs (e.g. otpauth://totp/test:test@example.com?secret=63BEDWCQZKTQWPESARIERL5DTTQFCJTK&issuer=Valve&algorithm=SHA1&digits=5&period=30&encoder=steam) 2019-11-06 04:50:29 +01:00
Philipp Crocoll
b5fe3b8ce4 Merge branch 'master' of https://github.com/PhilippC/keepass2android 2019-11-05 22:41:10 +01:00
Philipp Crocoll
2362efe5fc fix SelectCurrentDbActivity not correctly forwarding to PasswordActivity 2019-11-05 22:40:59 +01:00
Philipp Crocoll
308d8889e4 add missing permission and fix app version for 1.08-pre2 (142 was already used for pre1) 2019-11-05 21:33:14 +01:00
Philipp Crocoll
5e4ea21377 Merge branch 'master' of https://github.com/PhilippC/keepass2android 2019-11-05 20:56:53 +01:00
Philipp Crocoll
45489ad600 changelog and manifest for 1.08-pre2 2019-11-05 20:56:45 +01:00
Philipp Crocoll
683cde5a8b update targetSdkVersion to 29 (Android 10/Q). Change canvas clipping in Soft keyboard to adhere to behavior changes in Android 10. Migrate to AndroidX. Migrate to using BiometricPrompt instead of FingerprintManager, keeping compatibility to SamsungPass API for devices like SGS5. Closes #795, should close #626, closes #910 2019-11-05 20:55:02 +01:00
Philipp Crocoll
8a9c781de2 packages.config to .csproj 2019-11-01 20:35:25 +01:00
PhilippC
6812998c8d Update README.md 2019-10-29 19:43:41 +01:00
Philipp Crocoll
89fda1eee5 update to target Android Q (build tools and targetSdkVersion) 2019-10-28 20:24:20 +01:00
Philipp Crocoll
0cf0170144 changelog and manifest for 1.08-pre1 2019-10-27 22:30:02 +01:00
Philipp Crocoll
cb79c8b1ff Merge branch 'master' of https://github.com/PhilippC/keepass2android 2019-10-27 22:19:57 +01:00
Philipp Crocoll
658dd6a0ec add kiwi browser to list of support autofill browsers 2019-10-27 22:11:36 +01:00
Philipp Crocoll
e6049eca2c upgrade OkHttp to 4.2.2 2019-10-27 22:11:03 +01:00
Philipp Crocoll
efcaa36325 no donate notice in changelog when using the app for one of the first times 2019-10-21 10:33:31 +02:00
Philipp Crocoll
905efd0454 Merge branch 'master' of https://github.com/PhilippC/keepass2android
# Resolved Conflicts:
#	src/keepass2android/Resources/values/strings.xml
2019-10-21 10:24:15 +02:00
Philipp Crocoll
3ce1c04cf2 Merge branch 'Branch_1.07'
# Resolved Conflicts:
#	src/keepass2android/Resources/values/strings.xml
2019-10-10 03:25:02 +02:00
Philipp Crocoll
cb979f8975 Merge remote-tracking branch 'remotes/origin/master' 2019-10-10 03:22:31 +02:00
Philipp Crocoll
cc8cea0049 manifest for 1.07b-r0 2019-10-10 03:20:48 +02:00
Philipp Crocoll
a94e6143e1 "rebase" changes to strings.xml to be in sync with translations from crowdin 2019-10-10 03:15:15 +02:00
PhilippC
699c97eaf9 New translations strings.xml (Portuguese, Brazilian) 2019-10-10 03:09:25 +02:00
PhilippC
10d4ec9bba New translations strings.xml (Portuguese) 2019-10-10 03:09:25 +02:00
PhilippC
e1f1b10f56 New translations strings.xml (French) 2019-10-10 03:09:25 +02:00
PhilippC
cfc09b8f3b New translations strings.xml (Swedish) 2019-10-10 03:09:24 +02:00
PhilippC
4c1571ff2d New translations strings.xml (Spanish) 2019-10-10 03:09:24 +02:00
PhilippC
5aea520cd1 New translations strings.xml (Portuguese, Brazilian) 2019-10-10 03:09:24 +02:00
PhilippC
00294f1aad New translations strings.xml (Portuguese) 2019-10-10 03:09:23 +02:00
PhilippC
e0fd45f838 New translations strings.xml (German) 2019-10-10 03:09:23 +02:00
PhilippC
a7e8363ed7 New translations strings.xml (Swedish) 2019-10-10 03:09:23 +02:00
PhilippC
cb144c5bcf New translations strings.xml (Swedish) 2019-10-10 03:09:23 +02:00
PhilippC
57a9570d34 New translations strings.xml (Swedish) 2019-10-10 03:09:22 +02:00
PhilippC
28162762ef New translations strings.xml (Czech) 2019-10-10 03:09:22 +02:00
PhilippC
b9e745a7fb New translations strings.xml (Czech) 2019-10-10 03:09:22 +02:00
PhilippC
e08e59c226 New translations strings.xml (Polish) 2019-10-10 03:09:21 +02:00
PhilippC
3d6b02a016 New translations strings.xml (Catalan) 2019-10-10 03:09:21 +02:00
PhilippC
b18a7b1a23 New translations strings.xml (Catalan) 2019-10-10 03:09:21 +02:00
PhilippC
8595674eb0 New translations strings.xml (Catalan) 2019-10-10 03:09:21 +02:00
PhilippC
23fd50df21 New translations strings.xml (Dutch) 2019-10-10 03:09:20 +02:00
PhilippC
af80997ed4 New translations strings.xml (Ukrainian) 2019-10-10 03:09:20 +02:00
PhilippC
7e3ac2959e New translations strings.xml (German) 2019-10-10 03:09:20 +02:00
PhilippC
78124c505e New translations strings.xml (German) 2019-10-10 03:09:19 +02:00
PhilippC
589b3f9540 New translations strings.xml (Russian) 2019-10-10 03:09:19 +02:00
PhilippC
bd505d858a New translations strings.xml (Chinese Traditional) 2019-10-10 03:09:19 +02:00
PhilippC
308909f4eb New translations strings.xml (Danish) 2019-10-10 03:09:19 +02:00
PhilippC
9cfcda2938 New translations strings.xml (Danish) 2019-10-10 03:09:18 +02:00
PhilippC
fa4887ffef New translations strings.xml (Italian) 2019-10-10 03:09:18 +02:00
PhilippC
f70f26149e New translations strings.xml (Italian) 2019-10-10 03:09:18 +02:00
PhilippC
3cc904dc18 New translations strings.xml (Danish) 2019-10-10 03:09:17 +02:00
PhilippC
16c6346797 New translations strings.xml (Japanese) 2019-10-10 03:09:17 +02:00
PhilippC
01b8f92d43 New translations strings.xml (Danish) 2019-10-10 03:09:17 +02:00
PhilippC
082f0a928f New translations strings.xml (Chinese Traditional) 2019-10-10 03:09:17 +02:00
PhilippC
2ec4d6e006 New translations strings.xml (Dutch) 2019-10-10 03:09:16 +02:00
PhilippC
7bd46b2182 New translations strings.xml (Chinese Traditional) 2019-10-10 03:09:16 +02:00
PhilippC
2e9ba3bcfc New translations strings.xml (Spanish) 2019-10-10 03:09:16 +02:00
PhilippC
551e374786 New translations strings.xml (Slovenian) 2019-10-10 03:09:15 +02:00
PhilippC
4366858b73 New translations strings.xml (Spanish) 2019-10-10 03:09:15 +02:00
PhilippC
29b7c24312 New translations strings.xml (Slovak) 2019-10-10 03:09:15 +02:00
PhilippC
3c5894db5d New translations strings.xml (Italian) 2019-10-10 03:09:15 +02:00
PhilippC
1d652272d7 New translations strings.xml (French) 2019-10-10 03:09:14 +02:00
PhilippC
d8c7f479ae New translations strings.xml (Danish) 2019-10-10 03:09:14 +02:00
PhilippC
3a0cb3fc72 New translations strings.xml (Slovak) 2019-10-10 03:09:14 +02:00
PhilippC
65f1ec8bf4 New translations strings.xml (Portuguese, Brazilian) 2019-10-10 03:09:14 +02:00
PhilippC
0421e16910 New translations strings.xml (Portuguese) 2019-10-10 03:09:13 +02:00
PhilippC
2489d8e95f New translations strings.xml (Spanish) 2019-10-10 03:09:13 +02:00
PhilippC
ac46ac7372 New translations strings.xml (Japanese) 2019-10-10 03:09:13 +02:00
PhilippC
3ed3c90dae New translations strings.xml (Japanese) 2019-10-10 03:09:12 +02:00
PhilippC
a45530393e New translations strings.xml (Spanish) 2019-10-10 03:09:12 +02:00
PhilippC
a3e4b61216 New translations strings.xml (French) 2019-10-10 03:09:12 +02:00
PhilippC
c4939dd231 New translations strings.xml (Spanish) 2019-10-10 03:09:12 +02:00
PhilippC
c20303ebf1 New translations strings.xml (Chinese Traditional) 2019-10-10 03:09:11 +02:00
PhilippC
d7627899ea New translations strings.xml (Chinese Traditional) 2019-10-10 03:09:11 +02:00
PhilippC
87f82fb23f New translations strings.xml (Chinese Traditional) 2019-10-10 03:09:11 +02:00
PhilippC
f866cdd4aa New translations strings.xml (Slovenian) 2019-10-10 03:09:10 +02:00
PhilippC
a9fc44a4a2 New translations strings.xml (Danish) 2019-10-10 03:09:10 +02:00
PhilippC
ee00e66e4f New translations strings.xml (German) 2019-10-10 03:09:10 +02:00
PhilippC
cfa97759da New translations strings.xml (Danish) 2019-10-10 03:09:10 +02:00
PhilippC
cf26b9fd58 New translations strings.xml (Danish) 2019-10-10 03:09:09 +02:00
PhilippC
6a5ddcc06d New translations strings.xml (Polish) 2019-10-10 03:09:09 +02:00
PhilippC
592667a845 New translations strings.xml (Italian) 2019-10-10 03:09:09 +02:00
PhilippC
8f6e3db71d New translations strings.xml (Czech) 2019-10-10 03:09:08 +02:00
PhilippC
70502414c3 New translations strings.xml (French) 2019-10-10 03:09:08 +02:00
PhilippC
c9189d37f5 New translations strings.xml (Portuguese, Brazilian) 2019-10-10 03:09:08 +02:00
PhilippC
9e62e32e0a New translations strings.xml (Turkish) 2019-10-10 03:09:08 +02:00
PhilippC
f592126d63 New translations strings.xml (Italian) 2019-10-10 03:09:07 +02:00
PhilippC
c26b360bcc New translations strings.xml (Portuguese) 2019-10-10 03:09:07 +02:00
PhilippC
33c844bc97 New translations strings.xml (Dutch) 2019-10-10 03:09:07 +02:00
PhilippC
23a4a90afa New translations strings.xml (Hungarian) 2019-10-10 03:09:06 +02:00
PhilippC
643d8cc644 New translations strings.xml (Turkish) 2019-10-10 03:09:06 +02:00
PhilippC
10d9f73982 New translations strings.xml (Dutch) 2019-10-10 03:09:06 +02:00
PhilippC
a8f3e079a4 New translations strings.xml (Dutch) 2019-10-10 03:09:06 +02:00
PhilippC
8ad258d6b3 New translations strings.xml (Czech) 2019-10-10 03:09:05 +02:00
PhilippC
9a37d61892 New translations strings.xml (German) 2019-10-10 03:09:05 +02:00
PhilippC
30b5443ee1 New translations strings.xml (Vietnamese) 2019-10-10 03:09:05 +02:00
PhilippC
82885da6aa New translations strings.xml (Hungarian) 2019-10-10 03:09:04 +02:00
PhilippC
b498b8b437 New translations strings.xml (Greek) 2019-10-10 03:09:04 +02:00
PhilippC
7109fe405a New translations strings.xml (German) 2019-10-10 03:09:04 +02:00
PhilippC
0611cf2d89 New translations strings.xml (Galician) 2019-10-10 03:09:04 +02:00
PhilippC
2f5a1770c4 New translations strings.xml (French) 2019-10-10 03:09:03 +02:00
PhilippC
f7ee43fc89 New translations strings.xml (Finnish) 2019-10-10 03:09:03 +02:00
PhilippC
1457bdf69b New translations strings.xml (Indonesian) 2019-10-10 03:09:03 +02:00
PhilippC
db4a1a918e New translations strings.xml (Dutch) 2019-10-10 03:09:03 +02:00
PhilippC
66fafc25c8 New translations strings.xml (Czech) 2019-10-10 03:09:02 +02:00
PhilippC
b83cd39754 New translations strings.xml (Croatian) 2019-10-10 03:09:02 +02:00
PhilippC
3010643dc1 New translations strings.xml (Chinese Traditional) 2019-10-10 03:09:02 +02:00
PhilippC
823d6467b9 New translations strings.xml (Chinese Simplified) 2019-10-10 03:09:01 +02:00
PhilippC
9ebdf9c22c New translations strings.xml (Catalan) 2019-10-10 03:09:01 +02:00
PhilippC
0e4421ddc2 New translations strings.xml (Bulgarian) 2019-10-10 03:09:01 +02:00
PhilippC
3fbdf836cd New translations strings.xml (Basque) 2019-10-10 03:09:01 +02:00
PhilippC
124c07efa3 New translations strings.xml (Danish) 2019-10-10 03:09:00 +02:00
PhilippC
5d8cb69938 New translations strings.xml (Italian) 2019-10-10 03:09:00 +02:00
PhilippC
5e2f19b73e New translations strings.xml (Korean) 2019-10-10 03:09:00 +02:00
PhilippC
6e5f2dc910 New translations strings.xml (Ukrainian) 2019-10-10 03:08:59 +02:00
PhilippC
11119c8aa6 New translations strings.xml (Turkish) 2019-10-10 03:08:59 +02:00
PhilippC
b53ebafa9b New translations strings.xml (Swedish) 2019-10-10 03:08:59 +02:00
PhilippC
53bb74b837 New translations strings.xml (Spanish) 2019-10-10 03:08:59 +02:00
PhilippC
8b56ace8d1 New translations strings.xml (Slovenian) 2019-10-10 03:08:58 +02:00
PhilippC
524b8414d5 New translations strings.xml (Slovak) 2019-10-10 03:08:58 +02:00
PhilippC
88bfa05921 New translations strings.xml (Japanese) 2019-10-10 03:08:58 +02:00
PhilippC
4115463922 New translations strings.xml (Russian) 2019-10-10 03:08:57 +02:00
PhilippC
83ab0b2ee4 New translations strings.xml (Portuguese, Brazilian) 2019-10-10 03:08:57 +02:00
PhilippC
5bacadbca0 New translations strings.xml (Portuguese) 2019-10-10 03:08:57 +02:00
PhilippC
005930c8a0 New translations strings.xml (Polish) 2019-10-10 03:08:56 +02:00
PhilippC
a16e6ff00b New translations strings.xml (Persian) 2019-10-10 03:08:56 +02:00
PhilippC
aef334ec61 New translations strings.xml (Norwegian Bokmal) 2019-10-10 03:08:56 +02:00
PhilippC
7917a59757 New translations strings.xml (Romanian) 2019-10-10 03:08:55 +02:00
PhilippC
954fc0f5fb New translations strings.xml (Arabic) 2019-10-10 03:08:55 +02:00
PhilippC
f9578493b4 New translations strings.xml (French) 2019-10-10 03:08:55 +02:00
PhilippC
f49a82745f New translations strings.xml (Chinese Traditional) 2019-10-10 03:08:55 +02:00
PhilippC
84bd67bdea New translations strings.xml (French) 2019-10-10 03:08:54 +02:00
PhilippC
e32bb0a573 New translations strings.xml (Turkish) 2019-10-10 03:08:54 +02:00
PhilippC
8f5d4be864 New translations strings.xml (Italian) 2019-10-10 03:08:54 +02:00
PhilippC
e99c425120 New translations strings.xml (Spanish) 2019-10-10 03:08:53 +02:00
PhilippC
369379df2f New translations strings.xml (Japanese) 2019-10-10 03:08:53 +02:00
PhilippC
9a35575741 New translations strings.xml (Chinese Traditional) 2019-10-10 03:08:53 +02:00
PhilippC
455ca956ab New translations strings.xml (Portuguese) 2019-10-10 03:08:53 +02:00
PhilippC
b87df11941 New translations strings.xml (Dutch) 2019-10-10 03:08:52 +02:00
PhilippC
beb9e2241b New translations strings.xml (Dutch) 2019-10-10 03:08:52 +02:00
PhilippC
71c78d04c6 New translations strings.xml (Dutch) 2019-10-10 03:08:52 +02:00
PhilippC
9a5b18d842 New translations strings.xml (Norwegian Bokmal) 2019-10-10 03:08:52 +02:00
PhilippC
702baf3614 New translations strings.xml (Dutch) 2019-10-10 03:08:51 +02:00
PhilippC
c8b7a8d51e New translations strings.xml (Dutch) 2019-10-10 03:08:51 +02:00
PhilippC
95f1d2ca14 New translations strings.xml (Dutch) 2019-10-10 03:08:51 +02:00
PhilippC
d4673abd01 New translations strings.xml (Polish) 2019-10-10 03:08:50 +02:00
PhilippC
225f0ab437 New translations strings.xml (Polish) 2019-10-10 03:08:50 +02:00
PhilippC
7a36a53a4b New translations strings.xml (Korean) 2019-10-10 03:08:50 +02:00
PhilippC
d9a3469e19 New translations strings.xml (Swedish) 2019-10-10 03:08:50 +02:00
PhilippC
46a5202edb New translations strings.xml (Swedish) 2019-10-10 03:08:49 +02:00
PhilippC
e28b55df9d New translations strings.xml (Swedish) 2019-10-10 03:08:49 +02:00
PhilippC
91a8d6ac6c New translations strings.xml (Swedish) 2019-10-10 03:08:49 +02:00
PhilippC
151d7bb5ca New translations strings.xml (Swedish) 2019-10-10 03:08:48 +02:00
PhilippC
7432f294b2 New translations strings.xml (Swedish) 2019-10-10 03:08:48 +02:00
PhilippC
6ac2bd3c1f New translations strings.xml (Vietnamese) 2019-10-10 03:08:48 +02:00
PhilippC
3ad238e7e8 New translations strings.xml (Basque) 2019-10-10 03:08:47 +02:00
PhilippC
59230fe57a New translations strings.xml (Bulgarian) 2019-10-10 03:08:47 +02:00
PhilippC
43e1e62b41 New translations strings.xml (Catalan) 2019-10-10 03:08:47 +02:00
PhilippC
afb4dd5ce9 New translations strings.xml (Chinese Simplified) 2019-10-10 03:08:47 +02:00
PhilippC
f2b861c369 New translations strings.xml (Croatian) 2019-10-10 03:08:46 +02:00
PhilippC
4080966331 New translations strings.xml (Czech) 2019-10-10 03:08:46 +02:00
PhilippC
54b4662322 New translations strings.xml (Danish) 2019-10-10 03:08:46 +02:00
PhilippC
26e8e2afc9 New translations strings.xml (Dutch) 2019-10-10 03:08:45 +02:00
PhilippC
9aa705f3e7 New translations strings.xml (Finnish) 2019-10-10 03:08:45 +02:00
PhilippC
cb49c90b4a New translations strings.xml (French) 2019-10-10 03:08:45 +02:00
PhilippC
84b2b83901 New translations strings.xml (Galician) 2019-10-10 03:08:45 +02:00
PhilippC
abebc9d3aa New translations strings.xml (German) 2019-10-10 03:08:44 +02:00
PhilippC
19a6044044 New translations strings.xml (Arabic) 2019-10-10 03:08:44 +02:00
PhilippC
6a396561a8 New translations strings.xml (Greek) 2019-10-10 03:08:43 +02:00
PhilippC
025b822046 New translations strings.xml (Hungarian) 2019-10-10 03:08:43 +02:00
PhilippC
1f95c684d8 New translations strings.xml (Indonesian) 2019-10-10 03:08:43 +02:00
PhilippC
7116370908 New translations strings.xml (Italian) 2019-10-10 03:08:43 +02:00
PhilippC
caca6237b8 New translations strings.xml (Japanese) 2019-10-10 03:08:42 +02:00
PhilippC
c5ddf1644d New translations strings.xml (Romanian) 2019-10-10 03:08:42 +02:00
PhilippC
7147874d79 New translations strings.xml (Russian) 2019-10-10 03:08:42 +02:00
PhilippC
91bcbcf47d New translations strings.xml (Serbian (Cyrillic)) 2019-10-10 03:08:41 +02:00
PhilippC
e9ecff62a3 New translations strings.xml (Slovak) 2019-10-10 03:08:41 +02:00
PhilippC
69e081a279 New translations strings.xml (Slovenian) 2019-10-10 03:08:41 +02:00
PhilippC
51ce9847e2 New translations strings.xml (Spanish) 2019-10-10 03:08:41 +02:00
PhilippC
988cc8bd3d New translations strings.xml (Swedish) 2019-10-10 03:08:40 +02:00
PhilippC
9b34ddfd9d New translations strings.xml (Turkish) 2019-10-10 03:08:40 +02:00
PhilippC
bd158984b7 New translations strings.xml (Chinese Traditional) 2019-10-10 03:08:40 +02:00
PhilippC
ba76baf6ce New translations strings.xml (Polish) 2019-10-10 03:08:39 +02:00
PhilippC
19cf36c1e6 New translations strings.xml (Persian) 2019-10-10 03:08:39 +02:00
PhilippC
2bee860748 New translations strings.xml (Norwegian Bokmal) 2019-10-10 03:08:39 +02:00
PhilippC
edcbfeca1c New translations strings.xml (Korean) 2019-10-10 03:08:39 +02:00
PhilippC
db7a629e7d New translations strings.xml (Portuguese, Brazilian) 2019-10-10 03:08:38 +02:00
PhilippC
213ff373a9 New translations strings.xml (Ukrainian) 2019-10-10 03:08:38 +02:00
PhilippC
13fe371b73 New translations strings.xml (Vietnamese) 2019-10-10 03:08:38 +02:00
PhilippC
42e8c28320 New translations strings.xml (Basque) 2019-10-10 03:08:37 +02:00
PhilippC
cefeff50c9 New translations strings.xml (Bulgarian) 2019-10-10 03:08:37 +02:00
PhilippC
d3bb247b65 New translations strings.xml (Catalan) 2019-10-10 03:08:37 +02:00
PhilippC
6a7097a70f New translations strings.xml (Chinese Simplified) 2019-10-10 03:08:37 +02:00
PhilippC
c00ba4ad67 New translations strings.xml (Croatian) 2019-10-10 03:08:36 +02:00
PhilippC
63f3639196 New translations strings.xml (Czech) 2019-10-10 03:08:36 +02:00
PhilippC
5a02b65b66 New translations strings.xml (Danish) 2019-10-10 03:08:36 +02:00
PhilippC
daf0dfa761 New translations strings.xml (Dutch) 2019-10-10 03:08:35 +02:00
PhilippC
9aaf0ff08d New translations strings.xml (Finnish) 2019-10-10 03:08:35 +02:00
PhilippC
afac7406d7 New translations strings.xml (French) 2019-10-10 03:08:35 +02:00
PhilippC
6ae7c6e7ab New translations strings.xml (Galician) 2019-10-10 03:08:34 +02:00
PhilippC
16e8b01bcc New translations strings.xml (German) 2019-10-10 03:08:34 +02:00
PhilippC
ffd37f3658 New translations strings.xml (Arabic) 2019-10-10 03:08:34 +02:00
PhilippC
f6d18b18b9 New translations strings.xml (Greek) 2019-10-10 03:08:34 +02:00
PhilippC
2061ea8e18 New translations strings.xml (Hungarian)
# Conflicts:
#	src/keepass2android/Resources/values-hu/strings.xml
2019-10-10 03:08:33 +02:00
PhilippC
f9ff03d85d New translations strings.xml (Indonesian) 2019-10-10 03:08:33 +02:00
PhilippC
4b8a8e83d2 New translations strings.xml (Italian) 2019-10-10 03:08:33 +02:00
PhilippC
47466e7322 New translations strings.xml (Japanese) 2019-10-10 03:08:32 +02:00
PhilippC
92be6e1b56 New translations strings.xml (Romanian) 2019-10-10 03:08:32 +02:00
PhilippC
f763840c14 New translations strings.xml (Russian)
# Conflicts:
#	src/keepass2android/Resources/values-ru/strings.xml
2019-10-10 03:08:32 +02:00
PhilippC
09fed92c4f New translations strings.xml (Serbian (Cyrillic)) 2019-10-10 03:08:32 +02:00
PhilippC
0cb4e1db64 New translations strings.xml (Slovak) 2019-10-10 03:08:31 +02:00
PhilippC
66c7afc8db New translations strings.xml (Slovenian) 2019-10-10 03:08:31 +02:00
PhilippC
7482006851 New translations strings.xml (Spanish) 2019-10-10 03:08:31 +02:00
PhilippC
45f17d81e7 New translations strings.xml (Swedish) 2019-10-10 03:08:30 +02:00
PhilippC
dc2e557d2c New translations strings.xml (Turkish)
# Conflicts:
#	src/keepass2android/Resources/values-tr/strings.xml
2019-10-10 03:08:30 +02:00
PhilippC
6d4630e2d9 New translations strings.xml (Chinese Traditional) 2019-10-10 03:08:30 +02:00
PhilippC
fc96bc6b4e New translations strings.xml (Polish) 2019-10-10 03:08:30 +02:00
PhilippC
c13986a88f New translations strings.xml (Persian) 2019-10-10 03:08:29 +02:00
PhilippC
6eb7f15045 New translations strings.xml (Norwegian Bokmal) 2019-10-10 03:08:29 +02:00
PhilippC
61346438eb New translations strings.xml (Korean) 2019-10-10 03:08:29 +02:00
PhilippC
47e520c4b0 New translations strings.xml (Portuguese, Brazilian) 2019-10-10 03:08:28 +02:00
PhilippC
bcdae3d3e7 New translations strings.xml (Ukrainian) 2019-10-10 03:08:28 +02:00
PhilippC
a17aafeabd New translations strings.xml (Chinese Traditional) 2019-10-10 03:08:28 +02:00
PhilippC
286c27f7f8 New translations strings.xml (Ukrainian) 2019-10-10 03:08:28 +02:00
PhilippC
a44d08c352 New translations strings.xml (Polish) 2019-10-10 03:08:27 +02:00
PhilippC
aeb396f000 New translations strings.xml (Polish) 2019-10-10 03:08:27 +02:00
PhilippC
6c8dcbadb4 New translations strings.xml (Polish) 2019-10-10 03:08:27 +02:00
PhilippC
0071502c83 New translations strings.xml (Czech) 2019-10-10 03:08:26 +02:00
PhilippC
eb47e19df7 New translations strings.xml (Czech) 2019-10-10 03:08:26 +02:00
PhilippC
8ff2d10697 New translations strings.xml (Czech) 2019-10-10 03:08:26 +02:00
PhilippC
e1bfb4f7c2 New translations strings.xml (Czech) 2019-10-10 03:08:26 +02:00
PhilippC
8ae699b751 New translations strings.xml (Catalan) 2019-10-10 03:08:25 +02:00
PhilippC
6381d323da New translations strings.xml (Catalan) 2019-10-10 03:08:25 +02:00
PhilippC
8e9ec81591 New translations strings.xml (Turkish) 2019-10-10 03:08:25 +02:00
PhilippC
ad847e0114 New translations strings.xml (Chinese Simplified) 2019-10-10 03:08:24 +02:00
PhilippC
d44dd3e738 New translations strings.xml (Chinese Simplified) 2019-10-10 03:08:24 +02:00
PhilippC
6b6a3db89a New translations strings.xml (Chinese Simplified) 2019-10-10 03:08:24 +02:00
PhilippC
cecdb4e76d New translations strings.xml (Swedish) 2019-10-10 03:08:24 +02:00
PhilippC
c984497454 New translations strings.xml (Swedish) 2019-10-10 03:08:23 +02:00
PhilippC
5a617ad824 New translations strings.xml (Danish) 2019-10-10 03:08:23 +02:00
PhilippC
7f83846937 New translations strings.xml (Chinese Traditional) 2019-10-10 03:08:23 +02:00
PhilippC
19de6e7d52 New translations strings.xml (Portuguese, Brazilian) 2019-10-10 03:08:22 +02:00
Philipp Crocoll
12d2f961cf re-acquire token in OneDrive2FileStorage after expiry, closes https://github.com/PhilippC/keepass2android/issues/983 2019-10-10 03:08:22 +02:00
PhilippC
8fe549fc55 Merge pull request #768 from PhilippC/l10n_master
New Crowdin translations
2019-10-10 02:44:27 +02:00
PhilippC
a99e55e884 New translations strings.xml (Portuguese, Brazilian) 2019-10-10 02:41:12 +02:00
PhilippC
e361f770e8 New translations strings.xml (Portuguese) 2019-10-10 02:41:09 +02:00
PhilippC
a27e13bcb3 New translations strings.xml (French) 2019-10-10 02:34:34 +02:00
PhilippC
03cf25766b New translations strings.xml (Swedish) 2019-10-10 02:33:44 +02:00
PhilippC
9ce42a8e98 New translations strings.xml (Spanish) 2019-10-10 02:33:39 +02:00
PhilippC
c03a5b08fd New translations strings.xml (Portuguese, Brazilian) 2019-10-10 02:33:16 +02:00
PhilippC
9b5853d3f9 New translations strings.xml (Portuguese) 2019-10-10 02:33:11 +02:00
PhilippC
8a3735dc01 New translations strings.xml (German) 2019-10-09 22:30:13 +02:00
PhilippC
aae662ab5e New translations strings.xml (Swedish) 2019-10-09 10:10:14 +02:00
PhilippC
d051f02a43 New translations strings.xml (Swedish) 2019-10-09 10:00:15 +02:00
PhilippC
2e4cf0dfc6 New translations strings.xml (Swedish) 2019-10-09 09:50:09 +02:00
Philipp Crocoll
fc76e2042d remove "pre" from changelog 2019-10-09 02:36:04 +02:00
PhilippC
d7f462d21f New translations strings.xml (Czech) 2019-10-08 21:00:11 +02:00
PhilippC
2b61598c21 New translations strings.xml (Czech) 2019-10-08 20:50:12 +02:00
Philipp Crocoll
799dc3a38f switch to FluentFTP to close #825 2019-10-08 07:11:34 +02:00
PhilippC
9c76dce17d New translations strings.xml (Polish) 2019-10-07 21:50:13 +02:00
PhilippC
28ac79bbe5 New translations strings.xml (Catalan) 2019-10-07 21:50:08 +02:00
PhilippC
bdf825a2b5 New translations strings.xml (Catalan) 2019-10-07 21:40:09 +02:00
PhilippC
37d03a2735 New translations strings.xml (Catalan) 2019-10-07 21:20:08 +02:00
PhilippC
e8fde4ad0a New translations strings.xml (Dutch) 2019-10-07 20:50:08 +02:00
PhilippC
1aa29a82fb New translations strings.xml (Ukrainian) 2019-10-07 18:10:09 +02:00
PhilippC
60f292a5a7 New translations strings.xml (German) 2019-10-07 17:30:10 +02:00
PhilippC
1f956ab1db New translations strings.xml (German) 2019-10-07 17:20:12 +02:00
PhilippC
df39fa5545 New translations strings.xml (Russian) 2019-10-07 17:00:12 +02:00
PhilippC
dd0800f543 New translations strings.xml (Chinese Traditional) 2019-10-07 16:50:14 +02:00
PhilippC
8b3c6eb1ff New translations strings.xml (Danish) 2019-10-07 16:30:13 +02:00
PhilippC
88b35c0051 New translations strings.xml (Danish) 2019-10-07 15:00:10 +02:00
PhilippC
2f83169ddd New translations strings.xml (Italian) 2019-10-07 13:50:08 +02:00
PhilippC
ce4b301f5c New translations strings.xml (Italian) 2019-10-07 13:40:13 +02:00
PhilippC
433f46b8f1 New translations strings.xml (Danish) 2019-10-07 13:40:10 +02:00
PhilippC
03eb52dc14 New translations strings.xml (Japanese) 2019-10-07 13:30:19 +02:00
PhilippC
9d785679c5 New translations strings.xml (Danish) 2019-10-07 13:30:14 +02:00
PhilippC
699a4f96b0 New translations strings.xml (Chinese Traditional) 2019-10-07 13:30:09 +02:00
PhilippC
afd6f0f4d6 New translations strings.xml (Dutch) 2019-10-07 12:40:15 +02:00
PhilippC
eaadc45fce New translations strings.xml (Chinese Traditional) 2019-10-07 12:40:13 +02:00
PhilippC
e9852a6d98 New translations strings.xml (Spanish) 2019-10-07 12:30:17 +02:00
PhilippC
e1b3e769d8 New translations strings.xml (Slovenian) 2019-10-07 12:30:12 +02:00
PhilippC
501535a9a4 New translations strings.xml (Spanish) 2019-10-07 12:20:10 +02:00
PhilippC
fb8608e467 New translations strings.xml (Slovak) 2019-10-07 12:10:29 +02:00
PhilippC
e9eb8c250a New translations strings.xml (Italian) 2019-10-07 12:10:22 +02:00
PhilippC
eaa5a9d375 New translations strings.xml (French) 2019-10-07 12:10:15 +02:00
PhilippC
d28834591a New translations strings.xml (Danish) 2019-10-07 12:02:12 +02:00
PhilippC
49aa0a20cd New translations strings.xml (Slovak) 2019-10-07 12:01:17 +02:00
PhilippC
8d611bd6c6 New translations strings.xml (Portuguese, Brazilian) 2019-10-07 12:01:01 +02:00
PhilippC
bfe8650ec9 New translations strings.xml (Portuguese) 2019-10-07 12:00:56 +02:00
PhilippC
fd52a5f388 New translations strings.xml (Spanish) 2019-10-07 11:40:13 +02:00
PhilippC
6b8c5ea1fb New translations strings.xml (Japanese) 2019-10-07 11:40:09 +02:00
PhilippC
8347feceff New translations strings.xml (Japanese) 2019-10-07 11:30:10 +02:00
PhilippC
626b7fc6b3 New translations strings.xml (Spanish) 2019-10-07 11:20:08 +02:00
Philipp Crocoll
1701c9142b allow to activate search field also after QuickUnlock, not only full unlock. Closes #858 2019-10-07 11:19:34 +02:00
Philipp Crocoll
245794ed53 add Copy TOTP notification, closes #110 2019-10-07 11:18:48 +02:00
PhilippC
24aba30fa8 New translations strings.xml (French) 2019-10-07 10:30:10 +02:00
Philipp Crocoll
6338472e73 order group list with culture-aware sorting, closes #922 2019-10-07 10:30:08 +02:00
Philipp Crocoll
580b46a394 detect if FLAG_SECURE cannot be set and display an explanation, combined with a button to access the app settings to disable screen protection if desired. closes #272. 2019-10-07 10:29:54 +02:00
PhilippC
ea1a34353c New translations strings.xml (Spanish) 2019-10-07 09:50:08 +02:00
PhilippC
f9790e0e3e New translations strings.xml (Chinese Traditional) 2019-10-07 09:30:14 +02:00
PhilippC
540c4a72a2 New translations strings.xml (Chinese Traditional) 2019-10-07 09:20:10 +02:00
PhilippC
bc905304e7 New translations strings.xml (Chinese Traditional) 2019-10-07 09:10:08 +02:00
PhilippC
ad04309f9d New translations strings.xml (Slovenian) 2019-10-07 07:20:07 +02:00
Philipp Crocoll
684ffb8525 show toast in correct thread, closes #371 2019-10-07 07:13:59 +02:00
Philipp Crocoll
049764fe67 don't save files in a file version lower than what was read, closes #791 2019-10-07 02:30:38 +02:00
Philipp Crocoll
a048c45b32 improve clearing of clipboard, closes #936 2019-10-07 02:29:00 +02:00
PhilippC
60c78642b1 New translations strings.xml (Danish) 2019-10-07 00:10:09 +02:00
PhilippC
5c7f551922 New translations strings.xml (German) 2019-10-07 00:00:15 +02:00
PhilippC
ceac7841a0 New translations strings.xml (Danish) 2019-10-07 00:00:11 +02:00
PhilippC
a29fc9d3cc New translations strings.xml (Danish) 2019-10-06 23:50:10 +02:00
PhilippC
f5dbc85450 New translations strings.xml (Polish) 2019-10-06 22:50:10 +02:00
PhilippC
6a86a6906c New translations strings.xml (Italian) 2019-10-06 22:40:12 +02:00
PhilippC
2b4bd1a79d New translations strings.xml (Czech) 2019-10-06 22:40:08 +02:00
PhilippC
2b2ce4eb29 New translations strings.xml (French) 2019-10-06 22:20:10 +02:00
PhilippC
6ac875aeb5 New translations strings.xml (Portuguese, Brazilian) 2019-10-06 22:10:24 +02:00
PhilippC
f43c6d3899 New translations strings.xml (Turkish) 2019-10-06 22:00:26 +02:00
PhilippC
3f240868d0 New translations strings.xml (Italian) 2019-10-06 22:00:22 +02:00
PhilippC
5ccea973ee New translations strings.xml (Portuguese) 2019-10-06 21:51:33 +02:00
PhilippC
c1d59d9203 New translations strings.xml (Dutch) 2019-10-06 21:50:33 +02:00
Philipp Crocoll
c6d3eb7131 Merge branch 'master' of https://github.com/PhilippC/keepass2android 2019-10-06 21:48:35 +02:00
Philipp Crocoll
f462bbe98b remove "pre" from changelog 2019-10-06 21:48:10 +02:00
PhilippC
c6be5fcf84 New translations strings.xml (Hungarian) 2019-10-06 21:40:10 +02:00
PhilippC
023d9e194f New translations strings.xml (Turkish) 2019-10-06 21:30:10 +02:00
PhilippC
78ad964481 New translations strings.xml (Dutch) 2019-10-06 21:20:08 +02:00
PhilippC
9c9a8277a9 New translations strings.xml (Dutch) 2019-10-06 21:10:13 +02:00
PhilippC
3f414ded5b New translations strings.xml (Czech) 2019-10-06 21:10:11 +02:00
PhilippC
5906824ffc New translations strings.xml (German) 2019-10-06 21:00:09 +02:00
PhilippC
737c87bdf8 New translations strings.xml (Vietnamese) 2019-10-06 20:53:11 +02:00
PhilippC
bb27734a07 New translations strings.xml (Hungarian) 2019-10-06 20:53:07 +02:00
PhilippC
a9e6880add New translations strings.xml (Greek) 2019-10-06 20:52:57 +02:00
PhilippC
a1c3bf19ae New translations strings.xml (German) 2019-10-06 20:52:53 +02:00
PhilippC
0dc86e8662 New translations strings.xml (Galician) 2019-10-06 20:52:50 +02:00
PhilippC
bddc731390 New translations strings.xml (French) 2019-10-06 20:52:46 +02:00
PhilippC
2521aa2621 New translations strings.xml (Finnish) 2019-10-06 20:52:42 +02:00
PhilippC
23af6f3031 New translations strings.xml (Indonesian) 2019-10-06 20:52:39 +02:00
PhilippC
89ac5af115 New translations strings.xml (Dutch) 2019-10-06 20:52:36 +02:00
PhilippC
1f1ac04640 New translations strings.xml (Czech) 2019-10-06 20:52:32 +02:00
PhilippC
67d2eeaaff New translations strings.xml (Croatian) 2019-10-06 20:52:28 +02:00
PhilippC
0788af941e New translations strings.xml (Chinese Traditional) 2019-10-06 20:52:24 +02:00
PhilippC
484cea229c New translations strings.xml (Chinese Simplified) 2019-10-06 20:52:22 +02:00
PhilippC
827a680f81 New translations strings.xml (Catalan) 2019-10-06 20:52:20 +02:00
PhilippC
8b5c170409 New translations strings.xml (Bulgarian) 2019-10-06 20:52:16 +02:00
PhilippC
9ec76c2738 New translations strings.xml (Basque) 2019-10-06 20:52:11 +02:00
PhilippC
ea9539ad0a New translations strings.xml (Danish) 2019-10-06 20:52:06 +02:00
PhilippC
03f4040c09 New translations strings.xml (Italian) 2019-10-06 20:51:58 +02:00
PhilippC
869f5d35bd New translations strings.xml (Korean) 2019-10-06 20:51:54 +02:00
PhilippC
01ac1c601f New translations strings.xml (Ukrainian) 2019-10-06 20:51:50 +02:00
PhilippC
22f3f5ce59 New translations strings.xml (Turkish) 2019-10-06 20:51:47 +02:00
PhilippC
0b430c90f4 New translations strings.xml (Swedish) 2019-10-06 20:51:41 +02:00
PhilippC
080483b2d0 New translations strings.xml (Spanish) 2019-10-06 20:51:35 +02:00
PhilippC
2da645f25b New translations strings.xml (Slovenian) 2019-10-06 20:51:32 +02:00
PhilippC
3ff6c35e35 New translations strings.xml (Slovak) 2019-10-06 20:51:30 +02:00
PhilippC
5f3fb52833 New translations strings.xml (Japanese) 2019-10-06 20:51:23 +02:00
PhilippC
6117053dd7 New translations strings.xml (Russian) 2019-10-06 20:51:18 +02:00
PhilippC
c3a1faffca New translations strings.xml (Portuguese, Brazilian) 2019-10-06 20:51:12 +02:00
PhilippC
5d85fdda46 New translations strings.xml (Portuguese) 2019-10-06 20:51:10 +02:00
PhilippC
907705b657 New translations strings.xml (Polish) 2019-10-06 20:51:04 +02:00
PhilippC
22e460d7bf New translations strings.xml (Persian) 2019-10-06 20:51:00 +02:00
PhilippC
3a81ebfcd9 New translations strings.xml (Norwegian Bokmal) 2019-10-06 20:50:52 +02:00
PhilippC
ec92225e50 New translations strings.xml (Romanian) 2019-10-06 20:50:49 +02:00
PhilippC
5163d472b3 New translations strings.xml (Arabic) 2019-10-06 20:50:46 +02:00
Philipp Crocoll
069a2d287c catch bad paths passed to search activity. closes #801. 2019-10-06 20:36:37 +02:00
Philipp Crocoll
01b8469fbb fix crash when copying entries, closes #920 2019-10-06 20:25:25 +02:00
PhilippC
421a590514 Update Documentation.md 2019-10-06 07:53:37 +02:00
Philipp Crocoll
a0a494e724 fix bug in BinaryDictionary.java which lead to crashes with dictionary using on 64bit devices; enable multi-dex and increase heap size also for Release build 2019-10-04 20:10:58 +02:00
Philipp Crocoll
3f6f0b7430 Merge branch 'master' of c:/ph/keepass2android 2019-10-03 17:19:35 +02:00
Philipp Crocoll
b8d161ffee add sha sources to repo 2019-10-03 17:18:11 +02:00
Philipp Crocoll
e27ff98517 remove Java implementation of OneDriveStorage2 2019-10-03 17:02:34 +02:00
Philipp Crocoll
4c2c6bbb54 Merge branch 'master' of c:/ph/keepass2android
# Resolved Conflicts:
#	src/keepass2android/proguard.cfg
2019-10-03 16:58:33 +02:00
Philipp Crocoll
5de92719f8 keep keyboard native methods in proguard 2019-10-03 16:57:07 +02:00
Philipp Crocoll
34b9d71cbf prepare for preview release 2019-10-03 16:54:35 +02:00
Philipp Crocoll
57e9253270 improvements to OneDrive2 implementation: it's now possible select between different access scopes, also fixed several issues 2019-10-03 16:42:50 +02:00
Philipp Crocoll
99d0ecfd59 refactoring, use less UrlUtil and more IFileStorage 2019-10-01 20:04:03 +02:00
Philipp Crocoll
706debfa33 add missing file OneDrive2FileStorage (with improvements) 2019-09-30 21:18:40 +02:00
Philipp Crocoll
db26fb6f39 first version of OneDrive implementation in C# 2019-09-30 10:42:27 +02:00
Philipp Crocoll
57e36fb728 subrepo update 2019-09-25 19:28:13 +02:00
Philipp Crocoll
7c49eeca97 update SamsungPass 2019-09-25 19:25:00 +02:00
Philipp Crocoll
8d065255d6 update dropbox sdk and gson jars, upgrade to TargetFramework Android 9 2019-09-25 19:17:08 +02:00
Philipp Crocoll
a630543ecc Merge branch 'master' of https://github.com/PhilippC/keepass2android 2019-09-23 11:52:38 +02:00
Philipp Crocoll
989e397ee2 Integrate 64-bit native libraries (required by Google Play)
Therefore change the way Keyboard and KdbLibrary are built and add (updated) native files for Keyboard.
2019-09-23 11:52:24 +02:00
Philipp Crocoll
f99843737f implement java side of OneDriveStorage2 2019-09-10 05:26:38 +02:00
PhilippC
5197111a3a Merge pull request #949 from ihanson/patch-1
Fix “CHANGE DATABAS” button bug
2019-09-10 05:04:28 +02:00
Ira Hanson
d12339bb50 Correctly strip ellipsis
Fix bug where button caption is “CHANGE DATABAS”
2019-09-09 19:45:52 -05:00
PhilippC
e166e9f754 Update Documentation.md 2019-09-03 11:43:28 +02:00
PhilippC
1d5bca81da Update Documentation.md 2019-09-03 11:36:33 +02:00
Philipp Crocoll
56891d6183 add contributor names 2019-08-21 05:02:37 +02:00
Philipp Crocoll
d0f1882995 manifest for release 1.07b-pre1 2019-08-20 06:09:54 +02:00
Philipp Crocoll
b1b67807ac added ChangeLog for 1.07b, updated contributors 2019-08-20 06:05:50 +02:00
Philipp Crocoll
265c67c91c change SamsungPass back to https://github.com/PhilippC/Xamarin-Samsung-Pass.git, merged changes for Linux from gilbsgilbs 2019-08-20 06:05:21 +02:00
Philipp Crocoll
7c55c50b4c explicity use 8.0 as target version to fix compile error. (Note: I could also upgrade everything to 8.1 to fix the compile error, but that would require extensive testing; updating target version can come with subtle changes in how the app behaves at many places) 2019-08-20 05:46:53 +02:00
Philipp Crocoll
a42b74b614 add Fennec_fdroid and Bromite to list of browsers for Autofill 2019-08-20 05:10:53 +02:00
Philipp Crocoll
262b931a1e Merge branch 'master' of c:/ph/keepass2android 2019-08-19 14:47:53 +02:00
Philipp Crocoll
3f1db5aa56 changes for 1.07-r1 (not commited correctly) 2019-08-19 14:47:46 +02:00
Philipp Crocoll
95ce6878e6 avoid exception for invalid input of getDisplayName, fixes #771 2019-08-19 14:36:33 +02:00
Philipp Crocoll
9f6fea7038 improve error message to diagnose #801 2019-08-19 14:33:44 +02:00
Philipp Crocoll
28eaa2ee7f Merge branch 'master' of https://github.com/PhilippC/keepass2android 2019-08-19 14:32:43 +02:00
Philipp Crocoll
c35cf56d8a fix entry notification being closed immediately after opening when there are TOTP fields in the entry (closes #799) 2019-08-19 14:32:29 +02:00
PhilippC
0526c58913 Update Documentation.md 2019-08-19 12:53:38 +02:00
Philipp Crocoll
1f20c18ad6 fix creation of IfDevice string, closes #888 2019-08-19 12:10:27 +02:00
Philipp Crocoll
4b56eca5e2 add mark.via.gp browser, closes #885 2019-08-19 11:47:42 +02:00
Philipp Crocoll
d14702494e Merge branch 'marcoDallas-fingerprint-improvement-#831' 2019-08-17 23:06:07 +02:00
Philipp Crocoll
f2bda0f2d1 Merge branch 'fingerprint-improvement-#831' of https://github.com/marcoDallas/keepass2android into marcoDallas-fingerprint-improvement-#831 2019-08-17 19:56:01 +02:00
Marco Dalla Libera
5f90628d2d Improved code by using a single call to setPositiveButton.
The positive button is always the same so there's no need to use two different
calls, I just brought one outside the if statement. It was an artifact left
from a previous test where I was changing both of the buttons.
2019-08-15 14:45:24 +02:00
Marco Dalla Libera
409c3eec55 Added underscreen fingerprint improvement to QuickUnlockActivity. 2019-08-15 10:44:03 +02:00
Philipp Crocoll
2a7ea24d17 Merge branch 'master' of https://github.com/PhilippC/keepass2android 2019-08-15 06:53:09 +02:00
PhilippC
f81a398f4b Merge pull request #886 from DDoSolitary/patch-password-cursor
Restore cursor position after switching password visibility.
2019-08-15 06:52:56 +02:00
Philipp Crocoll
7a94f83019 fix compile errors 2019-08-15 06:51:27 +02:00
Philipp Crocoll
134234da12 Merge branch 'patch-password-cursor' of https://github.com/DDoSolitary/keepass2android 2019-08-15 05:48:53 +02:00
Philipp Crocoll
7354c8933c Merge branch 'master' of https://github.com/PhilippC/keepass2android 2019-08-15 05:46:23 +02:00
Philipp Crocoll
0565a83085 update Dropbox SDK version to fix https://github.com/PhilippC/keepass2android/issues/793 2019-08-15 05:45:40 +02:00
PhilippC
eab79eaac2 Merge pull request #905 from marcoDallas/improvement/linux-build-scripts
Improved Android SDK detection in Linux build scripts
2019-08-15 05:42:55 +02:00
PhilippC
1007f7ee6b Merge pull request #906 from marcoDallas/improvement/linux-build-instructions
Added a different path to libzip5 in Linux build instructions
2019-08-15 05:41:40 +02:00
Marco Dalla Libera
ce008843e2 Added a different path to libzip5
In my system (OpenSUSE Tumbleweed 20190806 64bit) its path was
"/usr/lib64/libzip.so.5".
2019-08-12 16:53:54 +02:00
Marco Dalla Libera
ea5ae50813 Improved Android SDK detection
If ANDROID_HOME environment variable is set, add parameter
"/p:AndroidSdkDirectory=$ANDROID_HOME" to improve the Android SDK detection.
2019-08-12 16:37:11 +02:00
Marco Dalla Libera
0970f0659a Fixed wrong indentation in files. 2019-08-12 15:31:45 +02:00
Marco Dalla Libera
ef2123422c IMPROVED UNDERSCREEN FINGERPRINT, ISSUE #831
Improved underscreen fingerprint as request in issue #831 by giving the users
the ability to disable the sensor in the PasswordActivity. Now pressing the
fingerprint icon opens up a dialog that has the option to enable/disable the
sensor.
I added two new strings to the resources (enable sensor - disable sensor) and
already translated them to italian.
2019-08-12 15:09:13 +02:00
PhilippC
6d82642176 Merge pull request #896 from jonalmeida/moz-browser-whitelist
Add support for Fenix Nightly and Reference Browser
2019-08-09 03:46:35 +02:00
Jonathan Almeida
f9c22574a7 Add support for Fenix Nightly and Reference Browser 2019-08-08 19:56:06 -04:00
PhilippC
3fde6af2a2 Merge pull request #892 from PhilippC/Branch_b0f6103
1.07-r1
2019-08-05 07:25:51 +02:00
Philipp Crocoll
5322468819 Merge branch 'Branch_b0f6103' 2019-08-05 07:21:53 +02:00
Philipp Crocoll
e50cb41d1f Merge branch 'master' of https://github.com/PhilippC/keepass2android 2019-08-05 06:36:56 +02:00
Philipp Crocoll
428c360abf avoid potential NullReferenceException 2019-08-05 06:36:40 +02:00
DDoSolitary
b89f3906e9 Restore cursor position after switching password visibility. 2019-07-27 13:22:42 +08:00
PhilippC
c3898245ce New translations strings.xml (French) 2019-07-22 17:30:13 +02:00
PhilippC
f15748b4e9 New translations strings.xml (Chinese Traditional) 2019-07-22 14:00:18 +02:00
PhilippC
d11c871526 New translations strings.xml (French) 2019-07-22 13:00:11 +02:00
PhilippC
6944d842c3 New translations strings.xml (Turkish) 2019-07-22 11:40:15 +02:00
PhilippC
183087b441 New translations strings.xml (Italian) 2019-07-22 11:30:13 +02:00
PhilippC
5e081805f1 New translations strings.xml (Spanish) 2019-07-22 11:10:22 +02:00
PhilippC
e1addd1485 New translations strings.xml (Japanese) 2019-07-22 11:10:14 +02:00
PhilippC
801f13c2d3 New translations strings.xml (Chinese Traditional) 2019-07-22 10:50:11 +02:00
PhilippC
6dcb22dfc2 New translations strings.xml (Portuguese) 2019-07-22 09:50:30 +02:00
PhilippC
e5dbd86eb3 Merge pull request #835 from PhilippC/pcloud-help-dialog
PCloud improvements
2019-07-22 09:46:54 +02:00
PhilippC
1706891be4 Merge pull request #836 from PhilippC/fix-linux-build
Fix invalid namespace in manifests causing build failure on Linux.
2019-07-22 09:45:07 +02:00
PhilippC
11323c0206 Merge pull request #855 from caesar/patch-1
Add support for autofill in Firefox Preview/Fenix
2019-07-22 09:44:15 +02:00
PhilippC
c36d252159 Merge pull request #872 from yan12125/argon2-performance
Improve Argon2 performance
2019-07-22 09:39:50 +02:00
Chih-Hsuan Yen
7d1eeb1e34 Use native Argon2 implementation 2019-07-16 21:07:26 +08:00
Chih-Hsuan Yen
e081a6aa2c Build fixes 2019-07-16 21:07:26 +08:00
PhilippC
014f238f6c New translations strings.xml (Dutch) 2019-07-03 10:30:13 +02:00
PhilippC
9482b37672 New translations strings.xml (Dutch) 2019-07-03 10:20:13 +02:00
PhilippC
69c5601de4 New translations strings.xml (Dutch) 2019-07-03 10:10:13 +02:00
Caesar Schinas
96c717f748 Add support for autofill in Firefox Preview/Fenix
Also tidy / reorganize `_trustedBrowsers` list somewhat.

Fixes #758.
2019-07-01 11:39:50 +01:00
PhilippC
856ba36a20 New translations strings.xml (Norwegian Bokmal) 2019-06-27 23:10:10 +02:00
PhilippC
396cf51794 New translations strings.xml (Dutch) 2019-06-26 13:30:10 +02:00
PhilippC
8138790396 New translations strings.xml (Dutch) 2019-06-26 13:20:10 +02:00
PhilippC
e698468c39 New translations strings.xml (Dutch) 2019-06-26 13:10:12 +02:00
PhilippC
da005a35bf New translations strings.xml (Polish) 2019-06-21 02:40:11 +02:00
PhilippC
9b62f28e93 New translations strings.xml (Polish) 2019-06-21 02:30:13 +02:00
PhilippC
5adc738c03 New translations strings.xml (Korean) 2019-06-18 10:10:14 +02:00
PhilippC
d784394ea9 New translations strings.xml (Swedish) 2019-06-02 18:00:11 +02:00
PhilippC
b1cbb7893c New translations strings.xml (Swedish) 2019-06-02 17:50:09 +02:00
PhilippC
51b2049429 New translations strings.xml (Swedish) 2019-06-02 17:40:09 +02:00
PhilippC
84c8af7357 New translations strings.xml (Swedish) 2019-06-02 17:30:10 +02:00
PhilippC
69cbda8a39 New translations strings.xml (Swedish) 2019-06-02 17:20:09 +02:00
PhilippC
48f351ba0d New translations strings.xml (Swedish) 2019-06-02 17:10:11 +02:00
PhilippC
0a7fac77ff New translations strings.xml (Vietnamese) 2019-05-26 13:32:22 +02:00
PhilippC
ff336b40ae New translations strings.xml (Basque) 2019-05-26 13:32:16 +02:00
PhilippC
86a8da3ef3 New translations strings.xml (Bulgarian) 2019-05-26 13:32:12 +02:00
PhilippC
a72b681205 New translations strings.xml (Catalan) 2019-05-26 13:32:07 +02:00
PhilippC
3c75a4a012 New translations strings.xml (Chinese Simplified) 2019-05-26 13:32:01 +02:00
PhilippC
f9fc4b9a06 New translations strings.xml (Croatian) 2019-05-26 13:31:56 +02:00
PhilippC
6869f940ac New translations strings.xml (Czech) 2019-05-26 13:31:52 +02:00
PhilippC
79f0f90f3e New translations strings.xml (Danish) 2019-05-26 13:31:47 +02:00
PhilippC
1119610a10 New translations strings.xml (Dutch) 2019-05-26 13:31:42 +02:00
PhilippC
90fe3f04c0 New translations strings.xml (Finnish) 2019-05-26 13:31:37 +02:00
PhilippC
aca0aef285 New translations strings.xml (French) 2019-05-26 13:31:32 +02:00
PhilippC
8134b73902 New translations strings.xml (Galician) 2019-05-26 13:31:28 +02:00
PhilippC
57414cd0b8 New translations strings.xml (German) 2019-05-26 13:31:23 +02:00
PhilippC
6792eb53f0 New translations strings.xml (Arabic) 2019-05-26 13:31:19 +02:00
PhilippC
a6d4814980 New translations strings.xml (Greek) 2019-05-26 13:31:15 +02:00
PhilippC
3ef0afa6bc New translations strings.xml (Hungarian) 2019-05-26 13:31:10 +02:00
PhilippC
942be17e61 New translations strings.xml (Indonesian) 2019-05-26 13:31:06 +02:00
PhilippC
37e8f14e3b New translations strings.xml (Italian) 2019-05-26 13:31:00 +02:00
PhilippC
64ca771c51 New translations strings.xml (Japanese) 2019-05-26 13:30:54 +02:00
PhilippC
df2c2cd827 New translations strings.xml (Romanian) 2019-05-26 13:30:50 +02:00
PhilippC
4b692e4697 New translations strings.xml (Russian) 2019-05-26 13:30:45 +02:00
PhilippC
a0fa5ff4c2 New translations strings.xml (Serbian (Cyrillic)) 2019-05-26 13:30:42 +02:00
PhilippC
32df0ae8fe New translations strings.xml (Slovak) 2019-05-26 13:30:36 +02:00
PhilippC
73b9bcac7a New translations strings.xml (Slovenian) 2019-05-26 13:30:31 +02:00
PhilippC
11f606631c New translations strings.xml (Spanish) 2019-05-26 13:30:28 +02:00
PhilippC
9f696441e3 New translations strings.xml (Swedish) 2019-05-26 13:30:23 +02:00
PhilippC
118d18613f New translations strings.xml (Turkish) 2019-05-26 13:30:19 +02:00
PhilippC
a39bc9b7f7 New translations strings.xml (Chinese Traditional) 2019-05-26 13:30:12 +02:00
PhilippC
e0e17359c9 New translations strings.xml (Polish) 2019-05-25 21:50:41 +02:00
PhilippC
5ab25b0bc8 New translations strings.xml (Persian) 2019-05-25 21:50:37 +02:00
PhilippC
686e7eb6c1 New translations strings.xml (Norwegian Bokmal) 2019-05-25 21:50:29 +02:00
PhilippC
c3ba8662b9 New translations strings.xml (Korean) 2019-05-25 21:50:25 +02:00
PhilippC
b7e23fd046 New translations strings.xml (Portuguese, Brazilian) 2019-05-25 21:50:20 +02:00
PhilippC
9ff89ba263 New translations strings.xml (Ukrainian) 2019-05-25 21:50:16 +02:00
Gilbert Gilb's
c84f85444a Fix invalid manifest namespace causing build failures on Linux. 2019-05-25 21:49:04 +02:00
Gilbert Gilb's
37c10e7b48 Show a dialog after picking PCloud file storage.
Not seeing any file was confusing to users.

See https://github.com/PhilippC/keepass2android/issues/794
See https://github.com/PhilippC/keepass2android/issues/796
2019-05-25 21:44:48 +02:00
Gilbert Gilb's
02b8292a2e Use new option to overwrite file in PCloud file storage. 2019-05-25 21:36:39 +02:00
Gilbert Gilb's
2d1909c227 Update PCloud SDK to 1.1.0. 2019-05-25 21:35:54 +02:00
PhilippC
f470606af0 New translations strings.xml (Vietnamese) 2019-05-21 15:43:03 +02:00
PhilippC
4a7b3f17c2 New translations strings.xml (Basque) 2019-05-21 15:42:54 +02:00
PhilippC
788df21115 New translations strings.xml (Bulgarian) 2019-05-21 15:42:48 +02:00
PhilippC
2aaaa8b416 New translations strings.xml (Catalan) 2019-05-21 15:42:43 +02:00
PhilippC
2660084401 New translations strings.xml (Chinese Simplified) 2019-05-21 15:42:37 +02:00
PhilippC
e0dfb888c1 New translations strings.xml (Croatian) 2019-05-21 15:42:31 +02:00
PhilippC
ab66b5585d New translations strings.xml (Czech) 2019-05-21 15:42:25 +02:00
PhilippC
bf8b9f32df New translations strings.xml (Danish) 2019-05-21 15:42:20 +02:00
PhilippC
d259143736 New translations strings.xml (Dutch) 2019-05-21 15:42:15 +02:00
PhilippC
83dc82a308 New translations strings.xml (Finnish) 2019-05-21 15:42:09 +02:00
PhilippC
233f4bb04f New translations strings.xml (French) 2019-05-21 15:42:04 +02:00
PhilippC
8183d17706 New translations strings.xml (Galician) 2019-05-21 15:41:57 +02:00
PhilippC
feedcae410 New translations strings.xml (German) 2019-05-21 15:41:52 +02:00
PhilippC
3157ea741e New translations strings.xml (Arabic) 2019-05-21 15:41:47 +02:00
PhilippC
623040bf3e New translations strings.xml (Greek) 2019-05-21 15:41:40 +02:00
PhilippC
6a394f697a New translations strings.xml (Hungarian) 2019-05-21 15:41:34 +02:00
PhilippC
3908f4b5ce New translations strings.xml (Indonesian) 2019-05-21 15:41:29 +02:00
PhilippC
ad21ee1e64 New translations strings.xml (Italian) 2019-05-21 15:41:21 +02:00
PhilippC
6c69796248 New translations strings.xml (Japanese) 2019-05-21 15:41:16 +02:00
PhilippC
e6f79562dc New translations strings.xml (Romanian) 2019-05-21 15:41:10 +02:00
PhilippC
5e9c655672 New translations strings.xml (Russian) 2019-05-21 15:41:06 +02:00
PhilippC
6b01100ca4 New translations strings.xml (Serbian (Cyrillic)) 2019-05-21 15:41:01 +02:00
PhilippC
838382ea0a New translations strings.xml (Slovak) 2019-05-21 15:40:55 +02:00
PhilippC
3c62c22f3a New translations strings.xml (Slovenian) 2019-05-21 15:40:50 +02:00
PhilippC
bc1197b4a0 New translations strings.xml (Spanish) 2019-05-21 15:40:44 +02:00
PhilippC
d691570099 New translations strings.xml (Swedish) 2019-05-21 15:40:35 +02:00
PhilippC
772d55fa45 New translations strings.xml (Turkish) 2019-05-21 15:40:29 +02:00
PhilippC
676072e96b New translations strings.xml (Chinese Traditional) 2019-05-21 15:40:17 +02:00
PhilippC
29dec2d9f7 New translations strings.xml (Polish) 2019-05-21 11:50:55 +02:00
PhilippC
b1d6099e2c New translations strings.xml (Persian) 2019-05-21 11:50:51 +02:00
PhilippC
e5cbf010a3 New translations strings.xml (Norwegian Bokmal) 2019-05-21 11:50:41 +02:00
PhilippC
023364f968 New translations strings.xml (Korean) 2019-05-21 11:50:34 +02:00
PhilippC
26fe7f610d New translations strings.xml (Portuguese, Brazilian) 2019-05-21 11:50:29 +02:00
PhilippC
37d6e54e70 New translations strings.xml (Ukrainian) 2019-05-21 11:50:23 +02:00
PhilippC
adc4c59a99 New translations strings.xml (Chinese Traditional) 2019-05-17 05:20:11 +02:00
PhilippC
16fd528e95 New translations strings.xml (Ukrainian) 2019-05-07 13:30:13 +02:00
PhilippC
efdfdac6cb New translations strings.xml (Polish) 2019-05-05 02:40:09 +02:00
PhilippC
03ebe6b176 New translations strings.xml (Polish) 2019-05-05 02:30:11 +02:00
Philipp Crocoll
730019b420 Merge branch 'master' of c:/ph/keepass2android 2019-04-10 06:01:42 +02:00
PhilippC
477c36d880 New translations strings.xml (Polish) 2019-04-10 01:00:11 +02:00
PhilippC
d4a99ce9b2 New translations strings.xml (Czech) 2019-04-07 15:30:10 +02:00
PhilippC
025c5fe301 New translations strings.xml (Czech) 2019-04-07 15:20:09 +02:00
PhilippC
422f5deafb New translations strings.xml (Czech) 2019-04-07 15:10:09 +02:00
PhilippC
00b5473a7a New translations strings.xml (Czech) 2019-04-07 15:00:09 +02:00
PhilippC
945264d927 New translations strings.xml (Catalan) 2019-04-07 10:50:11 +02:00
PhilippC
74848cd015 New translations strings.xml (Catalan) 2019-04-07 10:40:09 +02:00
PhilippC
c583e3238a New translations strings.xml (Turkish) 2019-04-06 12:20:09 +02:00
PhilippC
0cc7abf322 New translations strings.xml (Chinese Simplified) 2019-04-06 10:20:12 +02:00
PhilippC
8f3b9c532c New translations strings.xml (Chinese Simplified) 2019-04-06 10:10:10 +02:00
PhilippC
4ce35de276 New translations strings.xml (Chinese Simplified) 2019-04-06 10:00:10 +02:00
PhilippC
7c05aa625f New translations strings.xml (Swedish) 2019-04-05 11:20:11 +02:00
PhilippC
139ac0b269 New translations strings.xml (Swedish) 2019-04-05 11:10:12 +02:00
PhilippC
8ba35083d8 New translations strings.xml (Danish) 2019-04-04 01:10:11 +02:00
PhilippC
02003abf1d New translations strings.xml (Chinese Traditional) 2019-04-01 16:12:30 +02:00
PhilippC
88ce729351 New translations strings.xml (Portuguese, Brazilian) 2019-04-01 16:11:53 +02:00
Philipp Crocoll
dcac392e43 Merge branch 'master' of https://github.com/PhilippC/keepass2android 2019-04-01 10:44:31 +02:00
PhilippC
87cfa4c4d4 Merge pull request #766 from PhilippC/l10n_master
New Crowdin translations
2019-04-01 10:44:12 +02:00
PhilippC
58ec829d1a New translations strings.xml (Portuguese) 2019-04-01 10:39:46 +02:00
PhilippC
90fd2daa01 New translations strings.xml (Danish) 2019-04-01 10:39:05 +02:00
Philipp Crocoll
b2b29c692e 1.07-pre9 2019-03-25 10:30:06 +01:00
536 changed files with 18241 additions and 5296 deletions

10
.gitignore vendored
View File

@@ -160,3 +160,13 @@ src/java/Keepass2AndroidPluginSDK2/build/generated/mockable-Google-Inc.-Google-A
/src/.vs
/src/JavaFileStorageBindings/Jars/JavaFileStorage-release.aar
/src/PluginSdkBinding/Jars/app-debug.aar
/src/java/KP2AKdbLibrary/libs/arm64-v8a/libfinal-key.so
/src/java/KP2AKdbLibrary/libs/x86_64/libfinal-key.so
/src/java/KP2ASoftkeyboard_AS/app/src/main/libs/arm64-v8a/libkp2akeyboard_jni.so
/src/java/KP2ASoftkeyboard_AS/app/src/main/libs/armeabi-v7a/libkp2akeyboard_jni.so
/src/java/KP2ASoftkeyboard_AS/app/src/main/libs/x86/libkp2akeyboard_jni.so
/src/java/KP2ASoftkeyboard_AS/app/src/main/libs/x86_64/libkp2akeyboard_jni.so
/src/java/KP2AKdbLibrary/app/build
/src/java/KP2ASoftkeyboard_AS/app/.cxx
/src/java/KP2ASoftkeyboard_AS/app/src/main/libs
/src/java/KP2AKdbLibrary/app/.cxx

6
.gitmodules vendored
View File

@@ -1,6 +1,6 @@
[submodule "src/SamsungPass"]
path = src/SamsungPass
url = https://github.com/PhilippC/Xamarin-Samsung-Pass.git
[submodule "src/netftpandroid"]
path = src/netftpandroid
url = https://github.com/PhilippC/netftpandroid.git
[submodule "src/java/argon2/phc-winner-argon2"]
path = src/java/argon2/phc-winner-argon2
url = https://github.com/P-H-C/phc-winner-argon2

View File

@@ -28,14 +28,14 @@ Select "Create new database" from the start screen. Tap the integrated help icon
## Getting passwords into password fields
There are many ways how to enter the passwords from your database in the corresponding fields. By default, the clipboard as well as the KP2A keyboard are activated in the settings:
* The KP2A keyboard is the recommended way because it's safe against clipboard loggers: Whenever you select an entry, the KP2A keyboard notification will appear in the notification bar. Click it to activate the keyboard. (The first time you do this, you are required to enable the keyboard in the system settings. This must be done by the user for Android security reasons.) As soon as it's activated, you can tap a field where you want to enter data from the selected entry. The KP2A keyboard will come up. Click the KP2A key (on the bottom left) to select whether you want to enter Username/password etc. When you're done, click the Keyboard key (next to the KP2A key) to switch back to your favorite keyboard.
* You can enable the Keepass2Android Autofill service in the system's accessibility settings which allows to fill data using Android's accessibility system. This works with many apps including Chrome browser but is not supported for Firefox on Android.
* The clipboard based approach can be used as well: Pull the notification bar down and select "Copy username/password to clipboard". Then long-tap the field where you want to paste the data. A small "paste" button should come up. Note, however, that information in the clipboard can be monitored by all apps on your device.
* You can enable the Keepass2Android Autofill service in the system's Autofill settings (Android 8+) which allows to fill data using Android's accessibility system. This works with many apps including Firefox browser but is not supported for Chrome (when writing this).
* The clipboard based approach can be used as well: Pull the notification bar down and select "Copy username/password to clipboard". Then long-tap the field where you want to paste the data. A small "paste" button should come up. Note, however, that information in the clipboard can be monitored by all apps on your device and clearing the clipboard is not always possible.
These options can be used in different workflows:
### Browser-based workflow
If you are browsing the web and need to enter crendentials for a webpage, a simple and powerful workflow is to use the "Share URL" option from the browser's menu. Then select Keepass2Android (or KP2A Offline). Open your database (if it's not already opened) and select the entry you want to enter (if KP2A did not already select the appropriate entry). Use the built-in keyboard or the clipboard to enter the password.
### Autofill service based workflow
If you have enabled the autofill service and open a (supported) app with a password field, a notification appears in the notification bar. Select this notification to select the appropriate entry. When you return to the app, the password and user field should be filled already.
If you have enabled the autofill service and open a (supported) app with a password field, a dropdown appears. Select "Fill with Keepass2Android" to select the appropriate entry. When you return to the app, the password and user field should be filled already.
### KP2A based workflow for websites
Open KP2A, open your database, select your entry (in this step, the notification bar items should show up already). Now click the URL link of the entry to open a browser window with the website. Use one of the methods described above to enter the credentials.
### KP2A Keyboard based workflow
@@ -70,14 +70,32 @@ Please see the [Advanced usage of the Keepass2Android keyboard](Advanced-usage-o
# FAQ
* Should I use the KP2A keyboard for entering passwords?
## Should I use the KP2A keyboard for entering passwords?
The KP2A keyboard is meant to quickly "paste" or "type" values from your database to any text fields by using the KP2A icon. The QUERTY keyboard is just for convenience (if you just have the KP2A keyboard activated and need to enter a few letters). However, every other (trustworthy) keyboard is ok as well to enter sensitive information: Keyboard's aren't unsafe in Android. Only the clipboard is. Thus, the KP2A keyboard allows to get information out of the database without using the clipboard.
**You can use any keyboard when you enter the main database password**
* Is it safe to store my kdbx file in the cloud?
While it may happen that someone gets access to your kdbx file in the cloud, there is still no need to worry: the purpose of encryption is to protect the data even in case someone gets the kdbx file! As long as you are using a safe master key, you're safe!
## Is it safe to store my kdbx file in the cloud?
While it may happen that someone gets access to your kdbx file in the cloud, there is still no need to worry: the purpose of encryption is to protect the data even in case someone gets the kdbx file! As long as you are using a safe master key, you're safe! [Key files](https://keepass.info/help/base/keys.html#keyfiles) can help with securing the database even more.
* Why is Keepass2Android so big?
## Doesn't Keepass2Android create automatic backups?
Yes and no. Yes: Keepass2Android stores the last successfully opened file as a read-only backup locally on the phone (unless you disable this is in the settings). This should make sure that even if the file gets destroyed during a save operation or gets deleted by accident, you should always have a version that can be opened. (Don't mix this up with the internal file cache which is not meant as a backup and can easily be overwritten even with a corrupt file. This internal file cache is meant for providing writable access even when the original file is not reachable, e.g. when you're offline.)
No: The local backup has two shortcomings: It is only one backup and does not allow to revert to older versions. So if you deleted an entry from the database, it might be deleted in the local backup soon as well. The even more important shortcoming is that it is just a local backup. It won't help when your phone gets lost or broken. Please create additional backups on seperate storage!
## How do I backup the database?
If you have stored your database on the cloud, you might rely on your cloud storage providers backups. Make sure they allow you to revert to older revisions in case the file gets corrupted for some reason.
If you are working with a local database file, make sure you create regular backups. I suggest you have an aumotated mechanism, e.g. with FolderSync (Lite) which can copy local files from your device to other locations, e.g. your PC in a local network. You can also use USB or tools like MyPhoneExploror to transfer data to your PC. Or, you use a removable storage like an SD card which you keep in a safe place after making the backup.
In all cases, you need to verify that your backup is readable! It's even best to test this on another device (e.g. a PC), so you simulate the case that you may lose your phone.
## I can open my database with fingerprint, but don't remember my master password!
It's time for action! As soon as possible, select Settings - Database - Export and choose unencrypted XML (don't put this on the cloud but on a local file). Transfer this file to a PC and import it to a new kdbx file, e.g. with Keepass2. Choose a new master password and make sure you don't forget this password!
## How can I transfer data from one device to another?
* If you are about to get a new Android device, you should make sure you're not losing your passwords in the transition! The first thing you need to make sure is that you can access your .kdbx file (which stores the passwords) on the new device. If it is already stored in the cloud, you only need to make sure you know how to setup the cloud storage on the new device (it might require a password, so make sure you have access to that!).
* If the .kdbx-file is stored locally on the old device, make sure you have an up-to-date backup (see above). You can then transfer that backup copy to the new device. (Note: transferring via USB causes data corruption in some cases, use MyPhoneExplorer or similar tools to be sure this does not happen.)
* If you are securing your password database with a keyfile, also transfer this key file to the new device.
* If you are opening your database with a fingerprint, make sure you also know the master password because fingerprint will not be available immediately on the new device.
## Why is Keepass2Android's apk so big?
Please see [Keepass2Android Apk](Keepass2Android-Apk.md) for more information.
# For developers

View File

@@ -54,7 +54,7 @@ Please also add a few strings in your resource files (e.g. strings.xml) with the
These strings will be displayed to the user when KP2A asks if access should be granted.
## Modifying the entry view
You can add menu options for the full entry or for individual fields of the entry when displayed to the user. This is done, for example, by the QR plugin ([https://play.google.com/store/apps/details?id=keepass2android.plugin.qr](https___play.google.com_store_apps_details_id=keepass2android.plugin.qr)).
You can add menu options for the full entry or for individual fields of the entry when displayed to the user. This is done, for example, by the QR plugin ([https://play.google.com/store/apps/details?id=keepass2android.plugin.qr](https://play.google.com/store/apps/details?id=keepass2android.plugin.qr)).
In addition, it is even possible to add new fields or modify existing fields. Please see the sample plugin "PluginA" in the KP2A repository for a simple example on how to do this:
[https://keepass2android.codeplex.com/SourceControl/latest#src/java/PluginA/src/keepass2android/plugina/PluginAActionReceiver.java](https://keepass2android.codeplex.com/SourceControl/latest#src/java/PluginA/src/keepass2android/plugina/PluginAActionReceiver.java)

View File

@@ -13,6 +13,7 @@ Beta-releases can be obtained by opting in to the [Beta testing channel](https:/
# How can I contribute?
* Help to translate Keepass2Android into your language or improve translations at [our Crowdin page](http://crowdin.net/project/keepass2android)
* Add features by [creating a plugin](How-to-create-a-plug-in_.md) or creating a pull request. You might want to contact me before you start working so I can coordinate efforts.
* [Become a GitHub sponsor to boost 🚀 development](https://github.com/sponsors/PhilippC)
* [Make a donation](http://philipp.crocoll.net/donate.php)
# How do I learn more?

View File

@@ -10,8 +10,9 @@
<RootNamespace>AndroidFileChooserBinding</RootNamespace>
<AssemblyName>AndroidFileChooserBinding</AssemblyName>
<FileAlignment>512</FileAlignment>
<TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<AndroidCodegenTarget>XAJavaInterop1</AndroidCodegenTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -10,8 +10,10 @@
<RootNamespace>JavaFileStorageBindings</RootNamespace>
<AssemblyName>JavaFileStorageBindings</AssemblyName>
<FileAlignment>512</FileAlignment>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
<AndroidClassParser>class-parse</AndroidClassParser>
<AndroidCodegenTarget>XAJavaInterop1</AndroidCodegenTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -83,12 +85,6 @@
<ItemGroup>
<ProjectReference Include="..\PCloudBindings\PCloudBindings.csproj" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-digest-1.7.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\gson-2.3.1.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\msa-auth-0.8.6\classes-msa-auth.jar" />
</ItemGroup>
@@ -144,12 +140,18 @@
<EmbeddedReferenceJar Include="Jars\jackson-core-2.7.4.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedJar Include="Jars\dropbox-core-sdk-3.0.3.jar" />
<EmbeddedJar Include="Jars\dropbox-core-sdk-3.1.1.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-3.9.0.jar" />
<EmbeddedReferenceJar Include="Jars\gson-2.8.1.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okio-1.13.0.jar" />
<EmbeddedReferenceJar Include="Jars\okhttp-4.2.2.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okio-2.2.2.jar" />
</ItemGroup>
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\okhttp-digest-2.0.jar" />
</ItemGroup>
</Project>

View File

@@ -10,8 +10,9 @@
<RootNamespace>KP2AKdbLibraryBinding</RootNamespace>
<AssemblyName>KP2AKdbLibraryBinding</AssemblyName>
<FileAlignment>512</FileAlignment>
<TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<AndroidCodegenTarget>XAJavaInterop1</AndroidCodegenTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -52,10 +53,11 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<LibraryProjectZip Include="..\java\KP2AKdbLibrary\app\build\outputs\aar\app-debug.aar">
<Link>Jars\app-debug.aar</Link>
</LibraryProjectZip>
<None Include="Jars\AboutJars.txt" />
<None Include="Additions\AboutAdditions.txt" />
<EmbeddedNativeLibrary Include="libs\armeabi-v7a\libfinal-key.so" />
<EmbeddedNativeLibrary Include="libs\armeabi\libfinal-key.so" />
</ItemGroup>
<ItemGroup>
<TransformFile Include="Transforms\Metadata.xml">
@@ -65,9 +67,7 @@
<TransformFile Include="Transforms\EnumMethods.xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedJar Include="..\java\KP2AKdbLibrary\bin\kp2akdblibrary.jar">
<Link>Jars\kp2akdblibrary.jar</Link>
</EmbeddedJar>
<Folder Include="libs\" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.Bindings.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27004.2009
# Visual Studio Version 16
VisualStudioVersion = 16.0.29418.71
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeePassLib2Android", "KeePassLib2Android\KeePassLib2Android.csproj", "{545B4A6B-8BBA-4FBE-92FC-4AC060122A54}"
EndProject
@@ -23,8 +23,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginSdkBinding", "PluginS
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZlibAndroid", "ZlibAndroid\ZlibAndroid.csproj", "{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Net.FtpClient.Android", "netftpandroid\System.Net.FtpClient\System.Net.FtpClient.Android.csproj", "{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SamsungPass", "SamsungPass\Xamarin.SamsungPass\SamsungPass\SamsungPass.csproj", "{3A4B8E88-FA9B-4663-BCDA-21C12E3AF98A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PCloudBindings", "PCloudBindings\PCloudBindings.csproj", "{2DB80C77-D46F-4970-B967-E9FFA9B2AC2E}"
@@ -255,24 +253,6 @@ Global
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.ReleaseNoNet|Win32.Build.0 = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.ReleaseNoNet|x64.ActiveCfg = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.ReleaseNoNet|x64.Build.0 = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Debug|Win32.ActiveCfg = Debug|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Debug|x64.ActiveCfg = Debug|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Release|Any CPU.Build.0 = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Release|Win32.ActiveCfg = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.Release|x64.ActiveCfg = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.ReleaseNoNet|Any CPU.ActiveCfg = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.ReleaseNoNet|Any CPU.Build.0 = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.ReleaseNoNet|Mixed Platforms.ActiveCfg = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.ReleaseNoNet|Mixed Platforms.Build.0 = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.ReleaseNoNet|Win32.ActiveCfg = Release|Any CPU
{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}.ReleaseNoNet|x64.ActiveCfg = Release|Any CPU
{3A4B8E88-FA9B-4663-BCDA-21C12E3AF98A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3A4B8E88-FA9B-4663-BCDA-21C12E3AF98A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3A4B8E88-FA9B-4663-BCDA-21C12E3AF98A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU

View File

@@ -20,6 +20,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
namespace KeePassLib.Cryptography.KeyDerivation
@@ -127,8 +128,44 @@ namespace KeePassLib.Cryptography.KeyDerivation
byte[] pbSecretKey = p.GetByteArray(ParamSecretKey);
byte[] pbAssocData = p.GetByteArray(ParamAssocData);
if (pbSecretKey != null) {
throw new ArgumentOutOfRangeException("Unsupported configuration: non-null pbSecretKey");
}
if (pbAssocData != null) {
throw new ArgumentOutOfRangeException("Unsupported configuration: non-null pbAssocData");
}
/*
byte[] pbRet = Argon2d(pbMsg, pbSalt, uPar, uMem, uIt,
32, v, pbSecretKey, pbAssocData);
*/
IntPtr msgPtr = Marshal.AllocHGlobal(pbMsg.Length);
IntPtr saltPtr = Marshal.AllocHGlobal(pbSalt.Length);
IntPtr retPtr = Marshal.AllocHGlobal(32);
Marshal.Copy(pbMsg, 0, msgPtr, pbMsg.Length);
Marshal.Copy(pbSalt, 0, saltPtr, pbSalt.Length);
const UInt32 Argon2_d = 0;
int ret = argon2_hash(
(UInt32)uIt, (UInt32)(uMem / 1024), uPar,
msgPtr, (IntPtr)pbMsg.Length,
saltPtr, (IntPtr)pbSalt.Length,
retPtr, (IntPtr)32,
(IntPtr)0, (IntPtr)0, Argon2_d, v);
if (ret != 0) {
throw new Exception("argon2_hash failed with " + ret);
}
byte[] pbRet = new byte[32];
Marshal.Copy(retPtr, pbRet, 0, 32);
Marshal.FreeHGlobal(msgPtr);
Marshal.FreeHGlobal(saltPtr);
Marshal.FreeHGlobal(retPtr);
if(uMem > (100UL * 1024UL * 1024UL)) GC.Collect();
return pbRet;
@@ -143,5 +180,14 @@ namespace KeePassLib.Cryptography.KeyDerivation
MaxIterations, uMilliseconds, true);
return p;
}
[DllImport("argon2")]
static extern int argon2_hash(
UInt32 t_cost, UInt32 m_cost, UInt32 parallelism,
IntPtr pwd, IntPtr pwdlen,
IntPtr salt, IntPtr saltlen,
IntPtr hash, IntPtr hashlen,
IntPtr encoded, IntPtr encodedlen,
UInt32 type, UInt32 version);
}
}

View File

@@ -12,8 +12,8 @@
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
<AndroidResgenClass>Resource</AndroidResgenClass>
<AssemblyName>KeePassLib2Android</AssemblyName>
<TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<NuGetPackageImportStamp>8482b288</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

View File

@@ -21,7 +21,6 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Security;
#if !KeePassUAP
@@ -78,26 +77,7 @@ namespace KeePassLib.Keys
// m_pbKeyData = null;
// }
private static string GetUserKeyFilePath(bool bCreate)
{
#if KeePassRT
string strUserDir = Windows.Storage.ApplicationData.Current.RoamingFolder.Path;
#else
string strUserDir = Environment.GetFolderPath(
Environment.SpecialFolder.ApplicationData);
#endif
strUserDir = UrlUtil.EnsureTerminatingSeparator(strUserDir, false);
strUserDir += PwDefs.ShortProductName;
if (bCreate && !Directory.Exists(strUserDir))
Directory.CreateDirectory(strUserDir);
strUserDir = UrlUtil.EnsureTerminatingSeparator(strUserDir, false);
return strUserDir + UserKeyFileName;
}
private static byte[] LoadUserKey(bool bShowWarning)
private static byte[] LoadUserKey(bool bShowWarning)
{
byte[] pbKey = null;

View File

@@ -587,7 +587,7 @@ namespace KeePassLib
/// </summary>
/// <param name="ioConnection">IO connection of the new database.</param>
/// <param name="pwKey">Key to open the database.</param>
public void New(IOConnectionInfo ioConnection, CompositeKey pwKey)
public void New(IOConnectionInfo ioConnection, CompositeKey pwKey, string filenameWithoutPathAndExt)
{
Debug.Assert(ioConnection != null);
if(ioConnection == null) throw new ArgumentNullException("ioConnection");
@@ -602,26 +602,11 @@ namespace KeePassLib
m_bDatabaseOpened = true;
m_bModified = true;
m_pgRootGroup = new PwGroup(true, true,
UrlUtil.StripExtension(UrlUtil.GetFileName(ioConnection.Path)),
m_pgRootGroup = new PwGroup(true, true, filenameWithoutPathAndExt,
PwIcon.FolderOpen);
m_pgRootGroup.IsExpanded = true;
}
/// <summary>
/// Open a database. The URL may point to any supported data source.
/// </summary>
/// <param name="ioSource">IO connection to load the database from.</param>
/// <param name="pwKey">Key used to open the specified database.</param>
/// <param name="slLogger">Logger, which gets all status messages.</param>
public void Open(IOConnectionInfo ioSource, CompositeKey pwKey,
IStatusLogger slLogger, IDatabaseFormat format)
{
Open(IOConnection.OpenRead(ioSource), UrlUtil.StripExtension(
UrlUtil.GetFileName(ioSource.Path)), ioSource, pwKey, slLogger, format);
}
/// <summary>
/// Open a database. The URL may point to any supported data source.
@@ -669,37 +654,7 @@ namespace KeePassLib
throw;
}
}
/// <summary>
/// Save the currently opened database. The file is written to the location
/// it has been opened from.
/// </summary>
/// <param name="slLogger">Logger that recieves status information.</param>
public void Save(IStatusLogger slLogger)
{
Debug.Assert(!HasDuplicateUuids());
FileLock fl = null;
if(m_bUseFileLocks) fl = new FileLock(m_ioSource);
try
{
FileTransactionEx ft = new FileTransactionEx(m_ioSource,
m_bUseFileTransactions);
Stream s = ft.OpenWrite();
KdbxFile kdb = new KdbxFile(this);
kdb.Save(s, null, KdbpFile.GetFormatToUse(m_ioSource), slLogger);
ft.CommitWrite();
m_pbHashOfLastIO = kdb.HashOfFileOnDisk;
m_pbHashOfFileOnDisk = kdb.HashOfFileOnDisk;
Debug.Assert(m_pbHashOfFileOnDisk != null);
}
finally { if(fl != null) fl.Dispose(); }
m_bModified = false;
}
/// <summary>
/// Save the currently opened database. The file is written to the given stream which is expected to be the original location.
@@ -717,46 +672,6 @@ namespace KeePassLib
m_bModified = false;
}
/// <summary>
/// Save the currently opened database to a different location. If
/// <paramref name="bIsPrimaryNow" /> is <c>true</c>, the specified
/// location is made the default location for future saves
/// using <c>SaveDatabase</c>.
/// </summary>
/// <param name="ioConnection">New location to serialize the database to.</param>
/// <param name="bIsPrimaryNow">If <c>true</c>, the new location is made the
/// standard location for the database. If <c>false</c>, a copy of the currently
/// opened database is saved to the specified location, but it isn't
/// made the default location (i.e. no lock files will be moved for
/// example).</param>
/// <param name="slLogger">Logger that recieves status information.</param>
public void SaveAs(IOConnectionInfo ioConnection, bool bIsPrimaryNow,
IStatusLogger slLogger)
{
Debug.Assert(ioConnection != null);
if(ioConnection == null) throw new ArgumentNullException("ioConnection");
IOConnectionInfo ioCurrent = m_ioSource; // Remember current
m_ioSource = ioConnection;
byte[] pbHashCopy = m_pbHashOfFileOnDisk;
try { this.Save(slLogger); }
catch(Exception)
{
m_ioSource = ioCurrent; // Restore
m_pbHashOfFileOnDisk = pbHashCopy;
m_pbHashOfLastIO = null;
throw;
}
if(!bIsPrimaryNow)
{
m_ioSource = ioCurrent; // Restore
m_pbHashOfFileOnDisk = pbHashCopy;
}
}
/// <summary>
/// Closes the currently opened database. No confirmation message is shown

View File

@@ -23,7 +23,7 @@ using System.Diagnostics;
using System.IO;
using System.Text;
using System.Xml;
using keepass2android;
#if !KeePassUAP
using System.Drawing;
#endif
@@ -872,8 +872,17 @@ namespace KeePassLib.Serialization
pb = pb8;
}
long lSec = MemUtil.BytesToInt64(pb);
return new DateTime(lSec * TimeSpan.TicksPerSecond, DateTimeKind.Utc);
}
try
{
return new DateTime(lSec * TimeSpan.TicksPerSecond, DateTimeKind.Utc);
}
catch (System.ArgumentOutOfRangeException e)
{
//files might contain bad data, e.g. see #868. Fall back to MinValue
Kp2aLog.Log("Failed to read date from file.");
return DateTime.MinValue;
}
}
else
{
string str = ReadString(xr);

View File

@@ -581,7 +581,7 @@ namespace KeePassLib.Serialization
return vEntries; */
PwDatabase pd = new PwDatabase();
pd.New(new IOConnectionInfo(), new CompositeKey());
pd.New(new IOConnectionInfo(), new CompositeKey(), "");
KdbxFile f = new KdbxFile(pd);
f.Load(msData, KdbxFormat.PlainXml, null);

View File

@@ -1048,7 +1048,7 @@ namespace KeePassLib.Serialization
return true; */
PwDatabase pd = new PwDatabase();
pd.New(new IOConnectionInfo(), new CompositeKey());
pd.New(new IOConnectionInfo(), new CompositeKey(), "");
PwGroup pg = pd.RootGroup;
if (pg == null) { Debug.Assert(false); return false; }

View File

@@ -375,13 +375,16 @@ namespace KeePassLib.Serialization
// See also KeePassKdb2x3.Export (KDBX 3.1 export module)
uint minVersionForKeys = m_pwDatabase.MasterKey.UserKeys.Select(key => key.GetMinKdbxVersion()).Max();
uint minRequiredVersion = Math.Max(minVersionForKeys, m_uFileVersion); //don't save a version lower than what we read
AesKdf kdfAes = new AesKdf();
if(!kdfAes.Uuid.Equals(m_pwDatabase.KdfParameters.KdfUuid))
return Math.Max(FileVersion32, minVersionForKeys);
return Math.Max(FileVersion32, minRequiredVersion);
if(m_pwDatabase.PublicCustomData.Count > 0)
return Math.Max(FileVersion32, minVersionForKeys);
return Math.Max(FileVersion32, minRequiredVersion);
@@ -401,9 +404,9 @@ namespace KeePassLib.Serialization
gh(m_pwDatabase.RootGroup);
m_pwDatabase.RootGroup.TraverseTree(TraversalMethod.PreOrder, gh, eh);
if(bCustomData)
return Math.Max(FileVersion32, minVersionForKeys);
return Math.Max(FileVersion32, minRequiredVersion);
return Math.Max(FileVersion32_3, minVersionForKeys); ; // KDBX 3.1 is sufficient
return Math.Max(FileVersion32_3, minRequiredVersion); ; // KDBX 3.1 is sufficient
}
private void ComputeKeys(out byte[] pbCipherKey, int cbCipherKey,

View File

@@ -26,10 +26,10 @@ namespace KeePassLib.Serialization
/// <summary>
/// Determines whether the database pointed to by the specified ioc should be (de)serialised in default (xml) or protocol buffers format.
/// </summary>
public static KdbxFormat GetFormatToUse(IOConnectionInfo ioc)
public static KdbxFormat GetFormatToUse(string fileExt)
{
// If the filename ends in .kdbp, use ProtocolBuffers format.
return UrlUtil.GetExtension(UrlUtil.GetFileName(ioc.Path)).Equals(KdbpFile.FileNameExtension, StringComparison.OrdinalIgnoreCase) ? KdbxFormat.ProtocolBuffers : KdbxFormat.Default;
return fileExt.Equals(KdbpFile.FileNameExtension, StringComparison.OrdinalIgnoreCase) ? KdbxFormat.ProtocolBuffers : KdbxFormat.Default;
}
public static void WriteDocument(PwDatabase database, Stream stream, byte[] protectedStreamKey, byte[] hashOfHeader)

View File

@@ -11,7 +11,7 @@ using KeePassLib.Keys;
using KeePassLib.Serialization;
using keepass2android.Io;
using KeePassLib.Interfaces;
#if !NoNet
#if !NoNet && !EXCLUDE_JAVAFILESTORAGE
using Keepass2android.Javafilestorage;
#endif
@@ -29,7 +29,7 @@ namespace keepass2android
}
/// <summary>
/// <summary>
/// Interface through which Activities and the logic layer can access some app specific functionalities and Application static data
/// </summary>
/// This also contains methods which are UI specific and should be replacable for testing.
@@ -123,7 +123,7 @@ namespace keepass2android
bool CheckForDuplicateUuids { get; }
#if !NoNet
#if !NoNet && !EXCLUDE_JAVAFILESTORAGE
ICertificateErrorHandler CertificateErrorHandler { get; }

View File

@@ -82,7 +82,12 @@ namespace keepass2android.Io
UrlUtil.GetFileName(ioc.Path));
}
public bool RequiresCredentials(IOConnectionInfo ioc)
public string GetFileExtension(IOConnectionInfo ioc)
{
return UrlUtil.GetExtension(ioc.Path);
}
public bool RequiresCredentials(IOConnectionInfo ioc)
{
return false;
}
@@ -328,12 +333,13 @@ namespace keepass2android.Io
public void CommitWrite()
{
ParcelFileDescriptor fileDescriptor = _ctx.ContentResolver.OpenFileDescriptor(Android.Net.Uri.Parse(_path), "w");
ParcelFileDescriptor fileDescriptor = _ctx.ContentResolver.OpenFileDescriptor(Android.Net.Uri.Parse(_path), "rwt");
using (var outputStream = new FileOutputStream(fileDescriptor.FileDescriptor))
{
byte[] data = _memoryStream.ToArray();
outputStream.Write(data, 0, data.Length);
outputStream.Write(data);
outputStream.Close();
}
fileDescriptor.Close();

View File

@@ -12,13 +12,10 @@ using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Preferences;
using Android.Support.V13.App;
using Android.Support.V4.App;
using Java.IO;
using Java.Util;
using Android.Support.V4;
using KeePassLib.Serialization;
using KeePassLib.Utility;
using ActivityCompat = Android.Support.V13.App.ActivityCompat;
using File = System.IO.File;
using FileNotFoundException = System.IO.FileNotFoundException;
using IOException = System.IO.IOException;
@@ -204,7 +201,12 @@ namespace keepass2android.Io
}
public bool RequiresCredentials(IOConnectionInfo ioc)
public string GetFileExtension(IOConnectionInfo ioc)
{
return UrlUtil.GetExtension(ioc.Path);
}
public bool RequiresCredentials(IOConnectionInfo ioc)
{
return (!ioc.IsLocalFile()) && (ioc.CredSaveMode != IOCredSaveMode.SaveCred);
}

View File

@@ -448,7 +448,12 @@ namespace keepass2android.Io
return _cachedStorage.GetFilenameWithoutPathAndExt(ioc);
}
public bool RequiresCredentials(IOConnectionInfo ioc)
public string GetFileExtension(IOConnectionInfo ioc)
{
return _cachedStorage.GetFileExtension(ioc);
}
public bool RequiresCredentials(IOConnectionInfo ioc)
{
return _cachedStorage.RequiresCredentials(ioc);
}

View File

@@ -88,11 +88,13 @@ namespace keepass2android.Io
IWriteTransaction OpenWriteTransaction(IOConnectionInfo ioc, bool useFileTransaction);
string GetFilenameWithoutPathAndExt(IOConnectionInfo ioc);
/// <summary>
/// Returns true if the the given ioc must be filled with username/password
/// </summary>
bool RequiresCredentials(IOConnectionInfo ioc);
string GetFileExtension(IOConnectionInfo ioc);
/// <summary>
/// Returns true if the the given ioc must be filled with username/password
/// </summary>
bool RequiresCredentials(IOConnectionInfo ioc);
/// <summary>
/// Creates the directory described by ioc

View File

@@ -128,10 +128,12 @@ namespace keepass2android.Io
}
//creates a local ioc where the sourceIoc can be stored to
public static IOConnectionInfo GetInternalIoc(IOConnectionInfo sourceIoc, Context ctx)
public static IOConnectionInfo GetInternalIoc(IOConnectionInfo sourceIoc, Context ctx, IKp2aApp app)
{
Java.IO.File internalDirectory = IoUtil.GetInternalDirectory(ctx);
string targetPath = UrlUtil.GetFileName(sourceIoc.Path);
var filestorage = app.GetFileStorage(sourceIoc);
string targetPath = filestorage.GetFilenameWithoutPathAndExt(sourceIoc);
targetPath = targetPath.Trim("|\\?*<\":>+[]/'".ToCharArray());
if (targetPath == "")
targetPath = "internal";
@@ -153,7 +155,7 @@ namespace keepass2android.Io
public static IOConnectionInfo ImportFileToInternalDirectory(IOConnectionInfo sourceIoc, Context ctx, IKp2aApp app)
{
var targetIoc = GetInternalIoc(sourceIoc, ctx);
var targetIoc = GetInternalIoc(sourceIoc, ctx, app);
IoUtil.Copy(targetIoc, sourceIoc, app);

View File

@@ -177,7 +177,12 @@ namespace keepass2android.Io
_jfs.GetFilename(IocToPath(ioc)));
}
public bool RequiresCredentials(IOConnectionInfo ioc)
public string GetFileExtension(IOConnectionInfo ioc)
{
return UrlUtil.GetExtension(ioc.Path);
}
public bool RequiresCredentials(IOConnectionInfo ioc)
{
return false;
}

View File

@@ -3,12 +3,12 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.FtpClient;
using System.Reflection;
using System.Threading;
using Android.Content;
using Android.OS;
using Android.Preferences;
using FluentFTP;
using KeePassLib;
using KeePassLib.Serialization;
using KeePassLib.Utility;
@@ -17,73 +17,6 @@ namespace keepass2android.Io
{
public class NetFtpFileStorage: IFileStorage
{
class RetryConnectFtpClient : FtpClient
{
protected override FtpClient CloneConnection()
{
RetryConnectFtpClient conn = new RetryConnectFtpClient();
conn.m_isClone = true;
foreach (PropertyInfo prop in GetType().GetProperties())
{
object[] attributes = prop.GetCustomAttributes(typeof(FtpControlConnectionClone), true);
if (attributes != null && attributes.Length > 0)
{
prop.SetValue(conn, prop.GetValue(this, null), null);
}
}
// always accept certficate no matter what because if code execution ever
// gets here it means the certificate on the control connection object being
// cloned was already accepted.
conn.ValidateCertificate += new FtpSslValidation(
delegate(FtpClient obj, FtpSslValidationEventArgs e)
{
e.Accept = true;
});
return conn;
}
private static T DoInRetryLoop<T>(Func<T> func)
{
double timeout = 30.0;
double timePerRequest = 1.0;
var startTime = DateTime.Now;
while (true)
{
var attemptStartTime = DateTime.Now;
try
{
return func();
}
catch (System.Net.Sockets.SocketException e)
{
if ((e.ErrorCode != 10061) || (DateTime.Now > startTime.AddSeconds(timeout)))
{
throw;
}
double secondsSinceAttemptStart = (DateTime.Now - attemptStartTime).TotalSeconds;
if (secondsSinceAttemptStart < timePerRequest)
{
Thread.Sleep(TimeSpan.FromSeconds(timePerRequest - secondsSinceAttemptStart));
}
}
}
}
public override void Connect()
{
DoInRetryLoop(() =>
{
base.Connect();
return true;
}
);
}
}
public struct ConnectionSettings
{
public FtpEncryptionMode EncryptionMode {get; set; }
@@ -147,9 +80,8 @@ namespace keepass2android.Io
public NetFtpFileStorage(Context context, ICertificateValidationHandler app)
{
_app = app;
_app = app;
traceStream = new MemoryStream();
FtpTrace.AddListener(new System.Diagnostics.TextWriterTraceListener(traceStream));
}
@@ -172,9 +104,9 @@ namespace keepass2android.Io
{
using (FtpClient client = GetClient(ioc))
{
string localPath = IocToUri(ioc).PathAndQuery;
string localPath = IocToLocalPath(ioc);
if (client.DirectoryExists(localPath))
client.DeleteDirectory(localPath, true);
client.DeleteDirectory(localPath);
else
client.DeleteFile(localPath);
}
@@ -205,7 +137,8 @@ namespace keepass2android.Io
{
var settings = ConnectionSettings.FromIoc(ioc);
FtpClient client = new RetryConnectFtpClient();
FtpClient client = new FtpClient();
client.RetryAttempts = 3;
if ((settings.Username.Length > 0) || (settings.Password.Length > 0))
client.Credentials = new NetworkCredential(settings.Username, settings.Password);
else
@@ -250,20 +183,22 @@ namespace keepass2android.Io
path = path.Substring(settings.Length + 1);
}
return new Uri(scheme + "://" + path);
Kp2aLog.Log("FTP: IocToUri out = " + scheme + "://" + path);
return new Uri(scheme + "://" + path);
}
private string IocPathFromUri(IOConnectionInfo baseIoc, Uri uri)
private string IocPathFromUri(IOConnectionInfo baseIoc, string uri)
{
string basePath = baseIoc.Path;
string basePath = baseIoc.Path;
int schemeLength = basePath.IndexOf("://", StringComparison.Ordinal);
string scheme = basePath.Substring(0, schemeLength);
basePath = basePath.Substring(schemeLength + 3);
string baseSettings = basePath.Substring(0, basePath.IndexOf(ConnectionSettings.SettingsPostFix, StringComparison.Ordinal));
basePath = basePath.Substring(baseSettings.Length+1);
string baseHost = basePath.Substring(0, basePath.IndexOf("/", StringComparison.Ordinal));
return scheme + "://" + baseSettings + ConnectionSettings.SettingsPostFix + baseHost + uri.AbsolutePath; //TODO does this contain Query?
}
string result = scheme + "://" + baseSettings + ConnectionSettings.SettingsPostFix + baseHost + uri; //TODO does this contain Query?
return result;
}
public bool CheckForFileChangeFast(IOConnectionInfo ioc, string previousFileVersion)
@@ -282,7 +217,7 @@ namespace keepass2android.Io
{
using (var cl = GetClient(ioc))
{
return cl.OpenRead(IocToUri(ioc).PathAndQuery, FtpDataType.Binary, 0);
return cl.OpenRead(IocToLocalPath(ioc), FtpDataType.Binary, 0);
}
}
catch (FtpCommandException ex)
@@ -314,7 +249,12 @@ namespace keepass2android.Io
UrlUtil.GetFileName(ioc.Path));
}
public bool RequiresCredentials(IOConnectionInfo ioc)
public string GetFileExtension(IOConnectionInfo ioc)
{
return UrlUtil.GetExtension(ioc.Path);
}
public bool RequiresCredentials(IOConnectionInfo ioc)
{
return false;
}
@@ -325,7 +265,7 @@ namespace keepass2android.Io
{
using (var client = GetClient(ioc))
{
client.CreateDirectory(IocToUri(GetFilePath(ioc, newDirName)).PathAndQuery);
client.CreateDirectory(IocToLocalPath(GetFilePath(ioc, newDirName)));
}
}
catch (FtpCommandException ex)
@@ -334,14 +274,19 @@ namespace keepass2android.Io
}
}
public IEnumerable<FileDescription> ListContents(IOConnectionInfo ioc)
public static string IocToLocalPath(IOConnectionInfo ioc)
{
return WebUtility.UrlDecode(IocToUri(ioc).PathAndQuery);
}
public IEnumerable<FileDescription> ListContents(IOConnectionInfo ioc)
{
try
{
using (var client = GetClient(ioc))
using (var client = GetClient(ioc))
{
List<FileDescription> files = new List<FileDescription>();
foreach (FtpListItem item in client.GetListing(IocToUri(ioc).PathAndQuery,
foreach (FtpListItem item in client.GetListing(IocToLocalPath(ioc),
FtpListOption.Modify | FtpListOption.Size | FtpListOption.DerefLinks))
{
@@ -355,7 +300,7 @@ namespace keepass2android.Io
DisplayName = item.Name,
IsDirectory = true,
LastModified = item.Modified,
Path = IocPathFromUri(ioc, new Uri(item.FullName))
Path = IocPathFromUri(ioc, item.FullName)
});
break;
case FtpFileSystemObjectType.File:
@@ -366,7 +311,7 @@ namespace keepass2android.Io
DisplayName = item.Name,
IsDirectory = false,
LastModified = item.Modified,
Path = IocPathFromUri(ioc, new Uri(item.FullName)),
Path = IocPathFromUri(ioc, item.FullName),
SizeInBytes = item.Size
});
break;
@@ -391,10 +336,10 @@ namespace keepass2android.Io
//is it very inefficient to connect for each description?
using (FtpClient client = GetClient(ioc))
{
var uri = IocToUri(ioc);
string path = uri.PathAndQuery;
{
string path = IocToLocalPath(ioc);
if (!client.FileExists(path) && (!client.DirectoryExists(path)))
throw new FileNotFoundException();
var fileDesc = new FileDescription()
@@ -506,7 +451,7 @@ namespace keepass2android.Io
{
using (var client = GetClient(ioc))
{
return client.OpenWrite(IocToUri(ioc).PathAndQuery);
return client.OpenWrite(IocToLocalPath(ioc));
}
}
@@ -575,7 +520,7 @@ namespace keepass2android.Io
{
_client = _fileStorage.GetClient(_ioc, false);
_stream = _client.OpenWrite(NetFtpFileStorage.IocToUri(_iocTemp).PathAndQuery);
_stream = _client.OpenWrite(NetFtpFileStorage.IocToLocalPath(_iocTemp));
return _stream;
}
catch (FtpCommandException ex)
@@ -590,22 +535,11 @@ namespace keepass2android.Io
{
Android.Util.Log.Debug("NETFTP","connected: " + _client.IsConnected.ToString());
_stream.Close();
Android.Util.Log.Debug("NETFTP", "connected: " + _client.IsConnected.ToString());
_stream.Dispose();
_client.GetReply();
//make sure target file does not exist:
//try
{
if (_client.FileExists(NetFtpFileStorage.IocToUri(_ioc).PathAndQuery))
_client.DeleteFile(NetFtpFileStorage.IocToUri(_ioc).PathAndQuery);
}
//catch (FtpCommandException)
{
//TODO get a new clien? might be stale
}
_client.Rename(NetFtpFileStorage.IocToUri(_iocTemp).PathAndQuery,
NetFtpFileStorage.IocToUri(_ioc).PathAndQuery);
_client.MoveFile(NetFtpFileStorage.IocToLocalPath(_iocTemp),
NetFtpFileStorage.IocToLocalPath(_ioc));
}
catch (FtpCommandException ex)

View File

@@ -78,7 +78,12 @@ namespace keepass2android.Io
return _baseStorage.GetFilenameWithoutPathAndExt(ioc);
}
public bool RequiresCredentials(IOConnectionInfo ioc)
public string GetFileExtension(IOConnectionInfo ioc)
{
return _baseStorage.GetFileExtension(ioc);
}
public bool RequiresCredentials(IOConnectionInfo ioc)
{
return _baseStorage.RequiresCredentials(ioc);
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,26 @@
namespace keepass2android.Io.ItemLocation
{
public abstract class OneDrive2PrefixContainer
{
public abstract string Onedrive2ProtocolId { get; }
public string Onedrive2Prefix { get { return Onedrive2ProtocolId + "://"; } }
}
//for permissions including all my files and all shared files
public class OneDrive2FullPrefixContainer : OneDrive2PrefixContainer
{
public override string Onedrive2ProtocolId { get { return "onedrive2_full"; }}
}
//for permissions including all my files
public class OneDrive2MyFilesPrefixContainer : OneDrive2PrefixContainer
{
public override string Onedrive2ProtocolId { get { return "onedrive2_myfiles"; } }
}
//for permissions to app folder only
public class OneDrive2AppFolderPrefixContainer : OneDrive2PrefixContainer
{
public override string Onedrive2ProtocolId { get { return "onedrive2_appfolder"; } }
}
}

View File

@@ -9,14 +9,14 @@ using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
#if !NoNet
#if !NoNet && !EXCLUDE_JAVAFILESTORAGE
using Keepass2android.Javafilestorage;
#endif
using KeePassLib.Serialization;
namespace keepass2android.Io
{
#if !NoNet
#if !NoNet && !EXCLUDE_JAVAFILESTORAGE
public class WebDavFileStorage: JavaFileStorage
{
public WebDavFileStorage(IKp2aApp app) : base(new Keepass2android.Javafilestorage.WebDavStorage(app.CertificateErrorHandler), app)

View File

@@ -12,8 +12,8 @@
<FileAlignment>512</FileAlignment>
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>true</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v10.0</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
@@ -22,7 +22,7 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;EXCLUDE_TWOFISH;_EXCLUDE_KEYBOARD;_EXCLUDE_FILECHOOSER;_EXCLUDE_JAVAFILESTORAGE;INCLUDE_KEYTRANSFORM</DefineConstants>
<DefineConstants>DEBUG;_EXCLUDE_TWOFISH;_EXCLUDE_KEYBOARD;_EXCLUDE_FILECHOOSER;_EXCLUDE_JAVAFILESTORAGE;INCLUDE_KEYTRANSFORM</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidLinkMode>None</AndroidLinkMode>
@@ -56,36 +56,6 @@
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Xml" />
<Reference Include="Xamarin.Android.Arch.Core.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\lib\MonoAndroid80\Xamarin.Android.Arch.Core.Common.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Arch.Lifecycle.Common, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.0.1\lib\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Common.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Arch.Lifecycle.Runtime, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Android.Arch.Lifecycle.Runtime.1.0.0\lib\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Runtime.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Annotations, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Annotations.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Compat, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Android.Support.Compat.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Compat.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Core.UI, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Android.Support.Core.UI.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Core.UI.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Core.Utils, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Android.Support.Core.Utils.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Core.Utils.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Fragment, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Android.Support.Fragment.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Fragment.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Media.Compat, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Android.Support.Media.Compat.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Media.Compat.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.v13, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xamarin.Android.Support.v13.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.v13.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="database\CheckDatabaseForChanges.cs" />
@@ -118,6 +88,8 @@
<Compile Include="Io\JavaFileStorage.cs" />
<Compile Include="Io\NetFtpFileStorage.cs" />
<Compile Include="Io\OfflineSwitchableFileStorage.cs" />
<Compile Include="Io\OneDrive2FileStorage.cs" />
<Compile Include="Io\OneDrive2PrefixContainer.cs" />
<Compile Include="Io\PCloudFileStorage.cs" />
<Compile Include="Io\SftpFileStorage.cs" />
<Compile Include="Io\OneDriveFileStorage.cs" />
@@ -157,6 +129,10 @@
<Compile Include="Utils\Spr\SprEngine.PickChars.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AndroidFileChooserBinding\AndroidFileChooserBinding.csproj">
<Project>{3c0f7fe5-639f-4422-a087-8b26cf862d1b}</Project>
<Name>AndroidFileChooserBinding</Name>
</ProjectReference>
<ProjectReference Include="..\JavaFileStorageBindings\JavaFileStorageBindings.csproj">
<Project>{48574278-4779-4b3a-a9e4-9cf1bc285d0b}</Project>
<Name>JavaFileStorageBindings</Name>
@@ -169,9 +145,9 @@
<Project>{70D3844A-D9FA-4A64-B205-A84C6A822196}</Project>
<Name>KP2AKdbLibraryBinding</Name>
</ProjectReference>
<ProjectReference Include="..\netftpandroid\System.Net.FtpClient\System.Net.FtpClient.Android.csproj">
<Project>{146FD497-BA03-4740-B6C5-5C84EA8FCDE2}</Project>
<Name>System.Net.FtpClient.Android</Name>
<ProjectReference Include="..\PCloudBindings\PCloudBindings.csproj">
<Project>{2db80c77-d46f-4970-b967-e9ffa9b2ac2e}</Project>
<Name>PCloudBindings</Name>
</ProjectReference>
<ProjectReference Include="..\TwofishCipher\TwofishCipher.csproj">
<Project>{5CF675A5-9BEE-4720-BED9-D5BF14A2EBF9}</Project>
@@ -182,34 +158,125 @@
<Folder Include="Resources\" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
<None Include="app.config" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FluentFTP">
<Version>31.3.1</Version>
</PackageReference>
<PackageReference Include="Microsoft.Graph">
<Version>1.21.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.Graph.Auth">
<Version>1.0.0-preview.1</Version>
</PackageReference>
<PackageReference Include="Microsoft.Identity.Client">
<Version>4.8.2</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Arch.Core.Common">
<Version>1.1.1.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Arch.Core.Runtime">
<Version>1.1.1.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Arch.Lifecycle.Common">
<Version>1.1.1.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Arch.Lifecycle.LiveData">
<Version>1.1.1.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Arch.Lifecycle.LiveData.Core">
<Version>1.1.1.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Arch.Lifecycle.Runtime">
<Version>1.1.1.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Arch.Lifecycle.ViewModel">
<Version>1.1.1.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Animated.Vector.Drawable">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Annotations">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.AsyncLayoutInflater">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Collections">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Compat">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.CoordinaterLayout">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Core.UI">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Core.Utils">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.CursorAdapter">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.CustomTabs">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.CustomView">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.DocumentFile">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.DrawerLayout">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Fragment">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Interpolator">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Loader">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.LocalBroadcastManager">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Media.Compat">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Print">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.SlidingPaneLayout">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.SwipeRefreshLayout">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.v13">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.v4">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.v7.AppCompat">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.Vector.Drawable">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.VersionedParcelable">
<Version>28.0.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Android.Support.ViewPager">
<Version>28.0.0.3</Version>
</PackageReference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<Import Project="..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets')" />
<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.Android.Support.Annotations.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Core.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Core.Common.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.0.1\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.0.1\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Common.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Android.Arch.Lifecycle.Runtime.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Runtime.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Arch.Lifecycle.Runtime.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Runtime.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Compat.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Compat.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Core.UI.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.UI.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Core.UI.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.UI.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Core.Utils.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.Utils.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Core.Utils.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.Utils.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Fragment.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Fragment.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Fragment.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Fragment.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.Media.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Media.Compat.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.Media.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Media.Compat.targets'))" />
<Error Condition="!Exists('..\packages\Xamarin.Android.Support.v13.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v13.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Xamarin.Android.Support.v13.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v13.targets'))" />
</Target>
<Import Project="..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Core.Common.targets" Condition="Exists('..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Core.Common.targets')" />
<Import Project="..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.0.1\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Common.targets" Condition="Exists('..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.0.1\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Common.targets')" />
<Import Project="..\packages\Xamarin.Android.Arch.Lifecycle.Runtime.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Runtime.targets" Condition="Exists('..\packages\Xamarin.Android.Arch.Lifecycle.Runtime.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Runtime.targets')" />
<Import Project="..\packages\Xamarin.Android.Support.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Compat.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Compat.targets')" />
<Import Project="..\packages\Xamarin.Android.Support.Core.UI.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.UI.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Core.UI.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.UI.targets')" />
<Import Project="..\packages\Xamarin.Android.Support.Core.Utils.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.Utils.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Core.Utils.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.Utils.targets')" />
<Import Project="..\packages\Xamarin.Android.Support.Fragment.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Fragment.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Fragment.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Fragment.targets')" />
<Import Project="..\packages\Xamarin.Android.Support.Media.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Media.Compat.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Media.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Media.Compat.targets')" />
<Import Project="..\packages\Xamarin.Android.Support.v13.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v13.targets" Condition="Exists('..\packages\Xamarin.Android.Support.v13.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v13.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.
<Target Name="BeforeBuild">

File diff suppressed because it is too large Load Diff

View File

@@ -72,8 +72,8 @@ namespace keepass2android
SearchParameters sp = SearchParameters.None;
sp.SearchInUrls = true;
sp.SearchString = url;
if(sp.RegularExpression) // Validate regular expression
if(sp.RegularExpression) // Validate regular expression
{
new Regex(sp.SearchString);
}
@@ -104,7 +104,9 @@ namespace keepass2android
if (String.IsNullOrWhiteSpace(host))
return pgResults;
foreach (PwEntry entry in database.EntriesById.Values)
{
{
if (!entry.GetSearchingEnabled())
continue;
string otherUrl = entry.Strings.ReadSafe(PwDefs.UrlField);
otherUrl = SprEngine.Compile(otherUrl, new SprContext(entry, database.KpDatabase, SprCompileFlags.References));
String otherHost = ExtractHost(otherUrl);

View File

@@ -25,9 +25,7 @@ using KeePass.Util.Spr;
using KeePassLib;
using KeePassLib.Collections;
using KeePassLib.Cryptography;
using KeePassLib.Delegates;
using KeePassLib.Security;
using KeePassLib.Utility;
namespace KeePass.Util
@@ -89,41 +87,8 @@ namespace KeePass.Util
return str;
}
*/
private static string ReplaceHmacOtpPlaceholder(string strText,
SprContext ctx)
{
PwEntry pe = ctx.Entry;
PwDatabase pd = ctx.Database;
if((pe == null) || (pd == null)) return strText;
string str = strText;
const string strHmacOtpPlh = @"{HMACOTP}";
if(str.IndexOf(strHmacOtpPlh, StrUtil.CaseIgnoreCmp) >= 0)
{
const string strKeyField = "HmacOtp-Secret";
const string strCounterField = "HmacOtp-Counter";
byte[] pbSecret = StrUtil.Utf8.GetBytes(pe.Strings.ReadSafe(
strKeyField));
string strCounter = pe.Strings.ReadSafe(strCounterField);
ulong uCounter;
ulong.TryParse(strCounter, out uCounter);
string strValue = HmacOtp.Generate(pbSecret, uCounter, 6, false, -1);
pe.Strings.Set(strCounterField, new ProtectedString(false,
(uCounter + 1).ToString()));
pd.Modified = true;
str = StrUtil.ReplaceCaseInsensitive(str, strHmacOtpPlh, strValue);
}
return str;
}
public static bool EntriesHaveSameParent(PwObjectList<PwEntry> v)
public static bool EntriesHaveSameParent(PwObjectList<PwEntry> v)
{
if(v == null) { Debug.Assert(false); return true; }
if(v.UCount == 0) return true;

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Identity.Client" publicKeyToken="0a613f4dd989e8ae" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.4.0.0" newVersion="4.4.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -31,15 +31,17 @@ namespace keepass2android
private readonly PwEntry _entry;
private readonly PwGroup _parentGroup;
private readonly Activity _ctx;
public static AddEntry GetInstance(Activity ctx, IKp2aApp app, PwEntry entry, PwGroup parentGroup, OnFinish finish) {
private readonly Database _db;
return new AddEntry(ctx, app, entry, parentGroup, finish);
public static AddEntry GetInstance(Activity ctx, IKp2aApp app, PwEntry entry, PwGroup parentGroup, OnFinish finish, Database db) {
return new AddEntry(ctx, db, app, entry, parentGroup, finish);
}
public AddEntry(Activity ctx, IKp2aApp app, PwEntry entry, PwGroup parentGroup, OnFinish finish):base(ctx, finish) {
public AddEntry(Activity ctx, Database db, IKp2aApp app, PwEntry entry, PwGroup parentGroup, OnFinish finish):base(ctx, finish) {
_ctx = ctx;
_parentGroup = parentGroup;
_db = db;
_parentGroup = parentGroup;
_app = app;
_entry = entry;
@@ -57,10 +59,13 @@ namespace keepass2android
{
_parentGroup.AddEntry(_entry, true);
}
// Commit to disk
SaveDb save = new SaveDb(_ctx, _app, _app.CurrentDb, OnFinishToRun);
// Add entry to global
_db.EntriesById[_entry.Uuid] = _entry;
_db.Elements.Add(_entry);
// Commit to disk
SaveDb save = new SaveDb(_ctx, _app, _app.CurrentDb, OnFinishToRun);
save.SetStatusLogger(StatusLogger);
save.Run();
}
@@ -86,9 +91,7 @@ namespace keepass2android
// Mark parent group dirty
_app.DirtyGroups.Add(parent);
// Add entry to global
_db.EntriesById[_entry.Uuid] = _entry;
_db.Elements.Add(_entry);
} else
{

View File

@@ -16,8 +16,8 @@ namespace keepass2android.database.edit
{
public class CopyEntry: AddEntry
{
public CopyEntry(Activity ctx, IKp2aApp app, PwEntry entry, OnFinish finish)
: base(ctx, app, CreateCopy(entry, app), entry.ParentGroup, finish)
public CopyEntry(Activity ctx, IKp2aApp app, PwEntry entry, OnFinish finish, Database db)
: base(ctx, db, app, CreateCopy(entry, app), entry.ParentGroup, finish)
{
}

View File

@@ -65,7 +65,7 @@ namespace keepass2android
_key = new CompositeKey(); //use a temporary key which should be changed after creation
}
db.KpDatabase.New(_ioc, _key);
db.KpDatabase.New(_ioc, _key, _app.GetFileStorage(_ioc).GetFilenameWithoutPathAndExt(_ioc));
db.KpDatabase.KdfParameters = (new AesKdf()).GetDefaultParameters();
db.KpDatabase.Name = "Keepass2Android Password Database";

View File

@@ -82,7 +82,7 @@ namespace keepass2android
}
//ok, try to load the database. Let's start with Kdbx format and retry later if that is the wrong guess:
_format = new KdbxDatabaseFormat(KdbpFile.GetFormatToUse(_ioc));
_format = new KdbxDatabaseFormat(KdbpFile.GetFormatToUse(_app.GetFileStorage(_ioc).GetFileExtension(_ioc)));
TryLoad(databaseStream);

View File

@@ -230,7 +230,7 @@ namespace keepass2android
PwDatabase pwImp = new PwDatabase();
PwDatabase pwDatabase = _db.KpDatabase;
pwImp.New(new IOConnectionInfo(), pwDatabase.MasterKey);
pwImp.New(new IOConnectionInfo(), pwDatabase.MasterKey, _app.GetFileStorage(ioc).GetFilenameWithoutPathAndExt(ioc));
pwImp.MemoryProtection = pwDatabase.MemoryProtection.CloneDeep();
pwImp.MasterKey = pwDatabase.MasterKey;
var stream = GetStreamForBaseFile(fileStorage, ioc);

View File

@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Xamarin.Android.Arch.Core.Common" version="1.0.0" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Arch.Lifecycle.Common" version="1.0.1" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Arch.Lifecycle.Runtime" version="1.0.0" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Support.Annotations" version="26.1.0.1" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Support.Compat" version="26.1.0.1" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Support.Core.UI" version="26.1.0.1" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Support.Core.Utils" version="26.1.0.1" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Support.Fragment" version="26.1.0.1" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Support.Media.Compat" version="26.1.0.1" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Support.v13" version="26.1.0.1" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Support.v4" version="23.1.1.0" targetFramework="MonoAndroid50" />
</packages>

View File

@@ -10,8 +10,9 @@
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<AssemblyName>Kp2aKeyboardBinding</AssemblyName>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v10.0</TargetFrameworkVersion>
<AndroidCodegenTarget>XAJavaInterop1</AndroidCodegenTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>True</DebugSymbols>

Binary file not shown.

Binary file not shown.

View File

@@ -4,19 +4,15 @@
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{2DB80C77-D46F-4970-B967-E9FFA9B2AC2E}</ProjectGuid>
<ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{10368E6C-D01B-4462-8E8B-01FC667A7035};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PCloudBindings</RootNamespace>
<AssemblyName>PCouldBindings</AssemblyName>
<FileAlignment>512</FileAlignment>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
<AndroidCodegenTarget>XAJavaInterop1</AndroidCodegenTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -26,7 +22,6 @@
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>0</WarningLevel>
<AndroidLinkMode>None</AndroidLinkMode>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
@@ -37,7 +32,6 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseNoNet|AnyCPU'">
<OutputPath>bin\ReleaseNoNet\</OutputPath>
@@ -53,27 +47,20 @@
<ItemGroup>
<Reference Include="Mono.Android" />
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Jars\AboutJars.txt" />
<None Include="Additions\AboutAdditions.txt" />
<LibraryProjectZip Include="Jars\pcloud-sdk-android-1.0.1.aar" />
<LibraryProjectZip Include="Jars\pcloud-sdk-android-1.1.0.aar" />
</ItemGroup>
<ItemGroup>
<TransformFile Include="Transforms\Metadata.xml" />
<TransformFile Include="Transforms\EnumFields.xml" />
<TransformFile Include="Transforms\EnumMethods.xml" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.Bindings.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
@@ -84,7 +71,6 @@
</Target>
-->
<ItemGroup>
<EmbeddedReferenceJar Include="Jars\pcloud-sdk-java-core-1.0.1.jar" />
<EmbeddedReferenceJar Include="Jars\pcloud-sdk-java-core-1.1.0.jar" />
</ItemGroup>
</Project>
</Project>

View File

@@ -26,5 +26,5 @@ using Android.App;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("1.1.0.0")]
[assembly: AssemblyFileVersion("1.1.0.0")]

View File

@@ -11,7 +11,8 @@
<AssemblyName>PluginSdkBinding</AssemblyName>
<FileAlignment>512</FileAlignment>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
<AndroidCodegenTarget>XAJavaInterop1</AndroidCodegenTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -53,7 +54,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<LibraryProjectZip Include="..\java\Keepass2AndroidPluginSDK2\app\build\outputs\aar\Keepass2AndroidPluginSDK2-release.aar">
<LibraryProjectZip Include="..\java\Keepass2AndroidPluginSDK2\app\build\outputs\aar\app-release.aar">
<Link>Jars\Keepass2AndroidPluginSDK2-release.aar</Link>
</LibraryProjectZip>
<None Include="Jars\AboutJars.txt" />

View File

@@ -12,8 +12,8 @@
<FileAlignment>512</FileAlignment>
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

View File

@@ -11,9 +11,9 @@
<AndroidResgenClass>Resource</AndroidResgenClass>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
<AssemblyName>ZlibAndroid</AssemblyName>
<TargetFrameworkVersion>v8.1</TargetFrameworkVersion>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

View File

@@ -1,6 +1,11 @@
#!/bin/bash
set -e
echo '*****************************************'
echo '******* Building native libraries *******'
echo '*****************************************'
./build-native.sh
echo '*****************************************'
echo '********** Building Java parts **********'
echo '*****************************************'

View File

@@ -3,6 +3,12 @@ set -e
pushd ../keepass2android
xabuild keepass2android.csproj /t:SignAndroidPackage "$@"
# check if ANDROID_HOME is defined
if [ -z ${ANDROID_HOME+x} ];
then
xabuild keepass2android.csproj /t:SignAndroidPackage "$@"
else
xabuild keepass2android.csproj /p:AndroidSdkDirectory=$ANDROID_HOME /t:SignAndroidPackage "$@"
fi
popd

View File

@@ -1,13 +1,17 @@
cd ..\java\JavaFileStorageTest-AS
call gradlew assemble
./gradlew assemble
cd ..\KP2ASoftkeyboard_AS
call gradlew assemble
./gradlew assemble
cd ..\Keepass2AndroidPluginSDK2
call gradlew assemble
./gradlew assemble
cd ..\KP2AKdbLibrary
./gradlew assemble
cd ..\PluginQR
call gradlew assemble
./gradlew assemble
cd ..\..\build-scripts

View File

@@ -1,6 +1,8 @@
#!/bin/bash
set -e
unset ANDROID_NDK_HOME ANDROID_NDK
pushd ../java/
pushd JavaFileStorageTest-AS

View File

@@ -0,0 +1,6 @@
#!/bin/bash
set -e
pushd ../java/argon2
ndk-build
popd

View File

@@ -20,6 +20,12 @@ popd
# call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86_amd64
xabuild KeePass.sln /target:keepass2android /p:BuildProjectReferences=true /p:Configuration="Debug" /p:Platform="Any CPU" "$@"
# check if ANDROID_HOME is defined
if [ -z ${ANDROID_HOME+x} ];
then
xabuild KeePass.sln /target:keepass2android /p:BuildProjectReferences=true /p:Configuration="Debug" /p:Platform="Any CPU" "$@"
else
xabuild KeePass.sln /target:keepass2android /p:AndroidSdkDirectory=$ANDROID_HOME /p:BuildProjectReferences=true /p:Configuration="Debug" /p:Platform="Any CPU" "$@"
fi
popd

View File

@@ -0,0 +1,17 @@
cd ..\java\JavaFileStorageTest-AS
./gradlew -q :app:dependencies > ../../build-scripts/dependencies-JavaFileStorageTest-AS.txt
cd ..\KP2ASoftkeyboard_AS
./gradlew -q :app:dependencies > ../../build-scripts/dependencies-KP2ASoftkeyboard_AS.txt
cd ..\Keepass2AndroidPluginSDK2
./gradlew -q :app:dependencies > ../../build-scripts/dependencies-Keepass2AndroidPluginSDK2.txt
cd ..\KP2AKdbLibrary
./gradlew -q :app:dependencies > ../../build-scripts/dependencies-KP2AKdbLibrary.txt
cd ..\PluginQR
./gradlew -q :app:dependencies > ../../build-scripts/dependencies-PluginQR.txt
cd ..\..\build-scripts

View File

@@ -43,6 +43,7 @@ build-java.bat will call gradlew for several Java modules. build-xamarin.bat wil
- Install [libzip](https://libzip.org/) for your distribution.
- Note: Xamarin seems to require `libzip4`, yet most distributions only ships `libzip5`. As a dirty workaround, it's possible to symlink `libzip.so.5` to `libzip.so.4`. Luckily, it appears to be working.
- `sudo ln -s /usr/lib/libzip.so.5 /usr/lib/libzip.so.4`
- or `sudo ln -s /usr/lib64/libzip.so.5 /usr/lib/libzip.so.4`
- Install NuGet dependencies:
- `cd src/ && nuget restore KeePass.sln`
- Build:

View File

@@ -1,11 +1,11 @@
apply plugin: 'com.android.library'
android {
compileSdkVersion 26
buildToolsVersion '26.0.2'
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
minSdkVersion 15
targetSdkVersion 23
targetSdkVersion 28
}
buildTypes {
release {
@@ -21,26 +21,27 @@ android {
}
}
/*
NOTE: If you change dependencies here, don't forget to update the jar files in JavaFileStorageBindings as well!
*/
dependencies {
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.burgstaller:okhttp-digest:1.7'
compile 'com.android.support:appcompat-v7:28.0.0'
compile 'com.squareup.okhttp3:okhttp:4.2.2'
compile 'com.burgstaller:okhttp-digest:2.0'
compile 'com.google.android.gms:play-services:4.0.30'
compile 'com.google.http-client:google-http-client-gson:1.20.0'
compile('com.google.api-client:google-api-client-android:1.16.0-rc') {
exclude group: 'com.google.android.google-play-services'
}
compile 'com.google.apis:google-api-services-drive:v2-rev102-1.16.0-rc'
compile 'com.dropbox.core:dropbox-core-sdk:3.0.3'
compile 'com.dropbox.core:dropbox-core-sdk:3.1.1'
//onedrive:
compile('com.onedrive.sdk:onedrive-sdk-android:1.2.0') {
transitive = false
}
compile 'com.pcloud.sdk:java-core:1.0.1'
compile 'com.pcloud.sdk:android:1.0.1'
compile('com.microsoft.graph:msgraph-sdk-android:1.2.+')
compile ('com.microsoft.identity.client:msal:0.1.+') {
exclude group: 'com.android.support', module: 'appcompat-v7'
}
compile 'com.pcloud.sdk:java-core:1.1.0'
compile 'com.pcloud.sdk:android:1.1.0'
compile 'com.google.code.gson:gson:2.3.1'
compile 'com.microsoft.services.msa:msa-auth:0.8.6'
compile 'com.microsoft.aad:adal:1.14.0'

View File

@@ -31,147 +31,7 @@ package com.jcraft.jsch.jgss;
import com.jcraft.jsch.JSchException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.ietf.jgss.GSSContext;
import org.ietf.jgss.GSSCredential;
import org.ietf.jgss.GSSException;
import org.ietf.jgss.GSSManager;
import org.ietf.jgss.GSSName;
import org.ietf.jgss.MessageProp;
import org.ietf.jgss.Oid;
public class GSSContextKrb5 implements com.jcraft.jsch.GSSContext{
public class GSSContextKrb5 {
private static final String pUseSubjectCredsOnly =
"javax.security.auth.useSubjectCredsOnly";
private static String useSubjectCredsOnly =
getSystemProperty(pUseSubjectCredsOnly);
private GSSContext context=null;
public void create(String user, String host) throws JSchException{
try{
// RFC 1964
Oid krb5=new Oid("1.2.840.113554.1.2.2");
// Kerberos Principal Name Form
Oid principalName=new Oid("1.2.840.113554.1.2.2.1");
GSSManager mgr=GSSManager.getInstance();
GSSCredential crd=null;
/*
try{
GSSName _user=mgr.createName(user, principalName);
crd=mgr.createCredential(_user,
GSSCredential.DEFAULT_LIFETIME,
krb5,
GSSCredential.INITIATE_ONLY);
}
catch(GSSException crdex){
}
*/
String cname=host;
try{
cname=InetAddress.getByName(cname).getCanonicalHostName();
}
catch(UnknownHostException e){
}
GSSName _host=mgr.createName("host/"+cname, principalName);
context=mgr.createContext(_host,
krb5,
crd,
GSSContext.DEFAULT_LIFETIME);
// RFC4462 3.4. GSS-API Session
//
// When calling GSS_Init_sec_context(), the client MUST set
// integ_req_flag to "true" to request that per-message integrity
// protection be supported for this context. In addition,
// deleg_req_flag MAY be set to "true" to request access delegation, if
// requested by the user.
//
// Since the user authentication process by its nature authenticates
// only the client, the setting of mutual_req_flag is not needed for
// this process. This flag SHOULD be set to "false".
// TODO: OpenSSH's sshd does accepts 'false' for mutual_req_flag
//context.requestMutualAuth(false);
context.requestMutualAuth(true);
context.requestConf(true);
context.requestInteg(true); // for MIC
context.requestCredDeleg(true);
context.requestAnonymity(false);
return;
}
catch(GSSException ex){
throw new JSchException(ex.toString());
}
}
public boolean isEstablished(){
return context.isEstablished();
}
public byte[] init(byte[] token, int s, int l) throws JSchException {
try{
// Without setting "javax.security.auth.useSubjectCredsOnly" to "false",
// Sun's JVM for Un*x will show messages to stderr in
// processing context.initSecContext().
// This hack is not thread safe ;-<.
// If that property is explicitly given as "true" or "false",
// this hack must not be invoked.
if(useSubjectCredsOnly==null){
setSystemProperty(pUseSubjectCredsOnly, "false");
}
return context.initSecContext(token, 0, l);
}
catch(GSSException ex){
throw new JSchException(ex.toString());
}
catch(java.lang.SecurityException ex){
throw new JSchException(ex.toString());
}
finally{
if(useSubjectCredsOnly==null){
// By the default, it must be "true".
setSystemProperty(pUseSubjectCredsOnly, "true");
}
}
}
public byte[] getMIC(byte[] message, int s, int l){
try{
MessageProp prop = new MessageProp(0, true);
return context.getMIC(message, s, l, prop);
}
catch(GSSException ex){
return null;
}
}
public void dispose(){
try{
context.dispose();
}
catch(GSSException ex){
}
}
private static String getSystemProperty(String key){
try{ return System.getProperty(key); }
catch(Exception e){
// We are not allowed to get the System properties.
return null;
}
}
private static void setSystemProperty(String key, String value){
try{ System.setProperty(key, value); }
catch(Exception e){
// We are not allowed to set the System properties.
}
}
}

View File

@@ -186,7 +186,8 @@ public class GoogleDriveFileStorage extends JavaFileStorageBase {
return displayName;
String[] parts = mAccountLocalPath.split("/");
if (parts.length == 0)
return "";
String part = parts[parts.length-1];
logDebug("parsing part " + part);
int indexOfSeparator = part.lastIndexOf(NAME_ID_SEP);

View File

@@ -1,486 +0,0 @@
package keepass2android.javafilestorage;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.microsoft.graph.core.ClientException;
import com.microsoft.graph.core.DefaultClientConfig;
import com.microsoft.graph.core.GraphErrorCodes;
import com.microsoft.graph.extensions.DriveItem;
import com.microsoft.graph.extensions.GraphServiceClient;
import com.microsoft.graph.extensions.IDriveItemCollectionPage;
import com.microsoft.graph.extensions.IDriveItemCollectionRequestBuilder;
import com.microsoft.graph.extensions.IDriveItemRequest;
import com.microsoft.graph.extensions.IDriveItemRequestBuilder;
import com.microsoft.graph.extensions.IGraphServiceClient;
import com.microsoft.identity.client.AuthenticationCallback;
import com.microsoft.identity.client.AuthenticationResult;
import com.microsoft.identity.client.MsalException;
import com.microsoft.identity.client.PublicClientApplication;
import com.microsoft.identity.client.User;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import keepass2android.javafilestorage.onedrive2.GraphServiceClientManager;
/**
* Created by Philipp on 20.11.2016.
*/
public class OneDriveStorage2 extends JavaFileStorageBase
{
PublicClientApplication mPublicClientApp;
final HashMap<String /*userid*/, IGraphServiceClient> mClientByUser = new HashMap<String /*userid*/, IGraphServiceClient>();
private static final String[] scopes = {"openid","offline_access", "https://graph.microsoft.com/Files.ReadWrite","https://graph.microsoft.com/User.Read"};
public OneDriveStorage2(final Activity context, final String clientId) {
mPublicClientApp = new PublicClientApplication(context, clientId);
initAuthenticator(context);
}
@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(String path) {
try {
if (tryGetMsGraphClient(path) == null)
try {
final CountDownLatch latch = new CountDownLatch(1);
Log.d("KP2AJ", "trying silent login");
String userId = extractUserId(path);
final MsalException[] _exception = {null};
final AuthenticationResult[] _result = {null};
User user = mPublicClientApp.getUser(userId);
mPublicClientApp.acquireTokenSilentAsync(scopes, user,
new AuthenticationCallback() {
@Override
public void onSuccess(AuthenticationResult authenticationResult) {
_result[0] = authenticationResult;
latch.countDown();
}
@Override
public void onError(MsalException exception) {
_exception[0] = exception;
latch.countDown();
}
@Override
public void onCancel() {
latch.countDown();
}
});
latch.await();
if (_result[0] != null) {
buildClient(_result[0]);
} else if (_exception[0] != null){
_exception[0].printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return tryGetMsGraphClient(path) != null;
}
catch (Exception e)
{
return false;
}
}
private IGraphServiceClient tryGetMsGraphClient(String path) throws Exception
{
String userId = extractUserId(path);
if (mClientByUser.containsKey(userId))
return mClientByUser.get(userId);
return null;
}
private String extractUserId(String path) throws Exception {
String pathWithoutProtocol = removeProtocol(path);
String[] parts = pathWithoutProtocol.split("/",1);
if (parts.length != 2 || ("".equals(parts[0])))
{
throw new Exception("path does not contain user");
}
return parts[0];
}
private void initAuthenticator(Activity activity) {
}
@Override
public void prepareFileUsage(FileStorageSetupInitiatorActivity activity, String path, int requestCode, boolean alwaysReturnSuccess) {
initAuthenticator((Activity)activity.getActivity());
if (isConnected(path))
{
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 IGraphServiceClient buildClient(AuthenticationResult authenticationResult) throws InterruptedException {
IGraphServiceClient newClient = new GraphServiceClient.Builder()
.fromConfig(DefaultClientConfig.createWithAuthenticationProvider(new GraphServiceClientManager(authenticationResult.getAccessToken())))
.buildClient();
mClientByUser.put(authenticationResult.getUser().getUserIdentifier(), newClient);
return newClient;
}
String removeProtocol(String path) throws Exception {
if (path == null)
return null;
return path.substring(getProtocolId().length()+3);
}
@Override
public String getDisplayName(String path) {
if (path == null)
return null;
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;
}
class ClientAndPath
{
public IGraphServiceClient client;
public String oneDrivePath;
public IDriveItemRequestBuilder getPathItem()
{
IDriveItemRequestBuilder pathItem = client.getDrive().getRoot();
if ("".equals(oneDrivePath) == false) {
pathItem = pathItem.getItemWithPath(oneDrivePath);
}
return pathItem;
}
}
@Override
public InputStream openFileForRead(String path) throws Exception {
try {
ClientAndPath clientAndpath = getOneDriveClientAndPath(path);
logDebug("openFileForRead. Path="+path);
InputStream result = clientAndpath.client.getDrive()
.getRoot()
.getItemWithPath(clientAndpath.oneDrivePath)
.getContent()
.buildRequest()
.get();
logDebug("ok");
return result;
}
catch (ClientException e)
{
throw convertException(e);
}
}
private ClientAndPath getOneDriveClientAndPath(String path) throws Exception {
ClientAndPath result = new ClientAndPath();
String pathWithoutProtocol = removeProtocol(path);
String[] parts = pathWithoutProtocol.split("/",2);
if (parts.length != 2 || ("".equals(parts[0])))
{
throw new Exception("path does not contain user");
}
result.client = mClientByUser.get(parts[0]);
result.oneDrivePath = parts[1];
return result;
}
private Exception convertException(ClientException e) {
if (e.isError(GraphErrorCodes.ItemNotFound))
return new FileNotFoundException(e.getMessage());
return e;
}
@Override
public void uploadFile(String path, byte[] data, boolean writeTransactional) throws Exception {
try {
ClientAndPath clientAndPath = getOneDriveClientAndPath(path);
clientAndPath.client.getDrive()
.getRoot()
.getItemWithPath(clientAndPath.oneDrivePath)
.getContent()
.buildRequest()
.put(data);
} catch (ClientException 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>();
ClientAndPath clientAndPath = getOneDriveClientAndPath(parentPath);
parentPath = clientAndPath.oneDrivePath;
IDriveItemCollectionPage itemsPage = clientAndPath.getPathItem()
.getChildren()
.buildRequest()
.get();
if (parentPath.endsWith("/"))
parentPath = parentPath.substring(0,parentPath.length()-1);
while (true)
{
List<DriveItem> items = itemsPage.getCurrentPage();
if (items.isEmpty())
return result;
for (DriveItem i: items)
{
FileEntry e = getFileEntry(parentPath + "/" + i.name, i);
Log.d("KP2AJ", e.path);
result.add(e);
}
IDriveItemCollectionRequestBuilder nextPageReqBuilder = itemsPage.getNextPage();
if (nextPageReqBuilder == null)
return result;
itemsPage = nextPageReqBuilder.buildRequest().get();
}
} catch (ClientException e) {
throw convertException(e);
}
}
private FileEntry getFileEntry(String path, DriveItem 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 {
ClientAndPath clientAndPath = getOneDriveClientAndPath(filename);
IDriveItemRequestBuilder pathItem = clientAndPath.getPathItem();
IDriveItemRequest request = pathItem.buildRequest();
DriveItem item = request.get();
return getFileEntry(filename, item);
} catch (ClientException e) {
throw convertException(e);
}
}
@Override
public void delete(String path) throws Exception {
try {
ClientAndPath clientAndPath = getOneDriveClientAndPath(path);
clientAndPath.client.getDrive()
.getRoot()
.getItemWithPath(clientAndPath.oneDrivePath)
.buildRequest()
.delete();
} catch (ClientException e) {
throw convertException(e);
}
}
boolean acquireTokenRunning = false;
@Override
public void onStart(final FileStorageSetupActivity activity) {
Log.d("KP2AJ", "onStart " + activity.getPath());
if (activity.getProcessName().equals(PROCESS_NAME_SELECTFILE))
activity.getState().putString(EXTRA_PATH, activity.getPath());
String userId = activity.getState().getString("OneDriveUser");
if (mClientByUser.containsKey(userId)) {
finishActivityWithSuccess(activity);
return;
}
JavaFileStorage.FileStorageSetupActivity storageSetupAct = activity;
final CountDownLatch latch = new CountDownLatch(1);
final AuthenticationResult[] _authenticationResult = {null};
MsalException _exception[] = {null};
if (!acquireTokenRunning) {
acquireTokenRunning = true;
mPublicClientApp.acquireToken((Activity) activity, scopes, new AuthenticationCallback() {
@Override
public void onSuccess(AuthenticationResult authenticationResult) {
Log.i(TAG, "authenticating successful");
try {
buildClient(authenticationResult);
} catch (InterruptedException e) {
e.printStackTrace();
}
activity.getState().putString(EXTRA_PATH, getProtocolPrefix() + authenticationResult.getUser().getUserIdentifier() + "/");
finishActivityWithSuccess(activity);
acquireTokenRunning = false;
return;
}
@Override
public void onError(MsalException exception) {
Log.i(TAG, "authenticating not successful");
Intent data = new Intent();
data.putExtra(EXTRA_ERROR_MESSAGE, "authenticating not successful");
((Activity) activity).setResult(Activity.RESULT_CANCELED, data);
((Activity) activity).finish();
acquireTokenRunning = false;
}
@Override
public void onCancel() {
Log.i(TAG, "authenticating cancelled");
Intent data = new Intent();
data.putExtra(EXTRA_ERROR_MESSAGE, "authenticating not cancelled");
((Activity) activity).setResult(Activity.RESULT_CANCELED, data);
((Activity) activity).finish();
acquireTokenRunning = false;
}
});
}
}
@Override
public void onActivityResult(FileStorageSetupActivity activity, int requestCode, int resultCode, Intent data) {
mPublicClientApp.handleInteractiveRequestRedirect(requestCode, resultCode, data);
}
}

View File

@@ -28,6 +28,7 @@ import com.pcloud.sdk.PCloudSdk;
import com.pcloud.sdk.RemoteEntry;
import com.pcloud.sdk.RemoteFile;
import com.pcloud.sdk.RemoteFolder;
import com.pcloud.sdk.UploadOptions;
/**
* FileStorage implementation for PCloud provider.
@@ -136,10 +137,10 @@ public class PCloudFileStorage extends JavaFileStorageBase
String filePath = path.substring(0, path.lastIndexOf("/") + 1);
RemoteFolder remoteFolder = this.getRemoteFolderByPath(filePath);
String tempName = "." + UUID.randomUUID().toString();
try {
RemoteFile remoteFile = this.apiClient.createFile(remoteFolder, tempName, dataSource).execute();
this.apiClient.rename(remoteFile, filename).execute();
RemoteFile remoteFile = this.apiClient.createFile(
remoteFolder, filename, dataSource, null, null, UploadOptions.OVERRIDE_FILE
).execute();
} catch (ApiError e) {
throw convertApiError(e);
}

View File

@@ -447,10 +447,20 @@ public class WebDavStorage extends JavaFileStorageBase {
if (href.endsWith("/"))
href = href.substring(0, href.length()-1);
int lastIndex = href.lastIndexOf("/");
String displayName;
if (lastIndex >= 0)
return href.substring(lastIndex + 1);
displayName = href.substring(lastIndex + 1);
else
return href;
displayName = href;
try {
displayName = java.net.URLDecoder.decode(displayName, UTF_8);
} catch (UnsupportedEncodingException e) {
}
return displayName;
}
@Override

View File

@@ -1,45 +0,0 @@
package keepass2android.javafilestorage.onedrive2;
import com.microsoft.graph.authentication.IAuthenticationProvider;
import com.microsoft.graph.core.DefaultClientConfig;
import com.microsoft.graph.core.IClientConfig;
import com.microsoft.graph.extensions.GraphServiceClient;
import com.microsoft.graph.extensions.IGraphServiceClient;
import com.microsoft.graph.http.IHttpRequest;
/**
* Singleton class that manages a GraphServiceClient object.
* It implements IAuthentication provider to authenticate requests using an access token.
*/
public class GraphServiceClientManager implements IAuthenticationProvider {
private IGraphServiceClient mGraphServiceClient;
private String mAccessToken;
public GraphServiceClientManager(String accessToken) {
mAccessToken = accessToken;
}
@Override
public void authenticateRequest(IHttpRequest request) {
try {
request.addHeader("Authorization", "Bearer " + mAccessToken);
} catch (NullPointerException e) {
e.printStackTrace();
}
}
public synchronized IGraphServiceClient getGraphServiceClient() {
return getGraphServiceClient(this);
}
public synchronized IGraphServiceClient getGraphServiceClient(IAuthenticationProvider authenticationProvider) {
if (mGraphServiceClient == null) {
IClientConfig clientConfig = DefaultClientConfig.createWithAuthenticationProvider(
authenticationProvider
);
mGraphServiceClient = new GraphServiceClient.Builder().fromConfig(clientConfig).buildClient();
}
return mGraphServiceClient;
}
}

View File

@@ -2,14 +2,19 @@
buildscript {
repositories {
jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.android.tools.build:gradle:3.3.2'
}
}
allprojects {
repositories {
jcenter()
google()
}
}

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-2.2.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip

View File

@@ -1,13 +1,13 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion '26.0.2'
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "com.crocoapps.javafilestoragetest"
minSdkVersion 21
targetSdkVersion 23
targetSdkVersion 28
versionCode 1
versionName "1.0"
multiDexEnabled true
@@ -28,7 +28,7 @@ android {
}
}
apply plugin: 'com.getkeepsafe.dexcount'
//apply plugin: 'com.getkeepsafe.dexcount'
dependencies {
compile project(':android-filechooser')

View File

@@ -8,7 +8,6 @@
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
tools:replace="android:icon"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>

View File

@@ -147,7 +147,6 @@ import java.util.List;
//import keepass2android.javafilestorage.DropboxCloudRailStorage;
import keepass2android.javafilestorage.JavaFileStorage;
import keepass2android.javafilestorage.JavaFileStorage.FileEntry;
import keepass2android.javafilestorage.OneDriveStorage2;
import keepass2android.javafilestorage.SftpStorage;
import keepass2android.javafilestorage.UserInteractionRequiredException;
import keepass2android.javafilestorage.WebDavStorage;
@@ -430,11 +429,11 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
&& (e.canWrite == file.canWrite)
&& (e.isDirectory == file.isDirectory)
&& (e.displayName.equals(file.displayName))
&& (e.sizeInBytes == file.sizeInBytes ))
&& (file.isDirectory || (e.sizeInBytes == file.sizeInBytes )))
return;
}
throw new Exception("didn't find file " + file.path + " in file list!");
throw new Exception("didn't find file " + file.path + " (" + file.displayName + ") in file list!");
}
}
@@ -535,9 +534,8 @@ public class MainActivity extends Activity implements JavaFileStorage.FileStorag
}
static JavaFileStorage createStorageToTest(Context ctx, Context appContext, boolean simulateRestart) {
//storageToTest = new SftpStorage(ctx.getApplicationContext());
storageToTest = new SftpStorage(ctx.getApplicationContext());
//storageToTest = new SkyDriveFileStorage("000000004010C234", appContext);
storageToTest = new OneDriveStorage2((Activity) ctx, "8374f801-0f55-407d-80cc-9a04fe86d9b2");
//storageToTest = new GoogleDriveFileStorage();

View File

@@ -9,11 +9,11 @@ buildscript {
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.android.tools.build:gradle:3.3.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.7.1'
//classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.7.1'
}
}

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-4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

View File

@@ -1,5 +0,0 @@
build.properties
local.properties
bin
gen
obj

View File

@@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>KP2AKdbLibrary</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@@ -1,4 +0,0 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.source=1.6

View File

@@ -1,339 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program 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 2 of the License, or
(at your option) any later version.
This program 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 this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@@ -1,306 +0,0 @@
---
The KeePass icon was created by Francis Jacquerye and is licensed under the terms of the GPLv2 or GPLv3.
---
Files under src/org/apache/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
---
Files under src/org/bouncycaste1x/*:
Copyright (c) 2000 - 2008 The Legion Of The Bouncy Castle
(http://www.bouncycastle.org)
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
---
Files under src/org/phoneid/*:
KeePass for J2ME
Copyright 2007 Naomaru Itoi <nao@phoneid.org>
This file was derived from
Java clone of KeePass - A KeePass file viewer for Java
Copyright 2006 Bill Zwicky <billzwicky@users.sourceforge.net>
This program 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; version 2
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
---
Files under src/com/android/keepass/* :
Copyright 2009 Brian Pellin <bpellin@gmail.com>.
This program 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 2 of the License, or
(at your option) any later version.
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
---
Files under jni/openssl-0.98l/*:
/* ====================================================================
* Copyright (c) 1998-2008 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* openssl-core@openssl.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
---
Files under biz.source_code.base64Coder
// Copyright 2003-2010 Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland
// www.source-code.biz, www.inventec.ch/chdh
//
// This module is multi-licensed and may be used under the terms
// of any of the following licenses:
//
// EPL, Eclipse Public License, http://www.eclipse.org/legal
// LGPL, GNU Lesser General Public License, http://www.gnu.org/licenses/lgpl.html
// AL, Apache License, http://www.apache.org/licenses
// BSD, BSD License, http://www.opensource.org/licenses/bsd-license.php
//
// Please contact the author if you need another license.
// This module is provided "as is", without warranties of any kind.
---
Files ic00.png to ic61.png under res/drawable, res/drawable-hdpi and res/drawable-ldpi
TITLE: NUVOLA ICON THEME for KDE 3.x
AUTHOR: David Vignoni | ICON KING
SITE: http://www.icon-king.com
MAILING LIST: http://mail.icon-king.com/mailman/listinfo/nuvola_icon-king.com
Copyright (c) 2003-2004 David Vignoni.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation,
version 2.1 of the License.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library (see the the license.txt file); if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#######**** NOTE THIS ADD-ON ****#######
The GNU Lesser General Public License or LGPL is written for software libraries
in the first place. The LGPL has to be considered valid for this artwork
library too.
Nuvola icon theme for KDE 3.x is a special kind of software library, it is an
artwork library, it's elements can be used in a Graphical User Interface, or
GUI.
Source code, for this library means:
- raster png image* .
The LGPL in some sections obliges you to make the files carry
notices. With images this is in some cases impossible or hardly usefull.
With this library a notice is placed at a prominent place in the directory
containing the elements. You may follow this practice.
The exception in section 6 of the GNU Lesser General Public License covers
the use of elements of this art library in a GUI.
dave [at] icon-king.com
Date: 15 october 2004
Version: 1.0
DESCRIPTION:
Icon theme for KDE 3.x.
Icons where designed using Adobe Illustrator, and then exported to PNG format.
Icons shadows and minor corrections were done using Adobe Photoshop.
Kiconedit was used to correct some 16x16 and 22x22 icons.
LICENSE
Released under GNU Lesser General Public License (LGPL)
Look at the license.txt file.
CONTACT
David Vignoni
e-mail : david [at] icon-king.com
ICQ : 117761009
http: http://www.icon-king.com
---
Files ic62.png under res/drawable, res/drawable-hdpi and res/drawable-ldpi
Based on http://de.wikipedia.org/w/index.php?title=Datei:Tux.svg&filetimestamp=20090927073505
The copyright holder of this file allows anyone to use it for any purpose,
provided that the copyright holders Larry Ewing, Simon Budig and
Anja Gerwinski are mentioned.
---
Files ic63.png under res/drawable, res/drawable-hdpi and res/drawable-ldpi
Based on http://en.wikipedia.org/wiki/File:ASF-logo.svg
Apache logo
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. You may
obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations under
the License.
---
Files ic64.png under res/drawable, res/drawable-hdpi and res/drawable-ldpi
!!! Not included yet !!!
---
Files ic65.png, ic67.png and ic68.png under res/drawable, res/drawable-hdpi and res/drawable-ldpi
Created by Tobias Selig and licensed under the terms of the GPLv2 or GPLv3.
---
File ic66.png under under res/drawable, res/drawable-hdpi and res/drawable-ldpi
Based on http://commons.wikimedia.org/wiki/File:Dollar_symbol_gold.svg
Author: Rugby471
Permission is granted to copy, distribute and/or modify this document under
the terms of the GNU Free Documentation License, Version 1.2 or any later
version published by the Free Software Foundation; with no Invariant Sections,
no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is
included in the section entitled "GNU Free Documentation License".
---
Many files under jni/final_key/ are coverage by the following license:
Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved.
LICENSE TERMS
The redistribution and use of this software (with or without changes)
is allowed without the payment of fees or royalties provided that:
1. source code distributions include the above copyright notice, this
list of conditions and the following disclaimer;
2. binary distributions include the above copyright notice, this list
of conditions and the following disclaimer in their documentation;
3. the name of the copyright holder is not used to endorse products
built using this software without specific written permission.
DISCLAIMER
This software is provided 'as is' with no explicit or implied warranties
in respect of its properties, including, but not limited to, correctness
and/or fitness for purpose.

View File

@@ -1 +0,0 @@
Created by extracting parts of Keepassdroid

View File

@@ -0,0 +1,25 @@
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion '28.0.3'
defaultConfig {
ndk.abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
}

View File

@@ -3,12 +3,8 @@
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true">
<application>
</application>
</manifest>

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