Compare commits

...

1082 Commits

Author SHA1 Message Date
J-Jamet
c2781af38d Merge branch 'release/2.5.0.0beta21' 2019-08-18 19:18:27 +02:00
J-Jamet
a1cd2683d4 Fix small views issues 2019-08-18 18:31:14 +02:00
J-Jamet
6d671f53c2 Fix content_description and translation 2019-08-18 17:48:21 +02:00
J-Jamet
4efb81f597 Fix translations 2019-08-18 17:11:19 +02:00
J-Jamet
faddeb6e2d Fix for entry duplicate and import 2019-08-18 16:47:02 +02:00
J-Jamet
e36629968d Fix edit group #296 2019-08-18 15:07:32 +02:00
J-Jamet
0b756797f6 Fix entry number size 2019-08-18 14:55:22 +02:00
J-Jamet
110c7bbbc7 Upgrade CHANGELOG 2019-08-18 14:46:00 +02:00
J-Jamet
639c6dc4ac Add number of entries in node view 2019-08-18 14:43:05 +02:00
J-Jamet
f605d36adf Remove TODO sort 2019-08-18 14:17:04 +02:00
J-Jamet
f6d6c134f4 Fix colorTextInverse 2019-08-18 14:12:31 +02:00
J-Jamet
a0c07654df Update CHANGELOGS 2019-08-18 11:14:07 +02:00
J-Jamet
03ab688abe Fix bug open button disabled with only keyFile #295 2019-08-18 11:10:07 +02:00
J-Jamet
4a28802b02 Add RecycleBin at Bottom sort option 2019-08-17 17:11:06 +02:00
J-Jamet
18f8fe7cc3 Upgrade CHANGELOG 2019-08-17 16:36:45 +02:00
J-Jamet
459606f5d5 Fix sort for natural database 2019-08-17 16:34:56 +02:00
J-Jamet
3d53c31680 Better sort implementation 2019-08-17 15:15:21 +02:00
J-Jamet
173dd5b59b Add natural database sort 2019-08-17 14:29:18 +02:00
J-Jamet
8536de3555 Remove email (no more code) 2019-08-17 13:21:48 +02:00
J-Jamet
722ba5c34d Move construct tree methods in Importer 2019-08-17 13:20:53 +02:00
J-Jamet
3ccfd7226b Upgrade to version 2.5.0.0beta21 and fix nested groups in v1 #292 2019-08-17 12:58:11 +02:00
J-Jamet
578da7bae5 Fix copy_field error 2019-08-16 21:01:06 +02:00
J-Jamet
6916389657 Merge tag '2.5.0.0beta20' into develop
2.5.0.0beta20
2019-08-16 20:34:23 +02:00
J-Jamet
da4f41732a Merge branch 'release/2.5.0.0beta20' 2019-08-16 20:34:13 +02:00
J-Jamet
0414adf5de Add changelog 2019-08-16 19:17:59 +02:00
J-Jamet
d9b2942f66 Fix Entry information is not correct #286 2019-08-16 19:08:59 +02:00
J-Jamet
cbe7907b07 Upgrade version to 2.5.0.0beta20 2019-08-16 18:41:24 +02:00
J-Jamet
3989ca3ad1 Merge tag '2.5.0.0beta19' into develop
2.5.0.0beta19
2019-08-14 19:26:04 +02:00
J-Jamet
977782a9f7 Merge branch 'release/2.5.0.0beta19' 2019-08-14 19:25:54 +02:00
J-Jamet
f100dda20b Fix icon resolution 2019-08-14 18:34:01 +02:00
J-Jamet
9c0a140a17 Change small code 2019-08-14 14:35:26 +02:00
J-Jamet
b4bcaf54ad Change small code 2019-08-14 14:32:57 +02:00
J-Jamet
82c0ca0f3c Kotlinized KDF 2019-08-14 14:08:03 +02:00
J-Jamet
bfbd81e3ee Better key retrieve code 2019-08-14 14:00:08 +02:00
J-Jamet
67fecf3fef Remove sound and vibration for notification 2019-08-14 10:41:12 +02:00
J-Jamet
c65d96802e Add clipboard clear at closing dependency 2019-08-14 09:23:29 +02:00
J-Jamet
64af8ddc2e Remove Request Focus 2019-08-13 19:49:14 +02:00
J-Jamet
732f472146 Fix warnings 2019-08-13 19:33:57 +02:00
J-Jamet
6dc46604a4 Add execution to gradlew 2019-08-13 19:18:46 +02:00
J-Jamet
f0c3071de1 Merge branch 'master' of https://hosted.weblate.org/projects/keepass-dx/strings into translation 2019-08-13 19:17:43 +02:00
J-Jamet
b250ad2f8b Upgrade CHANGELOG 2019-08-13 17:41:46 +02:00
J-Jamet
69390a81ab Fix lock with back button 2019-08-13 17:22:57 +02:00
J-Jamet
c398b92eb1 Encapsulate DatabaseTaskNotification 2019-08-13 17:12:35 +02:00
J-Jamet
3018206e2f New icons for notifications 2019-08-13 16:54:36 +02:00
J-Jamet
811d0f2534 Change default value for timeout 2019-08-13 16:17:10 +02:00
J-Jamet
2b33d785ac Add clear database option when close clipboard notification 2019-08-13 16:06:30 +02:00
J-Jamet
c7a8322c5d Change inputText importance for accessibility and autofill 2019-08-13 15:26:46 +02:00
J-Jamet
37e722847a Fix color style and remove colorAccentCompat 2019-08-13 14:19:13 +02:00
J-Jamet
4aa8d892a4 Fix small button color in API 21 2019-08-13 13:41:05 +02:00
J-Jamet
e164062cf3 Remove menu in selection mode 2019-08-13 13:27:09 +02:00
J-Jamet
935d3e1c4b Better notification implementation 2019-08-13 12:36:58 +02:00
J-Jamet
17eadcee2b Better notification implementation 2019-08-13 11:33:42 +02:00
J-Jamet
5ffbe0e9ee New Magikeyboard notification flow #182 2019-08-12 19:37:34 +02:00
J-Jamet
4c3da45141 Fix lock with magikeyboard 2019-08-12 15:28:07 +02:00
J-Jamet
c516ef7c28 Fix remove entry in Magikeyboard when lock in database performed 2019-08-12 14:55:51 +02:00
J-Jamet
dcf654cf0a Add entry title in Magikeyboard 2019-08-12 14:05:23 +02:00
J-Jamet
23f2e5decc Better Magikeyboard buttons width 2019-08-12 13:23:45 +02:00
J-Jamet
ddbf03bc91 Better button style 2019-08-12 12:33:35 +02:00
J-Jamet
94070ea5e0 Fix destroy Magikeyboard service when lock activity 2019-08-12 11:24:21 +02:00
J-Jamet
725d39626f Fix clear data when opening database #285 2019-08-12 11:01:38 +02:00
Zhai2333
25655abbbb Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/
2019-08-11 16:23:55 +02:00
Zhai2333
60bee79bc5 Translated using Weblate (Chinese (Traditional))
Currently translated at 23.8% (82 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hant/
2019-08-11 16:23:55 +02:00
C. Rüdinger
8f9d278d2f Translated using Weblate (German)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2019-08-11 16:23:54 +02:00
CurlingTongs
dc120135b1 Translated using Weblate (German)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2019-08-11 16:23:53 +02:00
J-Jamet
d2f56e7472 Retrieve database with a singleton 2019-08-09 23:29:28 +02:00
J-Jamet
3877e1aa22 Update description 2019-08-09 16:27:12 +02:00
J-Jamet
e08e5eca3a Fix entries search 2019-08-09 16:18:56 +02:00
J-Jamet
7321cc067f Fix app:theme deprecation 2019-08-07 14:00:56 +02:00
J-Jamet
43f14e1474 Fix style for pre lollipop devices 2019-08-07 13:50:42 +02:00
J-Jamet
ced6a77819 Add handler to fix password freeze #226 2019-08-07 11:27:11 +02:00
J-Jamet
bca777a97e Rename FingerPrintViewsManager 2019-08-07 11:05:16 +02:00
J-Jamet
5b98129da9 Fix fingerprint 2019-08-07 11:00:13 +02:00
J-Jamet
dc37ab74c1 Fix fingerprint 2019-08-07 10:57:35 +02:00
J-Jamet
ee76a35728 Fix fingerprint 2019-08-07 10:56:04 +02:00
J-Jamet
e31ea8c916 Better fingerprint version code 2019-08-06 20:22:49 +02:00
J-Jamet
41561cb7b6 Add comment fingerprint 2019-08-06 19:41:08 +02:00
J-Jamet
0c8fdca6f3 Fix assist structure for old device 2019-08-06 19:23:20 +02:00
J-Jamet
a50626dafb Encapsulate Fingerprint methods 2019-08-06 19:07:44 +02:00
J-Jamet
ca55081437 Better focus and revert hide credential view 2019-08-06 14:11:52 +02:00
J-Jamet
5cd66d074e Fix layout scroll and landscape for tablet 2019-08-06 12:55:52 +02:00
J-Jamet
9529e3a7ba Better entry top view 2019-08-06 12:14:29 +02:00
J-Jamet
d3e2668d85 Add Hindi source file 2019-08-06 11:54:18 +02:00
J-Jamet
b3b2bb90e1 Setting to delete the password entered after a connection attempt #214 2019-08-06 11:49:06 +02:00
J-Jamet
9c597665bf Hide credentials when opening database #250 2019-08-06 11:00:35 +02:00
J-Jamet
a845436af4 Fix small visual bug 2019-08-05 18:23:13 +02:00
J-Jamet
cabd487fa5 Adjust resize to save form 2019-08-05 18:18:55 +02:00
J-Jamet
9c7c43e7da Move change master key menu in Settings 2019-08-05 18:03:58 +02:00
J-Jamet
0c421c4906 Close button in edit activity 2019-08-05 17:27:03 +02:00
J-Jamet
4df8880b0d Fix classic icon view 2019-08-05 17:21:30 +02:00
J-Jamet
45046ee01a Fix icon cache density issue 2019-08-05 16:43:32 +02:00
J-Jamet
2ff6522b60 Fix visual bug 2019-08-05 16:05:53 +02:00
J-Jamet
ee8c589ea3 Fix extra card view 2019-08-05 13:30:14 +02:00
J-Jamet
b31d40dbb6 Better entry views 2019-08-05 13:24:04 +02:00
J-Jamet
970b966bcb Collapsing Toolbar for entry activity 2019-08-05 12:25:48 +02:00
J-Jamet
6f1dc14bdc Rename layout for better visibility 2019-08-05 09:49:58 +02:00
J-Jamet
949e6f247d Change copying notification priority #281 and fix never timeout 2019-08-03 14:17:58 +02:00
J-Jamet
77a848cf0e Fira mono font #223 2019-08-03 12:00:49 +02:00
J-Jamet
21e268b8c2 Merge branch 'feature/Refactor_Kotlin' into develop 2019-08-02 20:55:47 +02:00
J-Jamet
580c761fa0 New icon selection style and fix views 2019-08-02 20:51:17 +02:00
Ldm Public
e13b12550c Translated using Weblate (French)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2019-08-02 19:12:28 +02:00
J-Jamet
05dc421ea8 Fix orientation change entry with many bugs #228 2019-08-02 14:59:59 +02:00
Allan Nordhøy
423957d023 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb_NO/
2019-08-01 07:14:11 +02:00
bluepencil
c3b584973b Translated using Weblate (Korean)
Currently translated at 43.8% (151 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ko/
2019-08-01 07:14:10 +02:00
Marco Scaglioni
74e1805970 Translated using Weblate (Italian)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2019-08-01 07:14:02 +02:00
Wilker Santana da Silva
e2743e2c61 Translated using Weblate (English)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/en/
2019-08-01 07:14:02 +02:00
mondstern
59f0b90c72 Translated using Weblate (German)
Currently translated at 99.7% (344 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2019-08-01 07:14:01 +02:00
Wilker Santana da Silva
c962096fd5 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_BR/
2019-08-01 07:14:01 +02:00
Mesut Akcan
d9aa9f6cb3 Translated using Weblate (Turkish)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2019-08-01 07:13:53 +02:00
J-Jamet
874e422dbc Add vertical padding to autofill label #262 2019-07-31 15:31:39 +02:00
J-Jamet
63c825c056 Fix modify entry with no parent 2019-07-31 15:20:42 +02:00
J-Jamet
b507fa2a09 Fix long press magikeyboard 2019-07-31 14:54:20 +02:00
J-Jamet
eb2040edbd Fix ref autofill #274 2019-07-31 14:49:16 +02:00
J-Jamet
02ba1dabe7 Fix ref keyboard form field #274 2019-07-31 14:34:18 +02:00
J-Jamet
03494d78a5 Fix dialog preference description 2019-07-31 13:49:30 +02:00
J-Jamet
b598945903 Fix orientation change dimension 2019-07-31 12:19:01 +02:00
J-Jamet
8bf017e14e Allow no password default false 2019-07-30 09:51:57 +02:00
J-Jamet
00e4d77503 Fix crash during swipe keyboard notification #258 2019-07-29 21:55:05 +02:00
J-Jamet
e6efdadb6f Fix Autofill layout background #238 2019-07-29 21:41:18 +02:00
J-Jamet
02a8e7ea75 Fix Autofill setting 2019-07-29 21:02:43 +02:00
J-Jamet
dc9b7591a0 Update CHANGELOG 2019-07-29 20:26:53 +02:00
J-Jamet
7ae0d329e1 Fix bad base64 decoder implementation #222 #140 2019-07-29 20:23:52 +02:00
J-Jamet
bff9ec86ff Change layout to better visibility in landscape mode 2019-07-29 17:35:56 +02:00
J-Jamet
f445fbca3d Merge branch 'feature/Refactor_Kotlin' of github.com:Kunzisoft/KeePassDX into feature/Refactor_Kotlin 2019-07-27 09:35:42 +02:00
J-Jamet
9079ce30a0 Fix preference 2019-07-26 18:21:54 +02:00
J-Jamet
2202f718b9 Add database task notification 2019-07-26 17:08:05 +02:00
J-Jamet
63b80634c2 Fix lock timeout 2019-07-26 11:22:23 +02:00
J-Jamet
9bbfeaba72 Better database creation runnable 2019-07-25 15:23:04 +02:00
J-Jamet
2d640dbe62 Fix database creation index 2019-07-25 14:50:51 +02:00
J-Jamet
2ce3fc3bd6 Fix first Recycle Bin creation 2019-07-24 21:23:43 +02:00
J-Jamet
009710f854 Upgrade CHANGELOG 2019-07-24 16:53:21 +02:00
J-Jamet
7eeff1b50a Add default Recycle Bin name as string resource 2019-07-24 16:49:18 +02:00
J-Jamet
6f736d6415 Better index action implementation 2019-07-24 16:37:24 +02:00
J-Jamet
3dc988dd08 Fix recycleBin 2019-07-24 15:55:52 +02:00
Deleted User
ca292fbb85 Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb_NO/
2019-07-23 19:31:06 +02:00
J-Jamet
53a3fe83cb Fix small code 2019-07-22 13:57:32 +02:00
J-Jamet
d667940157 Fix password encoding 2019-07-22 13:54:58 +02:00
J-Jamet
404fb9b39f Change licence in XML and .kt files 2019-07-22 11:53:12 +02:00
J-Jamet
d1c4bdb8eb Kotlinized V4 XML class 2019-07-22 11:49:49 +02:00
J-Jamet
7b67e4e811 Fix search 2019-07-22 11:26:47 +02:00
J-Jamet
2b387c8613 Fix list rebuild and add button animation 2019-07-20 01:25:19 +02:00
J-Jamet
c7f6cb6747 Fix remove crash 2019-07-20 01:20:19 +02:00
J-Jamet
5e5dc58482 Fix warning 2019-07-20 00:18:13 +02:00
J-Jamet
80d0510b86 Refactor util 2019-07-20 00:03:03 +02:00
J-Jamet
fcd3f7c3fe Refactorize uri util 2019-07-19 23:36:36 +02:00
J-Jamet
38abb9ca49 Refactorize string util 2019-07-19 21:57:50 +02:00
J-Jamet
c47834f470 Fix small crypto code 2019-07-19 19:15:33 +02:00
J-Jamet
b899212d14 Fix small crypto code 2019-07-19 19:06:34 +02:00
J-Jamet
5a11e47653 Fix small crypto code 2019-07-19 18:46:11 +02:00
J-Jamet
d0faf0f1b6 Fix small dialog code 2019-07-19 18:41:53 +02:00
J-Jamet
27de6b456b Kotlinized Stylish 2019-07-19 17:59:29 +02:00
J-Jamet
92f6684ca9 Fix education add button 2019-07-19 16:10:45 +02:00
J-Jamet
59c45f5627 Kotlinized icons 2019-07-19 16:03:40 +02:00
Ldm Public
35c2075f73 Translated using Weblate (French)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2019-07-18 23:05:52 +02:00
J-Jamet
4b659248f7 Kotlinized Magikeyboard 2019-07-18 21:05:29 +02:00
J-Jamet
3d01e09198 Kotlinized Notification 2019-07-18 19:44:13 +02:00
J-Jamet
a7805d9d4c Kotlinized Password Generator 2019-07-18 18:40:01 +02:00
J-Jamet
2439c0e7cd Kotlinized Preference 2019-07-18 18:19:03 +02:00
J-Jamet
67f99a4430 Kotlinized Fingerprint 2019-07-18 18:00:59 +02:00
J-Jamet
0a8c7700dc Kotlinized views 2019-07-18 16:55:02 +02:00
Mattéo Rossillol‑‑Laruelle
68ca17a0da Translated using Weblate (French)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2019-07-17 22:28:41 +02:00
J-Jamet
dcc7c4d39e Kotlinized preference 2019-07-17 22:20:07 +02:00
J-Jamet
06fcbf8995 Kotlinized preference dialog fragment and fix result action runnable 2019-07-17 20:46:22 +02:00
J-Jamet
a939d06f77 Kotlinized crypto engine 2019-07-17 16:19:24 +02:00
bluepencil
11e342ae19 Translated using Weblate (Korean)
Currently translated at 0.9% (3 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ko/
2019-07-16 18:25:04 +02:00
J-Jamet
5ac40d13a5 Change Readme.md year 2019-07-16 16:36:21 +02:00
J-Jamet
1dea366cec Fix translation 2019-07-16 15:49:15 +02:00
J-Jamet
7e5ae5a8af Fix small code 2019-07-16 12:22:49 +02:00
bluepencil
4e430b2fd4 Added translation using Weblate (Korean) 2019-07-16 04:20:19 +02:00
Júlio Costa
d61c345630 Translated using Weblate (Portuguese (Brazil))
Currently translated at 45.2% (156 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_BR/
2019-07-15 20:02:57 +02:00
J-Jamet
0c7aa3fad2 Merge branch 'feature/Refactor_Kotlin' of github.com:Kunzisoft/KeePassDX into feature/Refactor_Kotlin 2019-07-14 17:03:44 +02:00
J-Jamet
8de7e4a326 Upgrade CHANGELOG 2019-07-14 14:02:53 +02:00
J-Jamet
4fd5d72d97 Better ProgressDialog implementation 2019-07-13 19:51:52 +02:00
J-Jamet
d08d2552aa Update Gradle 2019-07-13 16:38:47 +02:00
J-Jamet
6b6968cbbe Update Gradle 2019-07-13 15:38:47 +02:00
Thomas johansen
49157a38ae Translated using Weblate (Norwegian Bokmål)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb_NO/
2019-07-12 21:01:58 +02:00
J-Jamet
402a0d3e43 Kotlinized Fragments 2019-07-11 15:45:05 +02:00
J-Jamet
5cd8cbd514 Fix PwGroupV3 and PwEntryV3 2019-07-11 14:51:20 +02:00
J-Jamet
32537e85a2 Move classes 2019-07-11 13:54:18 +02:00
J-Jamet
d937ca85a2 Kotlinized fragments 2019-07-10 23:37:40 +02:00
J-Jamet
6a5ed7f460 Fix kotlin null crash 2019-07-10 19:10:59 +02:00
J-Jamet
a158e96ba6 Refactor BasicViewHolder 2019-07-10 17:59:59 +02:00
J-Jamet
7ad43dbed7 Kotlinized Activities 2019-07-10 17:47:06 +02:00
J-Jamet
63f261f169 Fix add new entry 2019-07-09 17:12:00 +02:00
J-Jamet
f36849e815 Kotlinized Autofill and BackupAgent 2019-07-07 21:39:27 +02:00
J-Jamet
b0bc0f9d85 Kotlinized Adapters and fix StyledAttributes 2019-07-07 20:53:08 +02:00
J-Jamet
cd271e6f04 Kotlinized ListNodesFragment 2019-07-07 20:22:06 +02:00
J-Jamet
d6bac74e1b Kotlinized GroupActivity 2019-07-07 20:01:17 +02:00
J-Jamet
eda7fa0fe7 Fix NodeHandler parameter 2019-07-07 18:49:37 +02:00
J-Jamet
191e0cc654 Kotlinized EntryEditActivity 2019-07-07 18:48:56 +02:00
J-Jamet
cc35a1e8aa Fix deprecated buttons 2019-07-07 18:47:32 +02:00
J-Jamet
7dfe85450d Kotlinized EntryActivity 2019-07-07 16:37:57 +02:00
J-Jamet
e8b341c69f Refactor Education 2019-07-07 15:23:47 +02:00
J-Jamet
77c397e0d1 Fix small bugs 2019-07-04 19:10:33 +02:00
J-Jamet
15794f09c3 Move database history in singleton 2019-07-04 19:04:42 +02:00
J-Jamet
cdf8baeb10 Kotlinized PwDate 2019-07-04 15:25:47 +02:00
J-Jamet
e4b550afc1 4 spaces files harmonisation #184 2019-07-04 14:34:06 +02:00
WaldiS
49bb34b742 Translated using Weblate (Polish)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pl/
2019-07-04 12:02:05 +02:00
C. Rüdinger
ab01d01fce Translated using Weblate (German)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2019-06-29 20:02:47 +02:00
Allan Nordhøy
4905c262ba Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.7% (344 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb_NO/
2019-06-28 15:02:12 +02:00
Allan Nordhøy
ce05bb467e Translated using Weblate (English)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/en/
2019-06-28 15:02:12 +02:00
CurlingTongs
8f0fe89579 Translated using Weblate (German)
Currently translated at 99.7% (344 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2019-06-28 15:02:11 +02:00
Noel
23bd6e20a4 Translated using Weblate (Spanish)
Currently translated at 49.0% (169 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2019-06-24 17:01:43 +02:00
Yaron Shahrabani
3f0071ac58 Translated using Weblate (Hebrew)
Currently translated at 21.2% (73 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/he/
2019-06-18 21:05:56 +02:00
GiulioEl
776660923b Translated using Weblate (Italian)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2019-06-15 09:40:31 +02:00
J-Jamet
32f170f644 Remove unused import 2019-06-10 14:40:08 +02:00
J-Jamet
93222990b5 Kotlinized database package 2019-06-02 16:10:57 +02:00
J-Jamet
8890296beb Kotlinized importers 2019-06-02 14:04:36 +02:00
J-Jamet
9907af8135 Kotlinized many classes 2019-06-02 13:36:05 +02:00
J-Jamet
17ec357c1b Kotlinized PwNode PwEntry PwGroup 2019-06-02 02:41:51 +02:00
J-Jamet
575e967627 Kotlinized PwNode 2019-06-01 15:01:02 +02:00
J-Jamet
0b53e84761 Kotlinized small code 2019-06-01 13:58:41 +02:00
J-Jamet
fadf78aabd Remove PwVersion 2019-06-01 13:51:03 +02:00
J-Jamet
47fce14d16 Kotlinized PwIcon 2019-06-01 13:47:44 +02:00
J-Jamet
149b6fbcd4 Kotlinized PwNodeId 2019-06-01 13:12:51 +02:00
J-Jamet
e649be230e Remove clone 2019-06-01 12:58:28 +02:00
J-Jamet
6ba45c3d87 Better search implementation, kotlinize, start remove clone 2019-06-01 12:34:06 +02:00
J-Jamet
0e701189a3 Fix search 2019-06-01 11:10:42 +02:00
J-Jamet
af316607e1 Fix copy and clone 2019-05-30 21:11:33 +02:00
Allan Nordhøy
548039c66f Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.1% (342 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb_NO/
2019-05-16 17:49:10 +02:00
J-Jamet
e75a2502d1 Better index implementation 2019-05-10 00:39:31 +02:00
J-Jamet
6be2148951 Fix opening bugs 2019-05-09 23:41:26 +02:00
ButterflyOfFire
f149688da6 Translated using Weblate (Arabic)
Currently translated at 71.0% (245 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ar/
2019-05-07 12:49:02 +02:00
J-Jamet
8f77e5874e Refactor database import 2019-05-03 18:33:23 +02:00
J-Jamet
eabd2d3e4c Refactor 2019-05-03 17:15:53 +02:00
J-Jamet
e460a4fe4f Refactor database import 2019-04-24 21:40:28 +02:00
J-Jamet
9e79da0efc Refactor database elements 2019-04-24 20:38:13 +02:00
Tobias Johansson
6851d4a1d3 Translated using Weblate (Swedish)
Currently translated at 21.2% (73 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sv/
2019-04-18 15:05:18 +02:00
J-Jamet
5705d367ed Fix UI thread for ProgressDialogFragment 2019-04-13 18:03:31 +02:00
J-Jamet
d1f88112ce Finish database encapsulation 2019-04-12 22:22:17 +02:00
J-Jamet
eba1dbc8fa Move touch, fix tree construction, refactor getPwDatabase 2019-04-12 21:46:40 +02:00
J-Jamet
dcb819b087 Fix display message Toast bug 2019-04-12 19:19:13 +02:00
J-Jamet
25ced826c4 Refactor tree perform (to debug) 2019-04-12 17:56:07 +02:00
Noel
5a30c3219e Translated using Weblate (Spanish)
Currently translated at 48.4% (167 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2019-04-04 22:04:43 +02:00
Noel
6a5ac3729d Translated using Weblate (German)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2019-04-04 22:04:39 +02:00
Ldm Public
31326224ac Translated using Weblate (French)
Currently translated at 99.7% (344 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2019-04-04 22:04:38 +02:00
Semen Turchikhin
811a44574a Translated using Weblate (Russian)
Currently translated at 64.1% (221 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/
2019-03-26 05:34:41 +01:00
aasami
6782442d8e Translated using Weblate (Slovak)
Currently translated at 25.2% (87 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sk/
2019-03-25 15:38:42 +01:00
J-Jamet
a376d2f286 Refactor Entry and Group 2019-03-21 17:58:08 +01:00
Rui Mendes
ce3e1c86bc Translated using Weblate (Portuguese (Portugal))
Currently translated at 45.5% (157 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_PT/
2019-03-21 15:03:56 +01:00
J-Jamet
20f7675135 Refactor database elements (In PROGRESS) 2019-03-15 16:48:59 +01:00
J-Jamet
dad3edee5e Refactor database elements 2019-03-15 10:58:04 +01:00
J-Jamet
1bfdae53c6 Add a warning message in save progress dialog 2019-03-14 18:16:49 +01:00
J-Jamet
e5902b9cf6 First refactoring pass 2019-03-14 18:00:09 +01:00
George
88829ca91a Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/
2019-03-12 13:03:54 +01:00
abidin toumi
4bdf99b2f4 Translated using Weblate (Arabic)
Currently translated at 66.1% (228 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ar/
2019-03-12 13:03:51 +01:00
George
54883bb043 Translated using Weblate (Chinese (Simplified))
Currently translated at 84.6% (292 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/
2019-03-10 15:03:36 +01:00
abidin toumi
6db55b5eaa Translated using Weblate (Arabic)
Currently translated at 49.9% (172 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ar/
2019-03-09 12:03:40 +01:00
Ldm Public
821dc6df63 Translated using Weblate (French)
Currently translated at 99.7% (344 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2019-03-07 17:03:35 +01:00
George
8de86e26d6 Translated using Weblate (Chinese (Simplified))
Currently translated at 83.8% (289 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/
2019-03-07 17:03:35 +01:00
WaldiS
1cf8b1fc7d Translated using Weblate (Polish)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pl/
2019-03-04 15:58:02 +01:00
Nils B
f469fa224e Translated using Weblate (German)
Currently translated at 99.7% (344 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2019-03-04 15:58:01 +01:00
George
56912ddaf7 Translated using Weblate (Chinese (Simplified))
Currently translated at 71.3% (246 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/
2019-03-04 15:58:00 +01:00
J-Jamet
620b1b4f02 Refactor database runnable and prevent activity to be closed during saving 2019-02-28 16:34:25 +01:00
J-Jamet
2208c67b62 Fix renaming groups #194 2019-02-28 10:46:35 +01:00
abvgeej
6f6b53ff73 Translated using Weblate (Russian)
Currently translated at 64.1% (221 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/
2019-02-26 11:18:17 +01:00
jan madsen
529197fb7d Translated using Weblate (Danish)
Currently translated at 98.6% (340 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/da/
2019-02-26 11:18:14 +01:00
J-Jamet
953e63f55d Add selection mode and fix read only 2019-02-23 14:39:03 +01:00
Mesut Akcan
783cbc634e Translated using Weblate (Turkish)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2019-02-23 08:18:07 +01:00
Casiyre
9ac25b0d74 Translated using Weblate (English)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/en/
2019-02-23 08:18:06 +01:00
J-Jamet
5f051ed2a9 Merge branch 'feature/50-Back_Lock' into develop 2019-02-22 17:39:50 +01:00
J-Jamet
b40d2f3b9a Fix keyboard settings 2019-02-22 17:29:17 +01:00
J-Jamet
3f90276ce0 Refactor Timeout 2019-02-22 16:52:02 +01:00
J-Jamet
66e077f8f1 Fix keyboard entry disappear 2019-02-22 16:47:24 +01:00
J-Jamet
8426b1d91f Fix opening activity 2019-02-22 16:13:40 +01:00
J-Jamet
3b55937085 Fix keyboard entry selection 2019-02-22 15:10:07 +01:00
J-Jamet
da86a971b5 Refactor Autofill and Keyboard selection 2019-02-22 13:34:07 +01:00
J-Jamet
ff7f0e0a60 Add option for back lock 2019-02-21 16:25:00 +01:00
J-Jamet
9233b610c2 Refactor keys of preferences 2019-02-21 15:52:00 +01:00
J-Jamet
9dc183b9b7 Update version and Changelog 2019-02-21 14:21:22 +01:00
J-Jamet
d000b6f884 Add lock button always visible 2019-02-21 14:17:26 +01:00
J-Jamet
e0b0dd134f Refactor launch method 2019-02-21 13:50:07 +01:00
J-Jamet
e3d09bff36 Merge branch 'feature/WorkFlow_Connection' into develop 2019-02-21 13:40:26 +01:00
naofum
5e901812ad Translated using Weblate (Japanese)
Currently translated at 32.8% (113 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ja/
2019-02-17 10:22:32 +01:00
Balázs Meskó
b7f9ff8c98 Translated using Weblate (Hungarian)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/hu/
2019-02-12 16:10:26 +01:00
Balázs Meskó
76ed603bf1 Translated using Weblate (Hungarian)
Currently translated at 93.3% (322 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/hu/
2019-02-11 14:30:17 +01:00
Balázs Meskó
337816b7f2 Translated using Weblate (Hungarian)
Currently translated at 92.2% (318 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/hu/
2019-02-09 06:09:05 +01:00
Balázs Meskó
37b1566535 Translated using Weblate (Hungarian)
Currently translated at 39.1% (135 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/hu/
2019-02-06 20:55:59 +01:00
J-Jamet
9864d1e62d Fix setting opening 2019-01-24 18:21:44 +01:00
naofum
e3a07377e3 Translated using Weblate (Japanese)
Currently translated at 31.3% (108 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ja/
2019-01-18 08:20:49 +01:00
Hadrián Candela
f54b908dbb Translated using Weblate (Galician)
Currently translated at 8.7% (30 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/gl/
2019-01-12 11:06:53 +01:00
Allan Nordhøy
e3f3a5faf7 Translated using Weblate (Norwegian Bokmål)
Currently translated at 98.6% (340 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb_NO/
2019-01-09 04:06:57 +01:00
Osoitz
2046e15f65 Translated using Weblate (Basque)
Currently translated at 21.4% (74 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/eu/
2018-12-31 18:09:25 +01:00
Ldm Public
4e8f554ae6 Translated using Weblate (French)
Currently translated at 99.7% (344 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-12-29 00:09:26 +01:00
Éfrit
0f21040888 Translated using Weblate (French)
Currently translated at 99.7% (344 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-12-27 22:32:55 +01:00
J-Jamet
0d86fa0d95 Fix infinite time with keyboard and autofill 2018-12-19 22:38:43 +01:00
J-Jamet
0ad8826b51 New lock implementation 2018-12-19 22:27:06 +01:00
J-Jamet
a535f123ff Fix settings timeout 2018-12-19 19:04:44 +01:00
J-Jamet
4fcb2de2bb Rename lock or reset timeout method 2018-12-19 17:20:37 +01:00
random r
8885192db1 Translated using Weblate (Italian)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2018-12-19 16:09:17 +01:00
J-Jamet
7ebf64939b Merge branch 'feature/Unexpected_Lock' into develop 2018-12-19 12:07:28 +01:00
J-Jamet
6712b0927d Refactor entry views and check focus to reset timeout 2018-12-19 11:58:39 +01:00
J-Jamet
8853bb7618 Move LockingActivity 2018-12-17 19:07:24 +01:00
J-Jamet
cbc8ec9880 Refactor Lock with Kotlin 2018-12-17 19:00:08 +01:00
J-Jamet
6372099cb2 Add Kotlin dependency 2018-12-17 16:04:35 +01:00
Mesut Akcan
15fa114742 Translated using Weblate (Turkish)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2018-12-11 11:08:59 +01:00
wellinkstein
c16ded1377 Translated using Weblate (French)
Currently translated at 98.6% (340 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-12-11 05:42:13 +01:00
Mesut Akcan
8ecd0e0eb1 Translated using Weblate (Turkish)
Currently translated at 69.3% (239 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2018-12-08 15:08:40 +01:00
Mesut Akcan
c5895ed61b Translated using Weblate (Turkish)
Currently translated at 69.0% (238 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2018-12-07 14:08:36 +01:00
ssantos
35751844b0 Translated using Weblate (German)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-12-07 14:08:33 +01:00
Mesut Akcan
fd66e9acb8 Translated using Weblate (Turkish)
Currently translated at 56.8% (196 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2018-12-04 10:11:57 +01:00
Mesut Akcan
310ae58388 Translated using Weblate (Turkish)
Currently translated at 51.9% (179 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2018-12-02 12:08:30 +01:00
Bruno Guerreiro
d4a31567cd Translated using Weblate (Portuguese (Portugal))
Currently translated at 36.8% (127 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_PT/
2018-11-30 20:45:31 +01:00
Mesut Akcan
d54abf66fe Translated using Weblate (Turkish)
Currently translated at 48.7% (168 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2018-11-30 11:08:25 +01:00
MESUT AKCAN
792b3b7a81 Translated using Weblate (Turkish)
Currently translated at 33.0% (114 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2018-11-24 11:09:17 +01:00
mohammadA
0345606903 Translated using Weblate (Arabic)
Currently translated at 35.1% (121 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ar/
2018-11-24 11:09:13 +01:00
MESUT AKCAN
06aec23c8a Translated using Weblate (Turkish)
Currently translated at 27.2% (94 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2018-11-22 17:07:43 +01:00
liushuyu011
71a77250d0 Translated using Weblate (Chinese (Simplified))
Currently translated at 58.6% (202 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/
2018-11-20 07:08:32 +01:00
MESUT AKCAN
af32ef24db Translated using Weblate (Turkish)
Currently translated at 20.3% (70 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2018-11-19 01:22:15 +01:00
GoodMirek
214dca1d4e Translated using Weblate (Czech)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/cs/
2018-11-17 23:07:38 +01:00
C. Rüdinger
af8ca15e29 Translated using Weblate (German)
Currently translated at 98.6% (340 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-11-15 14:07:39 +01:00
MESUT AKCAN
ac71aec39d Translated using Weblate (Turkish)
Currently translated at 13.6% (47 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/tr/
2018-11-13 19:07:48 +01:00
wellinkstein
9b7b363b49 Translated using Weblate (French)
Currently translated at 98.0% (338 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-11-13 19:07:44 +01:00
xanadus1
948b54dc58 Translated using Weblate (Chinese (Simplified))
Currently translated at 37.4% (129 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/
2018-11-13 19:07:38 +01:00
MESUT AKCAN
20553713a8 Added translation using Weblate (Turkish) 2018-11-11 14:14:56 +01:00
TasogareRiiku
1424001ffd Translated using Weblate (Portuguese (Brazil))
Currently translated at 41.7% (144 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_BR/
2018-11-09 15:07:50 +01:00
Allan Nordhøy
fa1c49aaf2 Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.1% (342 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb_NO/
2018-11-09 15:07:50 +01:00
Krombel
316369f117 Translated using Weblate (German)
Currently translated at 97.4% (336 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-11-09 15:07:49 +01:00
ssantos
2253d3c2cc Translated using Weblate (German)
Currently translated at 97.4% (336 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-11-09 15:07:48 +01:00
Kunzisoft
b09bf68b7c Translated using Weblate (French)
Currently translated at 50.4% (174 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-11-09 15:07:47 +01:00
jan madsen
526111af98 Translated using Weblate (Danish)
Currently translated at 98.6% (340 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/da/
2018-11-09 15:07:47 +01:00
WaldiS
5942a33f42 Translated using Weblate (Polish)
Currently translated at 100.0% (345 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pl/
2018-11-04 17:24:15 +01:00
Allan Nordhøy
62b077c4b2 Translated using Weblate (Norwegian Bokmål)
Currently translated at 99.1% (342 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb/
2018-11-04 17:24:11 +01:00
C. Rüdinger
89996f09f1 Translated using Weblate (German)
Currently translated at 90.4% (312 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-11-04 17:24:10 +01:00
Kunzisoft
4b760c6361 Translated using Weblate (French)
Currently translated at 50.1% (173 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-11-04 17:24:07 +01:00
Heimen Stoffels
293b7e3a05 Translated using Weblate (Dutch)
Currently translated at 77.9% (269 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nl/
2018-11-04 17:24:06 +01:00
jan madsen
12686ecb83 Translated using Weblate (Danish)
Currently translated at 79.4% (274 of 345 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/da/
2018-11-04 17:24:04 +01:00
J-Jamet
456912b134 Merge tag '2.5.0.0beta18' into develop
2.5.0.0beta18
2018-11-01 17:46:17 +01:00
J-Jamet
88ac2ecf98 Merge branch 'release/2.5.0.0beta18' 2018-11-01 17:45:56 +01:00
J-Jamet
227cb078a5 Fix theme warning 2018-11-01 17:37:37 +01:00
J-Jamet
a17582bf6d Merge branch 'translations' into develop 2018-11-01 17:25:25 +01:00
J-Jamet
e8ba5dc6e2 Merge branch 'master' of https://hosted.weblate.org/projects/keepass-dx/strings into translations 2018-11-01 17:20:33 +01:00
J-Jamet
f37d3324e6 Upgrade app to version 18 2018-10-27 21:57:32 +02:00
J-Jamet
fcb06c8c22 Upgrade changelog 2018-10-27 21:42:00 +02:00
J-Jamet
d8bdf4500a Merge branch 'feature/Attachments' into develop 2018-10-27 21:38:57 +02:00
J-Jamet
69ea4d5414 Fix views 2018-10-27 20:46:17 +02:00
J-Jamet
7e9f99e5c8 Change the default icon pack 2018-10-27 20:30:31 +02:00
J-Jamet
95541d99c4 Replace a password sentence 2018-10-27 20:30:08 +02:00
J-Jamet
05ca7e6d69 Merge branch 'comradekingu-patch-2' into develop 2018-10-27 20:13:53 +02:00
J-Jamet
644a4a4886 Update strings 2018-10-27 20:13:15 +02:00
J-Jamet
7eb82ddbea Merge branch 'patch-2' of git://github.com/comradekingu/KeePassDX into comradekingu-patch-2 with corrections 2018-10-27 19:42:42 +02:00
J-Jamet
e721d4ca9e Fix keyboard clear and optimize views 2018-10-27 16:59:16 +02:00
J-Jamet
c72582b679 Update file selection view, title and Changelog 2018-10-27 16:30:36 +02:00
J-Jamet
217f0a82b5 Merge branch 'feature/Magikeyboard' into develop 2018-10-27 14:25:41 +02:00
J-Jamet
1efd172b42 Fix image 2018-10-27 14:17:59 +02:00
J-Jamet
e8d0d03ad9 Add keyboard Timeout 2018-10-27 13:56:08 +02:00
J-Jamet
6cb97de793 Remove keyboard sound and vibration duration settings 2018-10-20 12:57:26 +02:00
J-Jamet
77dbdc235a Add alpha channel to capture_keyboard images 2018-10-20 12:48:44 +02:00
J-Jamet
a9c87ea2b8 Add custom fields selection in keyboard 2018-10-13 16:10:45 +02:00
J-Jamet
232829526c Upgrade grdale 2018-10-13 10:52:04 +02:00
אלקנה בירדוגו
b5d8b2f14c Translated using Weblate (Hebrew)
Currently translated at 33.7% (110 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/he/
2018-09-27 15:31:03 +02:00
C. Rüdinger
c2673a627c Translated using Weblate (German)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-09-24 15:27:48 +02:00
Tatiana Canales
bb49256188 Translated using Weblate (Spanish)
Currently translated at 66.5% (217 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2018-09-22 11:36:53 +02:00
Allan Nordhøy
1b6a284dd6 "Database name" 2018-09-21 02:42:26 +02:00
Allan Nordhøy
36b35b907e Requested changes implemented 2018-09-21 02:41:40 +02:00
Allan Nordhøy
f61b310ff2 Language rework 2
Transformation rounds
2018-09-19 03:39:04 +02:00
J-Jamet
c1e84b3bf1 Add popup view for custom fields 2018-09-18 21:27:36 +02:00
Pavel Borecki
9971d27ef3 Translated using Weblate (Czech)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/cs/
2018-09-18 20:22:34 +02:00
J-Jamet
3c0835f725 Fix keyboard settings 2018-09-18 15:52:38 +02:00
J-Jamet
023aba2b60 Remove Magikeyboard and Model modules for easier integration 2018-09-18 11:46:37 +02:00
J-Jamet
abc0a14dda Update gradle 2018-09-18 10:14:15 +02:00
J-Jamet
dc23c6a445 Optimize memory pool and revert algo 2018-09-18 10:11:44 +02:00
J-Jamet
161a0ffc59 Change links 2018-09-17 22:38:48 +02:00
J-Jamet
b96436c906 Change small code 2018-09-16 11:40:22 +02:00
J-Jamet
cee7419208 Fix equals and hashcode for ProtectedBinary 2018-09-15 17:36:14 +02:00
J-Jamet
9ff6e7a080 Clear the cache to keep a small memory when the app is down 2018-09-15 17:22:42 +02:00
Lieven Blancke
9112a568d9 Translated using Weblate (Dutch)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nl/
2018-09-09 15:16:12 +02:00
Heimen Stoffels
8d0c9bc894 Translated using Weblate (Dutch)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nl/
2018-09-08 12:16:14 +02:00
RainSlide
e7b4e4501e Translated using Weblate (Chinese (Simplified))
Currently translated at 63.8% (208 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/
2018-09-08 12:14:45 +02:00
J-Jamet
df80084822 Fix attachment recovery 2018-09-06 22:05:31 +02:00
Heimen Stoffels
4df2891b1a Translated using Weblate (Dutch)
Currently translated at 46.9% (153 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nl/
2018-09-06 13:15:42 +02:00
J-Jamet
d0560677fa Temp commit 2018-09-05 22:02:24 +02:00
J-Jamet
9130a3851f Fix Out of memory for large attachment #115 2018-09-03 20:06:50 +02:00
J-Jamet
bb3fb26847 Update gradle 2018-09-03 12:00:57 +02:00
BO41
8406264138 Translated using Weblate (German)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-08-29 15:30:49 +02:00
ButterflyOfFire
e51f48ebe0 Translated using Weblate (Arabic)
Currently translated at 41.4% (135 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ar/
2018-08-29 10:34:27 +02:00
Daniel
a0a2aa4c5d Translated using Weblate (German)
Currently translated at 99.3% (324 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-08-24 12:38:48 +02:00
Claus Rüdinger
65cea7b5ec Translated using Weblate (German)
Currently translated at 99.3% (324 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-08-24 12:38:48 +02:00
WaldiS
fb589419de Translated using Weblate (Polish)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pl/
2018-08-23 18:50:11 +02:00
Allan Nordhøy
ae9844d5a1 Translated using Weblate (Norwegian Bokmål)
Currently translated at 90.1% (294 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb_NO/
2018-08-23 08:41:23 +02:00
J-Jamet
645ea21581 Remove warning_read_only 2018-08-23 00:24:18 +02:00
Allan Nordhøy
60fd675dff Translated using Weblate (Norwegian Bokmål)
Currently translated at 79.4% (259 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb_NO/
2018-08-22 05:41:35 +02:00
Allan Nordhøy
48903da446 Translated using Weblate (Danish)
Currently translated at 99.6% (325 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/da/
2018-08-22 04:36:29 +02:00
Claus Rüdinger
5399df134c Translated using Weblate (German)
Currently translated at 97.5% (318 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-08-21 21:37:54 +02:00
WaldiS
a858040ace Translated using Weblate (Polish)
Currently translated at 73.9% (241 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pl/
2018-08-21 20:41:36 +02:00
Allan Nordhøy
d792b7d5ae Added translation using Weblate (Norwegian Bokmål) 2018-08-21 03:27:23 +02:00
Claus Rüdinger
8b3ed1a7dc Translated using Weblate (German)
Currently translated at 97.5% (318 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-08-19 01:38:34 +02:00
jan madsen
47004857ea Translated using Weblate (Danish)
Currently translated at 99.6% (325 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/da/
2018-08-16 18:35:31 +02:00
J-Jamet
82a6b8d7ef Merge branch 'master' into develop 2018-08-15 09:32:13 +02:00
J-Jamet
a30bcf1fa7 Merge branch 'mohammadnaseri-master' into develop 2018-08-15 09:30:55 +02:00
Hosted Weblate
febe978fa1 Merge branch 'origin/master' into Weblate 2018-08-15 09:28:48 +02:00
jan madsen
1eeefcf495 Translated using Weblate (Danish)
Currently translated at 96.6% (315 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/da/
2018-08-15 09:28:48 +02:00
Jérémy JAMET
ff6b0eee6c Merge pull request #167 from tuxayo/patch-1
CHANGELOG: Fix forgotten version bump
2018-08-15 09:28:33 +02:00
Claus Rüdinger
a7c8eaa937 Translated using Weblate (German)
Currently translated at 92.3% (301 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-08-14 23:37:23 +02:00
Telugu Speaker
55545e31e8 Translated using Weblate (Telugu)
Currently translated at 3.3% (11 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/te/
2018-08-14 04:44:56 +02:00
Tobirium
34132c6da7 Translated using Weblate (German)
Currently translated at 91,4% (298 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-08-13 22:53:31 +02:00
Claus Rüdinger
fbafa99a3b Translated using Weblate (German)
Currently translated at 91,4% (298 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-08-13 22:53:31 +02:00
random r
bd63805611 Translated using Weblate (Italian)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2018-08-13 11:39:07 +02:00
lnxw
ae8398a434 Added translation using Weblate (Telugu) 2018-08-13 03:30:16 +02:00
عادل حسين المطهر
0b9318de88 Translated using Weblate (Arabic)
Currently translated at 37.4% (122 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ar/
2018-08-12 16:37:49 +02:00
WaldiS
55e4bbf9db Translated using Weblate (Polish)
Currently translated at 53.3% (174 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pl/
2018-08-11 19:42:59 +02:00
tuxayo
f33a572751 CHANGELOG: Fix forgotten version bump 2018-08-11 14:22:06 +02:00
K
2849cedbd8 Translated using Weblate (Latvian)
Currently translated at 34.6% (113 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/lv/
2018-08-11 09:40:28 +02:00
Mohammad Naseri
041d1b29d1 Passwords should be invisible to the accessibility services 2018-08-10 15:43:49 +02:00
K
cdcdc2fee1 Translated using Weblate (Latvian)
Currently translated at 34.0% (111 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/lv/
2018-08-09 18:39:53 +02:00
Tobirium
8e35d5bc8d Translated using Weblate (German)
Currently translated at 90.4% (295 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-08-08 18:38:37 +02:00
Daniel
f12e368707 Translated using Weblate (German)
Currently translated at 90.4% (295 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-08-08 18:38:36 +02:00
J-Jamet
f01895c7a7 Remove build version from app version (commit TAG = app name) 2018-08-08 12:35:15 +02:00
Aidar Gilmutdinov
4ce0c067e1 Translated using Weblate (Russian)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/
2018-08-07 22:41:35 +02:00
WaldiS
728a2cbfae Translated using Weblate (Polish)
Currently translated at 50.9% (166 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pl/
2018-08-07 17:41:48 +02:00
Tiago A. Reul
a4aab3b933 Translated using Weblate (Portuguese (Brazil))
Currently translated at 73.6% (240 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_BR/
2018-08-07 16:43:32 +02:00
Aidar Gilmutdinov
11ee0d6544 Translated using Weblate (Russian)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/
2018-08-06 21:52:24 +02:00
Allan Nordhøy
2b80dad47c Translated using Weblate (Norwegian Bokmål)
Currently translated at 2.1% (7 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb/
2018-08-06 19:41:56 +02:00
random r
7bb13ec1c2 Translated using Weblate (Italian)
Currently translated at 100,0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2018-08-06 11:19:27 +02:00
Ty Moss
344010d2bb Translated using Weblate (Norwegian Bokmål)
Currently translated at 2,1% (7 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/nb/
2018-08-05 18:42:40 +02:00
Ty Moss
ef37ecddc6 Added translation using Weblate (Norwegian Bokmål) 2018-08-05 18:05:54 +02:00
Kunzisoft
91a38e205e Translated using Weblate (French)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-08-04 11:38:13 +02:00
Kunzisoft
bd4de382e4 Translated using Weblate (English)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/en/
2018-08-04 10:36:42 +02:00
random r
623244c3bd Translated using Weblate (Italian)
Currently translated at 99.6% (325 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2018-08-03 14:39:19 +02:00
Kunzisoft
7a06ff6dec Translated using Weblate (French)
Currently translated at 100.0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-08-03 11:23:15 +02:00
random r
6d735e24ff Translated using Weblate (Italian)
Currently translated at 100,0% (326 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2018-08-02 14:23:10 +02:00
Hosted Weblate
5c30d544fa Merge branch 'origin/master' into Weblate 2018-08-02 13:11:19 +02:00
random r
54a3876288 Translated using Weblate (Italian)
Currently translated at 88.0% (287 of 326 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2018-08-02 13:11:19 +02:00
J-Jamet
57f71afb98 Fix font and upgrade version 2018-08-02 13:02:18 +02:00
J-Jamet
d8ec198f6f Fix null pointer 2018-08-02 11:58:15 +02:00
Hosted Weblate
faa6d7c9f6 Merge branch 'origin/master' into Weblate 2018-08-02 11:21:06 +02:00
Kunzisoft
d79a5b17a5 Translated using Weblate (French)
Currently translated at 100.0% (321 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-08-02 11:21:05 +02:00
J-Jamet
34deea5d32 Merge tag '2.5.0.0beta16' into develop
2.5.0.0bet16
2018-08-02 11:19:58 +02:00
J-Jamet
edc7324c1d Merge branch 'release/2.5.0.0beta16' 2018-08-02 11:19:41 +02:00
J-Jamet
b9190e8254 Fix translations 2018-08-02 11:18:59 +02:00
J-Jamet
534878ae99 Merge branch 'translations' into develop 2018-08-02 11:04:39 +02:00
J-Jamet
99bfd21ecc Merge branch 'master' of https://hosted.weblate.org/projects/keepass-dx/strings into translations 2018-08-02 11:03:37 +02:00
J-Jamet
cb5c324c9d Fix search / Fix icon - back #138 / Upgrade changelogs 2018-08-02 10:34:04 +02:00
J-Jamet
55dc504f26 Fix visual elements 2018-08-01 15:45:49 +02:00
J-Jamet
ecb0138c90 Add display username settings and rearrange form filling 2018-08-01 12:00:15 +02:00
J-Jamet
0860eeb87f Show website domains if entries given no title #124 and add username 2018-07-31 22:04:41 +02:00
J-Jamet
f08bff61cf Update changelogs 2018-07-31 08:52:58 +02:00
J-Jamet
432aca6465 Fix transparent toolbar 2018-07-30 22:17:23 +02:00
J-Jamet
7cdb8db146 New error message #154 2018-07-30 21:10:11 +02:00
random r
6ba9dedcb8 Translated using Weblate (Italian)
Currently translated at 100,0% (321 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2018-07-30 11:59:13 +02:00
random r
6d603608f4 Translated using Weblate (Italian)
Currently translated at 99.3% (319 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2018-07-30 11:58:11 +02:00
Kunzisoft
64f4d9fb84 Translated using Weblate (French)
Currently translated at 99.6% (320 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-07-29 14:37:40 +02:00
J-Jamet
60ccc450ae Fix read-only education screen 2018-07-29 09:44:01 +02:00
J-Jamet
ddb5f327a3 Add warning dialog on password copy button and sort settings 2018-07-28 18:00:57 +02:00
J-Jamet
df90ea42eb Deleting points in parameter explanations 2018-07-28 16:18:36 +02:00
Jérémy JAMET
a062d648b3 Merge pull request #158 from comradekingu/patch-1
Spelling: Language rework
2018-07-28 15:56:37 +02:00
J-Jamet
a59ae820b5 Add gray copy icon when copy not available 2018-07-28 15:18:34 +02:00
J-Jamet
228831acdd Upgrade version and add changelogs 2018-07-28 14:29:03 +02:00
J-Jamet
bf15ee43da Populate custom fields in search entry 2018-07-28 14:00:49 +02:00
J-Jamet
608f45677c Fix quick search with magikeyboard 2018-07-28 09:37:26 +02:00
Daniel
1cb15f214b Translated using Weblate (German)
Currently translated at 100.0% (321 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-07-28 00:37:41 +02:00
Claus Rüdinger
cd4a9e9b03 Translated using Weblate (German)
Currently translated at 100.0% (321 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-07-28 00:37:40 +02:00
J-Jamet
d6eae56d4f Merge branch 'feature/Search' into develop #26 #147 #153 2018-07-27 22:19:43 +02:00
J-Jamet
b5a87a63dc Fix search fragment 2018-07-27 21:39:26 +02:00
Allan Nordhøy
1eb17c4f34 Language rework 2018-07-27 15:11:56 +02:00
Hadrián Candela
8a6ce1f711 Translated using Weblate (Galician)
Currently translated at 7.4% (24 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/gl/
2018-07-27 13:38:02 +02:00
J-Jamet
0f22f8af45 Add search title 2018-07-27 10:54:58 +02:00
Tobirium
b2e81e6fd9 Translated using Weblate (German)
Currently translated at 100,0% (321 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-07-26 23:52:55 +02:00
Daniel
f82eab942d Translated using Weblate (German)
Currently translated at 100,0% (321 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-07-26 23:52:55 +02:00
J-Jamet
aa29aec40f Add search suggestions 2018-07-26 14:08:48 +02:00
Hadrián Candela
181def52ab Added translation using Weblate (Galician) 2018-07-26 13:01:37 +02:00
HybridGlucose
96d2bd63cc Translated using Weblate (Chinese (Traditional))
Currently translated at 44.5% (143 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hant/
2018-07-25 20:36:13 +02:00
Claus Rüdinger
194021a957 Translated using Weblate (German)
Currently translated at 100,0% (321 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-07-25 18:38:46 +02:00
Daniel
9e307f94ea Translated using Weblate (German)
Currently translated at 100,0% (321 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-07-25 18:38:45 +02:00
Tobirium
155b2de138 Translated using Weblate (German)
Currently translated at 100,0% (321 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-07-25 18:38:45 +02:00
J-Jamet
c76c3fd2be Fix fragment duplication 2018-07-25 11:50:18 +02:00
Matheus Gritz
01c5554944 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (321 of 321 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_BR/
2018-07-24 19:11:13 +02:00
J-Jamet
542cf65b41 Fix timeout and new animation 2018-07-24 18:32:19 +02:00
J-Jamet
f037561a67 Search in fragment 2018-07-24 18:02:08 +02:00
J-Jamet
379263a6d3 Search and Group in one activity 2018-07-24 14:48:03 +02:00
J-Jamet
c420ca01f6 Update Readme 2018-07-23 14:21:46 +02:00
J-Jamet
a1f9db6eee Try to solve the date crash 2018-07-23 14:12:07 +02:00
J-Jamet
c9212174c4 Change text by reset 2018-07-22 12:13:02 +02:00
J-Jamet
0065336377 Merge tag '2.5.0.0beta15' into develop
2.5.0.0beta15
2018-07-19 11:27:47 +02:00
J-Jamet
4f9625a3e1 Merge branch 'release/2.5.0.0beta15' 2018-07-19 11:27:18 +02:00
J-Jamet
7688ebd29b Merge branch 'master' of https://hosted.weblate.org/projects/keepass-dx/strings into translations 2018-07-19 11:15:53 +02:00
Claus Rüdinger
3f2a7f1eb3 Translated using Weblate (German)
Currently translated at 99.3% (313 of 315 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-07-19 11:08:28 +02:00
Veronica Small
b3d067d0c8 Translated using Weblate (Chinese (Simplified))
Currently translated at 41.9% (132 of 315 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/zh_Hans/
2018-07-19 11:08:28 +02:00
Kunzisoft
a3b4ad5ac1 Translated using Weblate (French)
Currently translated at 100.0% (315 of 315 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-07-19 11:08:28 +02:00
J-Jamet
e3b329d27f Update version and changelog 2018-07-19 11:01:32 +02:00
J-Jamet
7d10c43822 Fix orientation change 2018-07-19 10:40:36 +02:00
J-Jamet
fcb0d45d39 Fix Magikeyboard string 2018-07-19 08:58:20 +02:00
J-Jamet
5492db0223 Merge branch 'feature/ReadOnlyMode' into develop 2018-07-18 18:51:51 +02:00
J-Jamet
2207b05f5f Fix PwDate 2018-07-18 18:12:43 +02:00
J-Jamet
f15a0c2591 Optimize memory 2018-07-18 17:56:32 +02:00
J-Jamet
92fb22129c #77 Add read-only mode to the floating menu 2018-07-18 16:29:18 +02:00
J-Jamet
ccca9c4400 #77 Add read-only mode 2018-07-18 14:37:39 +02:00
J-Jamet
0597cb4416 #148 fix second element to copy 2018-07-16 22:02:24 +02:00
J-Jamet
0602174e50 Merge tag '2.5.0.0beta14' into develop
2.5.0.0beta14
2018-07-15 10:59:01 +02:00
J-Jamet
6fddc92ce7 Merge branch 'release/2.5.0.0beta14' 2018-07-15 10:58:48 +02:00
J-Jamet
aa30df6454 Update version / changelogs 2018-07-15 10:49:45 +02:00
J-Jamet
f6c61ab407 Show error message when sort can't be done 2018-07-15 10:33:54 +02:00
J-Jamet
2ab81ed77c Add parcelables 2018-07-15 10:24:30 +02:00
J-Jamet
0ade035f43 Catch construct element exception 2018-07-14 18:11:20 +02:00
J-Jamet
73b62035d8 Fix MagikIME nullpointer 2018-07-14 16:07:38 +02:00
J-Jamet
28837db308 Fix search and search for keyboard 2018-07-14 14:42:51 +02:00
J-Jamet
85befef260 Merge tag '2.5.0.0beta13' into develop
2.5.0.0beta13
2018-07-14 11:11:49 +02:00
J-Jamet
e7bbb47422 Merge branch 'release/2.5.0.0beta13' 2018-07-14 11:11:36 +02:00
J-Jamet
846bc7edb1 Update Changelogs 2018-07-14 11:01:34 +02:00
J-Jamet
99a9842a1f Fix null pointer on nodeButtonView 2018-07-14 10:47:52 +02:00
J-Jamet
33009138c3 Update version and fix memory crash 2018-07-14 10:23:04 +02:00
J-Jamet
c74b82ebd8 Fix changelogs 2018-07-13 17:06:20 +02:00
J-Jamet
49ea92a4a5 WebDav - Merge branch 'translations' into develop 2018-07-13 14:50:25 +02:00
David Ramiro
6cc4eeaa30 Translated using Weblate (German)
Currently translated at 100,0% (296 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-07-13 13:53:21 +02:00
David Ramiro
1b89f79888 Translated using Weblate (German)
Currently translated at 100,0% (296 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2018-07-13 13:53:21 +02:00
Ale-Ma
07d99de3ea Translated using Weblate (Italian)
Currently translated at 51.6% (153 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2018-07-13 13:53:21 +02:00
piegope
ae757affa1 Translated using Weblate (Spanish)
Currently translated at 100.0% (296 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2018-07-13 13:53:21 +02:00
Max
482b6296fc Translated using Weblate (Russian)
Currently translated at 57.0% (169 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/
2018-07-13 13:53:21 +02:00
piegope
d37ce729f0 Translated using Weblate (Español (España))
Currently translated at 100,0% (296 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2018-07-13 13:53:21 +02:00
ButterflyOfFire
e92ce232bc Translated using Weblate (Arabic)
Currently translated at 35.1% (104 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ar/
2018-07-13 13:53:21 +02:00
piegope
78ae44b160 Translated using Weblate (Spanish)
Currently translated at 87.5% (259 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2018-07-13 13:53:21 +02:00
Ale-Ma
49ce87a8e0 Translated using Weblate (Italian)
Currently translated at 51.3% (152 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/it/
2018-07-13 13:53:21 +02:00
ButterflyOfFire
d2fe5ce884 Translated using Weblate (Arabic)
Currently translated at 34.7% (103 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ar/
2018-07-13 13:53:21 +02:00
ButterflyOfFire
5e695756de Added translation using Weblate (Arabe) 2018-07-13 13:53:21 +02:00
Max
0506a75417 Translated using Weblate (Russian)
Currently translated at 57.0% (169 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/
2018-07-13 13:53:21 +02:00
dienteperro
34e1316144 Translated using Weblate (Spanish)
Currently translated at 57.0% (169 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2018-07-13 13:53:21 +02:00
Kunzisoft
18dffa6c75 Translated using Weblate (English)
Currently translated at 100.0% (296 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/en/
2018-07-13 13:53:21 +02:00
Kunzisoft
03621c378e Translated using Weblate (French)
Currently translated at 100.0% (296 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-07-13 13:53:21 +02:00
Kunzisoft
aff9312419 Translated using Weblate (French)
Currently translated at 100.0% (296 of 296 strings)

Translation: KeePass DX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fr/
2018-07-13 13:53:21 +02:00
J-Jamet
4651b1be96 Icons depends now of setting of list items #97 2018-07-13 11:25:02 +02:00
J-Jamet
32497a22d2 Add dialog with a warning to copy, add the setting to copy the protected custom fields #139 2018-07-12 21:53:05 +02:00
J-Jamet
3b5ef56c16 Fix clean clipboard in notification 2018-07-11 18:26:49 +02:00
J-Jamet
d4cc3a58d8 Remove copy menu for group 2018-07-11 12:24:37 +02:00
J-Jamet
afedbb38b2 Merge remote-tracking branch 'origin/develop' into develop 2018-07-11 12:15:26 +02:00
J-Jamet
fe70bf3877 Fix database creation workflow 2018-07-11 12:15:04 +02:00
J-Jamet
f14ee6cf1c Update changelogs 2018-07-10 14:45:56 +02:00
J-Jamet
1791b15f85 Update gradle and remove compatibility mode for FingerPrintManager 2018-07-10 11:24:00 +02:00
J-Jamet
6c5b3b3a0d Fix german translation 2018-07-10 11:24:00 +02:00
J-Jamet
6ea2287679 Update German translation - Merge branch 'davidramiro-develop' into develop 2018-07-09 14:49:32 +02:00
David Ramiro
cad4ec22b4 Update German translation 2018-07-08 22:10:28 +02:00
J-Jamet
f277983caf Merge branch 'develop' of https://github.com/Kunzisoft/KeePassDX into develop 2018-07-06 08:54:14 +02:00
J-Jamet
5e561e5321 Update descriptions 2018-07-06 08:53:54 +02:00
J-Jamet
ef83dbcae2 Fix errors highlight by @gaul fb715950a7 2018-07-04 13:19:06 +02:00
J-Jamet
ab6c69adcb Standardize the slide animation 2018-07-04 12:59:32 +02:00
J-Jamet
1c90747476 Add setting to disable education screens 2018-07-02 11:25:59 +02:00
J-Jamet
c3b3d8482c Update changelog 2018-07-01 21:53:40 +02:00
J-Jamet
86b4d92599 Change DbHeaderV4 number 2018-07-01 21:53:25 +02:00
J-Jamet
1f6786b1f8 Fix null pointer for enableButtonOncheckedChangeListener 2018-07-01 12:50:59 +02:00
J-Jamet
4cd2b153f4 Fix broadcast unregister receiver 2018-07-01 11:54:46 +02:00
J-Jamet
27b0810688 Merge branch 'feature/Magikeyboard' into develop 2018-06-30 16:10:08 +02:00
J-Jamet
94c72a4cf6 Remove Jelly Bean condition 2018-06-30 16:04:03 +02:00
J-Jamet
e634116e71 Fix bugs for Kitkat device 2018-06-30 15:22:16 +02:00
J-Jamet
9021cb5bc8 Add TODO, dev dialog and fix icon bug 2018-06-29 19:02:31 +02:00
J-Jamet
3674900a54 Add receiver to lock the entry in the keyboard 2018-06-29 17:59:58 +02:00
J-Jamet
9855ae79c3 Add keyboard notification 2018-06-29 16:56:13 +02:00
J-Jamet
fe1a4985f1 Add settings bones 2018-06-26 00:25:09 +02:00
J-Jamet
015a368a1d Add keyboard explanation 2018-06-25 17:00:57 +02:00
J-Jamet
07f59e071d Upgrade changelogs 2018-06-25 11:37:06 +02:00
J-Jamet
670e2bfe33 Refining activity animations 2018-06-25 11:25:28 +02:00
J-Jamet
992b6382a3 Fix disabled button 2018-06-25 11:00:50 +02:00
J-Jamet
c3ac550c93 Add setting to disable the open button #126 2018-06-25 10:42:19 +02:00
J-Jamet
acba7fc5de New adaptive icon 2018-06-24 21:22:36 +02:00
J-Jamet
ccb500fdf4 Fix search with Autofill service #130 2018-06-23 11:40:33 +02:00
J-Jamet
44111507e7 Change style of keyboard 2018-06-22 18:27:07 +02:00
J-Jamet
5f14596ed2 Assign entry elements to keys 2018-06-10 21:51:09 +02:00
J-Jamet
4ad65c8f4a Retrieve entry selected in keyboard 2018-06-10 14:03:34 +02:00
J-Jamet
b4b215fe30 Lock since keyboard and refactor 2018-06-08 17:59:18 +02:00
J-Jamet
d8a8005d70 Merge branch 'develop' into feature/Magikeyboard 2018-06-06 19:23:48 +02:00
J-Jamet
37ca15b77c Refactor lock 2018-06-06 19:11:20 +02:00
J-Jamet
6c18fe5591 Fix the spelling error 2018-06-05 19:24:26 +02:00
J-Jamet
fdcb05467c First commit to add Magikeyboard 2018-06-03 16:33:59 +02:00
J-Jamet
ef8db46ae7 Update changelogs 2018-05-31 18:26:03 +02:00
J-Jamet
14f56c77e8 Merge branch 'feature/IconsVector' into develop 2018-05-31 17:37:45 +02:00
J-Jamet
44e21084e4 Change material icons as XML 2018-05-31 17:37:08 +02:00
J-Jamet
b7f1275789 Fix globe icon #125 2018-05-31 15:24:09 +02:00
J-Jamet
b1be05db4d Set folder icon by default for a new group #122 2018-05-31 13:21:38 +02:00
J-Jamet
09c776fd7e Remove "Rounds fix" setting no more used 2018-05-31 11:53:45 +02:00
J-Jamet
e8a24790a5 Upgrade version and changelogs 2018-05-30 11:51:28 +02:00
J-Jamet
8b3be79266 Merge branch 'feature/ListNodesFragment' into develop 2018-05-30 11:16:13 +02:00
J-Jamet
e5f0572c1c Change node menu as XML 2018-05-30 10:03:38 +02:00
J-Jamet
68df3bc6c3 Set messages in threads 2018-05-29 23:04:43 +02:00
J-Jamet
a3da960c26 Fix toolbar paste action and colors 2018-05-29 22:27:38 +02:00
J-Jamet
d9490f9840 Refactor runnable action 2018-05-29 19:58:27 +02:00
J-Jamet
3b24f9d821 Merge branch 'feature/NodeMenu' into feature/ListNodesFragment 2018-05-29 12:18:09 +02:00
J-Jamet
bf35897e92 Add toolbar paste and animations for activities 2018-05-29 12:09:08 +02:00
J-Jamet
977705b42d Fix group title 2018-05-28 20:12:09 +02:00
J-Jamet
459bc40515 Add Move for Entries and Groups 2018-05-28 19:53:45 +02:00
J-Jamet
eb8ca9355c Merge branch 'feature/ListNodesFragment' into feature/NodeMenu 2018-05-28 18:10:06 +02:00
J-Jamet
31f7b0d5be Fix timeout for fragment 2018-05-28 17:54:38 +02:00
J-Jamet
7c54946c4b Fix fragment - Merge branch 'feature/ListNodesFragment' into feature/NodeMenu 2018-05-25 22:09:35 +02:00
J-Jamet
5aaf2c222a Fix fragment during orientation change 2018-05-25 21:52:09 +02:00
J-Jamet
9424feefce Add contextual bar to paste and add move entry 2018-05-24 19:51:28 +02:00
Jérémy JAMET
a3917ccab6 Add translation link in Readme.md 2018-05-24 14:48:28 +02:00
J-Jamet
5286a60142 Group activity with fragment for navigation 2018-05-24 00:11:46 +02:00
J-Jamet
d4459de49b Rename string clipboard cleared 2018-05-23 12:25:08 +02:00
J-Jamet
05dba6668c Change about description string key 2018-05-23 10:25:50 +02:00
J-Jamet
c15a1c6eaa Refactor KDF Engine for v3 2018-05-22 15:22:04 +02:00
J-Jamet
fe8c962f73 Better KDF Exception management 2018-05-22 12:52:12 +02:00
J-Jamet
4192cf2403 Add FAQ store time 2018-05-18 11:02:02 +02:00
J-Jamet
1817f1aa9e Fix extended ASCII in default setting 2018-05-18 09:09:07 +02:00
J-Jamet
afacf352ed Merge branch 'develop' of https://github.com/Kunzisoft/KeePassDX into develop 2018-05-15 15:43:30 +02:00
J-Jamet
d3ebbba2a1 Remove compat methods 2018-05-15 15:43:03 +02:00
J-Jamet
460edf1745 Merge branch 'develop' of https://github.com/Kunzisoft/KeePassDX into develop 2018-05-13 22:22:21 +02:00
J-Jamet
dacb19d412 Add Gimp source for store screens 2018-05-13 22:21:28 +02:00
Jérémy JAMET
fe8158db85 Update FAQ.md 2018-05-13 20:13:24 +02:00
Jérémy JAMET
a36e4fbcd0 Update FAQ link 2018-05-13 20:11:32 +02:00
J-Jamet
9442c7ef07 Merge tag '2.5.0.0beta11' into develop 2018-05-13 18:23:52 +02:00
J-Jamet
d4a0b59eb1 Merge branch 'release/2.5.0.0beta11' 2018-05-13 18:23:37 +02:00
J-Jamet
07600949ab Upgrade version and fix potential null pointer for kdf 2018-05-13 18:14:25 +02:00
J-Jamet
7efaad1818 Fix database creation issue 2018-05-13 17:54:35 +02:00
J-Jamet
e32b0d1c25 Merge tag '2.5.0.0beta10' into develop 2018-05-13 17:05:32 +02:00
J-Jamet
0fdcc29aa2 Merge branch 'release/2.5.0.0beta10' 2018-05-13 17:05:10 +02:00
J-Jamet
37bedbffc9 Fix italian translation for compilation 2018-05-13 16:59:35 +02:00
J-Jamet
46505150c4 New Red Volcano theme and change visual feature message for version libre 2018-05-13 16:47:59 +02:00
J-Jamet
e18c5c90cc Upgrade changelogs 2018-05-13 14:52:59 +02:00
J-Jamet
1f5649d9d2 Merge branch 'feature/ChangeAlgorithms' into develop #9 #29 2018-05-13 14:25:31 +02:00
J-Jamet
7bbd55a9fd Add binary to memory explanation 2018-05-13 14:17:19 +02:00
J-Jamet
92eeccf84e Fix algorithm and kdf function for database V3 and add small trad 2018-05-13 13:55:37 +02:00
J-Jamet
7bcc289518 Upgrade explanations 2018-05-13 13:02:09 +02:00
J-Jamet
507f758c0d Add memory usage and parallelism for Argon2 settings 2018-05-12 23:53:41 +02:00
J-Jamet
6afffb7245 Register UUID of database version in KDF parameter 2018-05-11 19:19:16 +02:00
J-Jamet
c62f4ae0b3 Text if choose only one extension #105 2018-05-11 13:25:33 +02:00
J-Jamet
ee80c614e0 Fix layer error for icon free #113 2018-05-11 12:44:33 +02:00
J-Jamet
fea7af6910 Dynamic creation of KdfEngine, reorganise code 2018-05-09 15:17:55 +02:00
J-Jamet
c72aa0e97d Merge branch 'develop' into feature/ChangeAlgorithms to Fix NDK 2018-05-09 12:01:16 +02:00
J-Jamet
3dd60b5392 Fix ndk filters 2018-05-09 10:59:48 +02:00
J-Jamet
a357267552 #107 Set master password in landscape 2018-05-07 10:47:00 +02:00
J-Jamet
1badeb2eef Change FAQ as markdown and add descriptions 2018-05-07 10:34:27 +02:00
Yhaulez
0bb8d2a417 Create FAQ 2018-05-06 16:26:19 +02:00
J-Jamet
4a215db83c Change toolbar style and password layout 2018-05-05 23:16:39 +02:00
J-Jamet
512e55a170 Fix fingerprint animation and for first init 2018-05-05 20:39:01 +02:00
J-Jamet
1ebe8dc022 Update fingerprint state with checkbox 2018-05-04 21:24:57 +02:00
J-Jamet
cafeabdbc3 Fix search styles 2018-05-02 21:31:04 +02:00
J-Jamet
b342b26409 Update readme 2018-05-02 20:59:05 +02:00
J-Jamet
938c3a07af Fix wait dialog callback 2018-05-02 20:52:16 +02:00
J-Jamet
16288f98f7 Merge branch 'develop' into feature/ChangeAlgorithms 2018-05-02 15:57:47 +02:00
J-Jamet
a932156e85 Remove unused progressbar 2018-05-02 15:26:24 +02:00
J-Jamet
64e9b9fb6d Fix lock orientation change 2018-05-02 14:02:10 +02:00
J-Jamet
7af28550da Merge branch 'feature/RefactorProgress' into develop #98 2018-05-02 13:49:56 +02:00
J-Jamet
60e2d786dd Change progress dialog title, and remove code 2018-05-02 13:49:03 +02:00
J-Jamet
ec08f3430d Add progress bar for all, create database in a single progress dialog 2018-05-02 09:54:55 +02:00
J-Jamet
a50aa0fb95 Fix null pointer for KeyDerivationName 2018-05-02 07:16:55 +02:00
J-Jamet
cf026e8eaa Update progress bar and message progress 2018-05-01 20:03:43 +02:00
J-Jamet
77614d0c4a Upgrade changelogs and version 2018-04-30 19:54:50 +02:00
J-Jamet
e8d71039d7 refactor 2018-04-30 18:18:13 +02:00
J-Jamet
4164b5bd37 Fix crash by locking activity position 2018-04-30 17:47:31 +02:00
J-Jamet
3c66ec82b5 Upgrade French 2018-04-30 17:00:42 +02:00
J-Jamet
b796c16877 Upgrade Italian 2018-04-30 16:57:10 +02:00
J-Jamet
42d34d8f0c Add material icon pack in free version and change texts 2018-04-30 16:10:18 +02:00
J-Jamet
5fbb37df82 Fix german fingerprint error 2018-04-29 14:07:56 +02:00
J-Jamet
52e12d7cbd Upgrade russian translation 2018-04-28 22:34:25 +02:00
J-Jamet
5cf5719e8e Fix education text color 2018-04-28 20:08:33 +02:00
J-Jamet
af3a80143e Fix crash by return blank when Resources$NotFoundException 2018-04-28 19:49:59 +02:00
J-Jamet
90db27c3fe Refactor Master key functions 2018-04-28 18:15:30 +02:00
J-Jamet
3d584b76f7 Choose kdf and encapsulate code 2018-04-28 15:58:04 +02:00
J-Jamet
fbf3dec421 Assign algorithm dynamically 2018-04-28 12:20:18 +02:00
J-Jamet
1d36683128 Remove screens in Readme 2018-04-28 11:11:50 +02:00
J-Jamet
cefc546c0a Upgrade german translation 2018-04-28 11:08:23 +02:00
J-Jamet
7aeb51813c Show algorithm dialog 2018-04-26 23:00:15 +02:00
J-Jamet
d6fc29ec79 Creation of classes and prepare assignment for algorithms 2018-04-26 22:00:11 +02:00
J-Jamet
9af182e0c3 Change dark style 2018-04-26 16:14:22 +02:00
J-Jamet
c7120b997f Fix contribution issue for KeePass DX Pro 2018-04-26 14:39:45 +02:00
J-Jamet
e61571fcec Upgrade fastlane 2018-04-26 12:18:14 +02:00
J-Jamet
9a900b32b2 Merge tag '2.5.0.0beta9' into develop
2.5.0.0beta9
2018-04-25 13:16:14 +02:00
J-Jamet
1033dd78b0 Merge branch 'release/2.5.0.0beta9' 2018-04-25 13:15:44 +02:00
J-Jamet
4aaae3f59e Upgrade readme and screen 2018-04-25 13:15:13 +02:00
J-Jamet
1424633a58 Update screenshots 2018-04-25 01:36:30 +02:00
J-Jamet
c9b98094e5 Change purple colors 2018-04-24 00:46:31 +02:00
J-Jamet
5707026985 Change fingerprint visual 2018-04-24 00:36:37 +02:00
J-Jamet
bfcfb842fb Fix visual bugs 2018-04-23 20:59:59 +02:00
J-Jamet
8fe2230891 Fix visual bugs 2018-04-23 20:40:17 +02:00
J-Jamet
41cc0b1a5a Fix compilation 2018-04-23 19:20:15 +02:00
J-Jamet
cc8c525dab Upgrade fastlane 2018-04-23 18:55:32 +02:00
J-Jamet
92bc3c2838 Add pro app name 2018-04-23 15:51:13 +02:00
J-Jamet
1d065e7bc5 Fix crash when orientation change after a modification 2018-04-21 15:44:17 +02:00
J-Jamet
fb1b90a281 Add modification 2018-04-21 14:20:43 +02:00
J-Jamet
268f716104 Upgrade fastlane 2018-04-21 07:14:34 +02:00
J-Jamet
b7328875f1 Fix filepicker style 2018-04-20 20:27:34 +02:00
J-Jamet
02ee58efa7 Add dev to crypt settings and comment transition 2018-04-20 19:59:31 +02:00
J-Jamet
6754881847 Add activity animation 2018-04-20 17:57:39 +02:00
J-Jamet
6e4c5d8c26 Add transition for settings 2018-04-20 17:43:08 +02:00
J-Jamet
544648c2eb Remove TODO 2018-04-20 16:03:10 +02:00
J-Jamet
e62f8bf56b Solve empty password issue #2 2018-04-20 15:48:53 +02:00
J-Jamet
7f5138b08b Upgrade Changelogs and versions 2018-04-20 10:44:22 +02:00
J-Jamet
a367aeaf12 Change font by Droid Sans Mono Slashed and activate by default, add it in password generator #86 2018-04-19 11:09:55 +02:00
J-Jamet
fc6453beba Keyboard setting with dev dialog 2018-04-18 22:28:49 +02:00
J-Jamet
8a981b7a79 Move appearance settings 2018-04-18 21:26:42 +02:00
J-Jamet
d7f9a02699 New selection screen 2018-04-18 19:32:51 +02:00
J-Jamet
7c9153ea04 Open button expanded and add small text 2018-04-17 14:09:44 +02:00
J-Jamet
2c16fe3335 Add fab menu 2018-04-16 21:32:56 +02:00
J-Jamet
eb14d27ca5 #88 Fix crash when header can't be write 2018-04-16 19:47:27 +02:00
J-Jamet
7024178069 #88 Open file with kitkat 2018-04-16 19:37:03 +02:00
J-Jamet
c85ce3e0e8 Replace standart by standard 2018-04-16 16:14:27 +02:00
J-Jamet
067c5ff1cf Fix bugs for Icons and Styles, add contribution and pro dialog 2018-04-16 15:27:45 +02:00
J-Jamet
429bd99f1c Upgrade app icons 2018-04-15 23:44:35 +02:00
J-Jamet
7b5bb0fd97 Add ocean theme and fix styles 2018-04-15 21:07:44 +02:00
J-Jamet
ae50f424d3 App icon for each flavor 2018-04-15 19:28:59 +02:00
J-Jamet
53cc1ad673 Disable custom font and clipboard notification by default #86 2018-04-15 12:08:44 +02:00
J-Jamet
ceb80c6cac Remove the first activity, fix colors in Classic theme and fix custom icon tint 2018-04-14 21:54:29 +02:00
J-Jamet
71bd3ab780 Add splashscreen 2018-04-14 20:39:15 +02:00
J-Jamet
8a40a4b3ae Fix visual bugs, add classic theme and pro theme #27 2018-04-14 19:58:26 +02:00
J-Jamet
7772db17ae Change productFlavors names 2018-04-14 15:36:41 +02:00
J-Jamet
11738d807c Merge branch 'feature/IconPackModules' into develop 2018-04-13 20:55:15 +02:00
J-Jamet
80b9a8fa50 List of IconPack as gradle entity 2018-04-13 20:54:05 +02:00
J-Jamet
d619f6581e Fix landscape icon #84 2018-04-13 20:04:11 +02:00
J-Jamet
697e9aa923 Fix visual bugs and save icon pack setting 2018-04-13 19:47:56 +02:00
J-Jamet
15c843fbb9 Add setting to choose an IconPack 2018-04-13 17:08:13 +02:00
J-Jamet
b6b7e61cfb Add tint for icon pack 2018-04-12 19:21:53 +02:00
J-Jamet
d5b0ee9371 Add feather icon and licences for icon packs 2018-04-12 17:32:06 +02:00
J-Jamet
e86807c3d3 Clean code and solve recovered icon 2018-04-11 20:57:04 +02:00
J-Jamet
08fcb119a9 Finish merge material_icon_pack 2018-04-11 19:10:48 +02:00
J-Jamet
edff33afd1 Merge branch 'justintime4tea-53_new-icon-pack' into feature/IconPackModules (Move in module material_icon_pack)
# Conflicts:
#	app/build.gradle
#	icon-pack-classic/src/main/res/drawable-hdpi/classic_64_32dp.png
#	icon-pack-classic/src/main/res/drawable-ldpi/classic_64_32dp.png
#	icon-pack-classic/src/main/res/drawable/classic_64_32dp.png
2018-04-11 19:09:53 +02:00
J-Jamet
bdfa963bed Merge branch '53_new-icon-pack' of git://github.com/justintime4tea/KeePass-Libre into justintime4tea-53_new-icon-pack 2018-04-11 18:23:17 +02:00
J-Jamet
4eff247865 Add icon pack identifier 2018-04-11 18:13:58 +02:00
J-Jamet
3e3d5bd7d8 Merge branch 'feature/Education' into develop 2018-04-11 15:31:18 +02:00
J-Jamet
5a74d1be8f Add links for field reference and autofill setting, add doc, fix glitches, add changelogs 2018-04-10 21:15:05 +02:00
J-Jamet
812eccfe0e Sort_selection as ScrollView #83 2018-04-10 19:01:22 +02:00
J-Jamet
d00c337382 Fix visual issues in education screens 2018-04-10 17:58:17 +02:00
J-Jamet
54dbcc95ab Change education for entries screens 2018-04-10 17:31:22 +02:00
J-Jamet
2e5ddd80ff Change education for group screen 2018-04-10 15:18:27 +02:00
J-Jamet
2c44a4d760 Change education for password screen 2018-04-10 12:44:49 +02:00
J-Jamet
f8561222d5 Change education for database selection 2018-04-10 12:23:41 +02:00
J-Jamet
2c8e3e9c8e Merge branch 'develop' into feature/Education
# Conflicts:
#	app/src/main/java/com/kunzisoft/keepass/activities/EntryActivity.java
#	app/src/main/java/com/kunzisoft/keepass/activities/EntryEditActivity.java
#	app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.java
#	app/src/main/java/com/kunzisoft/keepass/fileselect/FileSelectActivity.java
#	app/src/main/java/com/kunzisoft/keepass/password/PasswordActivity.java
#	app/src/main/java/com/kunzisoft/keepass/utils/MenuUtil.java
#	app/src/main/res/values/donottranslate.xml
2018-04-10 10:33:52 +02:00
J-Jamet
ccbc6c07ed Update supportVersion libraries 2018-04-10 09:59:33 +02:00
J-Jamet
47e820e3d8 (Implementation) Merge branch 'justintime4tea-kunzi-develop' into develop 2018-04-10 09:49:24 +02:00
J-Jamet
13dea4b567 New icon pack importer 2018-04-09 21:37:28 +02:00
Justin Gross
70d1ce715e Change compile to implementation 2018-04-08 16:20:07 -04:00
J-Jamet
cc41545c0a create Classic Icon Pack 2018-04-08 12:45:25 +02:00
J-Jamet
aded8fab0a Rebuild classic icons (Add apple icon and remove numbers) 2018-04-07 15:41:52 +02:00
J-Jamet
9cb4d28ad8 Upgrade Readme 2018-04-07 10:31:59 +02:00
J-Jamet
a1b2235fb3 Merge tag '2.5.0.0beta8' into develop
2.5.0.0beta8
2018-04-06 20:29:47 +02:00
J-Jamet
161923c808 Merge branch 'release/2.5.0.0beta8' 2018-04-06 20:29:26 +02:00
J-Jamet
d5a03424d0 Solve fab color 2018-04-06 20:27:33 +02:00
J-Jamet
3e87c1ab9d Change password layout 2018-04-06 19:39:58 +02:00
J-Jamet
a6046bc49a Add sorting by last access and by creation time 2018-04-06 19:02:31 +02:00
J-Jamet
db98f4b30c Remove db name for v3 2018-04-06 17:15:36 +02:00
J-Jamet
60eff63569 Add dialogs to save Db name and description 2018-04-06 16:51:25 +02:00
J-Jamet
b8e97ec53b Change rounds_fix_explanation 2018-04-06 08:43:33 +02:00
J-Jamet
c2b60b2268 Entry edit as menu, Launch in lowercase 2018-04-06 08:34:53 +02:00
J-Jamet
cac1f923cc Change url icon by launch icon 2018-04-06 08:06:37 +02:00
J-Jamet
b4ac0ef21f Move donation in menu 2018-04-06 07:56:57 +02:00
J-Jamet
8b85c22f25 Remove font 2018-04-05 20:31:27 +02:00
J-Jamet
582faab29d Base64Coder as dependency 2018-04-05 20:28:47 +02:00
J-Jamet
a9f6fa3441 commons-collections as dependency 2018-04-05 20:21:47 +02:00
J-Jamet
54740c1ba2 Change packages and solve dependencies 2018-04-05 20:11:08 +02:00
J-Jamet
94a8ecbdf1 GPL2 to GPL3 2018-04-05 18:41:49 +02:00
J-Jamet
46855e0b70 Merge branch 'feature/EncryptionSettings' into develop #9 2018-04-05 17:25:07 +02:00
J-Jamet
2d3eabe07e Update changelogs 2018-04-05 17:24:11 +02:00
J-Jamet
48bda000e9 Add database name, description and version, encapsulate db methods 2018-04-05 17:20:17 +02:00
J-Jamet
8aea6fa2da Remove keepassdroid assets 2018-04-05 13:26:00 +02:00
J-Jamet
c46aa0e5c8 remove .idea files from being tracked 2018-04-05 13:17:13 +02:00
Justin Gross
ed7f6e4b68 Update icons to font awesome 2018-04-04 16:49:40 -04:00
J-Jamet
825d88014d Set Key Rounds for database V4 2018-04-04 20:37:23 +02:00
J-Jamet
b3ff38fb35 Get rounds from KdfParameters 2018-04-04 17:25:45 +02:00
Justin Gross
1ebba9d8be Merge pull request #1 from Kunzisoft/develop
Merge upstream changes
2018-04-04 11:00:37 -04:00
J-Jamet
1e4deb2182 Refactor rounds 2018-04-04 14:42:58 +02:00
J-Jamet
d5acd04a19 Merge branch 'develop' into feature/EncryptionSettings 2018-04-04 13:38:48 +02:00
J-Jamet
fe73a951e3 Upgrade version 2018-04-04 13:38:05 +02:00
J-Jamet
415094154d Upgrade description 2018-04-04 13:31:07 +02:00
J-Jamet
347522b9a6 Add lock, field copy, sort and donation 2018-04-03 20:40:52 +02:00
J-Jamet
918f563faa Change Education for Password layout and fix translations 2018-04-03 17:11:46 +02:00
J-Jamet
3b88b0fea6 Keep long in DateToKDBX4 2018-04-03 13:49:23 +02:00
J-Jamet
d8e3d52f21 Catch OutOfMemoryError when writing 2018-04-03 13:07:05 +02:00
J-Jamet
041f3eb568 Solve visual bugs and translation 2018-04-02 12:59:02 +02:00
J-Jamet
4a1d97a622 Add entry edit screens preference 2018-04-01 16:34:54 +02:00
J-Jamet
cd0d712f56 Add reset education screens preference 2018-04-01 00:37:30 +02:00
J-Jamet
761d9a1883 Add education to "add button" 2018-03-31 21:59:05 +02:00
J-Jamet
2c9a6d7c26 Add education to database selection 2018-03-31 21:24:39 +02:00
J-Jamet
8105f89088 New FileSystem screen 2018-03-31 16:29:34 +02:00
J-Jamet
90084ed2f7 Solve protected field display 2018-03-31 14:57:01 +02:00
J-Jamet
496725a8fd Add encryption settings 2018-03-30 21:04:33 +02:00
J-Jamet
72b0cdf0d7 Add changelogs 2018-03-30 16:07:37 +02:00
J-Jamet
a266d307a6 Change timeout settings 2018-03-30 16:05:47 +02:00
J-Jamet
f7fe414597 Hide custom entries protected #65 2018-03-30 15:18:58 +02:00
J-Jamet
5c1e9bd94f Patch to allow autofill in search #62 2018-03-30 14:03:43 +02:00
J-Jamet
747135afae Fix crash #69 2018-03-29 23:26:22 +02:00
J-Jamet
675efe3ab8 Replace anonymous fun by lambda 2018-03-29 23:12:16 +02:00
J-Jamet
02b6191e66 Merge branch 'feature/RefactorModel' into develop 2018-03-29 22:15:40 +02:00
J-Jamet
1e07d6a28d Solve field reference issues #61 (Was fix in part by refactoring) 2018-03-29 22:07:09 +02:00
J-Jamet
ab98f03ebf Fix ExpireDate issue for Database V3 2018-03-29 21:17:24 +02:00
J-Jamet
4aff5e3a06 Fix ExpireDate issue for Database V3 2018-03-29 17:24:32 +02:00
J-Jamet
3ad4e8efe7 #67 Add warning dialog for storage setting 2018-03-29 12:34:07 +02:00
J-Jamet
d04d7737c3 Change copy password summary 2018-03-29 10:28:45 +02:00
J-Jamet
8de52cb51e Solve default XML settings 2018-03-29 10:25:55 +02:00
J-Jamet
c8cb79726b Change search methods 2018-03-29 10:16:44 +02:00
J-Jamet
d51a227c1d Add accessors to Database 2018-03-29 09:55:32 +02:00
J-Jamet
94ed03ce35 Refactor Database, Add Type parameters, Refactor ExtraFields 2018-03-29 00:35:25 +02:00
J-Jamet
304a5e946d Merge branch 'develop' into ModelTypeParameter 2018-03-28 21:37:50 +02:00
J-Jamet
ff64b53580 Fix crash when database can't be saved 2018-03-28 21:30:44 +02:00
J-Jamet
9ece794f9a Add type parameter to PwObject 2018-03-28 14:33:00 +02:00
J-Jamet
b67dc22f10 Solve gradle compilation warning 2018-03-28 12:41:23 +02:00
J-Jamet
8a1a29caa8 Upgrade Android version dialog #49 2018-03-28 11:57:03 +02:00
J-Jamet
a8d07c3e82 Refactor entry search 2018-03-27 18:46:59 +02:00
J-Jamet
937135bb36 Solve bug #63 Empty Autofill View 2018-03-27 15:31:47 +02:00
J-Jamet
10c32266c2 Add accessors to PwDatabase 2018-03-26 16:04:38 +02:00
J-Jamet
ad45369442 Add color to notification 2018-03-26 13:14:52 +02:00
J-Jamet
1ca770fa72 Upgrade fastlane 2018-03-25 20:58:24 +02:00
J-Jamet
4acd11d2b2 Merge tag '2.5.0.0beta7' into develop
2.5.0.0beta7
2018-03-25 20:40:21 +02:00
J-Jamet
38c264e38d Merge branch 'release/2.5.0.0beta7' 2018-03-25 20:40:00 +02:00
J-Jamet
8da6b882fc Fix compilation 2018-03-25 20:23:54 +02:00
J-Jamet
6e03c2ebfc Upgrade changelogs 2018-03-25 20:10:53 +02:00
J-Jamet
a5cb5ed896 Temp Merge branch 'feature/RefactorModel' to correct serializable crash 2018-03-25 20:03:41 +02:00
J-Jamet
32bef7b099 Add constructors 2018-03-25 15:49:13 +02:00
J-Jamet
af0359132e Move comparators in SortNodeEnum 2018-03-25 15:29:50 +02:00
J-Jamet
85990879de Add serializable to binary to solve crash, refactor UUID and icon 2018-03-25 14:05:19 +02:00
J-Jamet
9436a4c3a5 Merge remote-tracking branch 'origin/develop' into develop 2018-03-24 20:06:45 +01:00
J-Jamet
efc786e318 Description for error API #49 2018-03-24 20:06:27 +01:00
J-Jamet
ed299b35e9 Change clones (To redefine) 2018-03-24 17:13:16 +01:00
J-Jamet
0defe9401f Solve password notification 2018-03-24 12:53:47 +01:00
J-Jamet
b66678f028 Refactor Groups and Entries methods 2018-03-24 00:02:08 +01:00
J-Jamet
b0cfd4292f Make attributes private in PwGroup and PwEntry 2018-03-23 21:30:50 +01:00
J-Jamet
8e390685cd Upgrade changelog and change extended visual 2018-03-23 19:14:58 +01:00
J-Jamet
9bcacdca4a Change extended visual 2018-03-23 19:04:19 +01:00
J-Jamet
c1969402f1 Add extended Ascii (ñæËÌÂÝÜ...) #36 2018-03-23 16:54:32 +01:00
J-Jamet
50bf22a4c7 Better fingerprint error management #38 #52 2018-03-23 13:48:51 +01:00
J-Jamet
cf93044d3f Start factorise 2018-03-22 23:06:05 +01:00
J-Jamet
33404add38 Verify nullity of group 2018-03-22 16:48:02 +01:00
J-Jamet
49ba74c38f Add Copy of password in settings 2018-03-22 15:48:46 +01:00
J-Jamet
3ed5db9819 Change search label in settings 2018-03-22 15:10:24 +01:00
J-Jamet
4535204d1e Move down file_browser settings 2018-03-22 15:03:44 +01:00
J-Jamet
18c656a555 Solve flickering and architecture for timeout #43 2018-03-22 14:36:23 +01:00
J-Jamet
42c28b5b95 Add timeout in launch 2018-03-22 13:04:45 +01:00
J-Jamet
9fc47fdf05 Solve timeout bug and remove compat class for invalidateOptionMenu 2018-03-21 23:17:40 +01:00
J-Jamet
9ef34599ce Solve bug of refresh entry 2018-03-21 22:25:35 +01:00
J-Jamet
bd3e5c6917 Solve color bugs 2018-03-21 22:14:57 +01:00
J-Jamet
7e9bed1e53 #55 Fix dispatch event 2018-03-21 21:59:55 +01:00
J-Jamet
ff2215929c Add menu_edit strings 2018-03-21 17:49:15 +01:00
J-Jamet
36d53e9788 Add file_browser strings 2018-03-21 17:32:35 +01:00
J-Jamet
6b9db7d40d Merge branch 'develop' of https://github.com/Kunzisoft/KeePassDX into develop 2018-03-21 17:02:00 +01:00
J-Jamet
30f805f5a9 #55 Fix listener to add node (dispatch event must to be refactored) 2018-03-21 16:13:40 +01:00
J-Jamet
64448ef218 #58 Horizontal scroll to see password and fix layout issues 2018-03-21 15:08:57 +01:00
J-Jamet
6e312e0420 #53 Fix password checkbox and add lambda 2018-03-21 14:36:42 +01:00
J-Jamet
1f7b86d34f #52 Add strike-through for 0 and check setting by default 2018-03-21 14:17:44 +01:00
J-Jamet
ae00fd5782 Allow notifications for all fields 2018-03-20 15:04:44 +01:00
J-Jamet
62f6f02467 Add notification to copy extra field, remove unused string 2018-03-20 14:47:49 +01:00
J-Jamet
55ee89314f Merge remote-tracking branch 'origin/develop' into develop 2018-03-20 13:43:28 +01:00
J-Jamet
b2f985aa03 New Notification engine 2018-03-20 13:43:11 +01:00
J-Jamet
b3a34c0138 Auto open select file #32 2018-03-19 18:17:29 +01:00
J-Jamet
1f06b09d38 Remove manual compat dependencies in settings 2018-03-19 16:49:26 +01:00
J-Jamet
758914a80a Solve bug of empty filename #51 2018-03-19 16:33:43 +01:00
J-Jamet
f2566abdcd Solve bug of icon information color 2018-03-19 16:20:38 +01:00
J-Jamet
cb6d479350 Default file as hint, change color 2018-03-19 16:09:33 +01:00
J-Jamet
846930a4f9 Refactor packages 2018-03-19 01:39:34 +01:00
J-Jamet
e788d89b18 Fix null in entry menu 2018-03-19 01:17:52 +01:00
J-Jamet
07f68cfe2f Add 30 minutes to timeout #43 2018-03-18 15:46:25 +01:00
J-Jamet
1c6ef51925 Launch notification only one time 2018-03-18 15:31:47 +01:00
J-Jamet
9995bc4d9f Fix App timeout for main cases #43 2018-03-18 15:31:22 +01:00
J-Jamet
accb931831 Upgrade clipboard and timeout 2018-03-18 13:26:13 +01:00
J-Jamet
42ac83c814 Upgrade version 2018-03-18 11:31:35 +01:00
J-Jamet
9ee9063c4d Refactor Timeout, delete useless Intents class 2018-03-17 20:18:06 +01:00
J-Jamet
8c38b361ea New notifications to copy fields 2018-03-17 20:01:13 +01:00
J-Jamet
cb919b2de5 Fix action "add group" for v3 #46 2018-03-17 11:07:33 +01:00
J-Jamet
679ea7c58f Fix Autofill settings crash #22 2018-03-16 19:15:39 +01:00
J-Jamet
21ebbd25f8 Update changelogs 2018-03-16 17:19:06 +01:00
J-Jamet
3c232ac5b6 Change HTTP to HTTPS 2018-03-16 16:36:23 +01:00
J-Jamet
d36d2408d7 Upgrade Notifications 2018-03-15 23:37:21 +01:00
J-Jamet
9fd59f850c Fix flickering and timeout toast in settings 2018-03-14 17:36:11 +01:00
J-Jamet
4cc7d1e74d Fix ActivityNotFound in FilePicker #37 2018-03-14 16:52:40 +01:00
J-Jamet
66f4353c3e Fix ActivityNotFound for AutoFill Service #37 2018-03-14 14:38:56 +01:00
J-Jamet
0acc83b066 Merge tag '2.5.0.0beta6' into develop
2.5.0.0beta6
2018-03-10 13:56:07 +01:00
J-Jamet
943d7ca6b9 Merge branch 'release/2.5.0.0beta6' 2018-03-10 13:55:52 +01:00
J-Jamet
65d1c7376b Upgrade app and changelogs 2018-03-10 13:49:53 +01:00
J-Jamet
871a624313 Fix assign key crash 2018-03-10 13:32:58 +01:00
J-Jamet
8cf515120f Fix crash for dismiss dialog 2018-03-10 13:22:37 +01:00
J-Jamet
30c5db92e6 Fix getMasterKey for V3 2018-03-10 13:15:42 +01:00
J-Jamet
19ebc40bdb French trad for font 2018-03-10 13:06:38 +01:00
J-Jamet
4db2e6baf9 Fix application timeout 2018-03-10 13:01:06 +01:00
J-Jamet
a9c1369cbf Capture exception when create password 2018-03-10 00:09:06 +01:00
J-Jamet
dd478d7cd4 Fix null pointer emulator bug for Node children 2018-03-09 23:29:20 +01:00
J-Jamet
53e7cc7f72 Merge branch 'master' into develop 2018-03-09 23:14:34 +01:00
J-Jamet
e5d3a0a931 Cut Changelogs for PlayStore 2018-03-09 23:13:53 +01:00
J-Jamet
23e6b12326 Merge tag 'fix_compil_translation' into develop
2.5.0.0beta5fix
2018-03-09 22:29:32 +01:00
J-Jamet
2cc530cbec Merge branch 'hotfix/fix_compil_translation' 2018-03-09 22:28:47 +01:00
J-Jamet
b540cde623 Fix compilation 2018-03-09 22:24:26 +01:00
J-Jamet
5a54955941 Merge tag '2.5.0.0beta5' into develop
2.5.0.0beta5
2018-03-09 20:56:20 +01:00
J-Jamet
9ffffdceca Merge branch 'release/2.5.0.0beta5' 2018-03-09 20:55:49 +01:00
J-Jamet
257d0ff315 Update ScreenShots 2018-03-09 17:02:02 +01:00
J-Jamet
a935b0a089 Fix flickering 2018-03-09 16:46:58 +01:00
J-Jamet
0236bddffd Restore default transition 2018-03-09 16:36:50 +01:00
J-Jamet
384966641a Fix fingerprint keyfile recognition 2018-03-09 16:26:51 +01:00
J-Jamet
3be9c9161c Fix lock when screen off (back to password) 2018-03-09 16:00:24 +01:00
J-Jamet
a445533ffc Fix orientation in FileSelect and Password 2018-03-09 15:30:07 +01:00
J-Jamet
e073b21544 Fix compilation, flickering and crash with Autofill 2018-03-09 12:45:20 +01:00
J-Jamet
7e746bb01c Add Changelog for 2.5.0.0beta5 2018-03-08 13:42:59 +01:00
J-Jamet
2d8e902a2a Merge branch 'feature/Autofill' into develop #1 2018-03-08 13:11:15 +01:00
J-Jamet
bb10892b76 Exclude Autofill views 2018-03-08 12:59:56 +01:00
J-Jamet
bdfa5ae707 Change form filling setting text 2018-03-08 12:30:33 +01:00
J-Jamet
2091b04a11 Add autofill traduction 2018-03-08 12:28:03 +01:00
J-Jamet
f367c098ec Solve bug of back entry slowdown 2018-03-08 11:57:13 +01:00
J-Jamet
98631d37ae Dialog for Autofill not available 2018-03-08 11:50:07 +01:00
J-Jamet
d504ab7924 Retrieve Dataset, Upgrade Gradle, Add D8 dex 2018-03-08 00:19:32 +01:00
J-Jamet
4fc8c74530 Pass data result through activities 2018-03-06 15:13:17 +01:00
J-Jamet
4876623f86 Refactor autofill preference 2018-03-05 13:19:44 +01:00
J-Jamet
d5b752e4c0 Merge branch 'develop' after refactor lock 2018-03-04 12:53:47 +01:00
J-Jamet
a1ecc5b399 Refactor code to lock 2018-03-04 12:39:21 +01:00
J-Jamet
306e8b17b2 Merge branch 'develop' into feature/Autofill 2018-03-04 01:29:17 +01:00
J-Jamet
f66500f535 Change KeyFileHelper and refactor code 2018-03-03 01:15:22 +01:00
J-Jamet
b92ef7cb1a Change labels and copy toast 2018-03-02 13:15:17 +01:00
J-Jamet
b30c2656e8 Delete unused method 2018-03-02 12:49:18 +01:00
J-Jamet
0899c7fc5a Add Monospace setting for field #5 2018-03-02 12:39:03 +01:00
J-Jamet
800d0eb04d Solve bug of kdb and kdbx association 2018-03-01 23:13:18 +01:00
J-Jamet
b09bc52b51 Merge branch 'feature/Permissions' into develop #34 2018-03-01 22:54:36 +01:00
J-Jamet
657c810c1f Change string for never ask permission 2018-03-01 22:49:34 +01:00
J-Jamet
c501d6bdc6 Change fileSelect view 2018-03-01 22:42:10 +01:00
J-Jamet
f13c595bf9 Add permission to write database and read one without content provider 2018-03-01 19:01:00 +01:00
J-Jamet
60e2209281 Add External permission with permissionDispatcher 2018-03-01 14:13:19 +01:00
J-Jamet
24eeff1d61 Add menu order for each item 2018-02-27 22:11:34 +01:00
J-Jamet
c94291f6e1 Solve bug #25 - Add fingerprint key deletion 2018-02-27 21:15:46 +01:00
J-Jamet
6faee3cef9 Solve bug #25 - Read the fingerprint 2018-02-26 20:53:22 +01:00
J-Jamet
bb4e067394 Remove names from disclaimer 2018-02-26 14:45:32 +01:00
J-Jamet
81503c6934 Add Recycle Bin setting in code 2018-02-26 14:16:14 +01:00
J-Jamet
8858a5cdca Change code for list and solve bugs 2018-02-26 13:16:30 +01:00
J-Jamet
d994fbafcf Add 15 minutes to clipboard timeout 2018-02-26 11:45:34 +01:00
J-Jamet
c3954faa3e Solve bug after sort and prepare recycle bin at the bottom 2018-02-24 21:38:40 +01:00
J-Jamet
0650a6f7db Add ascending sort 2018-02-24 21:10:12 +01:00
J-Jamet
0ddd08bf6d Add dialog for sort and precise setting 2018-02-24 18:09:17 +01:00
J-Jamet
a1720c1c79 Move URL creation below password 2018-02-24 13:48:19 +01:00
J-Jamet
cd9f82696a Change name by title and sort trad 2018-02-24 13:46:20 +01:00
J-Jamet
242427d348 Hide "show password" icon when password not present 2018-02-24 13:04:51 +01:00
J-Jamet
3f1ab3623d Better button animation 2018-02-24 00:00:02 +01:00
J-Jamet
7068b4b4b3 Solve bug of update 2018-02-23 23:41:35 +01:00
J-Jamet
7c81685aa6 New animation for add button 2018-02-23 16:47:35 +01:00
J-Jamet
f7fc7984e2 Add compat for button animation 2018-02-23 14:53:01 +01:00
J-Jamet
b2ef29d131 Solve bug of hide button when scrolling 2018-02-23 14:40:43 +01:00
J-Jamet
d5dcf697f6 Refactor search and hide add button during search 2018-02-23 12:40:15 +01:00
J-Jamet
9731247f2e Lock toolbar 2018-02-23 11:20:36 +01:00
J-Jamet
c2654cd65c Add fingerprint alpha for text 2018-02-22 20:57:43 +01:00
J-Jamet
e032540c0b Add 5, 10 and 20 seconds of clipboard timeout 2018-02-22 20:51:22 +01:00
J-Jamet
6dda7d1e64 Copy as buttons 2018-02-22 20:17:43 +01:00
J-Jamet
f67df77dff Solve crash for empty password in V3 2018-02-22 18:22:43 +01:00
J-Jamet
ecdadaf0bc Solve small bug in code (listener) 2018-02-22 18:16:16 +01:00
J-Jamet
25fb85a5ef Solve bug of metastream 2018-02-22 18:04:40 +01:00
J-Jamet
31426268ea Refactor GroupActivity remove V3 and V4 2018-02-22 17:26:49 +01:00
J-Jamet
f0b5b1bcb5 Refactor EntryEditActivity, delete V3 and V4 2018-02-21 16:26:46 +01:00
J-Jamet
1f2ebf0825 Solve bug of file integration 2018-02-20 13:44:03 +01:00
J-Jamet
fa0afbe947 Solve bug of FileSelect list 2018-02-20 12:09:12 +01:00
J-Jamet
70967a4234 Solve bug of FAB in Entry Edit 2018-02-20 11:49:36 +01:00
J-Jamet
87c9aeeb12 Solve bug for new field 2018-02-19 21:21:23 +01:00
J-Jamet
0a386c3985 Solve visual FABs 2018-02-19 19:30:09 +01:00
J-Jamet
bfcd4b9f00 Solve visual submenu bug 2018-02-19 18:53:48 +01:00
J-Jamet
3d6082a5d9 Solve bug of update entry 2018-02-19 17:50:53 +01:00
J-Jamet
aceeb581d4 Add recycle bin setting, remove version, encapsulate field 2018-02-19 17:20:42 +01:00
J-Jamet
d46a6a2ea8 Hide empty field, move code in view, delete EntryActivityV4 2018-02-18 15:31:56 +01:00
J-Jamet
c1bf96ac5f Add done button for password and solve view bug 2018-02-18 12:16:56 +01:00
J-Jamet
a1bf5f1e70 Solve bug when update entry 2018-02-16 21:11:40 +01:00
J-Jamet
7155e25c1e Update views for material design 2018-02-16 20:53:09 +01:00
J-Jamet
5c4d2e607a Refactor for list of nodes, solve bug of add button 2018-02-16 16:33:25 +01:00
J-Jamet
79750c5320 Remove useless dirty, solve trash bug 2018-02-16 15:14:24 +01:00
J-Jamet
bb353bc9d6 Auto close of add button 2018-02-16 10:56:09 +01:00
J-Jamet
5818762aaf Solve bug of empty new entry 2018-02-16 10:55:48 +01:00
J-Jamet
e5467bc54b Solve search list and add edit for contextmenu in code 2018-02-14 20:21:44 +01:00
J-Jamet
e574fba0a5 Solve VerifyError exception for old device 2018-02-14 17:23:47 +01:00
J-Jamet
82b59662f3 Solve bug of settings not openable link to #19 2018-02-14 12:12:17 +01:00
Jeremy
260ce95509 Solve bug #19 and refactor click listener for fileselectadapter 2018-02-13 20:18:02 +01:00
Jeremy
23df28cb25 Solve bugs of recycle bin and entry view after callback 2018-02-13 18:25:31 +01:00
Jérémy JAMET
a68960a30f Update Readme, Remove JNI 2018-02-12 00:48:20 +01:00
Jeremy
f295aac206 Deleting some TODOs 2018-02-12 00:35:53 +01:00
Jeremy
d568604117 Solve bugs when update node in list, start encapsulate code 2018-02-12 00:22:03 +01:00
Jeremy
795d6fa334 Serializable for Pw, solve bug of entry refresh 2018-02-10 16:08:10 +01:00
Jeremy
d788d16020 New methods to dynamically add and remove node 2018-02-09 19:57:21 +01:00
Jeremy
c8db1f7c5c Add strategy pattern to node
Move sort list preference
2018-02-09 14:44:43 +01:00
Jeremy
ac67ff9f21 Refactor packages 2018-02-09 14:21:48 +01:00
Jeremy
3a71f635f0 ListView as RecyclerView,
Update SearchView,
Create Activity package
2018-02-09 12:45:45 +01:00
Jeremy
a9e12cb518 Merge branch 'develop' of https://github.com/Kunzisoft/KeePassDX into develop 2018-02-08 14:31:15 +01:00
J-Jamet
b0aac43d6c Solve bad fingerprint dialog issue #25 2018-02-02 16:38:09 +01:00
J-Jamet
f0d7249679 Solve search issue when no entry available #26 2018-02-02 16:28:44 +01:00
J-Jamet
32fb536a92 Solve fingerprint null pointer exception issue 2018-02-02 15:58:56 +01:00
J-Jamet
8f8361a176 Solve images in Readme 2018-02-01 19:53:32 +01:00
J-Jamet
06056128e5 Update fastlane scripts 2018-02-01 19:28:11 +01:00
Jeremy
259c31b94c Merge tag '2.5.0.0beta4' into develop
New tag for version 2.5.0.0beta4
2018-02-01 17:45:47 +01:00
Jeremy
c24c18d89e Merge branch 'release/2.5.0.0beta4' 2018-02-01 17:44:29 +01:00
Jeremy
61043b3acb Add fastlane/README.md 2018-02-01 17:18:35 +01:00
Jeremy
52f8862e71 Add changelogs 2018-02-01 15:44:36 +01:00
J-Jamet
8bd32e6605 Update fastlane script 2018-02-01 02:53:05 +01:00
J-Jamet
d430305eb1 Upgrade version 2018-02-01 02:52:45 +01:00
J-Jamet
2cb3972865 Add fastlane 2018-01-31 20:26:43 +01:00
J-Jamet
724bb1fc86 Solve issue for gradle compilation 2018-01-31 20:07:05 +01:00
Jeremy
ffffeb9e85 Better autofill data transfer between each activity,
New Autofill helper,
Add consultation mode
2018-01-30 21:08:30 +01:00
Jeremy
ebe8c90238 Mod files to do a good compilation 2018-01-29 23:26:36 +01:00
Jeremy
25f657e665 Merge branch 'develop' into feature/Autofill (Upgrade with last dev) 2018-01-29 23:24:40 +01:00
J-Jamet
38def26865 Solve crash when keyfile is selected 2018-01-28 22:43:13 +01:00
Jeremy
a08e65733d Upgrade disclaimer 2018-01-28 20:04:45 +01:00
Jeremy
e5bc9bfd1d Merge branch 'JanThomas118-update-german-translation' into develop 2018-01-28 19:31:17 +01:00
Jeremy
767f7b06d6 Merge branch 'upstream-update' issue #23 into develop 2018-01-28 18:55:56 +01:00
Jeremy
a06977cd25 Upgrade CHANGELOG 2018-01-28 18:48:05 +01:00
Jeremy
60be6f1223 Merge branch 'feature/FingerPrint' issue #20 into develop 2018-01-28 18:13:37 +01:00
Jeremy
e9929ed848 Fingerprint decrypt without fill password view 2018-01-28 16:56:26 +01:00
Jeremy
21c657c107 Code factoring 2018-01-28 16:37:18 +01:00
Jan Thomas
a93271401d fixed one punctuation error and removed accidental space at start of file 2018-01-27 22:59:40 +01:00
Jan Thomas
a66cd68ae2 Added more german translation strings 2018-01-27 22:54:33 +01:00
Jeremy
9ac060ea05 New settings to delete fingerprints 2018-01-27 15:49:23 +01:00
Jeremy
c20f453b90 Add fingerprints keystore deletion when disabled 2018-01-27 15:08:10 +01:00
J-Jamet
27d633a1e9 Lock fingerprint settings 2018-01-26 21:36:08 +01:00
J-Jamet
221a851f44 Solve fingerprints bugs 2018-01-26 20:50:37 +01:00
J-Jamet
c091ffb5e1 Remove thread when typing 2018-01-26 17:11:22 +01:00
J-Jamet
d8f81b669d Remove singleInstance in PasswordActivity -> bug in Kitkat 2018-01-24 22:03:53 +01:00
J-Jamet
fb72f37ebb Solve bug KeepassDX #18 2018-01-24 21:11:43 +01:00
Jeremy
6c5936d15d Add singleInstance tag for some activities 2018-01-23 22:31:40 +01:00
Jeremy
e68c682cac Decode FileUri in views 2018-01-23 22:31:01 +01:00
Jeremy
04da145513 Solve DocumentFile bug 2018-01-23 22:19:16 +01:00
J-Jamet
a15a039f2a Merge branch 'feature/ListOpening' into develop 2018-01-17 18:27:06 +01:00
J-Jamet
818c0a769b Update screenshots and CHANGELOG 2018-01-17 18:24:14 +01:00
J-Jamet
cc7b8a3fd8 Add setting to select file path and solve bugs 2018-01-17 17:42:26 +01:00
J-Jamet
43b4d00902 Add file deletion, move information and solve bugs 2018-01-17 15:28:11 +01:00
J-Jamet
06b126469a Add information dialog for file 2018-01-14 22:46:38 +01:00
J-Jamet
2ca4e817e9 Solve bug of titleFileList 2018-01-14 20:11:13 +01:00
J-Jamet
42a52b26bf FileSelect as RecyclerView 2018-01-14 19:34:32 +01:00
J-Jamet
5d8a73080b Change donation url 2018-01-14 17:45:59 +01:00
J-Jamet
0b736ce0b3 Change edit text layout color 2018-01-12 20:44:28 +01:00
J-Jamet
dea6515e90 Update file layout 2018-01-12 20:04:53 +01:00
J-Jamet
1bd1b2a224 Update "Open recent database" text 2018-01-12 19:01:00 +01:00
J-Jamet
b7a76ed2e7 Change file_selection 2018-01-12 18:56:25 +01:00
Jeremy
a1237215cc New layout 2018-01-10 23:20:54 +01:00
J-Jamet
4bb869e288 Merge branch 'develop' into upstream-update 2018-01-03 12:33:41 +01:00
J-Jamet
1d528488d3 Merge branch 'master' 2.2.1 of https://github.com/bpellin/keepassdroid into upstream-update 2018-01-03 12:16:49 +01:00
Brian Pellin
90282d9722 Version bump 2018-01-02 22:37:31 -06:00
bpellin
2c7b19d67d Merge pull request #255 from shanempope/dev
Fixing issue where Search opens new task instead of using same task.
2018-01-02 22:26:35 -06:00
bpellin
981fef8fb1 Merge pull request #256 from EdlerProgrammierer/patch-1
Add DE translation
2018-01-02 22:24:56 -06:00
Brian Pellin
77c8207c73 Fix kdbx4 date corruption 2018-01-02 22:08:22 -06:00
Jérémy JAMET
825a5c7e73 Update ReadMe.md 2018-01-02 19:10:29 +01:00
Jeremy
d921a0ae1a Change fingerprint exceptions 2018-01-02 00:49:11 +01:00
J-Jamet
ffd40a5419 Merge branch 'develop' 2.5.0.0beta3 into feature/Autofill 2017-12-15 16:28:10 +01:00
EdlerProgrammierer
1946844858 Add DE translation 2017-12-13 19:29:31 +01:00
J-Jamet
b62106068b Solve compilation bug for fdroid 2017-12-13 18:55:32 +01:00
Jeremy
1218d89173 Solve preferences bugs 2017-12-12 02:57:53 +01:00
Shane Pope
052641c556 Removing extraneous comment 2017-12-11 18:18:55 -06:00
Shane Pope
7950933d1f Fixing issue where Search opens new task instead of using same task.
If you open KeePassDroid from a file in another app, the KeePassDroid activity opens in that Task. However, if you search the ACTION_SEARCH intent opens a new task putting the app in a weird state that has various bugs. The easy way to fix this is setting PasswordActivity to LaunchMode="singleTask" in AndroidManifest. The other option is to remove the FLAG_ACTIVITY_NEW_TASK intent flagbit on search allowing the search activity to stay in the current task. I've included the second option in this changeset.
2017-12-11 18:10:58 -06:00
J-Jamet
37279af514 Change preferences as compat 2017-12-09 00:48:34 +01:00
J-Jamet
b45a8b5c94 Solve bug for fingerprint layout 2017-12-09 00:08:32 +01:00
J-Jamet
8a344170b3 Change description for rounds fix 2017-12-08 22:36:47 +01:00
J-Jamet
09f6498907 Solve settings style for API < 21 2017-12-08 21:04:02 +01:00
J-Jamet
57b8b9e53b Add features in Changelog 2017-12-08 21:03:33 +01:00
J-Jamet
8edb2c26d4 Merge branch 'upstream-update' 2.2.0.9 into develop #11 2017-12-08 20:30:26 +01:00
J-Jamet
7d7b34b2d0 Merge branch 'feature/EmptyPassword' into develop #2 2017-12-08 20:02:36 +01:00
J-Jamet
73765a7ecb Merge branch 'feature/FingerprintDialog' into develop #4 2017-12-08 19:18:26 +01:00
Jeremy
fb99c32708 Add fix for encryption rounds 2017-12-08 17:08:47 +01:00
Jeremy
6bb0b1a7e7 Add database lock for screen off 2017-12-08 15:53:25 +01:00
Jeremy
7a66c964a7 Add fingerprint setting for API < 23 2017-12-07 19:19:31 +01:00
Jeremy
a5b1535fb8 Add fingerprint setting 2017-12-07 15:57:16 +01:00
J-Jamet
05a5da4c8d Add fingerprint dialog and update icons 2017-12-06 22:28:25 +01:00
J-Jamet
f5314e0a9a Update ReadMe and screens 2017-12-05 21:14:54 +01:00
J-Jamet
332d1e0e06 Solve dialogs bugs (checkboxes) 2017-12-05 21:00:02 +01:00
Jeremy
9173c99928 Solve layout for selections 2017-12-04 21:28:44 +01:00
Jeremy
421bdae0d7 Solve select path bugs 2017-12-04 17:55:54 +01:00
Jeremy
421de6ea49 Add folder picker and solve asynctask 2017-12-04 04:39:52 +01:00
J-Jamet
ec2dd3db64 Add dialog to create database file 2017-12-03 16:45:40 +01:00
J-Jamet
e6cc9b628e New keyfile management 2017-12-01 20:03:22 +01:00
J-Jamet
7cce527e43 New workflow to assign master password 2017-12-01 18:24:20 +01:00
Jeremy
dd35fd508f Merge 2.2.0.9 into upstream-update 2017-11-30 22:40:34 +01:00
Brian Pellin
a7b5fd512a Version bump 2017-11-30 14:37:07 -06:00
Brian Pellin
45b03231dd Update build tools version 2017-11-30 14:34:20 -06:00
bpellin
85357e2168 Merge pull request #248 from pepeEL/patch-1
Update translation PL
2017-11-30 14:30:35 -06:00
bpellin
d6709254e2 Merge pull request #247 from bboa/master
Updated Russian strings.xml
2017-11-30 14:29:41 -06:00
J-Jamet
ef42dcd47f Change views and add checkboxes 2017-11-30 19:16:34 +01:00
J-Jamet
8536586c13 Solve settings title and change box by switch 2017-11-30 01:39:59 +01:00
J-Jamet
4794ccb38a Option to disable notifications #7 2017-11-30 01:32:16 +01:00
J-Jamet
d14dc22918 Solve layout password issue 2017-11-30 00:52:12 +01:00
J-Jamet
79084cee62 Merge branch 'develop' of repo 2017-11-30 00:39:23 +01:00
J-Jamet
f0ec9229cd Add visual representation of characters 2017-11-30 00:37:52 +01:00
J-Jamet
f6b04dff24 Password characters in settings 2017-11-30 00:19:26 +01:00
J-Jamet
b6721b32e7 Password length in settings #3 2017-11-29 20:42:01 +01:00
Jérémy JAMET
b1804a94b6 Update ReadMe.md 2017-11-29 20:41:22 +01:00
J-Jamet
f6bcd51cd3 Update gradle, .gitignore, add art screen and update readme 2017-11-29 20:41:22 +01:00
J-Jamet
a833dfe64a Remove unused libs and upgrade version 2017-11-29 20:41:22 +01:00
J-Jamet
87efd1daa4 Merge keepassdroid 2.2.0.8 and update changelog 2017-11-29 18:47:26 +01:00
J-Jamet
ecdd744b8e Merge keepassdroid 2.2.0.8 and update changelog 2017-11-29 18:46:46 +01:00
J-Jamet
9012fd6da6 Merge branch 'master' into develop 2017-11-28 01:27:31 +01:00
J-Jamet
c6a711dec5 Solve open file bug 2017-11-28 01:27:22 +01:00
pepeEL
9b1a0285c4 Update translation PL 2017-11-27 07:15:08 +01:00
Igor Nedoboy
fd6dd01ee7 Update strings.xml 2017-11-27 03:32:54 +03:00
Jérémy JAMET
bd10fe8542 Update ReadMe.md 2017-11-27 00:08:37 +01:00
J-Jamet
8333a80d88 Update gradle, .gitignore, add art screen and update readme 2017-11-27 00:07:08 +01:00
Brian Pellin
192f116925 Version bump 2017-11-25 23:45:25 -06:00
Brian Pellin
409ffd4f95 Fix UTF8 encoding 2017-11-25 23:42:24 -06:00
Brian Pellin
0add3c76c8 Add rounds corruption fix mode. 2017-11-25 23:42:21 -06:00
Brian Pellin
b4f9e06bd6 Version bump 2017-11-24 21:33:28 -06:00
Brian Pellin
c686ff7156 Fix kdbx4 attachments 2017-11-24 21:28:23 -06:00
Brian Pellin
da1370e7f5 Use the correct number of key encryption rounds on KDBX <4 2017-11-24 20:26:23 -06:00
Brian Pellin
c564253206 Use ACTION_GET_CONTENT when not using the storage access framework 2017-11-24 19:19:33 -06:00
Brian Pellin
3f22bf9e5c Updated Hungarian translations. 2017-11-24 19:18:06 -06:00
Jeremy
8f8b265d97 Add workflow autofill response 2017-11-24 22:01:18 +01:00
Jeremy
d20eef0922 Add autofill service and preference 2017-11-23 19:07:13 +01:00
Brian Pellin
eae321d034 Add additional ndk abis 2017-11-21 20:59:07 -06:00
Brian Pellin
e2022183ea Version bump 2017-11-21 20:43:18 -06:00
Brian Pellin
924db245ec Make DateFormatter threadsafe 2017-11-21 20:40:55 -06:00
Brian Pellin
2dae805ac0 Only show fingerprint prompt on devices with fingerprint hardware 2017-11-21 20:39:40 -06:00
Brian Pellin
9ce0a413ad Update build file versions 2017-11-21 20:38:30 -06:00
Brian Pellin
1ece7b1df7 Version bump 2017-11-19 21:12:38 -06:00
Brian Pellin
b7aec355a2 Fingerprint fixes 2017-11-19 21:09:55 -06:00
Brian Pellin
780a0cd42d Version bump 2017-11-19 19:30:20 -06:00
Brian Pellin
de45421b50 Handle devices with unconfigured fingerprint sensors better 2017-11-19 19:27:47 -06:00
Brian Pellin
c11e17af05 Remove new APIs from fingerprint helper 2017-11-19 19:11:16 -06:00
Brian Pellin
260de4099b Fix crash on empty search results 2017-11-19 16:46:47 -06:00
1189 changed files with 63141 additions and 32834 deletions

17
.gitignore vendored
View File

@@ -6,6 +6,7 @@
# Built application files
*.apk
*.ap_
app/free_google/*
# Files for the ART/Dalvik VM
*.dex
@@ -39,7 +40,6 @@ captures/
# Intellij
*.iml
<<<<<<< HEAD
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
@@ -49,19 +49,16 @@ captures/
# Keystore files
# Uncomment the following line if you do not want to check your keystore files in.
#*.jks
=======
.idea/*
# Keystore files
*.jks
>>>>>>> master
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
# Google Services (e.g. APIs or Firebase)
google-services.json
<<<<<<< HEAD
# Freeline
freeline.py
@@ -70,5 +67,13 @@ freeline_project_description.json
# Iml Files
app/app.iml
=======
>>>>>>> master
# Art
art/screen*.png
art/logo_512.png
art/store_screens/
# Dir linux
.directory
*/.directory
.idea

22
.idea/compiler.xml generated
View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
</project>

View File

@@ -1,3 +0,0 @@
<component name="CopyrightManager">
<settings default="" />
</component>

6
.idea/encodings.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>

20
.idea/gradle.xml generated
View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="distributionType" value="LOCAL" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1" />
<option name="gradleJvm" value="1.8" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>

View File

@@ -1,11 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="AndroidLintAppCompatResource" enabled="false" level="ERROR" enabled_by_default="false" />
<inspection_tool class="AndroidLintMissingTranslation" enabled="true" level="INFO" enabled_by_default="true" />
<inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
<option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" />
<option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" />
</inspection_tool>
</profile>
</component>

View File

@@ -1,7 +0,0 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Project Default" />
<option name="USE_PROJECT_PROFILE" value="true" />
<version value="1.0" />
</settings>
</component>

49
.idea/misc.xml generated
View File

@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
<component name="masterDetails">
<states>
<state key="ProjectJDKs.UI">
<settings>
<last-edited>1.7</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>

9
.idea/modules.xml generated
View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/KeePassDX.iml" filepath="$PROJECT_DIR$/KeePassDX.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
</modules>
</component>
</project>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>

185
CHANGELOG
View File

@@ -1,3 +1,157 @@
KeepassDX (2.5.0.0beta21)
* Fix nested groups no longer visible in V1 databases
* Improved data import algorithm for V1 databases
* Add natural database sort
* Add username database sort
* Fix button disabled with only KeyFile
* Show the number of entries in a group
KeepassDX (2.5.0.0beta20)
* Fix a major bug that displays an entry history
KeepassDX (2.5.0.0beta19)
* Add lock button always visible
* New connection workflow
* Code refactored in Kotlin
* Better notification implementation
* Better views for large screen
* Magikeyboard enhancement
* Fix Recycle Bin
* Fix memory when load database
* Fix small bugs
KeepassDX (2.5.0.0beta18)
* New recent databases views
* New information dialog
* Custom fields for the Magikeyboard
* Timeout for the Magikeyboard
* Long press for keyboard selection
* Fix memory when opening the database
* Memory management for attachments
KeepassDX (2.5.0.0beta17)
* Fix font and search
KeepassDX (2.5.0.0beta16)
* New search in a single fragment
* Search suggestions
* Added the display of usernames
* Added translations
* Fix read-only mode
* Fix parcelable / toolbar / back
KeepassDX (2.5.0.0beta15)
* Read only mode
* Best group recovery for the navigation fragment
* Fix copies in notifications
* Fix orientation
* Added translations
KeepassDX (2.5.0.0beta14)
* Optimize all the memory with parcelables / fix search
KeepassDX (2.5.0.0beta13)
* Fix memory issue with parcelable (crash in beta12 version)
KeepassDX (2.5.0.0beta12)
* Added the Magikeyboard to fill the forms (settings still in development)
* Added move and copy for groups and entries
* New navigation in a single screen / new animations between activities
* New icons for the material pack / vectorization
* New adaptive launcher icon
* Icons depends now of setting of list items
* Added a setting to disable the open button when no password is identified
* Added a setting to disable the education screens
* Added a setting to disable the copy of protected custom fields
* Fix the fingerprint recognition (WARNING : The keystore is reinit, you must delete the old keys)
* Fix small bugs
KeepassDX (2.5.0.0beta11)
* Fix crash in beta10 version
KeepassDX (2.5.0.0beta10)
* Dynamically change Algorithm and Key Derivation Function in settings
* Upgrade translations
* New red volcano theme, fix classic dark theme
* Add Material Icon Pack to the Free version
* Update fingerprint state with checkbox
* Fix bugs
KeepassDX (2.5.0.0beta9)
* Education Screens to learn how to use the app
* New designs
* New custom font for character visibility
* New themes
* New icon pack
* Change setting organisation
* Pro version
KeepassDX (2.5.0.0beta8)
* Hide custom entries protected
* Best management of field references (https://keepass.info/help/base/fieldrefs.html)
* Change database / default settings
* Add Autofill for search
* Add sorting by last access and by creation time
* Rebuild custom entries
* Refactor old code
* Fix bugs
KeepassDX (2.5.0.0beta7)
* Rebuild Notifications
* Change links to https
* Add extended Ascii (ñæËÌÂÝÜ...)
* Upgrade custom visibility font
* Best fingerprint error management
* Add setting to prevent the password copy
* Fix bugs
KeepassDX (2.5.0.0beta6)
* Fix crash
KeepassDX (2.5.0.0beta5)
* Autofill (Android O)
* Deletion for group
* New sorts with (Asc/Dsc, Groups before or after)
* Better permission management with dialog at runtime
* Setting to change font of field (monospace for a better visibility)
* Open kdbx and kdb files from file browser
* Change sort of fields
* Hide empty fields
* Add copy button for Username / Password and extra field
* Add 5, 10, 20 seconds and 15 minutes of clipboard timeout
* Hide "show password" icon when password not present
* New animations for add button
* New list to add and delete node with animation
* Change view for better cohesion
* Upgrade translations
* Fix crash for API < Kitkat
* Fix fingerprint bugs
* Fix many small bugs
* Add recycle bin setting (not yet accessible)
KeepassDX (2.5.0.0beta4)
* Show only file name
* Setting for full path
* Add information for each database file
* Setting to delete fingerprints
* Solve bugs when change fingerprint
* Delete view assignment for fingerprint opening
* Merge KeePassDroid 2.2.1
KeepassDX (2.5.0.0beta3)
* New database workflow with new screens and folder selection
* Settings for default password generation
* Fingerprint dialog for explanations
* Setting to disable fingerprint
* Directly opening kdbx file
* Setting to disable notifications
* Setting to lock database when screen is shut off
* Merge KeePassDroid 2.2.0.9
* Add corruption fix mode
KeepassDX (2.5.0.0beta2)
* Remove libs for F-Droid
KeepassDX (2.5.0.0beta1)
* Fork KeepassDroid
* Add Material Design
@@ -7,6 +161,37 @@ KeepassDX (2.5.0.0beta1)
* Update French translation
* Change donation (see KeepassDroid to contribute on both projects)
KeePassDroid (2.2.1)
* Fix kdbx4 date corruption
* Updated German translations
KeePassDroid (2.2.0.9)
* Update build tools version to workaround CM/Lineage bug (closes: #249)
* Update Russian translations
* Update Polish translations
KeePassDroid (2.2.0.8)
* Add corruption fix mode
* Update Hungarian translations
KeePassDroid (2.2.0.7)
* Fix KDBX3 encryption rounds corruption
* Fix KDBX4 attachement crashes
KeePassDroid (2.2.0.6)
* Add additional ndk ABIs
KeePassDroid (2.2.0.5)
* Don't show fingerprint prompt on devices without fingerprint hardware
* Fix dateformat crashes
KeePassDroid (2.2.0.4)
* Fingerprint fixes
KeePassDroid (2.2.0.3)
* Search crash fix
* Improve fingerprint handling
KeePassDroid (2.2.0.2)
* Fix non fingerprint password layout

View File

@@ -14,14 +14,14 @@ Tadashi Saito
vhschlenker
bumper314 - Samsung multiwindow support
Hans Cappelle - fingerprint sensor integration
Jeremy Jamet - Material Design - Patches
Jeremy Jamet - Keepass DX Material Design - Patches
Translations:
Diego Pierotto - Italian
Laurent, Norman Obry, Nam, Bruno Parmentier, Credomo - French
Maciej Bieniek, cod3r - Polish
Максим Сёмочкин, i.nedoboy, filimonic, bboa - Russian
MaWi, rvs2008, meviox, MaDill - German
MaWi, rvs2008, meviox, MaDill, EdlerProgrammierer, Jan Thomas - German
yslandro - Norwegian Nynorsk
王科峰 - Chinese
Typhoon - Slovak
@@ -30,7 +30,7 @@ Matsuu Takuto - Japanese
Carlos Schlyter - Portugese (Brazil)
YSmhXQDd6Z - Portugese (Portugal)
andriykopanytsia - Ukranian
intel - Hungarian
intel, Zoltán Antal - Hungarian
H Vanek - Czech
jipanos - Spanish
Erik Fdevriendt, Erik Jan Meijer - Dutch

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.

16
LICENSE
View File

@@ -1,7 +1,19 @@
---
The KeePass icon was created by Jeremy JAMET and is licensed under the terms of GPLv3.
KeePass DX is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
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/>.
The KeePass DX icon was created by Jeremy JAMET and is licensed under the terms of GPLv3.
---
@@ -54,7 +66,7 @@ Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft <contact@kunzisoft.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
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,

View File

@@ -0,0 +1,396 @@
Attribution 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution 4.0 International Public License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution 4.0 International Public License ("Public License"). To the
extent this Public License may be interpreted as a contract, You are
granted the Licensed Rights in consideration of Your acceptance of
these terms and conditions, and the Licensor grants You such rights in
consideration of benefits the Licensor receives from making the
Licensed Material available under these terms and conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
d. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
e. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
f. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
g. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
h. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
i. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
j. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
k. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part; and
b. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified
form), You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
4. If You Share Adapted Material You produce, the Adapter's
License You apply must not prevent recipients of the Adapted
Material from complying with this Public License.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material; and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the “Licensor.” The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.
Creative Commons may be contacted at creativecommons.org.

View File

@@ -0,0 +1,93 @@
Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A.
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@@ -1,58 +1,76 @@
# Android Keepass DX
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/logo.png"> Keepass DX is a material design Keepass Client for manage keys and passwords in crypt database for your android device.
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/icon.png"> Keepass DX is a **multi-format KeePass manager for Android devices**. The application allows to create keys and passwords in a secure way by integrating with the Android design standards.
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/screen.jpg" width="220">
### Features
- Create database file / entries and groups
- Open database, copy username / password, open URI / URL
- Fingerprint for fast unlocking
- Material design with themes
- Device integration and AutoFill (In progress)
* Create database files / entries and groups
* Support for **.kdb** and **.kdbx** files (version 1 to 4) with AES - Twofish - ChaCha20 - Argon2 algorithm
* **Compatible** with the majority of alternative programs (KeePass, KeePassX, KeePass XC...)
* Allows **fast copy** of fields and opening of URI / URL
* **Fingerprint** for fast unlocking
* Material design with **themes**
* **AutoFill** and Integration
* Field filling **keyboard**
* Precise management of **settings**
* Code written in **native language** *(Kotlin / Java / JNI / C)*
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/screen0.jpg" width="220">
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/screen2.jpg" width="220">
Keepass DX is **open source** and **ad-free**.
## What is KeePass?
## What is KeePass DX?
Today you need to remember many passwords. You need a password for the Windows network logon, your e-mail account, your website's FTP password, online passwords (like website member account), etc. etc. etc. The list is endless. Also, you should use different passwords for each account. Because if you use only one password everywhere and someone gets this password you have a problem... A serious problem. The thief would have access to your e-mail account, website, etc. Unimaginable.
Today you need to remember many passwords. You need a password for your e-mail account, your website's FTP password, online passwords (like website member account), etc. etc. etc. The list is endless. Also, you **should use different passwords for each account**. Because if you use only one password everywhere and someone gets this password you have a problem... A serious problem. The thief would have access to your e-mail account, website, etc. Unimaginable.
KeePass is a free open source password manager, which helps you to manage your passwords in a secure way. You can put all your passwords in one database, which is locked with one master key or a key file. So you only have to remember one single master password or select the key file to unlock the whole database. The databases are encrypted using the best and most secure encryption algorithms currently known (AES and Twofish). For more information, see the features page.
KeePass DX is a **free open source password manager for Android**, which helps you to **manage your passwords in a secure way**. You can put all your passwords in one database, which is locked with one **master key** or a **key file**. So you **only have to remember one single master password or select the key file** to unlock the whole database. The databases are encrypted using the best and **most secure encryption algorithms** currently known.
## Is it really free?
Yes, KeePass is really free, and more than that: it is open source (OSI certified). You can have a look at its full source and check whether the encryption algorithms are implemented correctly.
Yes, KeePass DX is under **free license (OSI certified)** and **without advertising**. You can have a look at its full source and check whether the encryption algorithms are implemented correctly.
## Donation
*Note : If you access the application from a store, visual features may not be available to incentivize the contribution to the work of open source projects. These optional visuals are accessible after a donation (and a small congratulation message :) or the purchase of an extended version, but do not worry, the main features remain completely free. If you contribute to the project and you do not have access to the themes, do not hesitate to contact me at [contact@kunzisoft.com](contact@kunzisoft.com), I will give you the procedure.*
Even if the application is free, to maintain the application, you can make donations.
## Contributions
[![Donation Paypal](https://4.bp.blogspot.com/-ncaIbUGaHOk/WfhaThYUPGI/AAAAAAAAAVQ/_HidNgdB1q4DaC24ujaKNzH64KUUJiQewCLcBGAs/s1600/pay-with-paypal.png "")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KM6QMDAXZM3UU "Kunzisoft Paypal Donation")
You can contribute in different ways to help us on our work.
[![Donation Liberapay](https://liberapay.com/assets/widgets/donate.svg "")](https://liberapay.com/Kunzisoft/donate "Kunzisoft Liberapay Donation")
* Add features by a **[pull request](https://help.github.com/articles/about-pull-requests/)**.
* Help to **[translate](https://hosted.weblate.org/projects/keepass-dx/strings/)** into your language (By using [Weblate](https://hosted.weblate.org/projects/keepass-dx/) or with a manual [pull request](https://help.github.com/articles/about-pull-requests/))
* **[Donate](https://www.kunzisoft.com/donation)** 人◕ ‿‿ ◕人Y for a better service and a quick development of your features.
* Buy the **[Pro version](https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro)** of KeePass DX
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/screen4.jpg" width="220">
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/screen5.jpg" width="220">
## Download
### JNI
*We recommend the installation from [F-Droid](https://f-droid.org/en/packages/com.kunzisoft.keepass.libre/) which verifies that all libraries and application code are open source.*
Native library build instructions:
1. Make sure you have the latest MIPS Android NDK installed:
https://developer.android.com/tools/sdk/ndk/index.html
2. From KeePassDroid/app/src/main/jni, call prep_build.sh to download and unpack the crypto sources.
3. The standard gradle files build everything now.
[<img src="https://f-droid.org/badge/get-it-on.png"
alt="Get it on F-Droid"
height="80">](https://f-droid.org/en/packages/com.kunzisoft.keepass.libre/)
This project is a fork of [KeepassDroid](https://github.com/bpellin/keepassdroid) by bpellin.
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Get it on Google Play"
height="80">](https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.free)
## F.A.Q.
Other questions? You can read the [F.A.Q.](https://www.keepassdx.com/FAQ)
## Other devices
- [KeePass XC](https://keepassxc.org/) (https://keepassxc.org/) works with **GNU/Linux**, **Mac** and **Windows**, is updated regularly and under the terms of the GNU General Public License. This is the recommended version for computers.
- [KeePass](https://keepass.info/) (https://keepass.info/) is the historical project, with good technical documentation for standardized database files but only running on **Windows**.
## License
Copyright (c) 2017 Jeremy Jamet / Kunzisoft.
Copyright (c) 2019 Jeremy Jamet / [Kunzisoft](https://www.kunzisoft.com).
This file is part of KeePass DX.
KeePass DX is free software: you can redistribute it and/or modify
[KeePass DX](https://www.keepassdx.com) 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
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
KeePass DX is distributed in the hope that it will be useful,
@@ -62,3 +80,5 @@ This project is a fork of [KeepassDroid](https://github.com/bpellin/keepassdroid
You should have received a copy of the GNU General Public License
along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*This project is a fork of [KeepassDroid](https://github.com/bpellin/keepassdroid) by bpellin.*

View File

@@ -1,18 +1,24 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion = 25
buildToolsVersion = "26.0.2"
compileSdkVersion 27
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "com.kunzisoft.keepass"
minSdkVersion 14
targetSdkVersion 25
versionCode = 2
versionName = "2.5.0.0beta2"
targetSdkVersion 27
versionCode = 21
versionName = "2.5.0.0beta21"
multiDexEnabled true
testApplicationId = "com.keepassdroid.tests"
testApplicationId = "com.kunzisoft.keepass.tests"
testInstrumentationRunner = "android.test.InstrumentationTestRunner"
buildConfigField "String[]", "ICON_PACKS", "{\"classic\",\"material\"}"
}
externalNativeBuild {
@@ -21,6 +27,7 @@ android {
}
}
buildTypes {
release {
minifyEnabled = false
@@ -35,35 +42,80 @@ android {
productFlavors {
libre {
applicationIdSuffix = ".libre"
versionNameSuffix "-libre"
buildConfigField "String", "BUILD_VERSION", "\"libre\""
buildConfigField "boolean", "FULL_VERSION", "true"
buildConfigField "boolean", "GOOGLE_PLAY_VERSION", "false"
buildConfigField "boolean", "CLOSED_STORE", "false"
buildConfigField "String[]", "STYLES_DISABLED", "{\"KeepassDXStyle_Dark\",\"KeepassDXStyle_Red\",\"KeepassDXStyle_Purple\"}"
buildConfigField "String[]", "ICON_PACKS_DISABLED", "{}"
}
pro_google {
pro {
applicationIdSuffix = ".pro"
versionNameSuffix "-pro"
buildConfigField "String", "BUILD_VERSION", "\"pro\""
buildConfigField "boolean", "FULL_VERSION", "true"
buildConfigField "boolean", "GOOGLE_PLAY_VERSION", "true"
buildConfigField "boolean", "CLOSED_STORE", "true"
buildConfigField "String[]", "STYLES_DISABLED", "{}"
buildConfigField "String[]", "ICON_PACKS_DISABLED", "{}"
}
free_google {
free {
applicationIdSuffix = ".free"
versionNameSuffix "-free"
buildConfigField "String", "BUILD_VERSION", "\"free\""
buildConfigField "boolean", "FULL_VERSION", "false"
buildConfigField "boolean", "GOOGLE_PLAY_VERSION", "true"
}
buildConfigField "boolean", "CLOSED_STORE", "true"
buildConfigField "String[]", "STYLES_DISABLED", "{\"KeepassDXStyle_Dark\",\"KeepassDXStyle_Blue\",\"KeepassDXStyle_Red\",\"KeepassDXStyle_Purple\"}"
buildConfigField "String[]", "ICON_PACKS_DISABLED", "{}"
}
}
def supportVersion = "25.4.0"
sourceSets {
libre.res.srcDir 'src/libre/res'
pro.res.srcDir 'src/pro/res'
free.res.srcDir 'src/free/res'
}
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
}
}
def supportVersion = "27.1.1"
def spongycastleVersion = "1.58.0.0"
def permissionDispatcherVersion = "3.3.1"
dependencies {
androidTestCompile "junit:junit:4.12"
compile "com.android.support:appcompat-v7:$supportVersion"
compile "com.android.support:design:$supportVersion"
compile "com.android.support:preference-v7:$supportVersion"
compile "com.android.support:preference-v14:$supportVersion"
compile "com.madgag.spongycastle:core:$spongycastleVersion"
compile "com.madgag.spongycastle:prov:$spongycastleVersion"
compile "joda-time:joda-time:2.9.9"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "com.android.support:appcompat-v7:$supportVersion"
implementation "com.android.support:design:$supportVersion"
implementation "com.android.support:preference-v7:$supportVersion"
implementation "com.android.support:preference-v14:$supportVersion"
implementation "com.android.support:cardview-v7:$supportVersion"
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation "com.madgag.spongycastle:core:$spongycastleVersion"
implementation "com.madgag.spongycastle:prov:$spongycastleVersion"
// Expandable view
implementation 'net.cachapa.expandablelayout:expandablelayout:2.9.2'
// Time
implementation 'joda-time:joda-time:2.9.9'
implementation 'org.sufficientlysecure:html-textview:3.5'
implementation 'com.nononsenseapps:filepicker:4.1.0'
implementation 'com.getkeepsafe.taptargetview:taptargetview:1.12.0'
// Permissions
implementation("com.github.hotchemi:permissionsdispatcher:$permissionDispatcherVersion") {
// if you don't use android.app.Fragment you can exclude support for them
exclude module: "support-v13"
}
kapt "com.github.hotchemi:permissionsdispatcher-processor:$permissionDispatcherVersion"
// Apache Commons Collections
implementation 'commons-collections:commons-collections:3.2.1'
implementation 'org.apache.commons:commons-io:1.3.2'
// Base64
implementation 'biz.source_code:base64coder:2010-12-19'
// IO-Extras
implementation 'com.github.davidmoten:io-extras:0.1'
implementation 'com.google.code.gson:gson:2.8.4'
implementation 'com.google.guava:guava:23.0-android'
// Icon pack
implementation project(path: ':icon-pack-classic')
implementation project(path: ':icon-pack-material')
}

View File

@@ -1,42 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests;
import android.test.AndroidTestCase;
import com.keepassdroid.tests.database.TestData;
public class AccentTest extends AndroidTestCase {
private static final String KEYFILE = "";
private static final String PASSWORD = "é";
private static final String ASSET = "accent.kdb";
private static final String FILENAME = "/sdcard/accent.kdb";
public void testOpen() {
try {
TestData.GetDb(getContext(), ASSET, PASSWORD, KEYFILE, FILENAME);
} catch (Exception e) {
assertTrue("Failed to open database", false);
}
}
}

View File

@@ -1,38 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests;
import junit.framework.TestCase;
import com.keepassdroid.database.PwDate;
public class PwDateTest extends TestCase {
public void testDate() {
PwDate jDate = new PwDate(System.currentTimeMillis());
PwDate intermediate = (PwDate) jDate.clone();
PwDate cDate = new PwDate(intermediate.getCDate(), 0);
assertTrue("jDate and intermediate not equal", jDate.equals(intermediate));
assertTrue("jDate and cDate not equal", cDate.equals(jDate));
}
}

View File

@@ -1,63 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests;
import static org.junit.Assert.assertArrayEquals;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import android.test.AndroidTestCase;
import com.keepassdroid.database.PwEntryV3;
import com.keepassdroid.tests.database.TestData;
public class PwEntryTestV3 extends AndroidTestCase {
PwEntryV3 mPE;
@Override
protected void setUp() throws Exception {
super.setUp();
mPE = (PwEntryV3) TestData.GetTest1(getContext()).entries.get(0);
}
public void testName() {
assertTrue("Name was " + mPE.title, mPE.title.equals("Amazon"));
}
public void testPassword() throws UnsupportedEncodingException {
String sPass = "12345";
byte[] password = sPass.getBytes("UTF-8");
assertArrayEquals(password, mPE.getPasswordBytes());
}
public void testCreation() {
Calendar cal = Calendar.getInstance();
cal.setTime(mPE.tCreation.getJDate());
assertEquals("Incorrect year.", cal.get(Calendar.YEAR), 2009);
assertEquals("Incorrect month.", cal.get(Calendar.MONTH), 3);
assertEquals("Incorrect day.", cal.get(Calendar.DAY_OF_MONTH), 23);
}
}

View File

@@ -1,66 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests;
import java.util.UUID;
import junit.framework.TestCase;
import com.keepassdroid.database.PwEntryV4;
import com.keepassdroid.database.PwGroupV4;
import com.keepassdroid.database.PwIconCustom;
import com.keepassdroid.database.PwIconStandard;
import com.keepassdroid.database.security.ProtectedBinary;
import com.keepassdroid.database.security.ProtectedString;
public class PwEntryTestV4 extends TestCase {
public void testAssign() {
PwEntryV4 entry = new PwEntryV4();
entry.additional = "test223";
entry.autoType = entry.new AutoType();
entry.autoType.defaultSequence = "1324";
entry.autoType.enabled = true;
entry.autoType.obfuscationOptions = 123412432109L;
entry.autoType.put("key", "value");
entry.backgroupColor = "blue";
entry.binaries.put("key1", new ProtectedBinary(false, new byte[] {0,1}));
entry.customIcon = new PwIconCustom(UUID.randomUUID(), new byte[0]);
entry.foregroundColor = "red";
entry.history.add(new PwEntryV4());
entry.icon = new PwIconStandard(5);
entry.overrideURL = "override";
entry.parent = new PwGroupV4();
entry.strings.put("key2", new ProtectedString(false, "value2"));
entry.url = "http://localhost";
entry.uuid = UUID.randomUUID();
PwEntryV4 target = new PwEntryV4();
target.assign(entry);
/* This test is not so useful now that I am not implementing value equality for Entries
assertTrue("Entries do not match.", entry.equals(target));
*/
}
}

View File

@@ -1,71 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import android.content.Context;
import android.content.res.AssetManager;
import android.net.Uri;
import android.os.Environment;
import com.keepassdroid.utils.EmptyUtils;
import com.keepassdroid.utils.UriUtil;
public class TestUtil {
private static final File sdcard = Environment.getExternalStorageDirectory();
public static void extractKey(Context ctx, String asset, String target) throws Exception {
InputStream key = ctx.getAssets().open(asset, AssetManager.ACCESS_STREAMING);
FileOutputStream keyFile = new FileOutputStream(target);
while (true) {
byte[] buf = new byte[1024];
int read = key.read(buf);
if ( read == -1 ) {
break;
} else {
keyFile.write(buf, 0, read);
}
}
keyFile.close();
}
public static InputStream getKeyFileInputStream(Context ctx, String keyfile) throws FileNotFoundException {
InputStream keyIs = null;
if (!EmptyUtils.isNullOrEmpty(keyfile)) {
Uri uri = UriUtil.parseDefaultFile(keyfile);
keyIs = UriUtil.getUriInputStream(ctx, uri);
}
return keyIs;
}
public static String getSdPath(String filename) {
File file = new File(sdcard, filename);
return file.getAbsolutePath();
}
}

View File

@@ -1,211 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests;
import static org.junit.Assert.assertArrayEquals;
import java.io.ByteArrayOutputStream;
import java.util.Calendar;
import java.util.Random;
import java.util.UUID;
import junit.framework.TestCase;
import com.keepassdroid.database.PwDate;
import com.keepassdroid.stream.LEDataInputStream;
import com.keepassdroid.stream.LEDataOutputStream;
import com.keepassdroid.utils.Types;
public class TypesTest extends TestCase {
public void testReadWriteLongZero() {
testReadWriteLong((byte) 0);
}
public void testReadWriteLongMax() {
testReadWriteLong(Byte.MAX_VALUE);
}
public void testReadWriteLongMin() {
testReadWriteLong(Byte.MIN_VALUE);
}
public void testReadWriteLongRnd() {
Random rnd = new Random();
byte[] buf = new byte[1];
rnd.nextBytes(buf);
testReadWriteLong(buf[0]);
}
private void testReadWriteLong(byte value) {
byte[] orig = new byte[8];
byte[] dest = new byte[8];
setArray(orig, value, 0, 8);
long one = LEDataInputStream.readLong(orig, 0);
LEDataOutputStream.writeLong(one, dest, 0);
assertArrayEquals(orig, dest);
}
public void testReadWriteIntZero() {
testReadWriteInt((byte) 0);
}
public void testReadWriteIntMin() {
testReadWriteInt(Byte.MIN_VALUE);
}
public void testReadWriteIntMax() {
testReadWriteInt(Byte.MAX_VALUE);
}
private void testReadWriteInt(byte value) {
byte[] orig = new byte[4];
byte[] dest = new byte[4];
for (int i = 0; i < 4; i++ ) {
orig[i] = 0;
}
setArray(orig, value, 0, 4);
int one = LEDataInputStream.readInt(orig, 0);
LEDataOutputStream.writeInt(one, dest, 0);
assertArrayEquals(orig, dest);
}
private void setArray(byte[] buf, byte value, int offset, int size) {
for (int i = offset; i < offset + size; i++) {
buf[i] = value;
}
}
public void testReadWriteShortOne() {
byte[] orig = new byte[2];
byte[] dest = new byte[2];
orig[0] = 0;
orig[1] = 1;
int one = LEDataInputStream.readUShort(orig, 0);
dest = LEDataOutputStream.writeUShortBuf(one);
assertArrayEquals(orig, dest);
}
public void testReadWriteShortMin() {
testReadWriteShort(Byte.MIN_VALUE);
}
public void testReadWriteShortMax() {
testReadWriteShort(Byte.MAX_VALUE);
}
private void testReadWriteShort(byte value) {
byte[] orig = new byte[2];
byte[] dest = new byte[2];
setArray(orig, value, 0, 2);
int one = LEDataInputStream.readUShort(orig, 0);
LEDataOutputStream.writeUShort(one, dest, 0);
assertArrayEquals(orig, dest);
}
public void testReadWriteByteZero() {
testReadWriteByte((byte) 0);
}
public void testReadWriteByteMin() {
testReadWriteByte(Byte.MIN_VALUE);
}
public void testReadWriteByteMax() {
testReadWriteShort(Byte.MAX_VALUE);
}
private void testReadWriteByte(byte value) {
byte[] orig = new byte[1];
byte[] dest = new byte[1];
setArray(orig, value, 0, 1);
int one = Types.readUByte(orig, 0);
Types.writeUByte(one, dest, 0);
assertArrayEquals(orig, dest);
}
public void testDate() {
Calendar cal = Calendar.getInstance();
Calendar expected = Calendar.getInstance();
expected.set(2008, 1, 2, 3, 4, 5);
byte[] buf = PwDate.writeTime(expected.getTime(), cal);
Calendar actual = Calendar.getInstance();
actual.setTime(PwDate.readTime(buf, 0, cal));
assertEquals("Year mismatch: ", 2008, actual.get(Calendar.YEAR));
assertEquals("Month mismatch: ", 1, actual.get(Calendar.MONTH));
assertEquals("Day mismatch: ", 1, actual.get(Calendar.DAY_OF_MONTH));
assertEquals("Hour mismatch: ", 3, actual.get(Calendar.HOUR_OF_DAY));
assertEquals("Minute mismatch: ", 4, actual.get(Calendar.MINUTE));
assertEquals("Second mismatch: ", 5, actual.get(Calendar.SECOND));
}
public void testUUID() {
Random rnd = new Random();
byte[] bUUID = new byte[16];
rnd.nextBytes(bUUID);
UUID uuid = Types.bytestoUUID(bUUID);
byte[] eUUID = Types.UUIDtoBytes(uuid);
assertArrayEquals("UUID match failed", bUUID, eUUID);
}
public void testULongMax() throws Exception {
byte[] ulongBytes = new byte[8];
for (int i = 0; i < ulongBytes.length; i++) {
ulongBytes[i] = -1;
}
ByteArrayOutputStream bos = new ByteArrayOutputStream();
LEDataOutputStream leos = new LEDataOutputStream(bos);
leos.writeLong(Types.ULONG_MAX_VALUE);
leos.close();
byte[] uLongMax = bos.toByteArray();
assertArrayEquals(ulongBytes, uLongMax);
}
}

View File

@@ -1,83 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.crypto;
import static org.junit.Assert.assertArrayEquals;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import junit.framework.TestCase;
import com.keepassdroid.crypto.CipherFactory;
public class AESTest extends TestCase {
private Random mRand = new Random();
public void testEncrypt() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {
// Test above below and at the blocksize
testFinal(15);
testFinal(16);
testFinal(17);
// Test random larger sizes
int size = mRand.nextInt(494) + 18;
testFinal(size);
}
private void testFinal(int dataSize) throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, InvalidAlgorithmParameterException {
// Generate some input
byte[] input = new byte[dataSize];
mRand.nextBytes(input);
// Generate key
byte[] keyArray = new byte[32];
mRand.nextBytes(keyArray);
SecretKeySpec key = new SecretKeySpec(keyArray, "AES");
// Generate IV
byte[] ivArray = new byte[16];
mRand.nextBytes(ivArray);
IvParameterSpec iv = new IvParameterSpec(ivArray);
Cipher android = CipherFactory.getInstance("AES/CBC/PKCS5Padding", true);
android.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] outAndroid = android.doFinal(input, 0, dataSize);
Cipher nat = CipherFactory.getInstance("AES/CBC/PKCS5Padding");
nat.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] outNative = nat.doFinal(input, 0, dataSize);
assertArrayEquals("Arrays differ on size: " + dataSize, outAndroid, outNative);
}
}

View File

@@ -1,100 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.crypto;
import static org.junit.Assert.assertArrayEquals;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import junit.framework.TestCase;
import com.keepassdroid.crypto.CipherFactory;
import com.keepassdroid.crypto.engine.AesEngine;
import com.keepassdroid.crypto.engine.CipherEngine;
import com.keepassdroid.stream.BetterCipherInputStream;
import com.keepassdroid.stream.LEDataInputStream;
public class CipherTest extends TestCase {
private Random rand = new Random();
public void testCipherFactory() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] key = new byte[32];
byte[] iv = new byte[16];
byte[] plaintext = new byte[1024];
rand.nextBytes(key);
rand.nextBytes(iv);
rand.nextBytes(plaintext);
CipherEngine aes = CipherFactory.getInstance(AesEngine.CIPHER_UUID);
Cipher encrypt = aes.getCipher(Cipher.ENCRYPT_MODE, key, iv);
Cipher decrypt = aes.getCipher(Cipher.DECRYPT_MODE, key, iv);
byte[] secrettext = encrypt.doFinal(plaintext);
byte[] decrypttext = decrypt.doFinal(secrettext);
assertArrayEquals("Encryption and decryption failed", plaintext, decrypttext);
}
public void testCipherStreams() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException {
final int MESSAGE_LENGTH = 1024;
byte[] key = new byte[32];
byte[] iv = new byte[16];
byte[] plaintext = new byte[MESSAGE_LENGTH];
rand.nextBytes(key);
rand.nextBytes(iv);
rand.nextBytes(plaintext);
CipherEngine aes = CipherFactory.getInstance(AesEngine.CIPHER_UUID);
Cipher encrypt = aes.getCipher(Cipher.ENCRYPT_MODE, key, iv);
Cipher decrypt = aes.getCipher(Cipher.DECRYPT_MODE, key, iv);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
CipherOutputStream cos = new CipherOutputStream(bos, encrypt);
cos.write(plaintext);
cos.close();
byte[] secrettext = bos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(secrettext);
BetterCipherInputStream cis = new BetterCipherInputStream(bis, decrypt);
LEDataInputStream lis = new LEDataInputStream(cis);
byte[] decrypttext = lis.readBytes(MESSAGE_LENGTH);
assertArrayEquals("Encryption and decryption failed", plaintext, decrypttext);
}
}

View File

@@ -1,66 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.crypto;
import static org.junit.Assert.assertArrayEquals;
import java.io.IOException;
import java.util.Random;
import junit.framework.TestCase;
import com.keepassdroid.crypto.finalkey.AndroidFinalKey;
import com.keepassdroid.crypto.finalkey.NativeFinalKey;
public class FinalKeyTest extends TestCase {
private Random mRand;
@Override
protected void setUp() throws Exception {
super.setUp();
mRand = new Random();
}
public void testNativeAndroid() throws IOException {
// Test both an old and an even number to test my flip variable
testNativeFinalKey(5);
testNativeFinalKey(6);
}
private void testNativeFinalKey(int rounds) throws IOException {
byte[] seed = new byte[32];
byte[] key = new byte[32];
byte[] nativeKey;
byte[] androidKey;
mRand.nextBytes(seed);
mRand.nextBytes(key);
AndroidFinalKey aKey = new AndroidFinalKey();
androidKey = aKey.transformMasterKey(seed, key, rounds);
NativeFinalKey nKey = new NativeFinalKey();
nativeKey = nKey.transformMasterKey(seed, key, rounds);
assertArrayEquals("Does not match", androidKey, nativeKey);
}
}

View File

@@ -1,79 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.database;
import java.io.InputStream;
import java.util.UUID;
import android.content.Context;
import android.content.res.AssetManager;
import android.test.AndroidTestCase;
import biz.source_code.base64Coder.Base64Coder;
import com.keepassdroid.database.PwDatabaseV4;
import com.keepassdroid.database.PwEntryV4;
import com.keepassdroid.database.load.ImporterV4;
import com.keepassdroid.utils.SprEngine;
import com.keepassdroid.utils.Types;
public class SprEngineTest extends AndroidTestCase {
private PwDatabaseV4 db;
private SprEngine spr;
@Override
protected void setUp() throws Exception {
super.setUp();
Context ctx = getContext();
AssetManager am = ctx.getAssets();
InputStream is = am.open("test.kdbx", AssetManager.ACCESS_STREAMING);
ImporterV4 importer = new ImporterV4();
db = importer.openDatabase(is, "12345", null);
is.close();
spr = SprEngine.getInstance(db);
}
private final String REF = "{REF:P@I:2B1D56590D961F48A8CE8C392CE6CD35}";
private final String ENCODE_UUID = "IN7RkON49Ui1UZ2ddqmLcw==";
private final String RESULT = "Password";
public void testRefReplace() {
UUID entryUUID = decodeUUID(ENCODE_UUID);
PwEntryV4 entry = (PwEntryV4) db.entries.get(entryUUID);
assertEquals(RESULT, spr.compile(REF, entry, db));
}
private UUID decodeUUID(String encoded) {
if (encoded == null || encoded.length() == 0 ) {
return PwDatabaseV4.UUID_ZERO;
}
byte[] buf = Base64Coder.decode(encoded);
return Types.bytestoUUID(buf);
}
}

View File

@@ -1,73 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.search;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.test.AndroidTestCase;
import com.kunzisoft.keepass.R;
import com.keepassdroid.Database;
import com.keepassdroid.database.PwGroup;
import com.keepassdroid.tests.database.TestData;
public class SearchTest extends AndroidTestCase {
private Database mDb;
@Override
protected void setUp() throws Exception {
super.setUp();
mDb = TestData.GetDb1(getContext(), true);
}
public void testSearch() {
PwGroup results = mDb.Search("Amazon");
assertTrue("Search result not found.", results.childEntries.size() > 0);
}
public void testBackupIncluded() {
updateOmitSetting(false);
PwGroup results = mDb.Search("BackupOnly");
assertTrue("Search result not found.", results.childEntries.size() > 0);
}
public void testBackupExcluded() {
updateOmitSetting(true);
PwGroup results = mDb.Search("BackupOnly");
assertFalse("Search result found, but should not have been.", results.childEntries.size() > 0);
}
private void updateOmitSetting(boolean setting) {
Context ctx = getContext();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(ctx.getString(R.string.omitbackup_key), setting);
editor.commit();
}
}

View File

@@ -1,110 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.stream;
import static org.junit.Assert.assertArrayEquals;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import junit.framework.TestCase;
import com.keepassdroid.stream.HashedBlockInputStream;
import com.keepassdroid.stream.HashedBlockOutputStream;
public class HashedBlock extends TestCase {
private static Random rand = new Random();
public void testBlockAligned() throws IOException {
testSize(1024, 1024);
}
public void testOffset() throws IOException {
testSize(1500, 1024);
}
private void testSize(int blockSize, int bufferSize) throws IOException {
byte[] orig = new byte[blockSize];
rand.nextBytes(orig);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
HashedBlockOutputStream output = new HashedBlockOutputStream(bos, bufferSize);
output.write(orig);
output.close();
byte[] encoded = bos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(encoded);
HashedBlockInputStream input = new HashedBlockInputStream(bis);
ByteArrayOutputStream decoded = new ByteArrayOutputStream();
while ( true ) {
byte[] buf = new byte[1024];
int read = input.read(buf);
if ( read == -1 ) {
break;
}
decoded.write(buf, 0, read);
}
byte[] out = decoded.toByteArray();
assertArrayEquals(orig, out);
}
public void testGZIPStream() throws IOException {
final int testLength = 32000;
byte[] orig = new byte[testLength];
rand.nextBytes(orig);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
HashedBlockOutputStream hos = new HashedBlockOutputStream(bos);
GZIPOutputStream zos = new GZIPOutputStream(hos);
zos.write(orig);
zos.close();
byte[] compressed = bos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(compressed);
HashedBlockInputStream his = new HashedBlockInputStream(bis);
GZIPInputStream zis = new GZIPInputStream(his);
byte[] uncompressed = new byte[testLength];
int read = 0;
while (read != -1 && testLength - read > 0) {
read += zis.read(uncompressed, read, testLength - read);
}
assertArrayEquals("Output not equal to input", orig, uncompressed);
}
}

View File

@@ -1,57 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.utils;
import java.util.Locale;
import com.keepassdroid.utils.StrUtil;
import junit.framework.TestCase;
public class StrUtilTest extends TestCase {
private final String text = "AbCdEfGhIj";
private final String search = "BcDe";
private final String badSearch = "Ed";
public void testIndexOfIgnoreCase1() {
assertEquals(1, StrUtil.indexOfIgnoreCase(text, search, Locale.ENGLISH));
}
public void testIndexOfIgnoreCase2() {
assertEquals(-1, StrUtil.indexOfIgnoreCase(text, search, Locale.ENGLISH), 2);
}
public void testIndexOfIgnoreCase3() {
assertEquals(-1, StrUtil.indexOfIgnoreCase(text, badSearch, Locale.ENGLISH));
}
private final String repText = "AbCtestingaBc";
private final String repSearch = "ABc";
private final String repSearchBad = "CCCCCC";
private final String repNew = "12345";
private final String repResult = "12345testing12345";
public void testReplaceAllIgnoresCase1() {
assertEquals(repResult, StrUtil.replaceAllIgnoresCase(repText, repSearch, repNew, Locale.ENGLISH));
}
public void testReplaceAllIgnoresCase2() {
assertEquals(repText, StrUtil.replaceAllIgnoresCase(repText, repSearchBad, repNew, Locale.ENGLISH));
}
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests;
import android.test.AndroidTestCase;
import com.kunzisoft.keepass.tests.database.TestData;
public class AccentTest extends AndroidTestCase {
private static final String KEYFILE = "";
private static final String PASSWORD = "é";
private static final String ASSET = "accent.kdb";
private static final String FILENAME = "/sdcard/accent.kdb";
public void testOpen() {
/*
try {
TestData.GetDb(getContext(), ASSET, PASSWORD, KEYFILE, FILENAME);
} catch (Exception e) {
assertTrue("Failed to open database", false);
}
*/
}
}

View File

@@ -5,7 +5,7 @@
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,7 +17,7 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests;
package com.kunzisoft.keepass.tests;
import junit.framework.Test;
import junit.framework.TestSuite;

View File

@@ -5,7 +5,7 @@
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,7 +17,7 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests;
package com.kunzisoft.keepass.tests;
import junit.framework.Test;
import junit.framework.TestSuite;
@@ -29,7 +29,7 @@ public class OutputTests extends TestSuite {
public static Test suite() {
return new TestSuiteBuilder(AllTests.class)
.includePackages("com.keepassdroid.tests.output")
.includePackages("com.kunzisoft.keepass.tests.output")
.build();
}
}

View File

@@ -1,11 +1,11 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
* Copyright 2019 Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,27 +17,21 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid;
package com.kunzisoft.keepass.tests
import android.content.Context;
import android.widget.Toast;
import junit.framework.TestCase
public class UIToastTask implements Runnable {
import com.kunzisoft.keepass.database.element.PwDate
import org.junit.Assert
private String mText;
private Context mCtx;
class PwDateTest : TestCase() {
public UIToastTask(Context ctx, int resId) {
mCtx = ctx;
mText = ctx.getString(resId);
}
fun testDate() {
val jDate = PwDate(System.currentTimeMillis())
val intermediate = PwDate(jDate)
val cDate = PwDate(intermediate.byteArrayDate!!, 0)
public UIToastTask(Context ctx, String text) {
mCtx = ctx;
mText = text;
}
public void run() {
Toast.makeText(mCtx, mText, Toast.LENGTH_LONG).show();
Assert.assertTrue("jDate and intermediate not equal", jDate == intermediate)
Assert.assertTrue("jDate and cDate not equal", cDate == jDate)
}
}

View File

@@ -0,0 +1,63 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests;
import static org.junit.Assert.assertArrayEquals;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import android.test.AndroidTestCase;
import com.kunzisoft.keepass.database.element.PwEntryV3;
import com.kunzisoft.keepass.tests.database.TestData;
public class PwEntryTestV3 extends AndroidTestCase {
PwEntryV3 mPE;
@Override
protected void setUp() throws Exception {
super.setUp();
// mPE = (PwEntryV3) TestData.GetTest1(getContext()).getEntryAt(0);
}
public void testName() {
assertTrue("Name was " + mPE.getTitle(), mPE.getTitle().equals("Amazon"));
}
public void testPassword() throws UnsupportedEncodingException {
String sPass = "12345";
byte[] password = sPass.getBytes("UTF-8");
assertArrayEquals(password, mPE.getPasswordBytes());
}
public void testCreation() {
Calendar cal = Calendar.getInstance();
cal.setTime(mPE.getCreationTime().getDate());
assertEquals("Incorrect year.", cal.get(Calendar.YEAR), 2009);
assertEquals("Incorrect month.", cal.get(Calendar.MONTH), 3);
assertEquals("Incorrect day.", cal.get(Calendar.DAY_OF_MONTH), 23);
}
}

View File

@@ -0,0 +1,59 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests;
import junit.framework.TestCase;
public class PwEntryTestV4 extends TestCase {
public void testAssign() {
/*
TODO Test
PwEntryV4 entry = new PwEntryV4();
entry.setAdditional("test223");
entry.setAutoType(new AutoType());
entry.getAutoType().defaultSequence = "1324";
entry.getAutoType().enabled = true;
entry.getAutoType().obfuscationOptions = 123412432109L;
entry.getAutoType().put("key", "value");
entry.setBackgroundColor("blue");
entry.putProtectedBinary("key1", new ProtectedBinary(false, new byte[] {0,1}));
entry.setIconCustom(new PwIconCustom(UUID.randomUUID(), new byte[0]));
entry.setForegroundColor("red");
entry.addToHistory(new PwEntryV4());
entry.setIconStandard(new PwIconStandard(5));
entry.setOverrideURL("override");
entry.setParent(new PwGroupV4());
entry.addExtraField("key2", new ProtectedString(false, "value2"));
entry.setUrl("http://localhost");
entry.setNodeId(UUID.randomUUID());
PwEntryV4 target = new PwEntryV4();
target.updateWith(entry);
/* This test is not so useful now that I am not implementing value equality for Entries
assertTrue("Entries do not match.", entry.equals(target));
*/
}
}

View File

@@ -5,7 +5,7 @@
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,13 +17,13 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests;
package com.kunzisoft.keepass.tests;
import android.test.AndroidTestCase;
import com.keepassdroid.database.PwGroupV3;
import com.keepassdroid.tests.database.TestData;
import com.kunzisoft.keepass.database.element.PwGroupV3;
import com.kunzisoft.keepass.tests.database.TestData;
public class PwGroupTest extends AndroidTestCase {
@@ -33,12 +33,12 @@ public class PwGroupTest extends AndroidTestCase {
protected void setUp() throws Exception {
super.setUp();
mPG = (PwGroupV3) TestData.GetTest1(getContext()).getGroups().get(0);
//mPG = (PwGroupV3) TestData.GetTest1(getContext()).getGroups().get(0);
}
public void testGroupName() {
assertTrue("Name was " + mPG.name, mPG.name.equals("Internet"));
//assertTrue("Name was " + mPG.getTitle(), mPG.getTitle().equals("Internet"));
}
}

View File

@@ -0,0 +1,56 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests;
import android.content.Context;
import android.content.res.AssetManager;
import android.os.Environment;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
public class TestUtil {
private static final File sdcard = Environment.getExternalStorageDirectory();
public static void extractKey(Context ctx, String asset, String target) throws Exception {
InputStream key = ctx.getAssets().open(asset, AssetManager.ACCESS_STREAMING);
FileOutputStream keyFile = new FileOutputStream(target);
while (true) {
byte[] buf = new byte[1024];
int read = key.read(buf);
if ( read == -1 ) {
break;
} else {
keyFile.write(buf, 0, read);
}
}
keyFile.close();
}
public static String getSdPath(String filename) {
File file = new File(sdcard, filename);
return file.getAbsolutePath();
}
}

View File

@@ -0,0 +1,211 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests;
import static org.junit.Assert.assertArrayEquals;
import java.io.ByteArrayOutputStream;
import java.util.Calendar;
import java.util.Random;
import java.util.UUID;
import junit.framework.TestCase;
import com.kunzisoft.keepass.database.element.PwDate;
import com.kunzisoft.keepass.stream.LEDataInputStream;
import com.kunzisoft.keepass.stream.LEDataOutputStream;
import com.kunzisoft.keepass.utils.Types;
public class TypesTest extends TestCase {
public void testReadWriteLongZero() {
testReadWriteLong((byte) 0);
}
public void testReadWriteLongMax() {
testReadWriteLong(Byte.MAX_VALUE);
}
public void testReadWriteLongMin() {
testReadWriteLong(Byte.MIN_VALUE);
}
public void testReadWriteLongRnd() {
Random rnd = new Random();
byte[] buf = new byte[1];
rnd.nextBytes(buf);
testReadWriteLong(buf[0]);
}
private void testReadWriteLong(byte value) {
byte[] orig = new byte[8];
byte[] dest = new byte[8];
setArray(orig, value, 0, 8);
long one = LEDataInputStream.readLong(orig, 0);
LEDataOutputStream.writeLong(one, dest, 0);
assertArrayEquals(orig, dest);
}
public void testReadWriteIntZero() {
testReadWriteInt((byte) 0);
}
public void testReadWriteIntMin() {
testReadWriteInt(Byte.MIN_VALUE);
}
public void testReadWriteIntMax() {
testReadWriteInt(Byte.MAX_VALUE);
}
private void testReadWriteInt(byte value) {
byte[] orig = new byte[4];
byte[] dest = new byte[4];
for (int i = 0; i < 4; i++ ) {
orig[i] = 0;
}
setArray(orig, value, 0, 4);
int one = LEDataInputStream.readInt(orig, 0);
LEDataOutputStream.writeInt(one, dest, 0);
assertArrayEquals(orig, dest);
}
private void setArray(byte[] buf, byte value, int offset, int size) {
for (int i = offset; i < offset + size; i++) {
buf[i] = value;
}
}
public void testReadWriteShortOne() {
byte[] orig = new byte[2];
byte[] dest = new byte[2];
orig[0] = 0;
orig[1] = 1;
int one = LEDataInputStream.readUShort(orig, 0);
dest = LEDataOutputStream.writeUShortBuf(one);
assertArrayEquals(orig, dest);
}
public void testReadWriteShortMin() {
testReadWriteShort(Byte.MIN_VALUE);
}
public void testReadWriteShortMax() {
testReadWriteShort(Byte.MAX_VALUE);
}
private void testReadWriteShort(byte value) {
byte[] orig = new byte[2];
byte[] dest = new byte[2];
setArray(orig, value, 0, 2);
int one = LEDataInputStream.readUShort(orig, 0);
LEDataOutputStream.writeUShort(one, dest, 0);
assertArrayEquals(orig, dest);
}
public void testReadWriteByteZero() {
testReadWriteByte((byte) 0);
}
public void testReadWriteByteMin() {
testReadWriteByte(Byte.MIN_VALUE);
}
public void testReadWriteByteMax() {
testReadWriteShort(Byte.MAX_VALUE);
}
private void testReadWriteByte(byte value) {
byte[] orig = new byte[1];
byte[] dest = new byte[1];
setArray(orig, value, 0, 1);
int one = Types.readUByte(orig, 0);
Types.writeUByte(one, dest, 0);
assertArrayEquals(orig, dest);
}
public void testDate() {
Calendar cal = Calendar.getInstance();
Calendar expected = Calendar.getInstance();
expected.set(2008, 1, 2, 3, 4, 5);
byte[] buf = PwDate.Companion.writeTime(expected.getTime(), cal);
Calendar actual = Calendar.getInstance();
actual.setTime(PwDate.Companion.readTime(buf, 0, cal));
assertEquals("Year mismatch: ", 2008, actual.get(Calendar.YEAR));
assertEquals("Month mismatch: ", 1, actual.get(Calendar.MONTH));
assertEquals("Day mismatch: ", 1, actual.get(Calendar.DAY_OF_MONTH));
assertEquals("Hour mismatch: ", 3, actual.get(Calendar.HOUR_OF_DAY));
assertEquals("Minute mismatch: ", 4, actual.get(Calendar.MINUTE));
assertEquals("Second mismatch: ", 5, actual.get(Calendar.SECOND));
}
public void testUUID() {
Random rnd = new Random();
byte[] bUUID = new byte[16];
rnd.nextBytes(bUUID);
UUID uuid = Types.bytestoUUID(bUUID);
byte[] eUUID = Types.UUIDtoBytes(uuid);
assertArrayEquals("UUID match failed", bUUID, eUUID);
}
public void testULongMax() throws Exception {
byte[] ulongBytes = new byte[8];
for (int i = 0; i < ulongBytes.length; i++) {
ulongBytes[i] = -1;
}
ByteArrayOutputStream bos = new ByteArrayOutputStream();
LEDataOutputStream leos = new LEDataOutputStream(bos);
leos.writeLong(Types.ULONG_MAX_VALUE);
leos.close();
byte[] uLongMax = bos.toByteArray();
assertArrayEquals(ulongBytes, uLongMax);
}
}

View File

@@ -0,0 +1,83 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests.crypto;
import com.kunzisoft.keepass.crypto.CipherFactory;
import junit.framework.TestCase;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import static org.junit.Assert.assertArrayEquals;
public class AESTest extends TestCase {
private Random mRand = new Random();
public void testEncrypt() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {
// Test above below and at the blocksize
testFinal(15);
testFinal(16);
testFinal(17);
// Test random larger sizes
int size = mRand.nextInt(494) + 18;
testFinal(size);
}
private void testFinal(int dataSize) throws NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, InvalidAlgorithmParameterException {
// Generate some input
byte[] input = new byte[dataSize];
mRand.nextBytes(input);
// Generate key
byte[] keyArray = new byte[32];
mRand.nextBytes(keyArray);
SecretKeySpec key = new SecretKeySpec(keyArray, "AES");
// Generate IV
byte[] ivArray = new byte[16];
mRand.nextBytes(ivArray);
IvParameterSpec iv = new IvParameterSpec(ivArray);
Cipher android = CipherFactory.INSTANCE.getInstance("AES/CBC/PKCS5Padding", true);
android.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] outAndroid = android.doFinal(input, 0, dataSize);
Cipher nat = CipherFactory.INSTANCE.getInstance("AES/CBC/PKCS5Padding");
nat.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] outNative = nat.doFinal(input, 0, dataSize);
assertArrayEquals("Arrays differ on size: " + dataSize, outAndroid, outNative);
}
}

View File

@@ -0,0 +1,100 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests.crypto;
import static org.junit.Assert.assertArrayEquals;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import junit.framework.TestCase;
import com.kunzisoft.keepass.crypto.CipherFactory;
import com.kunzisoft.keepass.crypto.engine.AesEngine;
import com.kunzisoft.keepass.crypto.engine.CipherEngine;
import com.kunzisoft.keepass.stream.BetterCipherInputStream;
import com.kunzisoft.keepass.stream.LEDataInputStream;
public class CipherTest extends TestCase {
private Random rand = new Random();
public void testCipherFactory() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[] key = new byte[32];
byte[] iv = new byte[16];
byte[] plaintext = new byte[1024];
rand.nextBytes(key);
rand.nextBytes(iv);
rand.nextBytes(plaintext);
CipherEngine aes = CipherFactory.INSTANCE.getInstance(AesEngine.CIPHER_UUID);
Cipher encrypt = aes.getCipher(Cipher.ENCRYPT_MODE, key, iv);
Cipher decrypt = aes.getCipher(Cipher.DECRYPT_MODE, key, iv);
byte[] secrettext = encrypt.doFinal(plaintext);
byte[] decrypttext = decrypt.doFinal(secrettext);
assertArrayEquals("Encryption and decryption failed", plaintext, decrypttext);
}
public void testCipherStreams() throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException {
final int MESSAGE_LENGTH = 1024;
byte[] key = new byte[32];
byte[] iv = new byte[16];
byte[] plaintext = new byte[MESSAGE_LENGTH];
rand.nextBytes(key);
rand.nextBytes(iv);
rand.nextBytes(plaintext);
CipherEngine aes = CipherFactory.INSTANCE.getInstance(AesEngine.CIPHER_UUID);
Cipher encrypt = aes.getCipher(Cipher.ENCRYPT_MODE, key, iv);
Cipher decrypt = aes.getCipher(Cipher.DECRYPT_MODE, key, iv);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
CipherOutputStream cos = new CipherOutputStream(bos, encrypt);
cos.write(plaintext);
cos.close();
byte[] secrettext = bos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(secrettext);
BetterCipherInputStream cis = new BetterCipherInputStream(bis, decrypt);
LEDataInputStream lis = new LEDataInputStream(cis);
byte[] decrypttext = lis.readBytes(MESSAGE_LENGTH);
assertArrayEquals("Encryption and decryption failed", plaintext, decrypttext);
}
}

View File

@@ -0,0 +1,66 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests.crypto;
import static org.junit.Assert.assertArrayEquals;
import java.io.IOException;
import java.util.Random;
import junit.framework.TestCase;
import com.kunzisoft.keepass.crypto.finalkey.AndroidFinalKey;
import com.kunzisoft.keepass.crypto.finalkey.NativeFinalKey;
public class FinalKeyTest extends TestCase {
private Random mRand;
@Override
protected void setUp() throws Exception {
super.setUp();
mRand = new Random();
}
public void testNativeAndroid() throws IOException {
// Test both an old and an even number to test my flip variable
testNativeFinalKey(5);
testNativeFinalKey(6);
}
private void testNativeFinalKey(int rounds) throws IOException {
byte[] seed = new byte[32];
byte[] key = new byte[32];
byte[] nativeKey;
byte[] androidKey;
mRand.nextBytes(seed);
mRand.nextBytes(key);
AndroidFinalKey aKey = new AndroidFinalKey();
androidKey = aKey.transformMasterKey(seed, key, rounds);
NativeFinalKey nKey = new NativeFinalKey();
nativeKey = nKey.transformMasterKey(seed, key, rounds);
assertArrayEquals("Does not match", androidKey, nativeKey);
}
}

View File

@@ -5,7 +5,7 @@
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,20 +17,13 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.database;
package com.kunzisoft.keepass.tests.database;
import java.util.List;
import android.content.Context;
import android.test.AndroidTestCase;
import com.keepassdroid.Database;
import com.keepassdroid.database.PwDatabase;
import com.keepassdroid.database.PwDatabaseV3;
import com.keepassdroid.database.PwEntry;
import com.keepassdroid.database.PwGroup;
import com.keepassdroid.database.edit.DeleteGroup;
import com.keepassdroid.search.SearchDbHelper;
import com.kunzisoft.keepass.database.element.GroupVersioned;
import com.kunzisoft.keepass.database.element.PwDatabase;
import com.kunzisoft.keepass.database.element.PwDatabaseV3;
import com.kunzisoft.keepass.database.element.PwEntryV3;
public class DeleteEntry extends AndroidTestCase {
private static final String GROUP1_NAME = "Group1";
@@ -43,6 +36,7 @@ public class DeleteEntry extends AndroidTestCase {
public void testDelete() {
/*
Database db;
Context ctx = getContext();
@@ -54,58 +48,61 @@ public class DeleteEntry extends AndroidTestCase {
return;
}
PwDatabaseV3 pm = (PwDatabaseV3) db.pm;
PwGroup group1 = getGroup(pm, GROUP1_NAME);
PwDatabaseV3 pm = (PwDatabaseV3) db.getPwDatabase();
GroupVersioned group1 = getGroup(pm, GROUP1_NAME);
assertNotNull("Could not find group1", group1);
// Delete the group
DeleteGroup task = new DeleteGroup(db, group1, null, true);
DeleteGroupRunnable task = new DeleteGroupRunnable(null, db, group1, null, true);
task.run();
// Verify the entries were deleted
PwEntry entry1 = getEntry(pm, ENTRY1_NAME);
PwEntryInterface entry1 = getEntry(pm, ENTRY1_NAME);
assertNull("Entry 1 was not removed", entry1);
PwEntry entry2 = getEntry(pm, ENTRY2_NAME);
PwEntryInterface entry2 = getEntry(pm, ENTRY2_NAME);
assertNull("Entry 2 was not removed", entry2);
// Verify the entries were removed from the search index
SearchDbHelper dbHelp = new SearchDbHelper(ctx);
PwGroup results1 = dbHelp.search(db, ENTRY1_NAME);
PwGroup results2 = dbHelp.search(db, ENTRY2_NAME);
GroupVersioned results1 = dbHelp.search(db.getPwDatabase(), ENTRY1_NAME, 100);
GroupVersioned results2 = dbHelp.search(db.getPwDatabase(), ENTRY2_NAME, 100);
assertEquals("Entry1 was not removed from the search results", 0, results1.childEntries.size());
assertEquals("Entry2 was not removed from the search results", 0, results2.childEntries.size());
assertEquals("Entry1 was not removed from the search results", 0, results1.numbersOfChildEntries());
assertEquals("Entry2 was not removed from the search results", 0, results2.numbersOfChildEntries());
// Verify the group was deleted
group1 = getGroup(pm, GROUP1_NAME);
assertNull("Group 1 was not removed.", group1);
*/
}
private PwEntry getEntry(PwDatabaseV3 pm, String name) {
List<PwEntry> entries = pm.entries;
private PwEntryV3 getEntry(PwDatabaseV3 pm, String name) {
/*
TODO test
List<PwEntryV3> entries = pm.getEntries();
for ( int i = 0; i < entries.size(); i++ ) {
PwEntry entry = entries.get(i);
PwEntryV3 entry = entries.get(i);
if ( entry.getTitle().equals(name) ) {
return entry;
}
}
*/
return null;
}
private PwGroup getGroup(PwDatabase pm, String name) {
List<PwGroup> groups = pm.getGroups();
private GroupVersioned getGroup(PwDatabase pm, String name) {
/*
List<GroupVersioned> groups = pm.getGroups();
for ( int i = 0; i < groups.size(); i++ ) {
PwGroup group = groups.get(i);
if ( group.getName().equals(name) ) {
GroupVersioned group = groups.get(i);
if ( group.getTitle().equals(name) ) {
return group;
}
}
*/
return null;
}

View File

@@ -5,7 +5,7 @@
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,36 +17,40 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.database;
package com.kunzisoft.keepass.tests.database;
import com.kunzisoft.keepass.database.element.PwDatabaseV4;
import com.kunzisoft.keepass.database.element.PwEntryV4;
import junit.framework.TestCase;
import com.keepassdroid.database.PwDatabaseV4;
import com.keepassdroid.database.PwEntryV4;
public class EntryV4 extends TestCase {
public void testBackup() {
/*
PwDatabaseV4 db = new PwDatabaseV4();
db.historyMaxItems = 2;
db.setHistoryMaxItems(2);
PwEntryV4 entry = new PwEntryV4();
entry.setTitle("Title1", db);
entry.setUsername("User1", db);
entry.startToManageFieldReferences(db);
entry.setTitle("Title1");
entry.setUsername("User1");
entry.createBackup(db);
entry.setTitle("Title2", db);
entry.setUsername("User2", db);
entry.setTitle("Title2");
entry.setUsername("User2");
entry.createBackup(db);
entry.setTitle("Title3", db);
entry.setUsername("User3", db);
entry.setTitle("Title3");
entry.setUsername("User3");
entry.createBackup(db);
PwEntryV4 backup = entry.history.get(0);
PwEntryV4 backup = entry.getHistory().get(0);
entry.stopToManageFieldReferences();
assertEquals("Title2", backup.getTitle());
assertEquals("User2", backup.getUsername());
*/
}
}

View File

@@ -5,7 +5,7 @@
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,24 +17,14 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.database;
package com.kunzisoft.keepass.tests.database;
import android.content.Context;
import android.content.res.AssetManager;
import android.net.Uri;
import android.os.Environment;
import android.test.AndroidTestCase;
import com.keepassdroid.database.load.ImporterV3;
import com.keepassdroid.tests.TestUtil;
import com.keepassdroid.utils.UriUtil;
import java.io.InputStream;
import java.io.File;
public class Kdb3 extends AndroidTestCase {
private void testKeyfile(String dbAsset, String keyAsset, String password) throws Exception {
/*
Context ctx = getContext();
File sdcard = Environment.getExternalStorageDirectory();
@@ -49,6 +39,7 @@ public class Kdb3 extends AndroidTestCase {
importer.openDatabase(is, password, TestUtil.getKeyFileInputStream(ctx, keyPath));
is.close();
*/
}
public void testXMLKeyFile() throws Exception {

View File

@@ -5,7 +5,7 @@
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,20 +17,13 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.database;
package com.kunzisoft.keepass.tests.database;
import java.io.InputStream;
import android.content.Context;
import android.content.res.AssetManager;
import android.test.AndroidTestCase;
import com.keepassdroid.database.PwDatabaseV3;
import com.keepassdroid.database.PwEncryptionAlgorithm;
import com.keepassdroid.database.load.ImporterV3;
public class Kdb3Twofish extends AndroidTestCase {
public void testReadTwofish() throws Exception {
/*
Context ctx = getContext();
AssetManager am = ctx.getAssets();
@@ -40,10 +33,9 @@ public class Kdb3Twofish extends AndroidTestCase {
PwDatabaseV3 db = importer.openDatabase(is, "12345", null);
assertTrue(db.algorithm == PwEncryptionAlgorithm.Twofish);
assertTrue(db.getEncryptionAlgorithm() == PwEncryptionAlgorithm.Twofish);
is.close();
*/
}
}

View File

@@ -5,7 +5,7 @@
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,28 +17,18 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.database;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
package com.kunzisoft.keepass.tests.database;
import android.content.Context;
import android.content.res.AssetManager;
import android.test.AndroidTestCase;
import com.keepassdroid.database.PwDatabaseV4;
import com.keepassdroid.database.exception.InvalidDBException;
import com.keepassdroid.database.exception.PwDbOutputException;
import com.keepassdroid.database.load.Importer;
import com.keepassdroid.database.load.ImporterFactory;
import com.keepassdroid.database.load.ImporterV4;
import com.keepassdroid.database.save.PwDbOutput;
import com.keepassdroid.database.save.PwDbV4Output;
import com.keepassdroid.stream.CopyInputStream;
import com.keepassdroid.tests.TestUtil;
import com.kunzisoft.keepass.database.exception.InvalidDBException;
import com.kunzisoft.keepass.database.exception.PwDbOutputException;
import com.kunzisoft.keepass.tests.TestUtil;
import java.io.IOException;
import java.io.InputStream;
public class Kdb4 extends AndroidTestCase {
@@ -48,11 +38,13 @@ public class Kdb4 extends AndroidTestCase {
AssetManager am = ctx.getAssets();
InputStream is = am.open("test.kdbx", AssetManager.ACCESS_STREAMING);
/*
TODO Test
Importer importer = ImporterFactory.createImporter(is);
assertTrue(importer instanceof ImporterV4);
is.close();
*/
}
public void testParsing() throws IOException, InvalidDBException {
@@ -61,12 +53,13 @@ public class Kdb4 extends AndroidTestCase {
AssetManager am = ctx.getAssets();
InputStream is = am.open("test.kdbx", AssetManager.ACCESS_STREAMING);
/*
TODO Test
ImporterV4 importer = new ImporterV4();
importer.openDatabase(is, "12345", null);
is.close();
*/
}
public void testSavingKDBXV3() throws IOException, InvalidDBException, PwDbOutputException {
@@ -83,6 +76,8 @@ public class Kdb4 extends AndroidTestCase {
AssetManager am = ctx.getAssets();
InputStream is = am.open(inputFile, AssetManager.ACCESS_STREAMING);
/*
TODO Test
ImporterV4 importer = new ImporterV4();
PwDatabaseV4 db = importer.openDatabase(is, password, null);
is.close();
@@ -103,7 +98,7 @@ public class Kdb4 extends AndroidTestCase {
bis.close();
fos.close();
*/
}
@Override
@@ -120,10 +115,13 @@ public class Kdb4 extends AndroidTestCase {
AssetManager am = ctx.getAssets();
InputStream is = am.open("keyfile.kdbx", AssetManager.ACCESS_STREAMING);
/*
TODO Test
ImporterV4 importer = new ImporterV4();
importer.openDatabase(is, "12345", TestUtil.getKeyFileInputStream(ctx, TestUtil.getSdPath("key")));
is.close();
*/
}
@@ -133,11 +131,13 @@ public class Kdb4 extends AndroidTestCase {
AssetManager am = ctx.getAssets();
InputStream is = am.open("keyfile-binary.kdbx", AssetManager.ACCESS_STREAMING);
/*
TODO Test
ImporterV4 importer = new ImporterV4();
importer.openDatabase(is, "12345", TestUtil.getKeyFileInputStream(ctx,TestUtil.getSdPath("key-binary")));
is.close();
*/
}
public void testKeyfile() throws IOException, InvalidDBException {
@@ -145,13 +145,13 @@ public class Kdb4 extends AndroidTestCase {
AssetManager am = ctx.getAssets();
InputStream is = am.open("key-only.kdbx", AssetManager.ACCESS_STREAMING);
/*
TODO Test
ImporterV4 importer = new ImporterV4();
importer.openDatabase(is, "", TestUtil.getKeyFileInputStream(ctx, TestUtil.getSdPath("key")));
is.close();
*/
}
public void testNoGzip() throws IOException, InvalidDBException {
@@ -159,13 +159,13 @@ public class Kdb4 extends AndroidTestCase {
AssetManager am = ctx.getAssets();
InputStream is = am.open("no-encrypt.kdbx", AssetManager.ACCESS_STREAMING);
/*
TODO Test
ImporterV4 importer = new ImporterV4();
importer.openDatabase(is, "12345", null);
is.close();
*/
}
}

View File

@@ -5,7 +5,7 @@
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,18 +17,13 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.database;
import java.io.InputStream;
package com.kunzisoft.keepass.tests.database;
import android.content.Context;
import android.content.res.AssetManager;
import android.test.AndroidTestCase;
import com.keepassdroid.crypto.CipherFactory;
import com.keepassdroid.crypto.engine.AesEngine;
import com.keepassdroid.database.PwDatabaseV4;
import com.keepassdroid.database.load.ImporterV4;
import java.io.InputStream;
public class Kdb4Header extends AndroidTestCase {
public void testReadHeader() throws Exception {
@@ -37,15 +32,18 @@ public class Kdb4Header extends AndroidTestCase {
AssetManager am = ctx.getAssets();
InputStream is = am.open("test.kdbx", AssetManager.ACCESS_STREAMING);
/*
TODO Test
ImporterV4 importer = new ImporterV4();
PwDatabaseV4 db = importer.openDatabase(is, "12345", null);
assertEquals(6000, db.numKeyEncRounds);
assertEquals(6000, db.getNumberKeyEncryptionRounds());
assertTrue(db.dataCipher.equals(AesEngine.CIPHER_UUID));
assertTrue(db.getDataCipher().equals(AesEngine.CIPHER_UUID));
is.close();
*/
}
}

View File

@@ -0,0 +1,70 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests.database;
import android.content.Context;
import android.content.res.AssetManager;
import android.test.AndroidTestCase;
import com.kunzisoft.keepass.database.element.PwDatabaseV4;
import com.kunzisoft.keepass.database.element.SprEngineV4;
import java.io.InputStream;
public class SprEngineTest extends AndroidTestCase {
private PwDatabaseV4 db;
private SprEngineV4 spr;
@Override
protected void setUp() throws Exception {
super.setUp();
Context ctx = getContext();
AssetManager am = ctx.getAssets();
InputStream is = am.open("test.kdbx", AssetManager.ACCESS_STREAMING);
/*
TODO Test
ImporterV4 importer = new ImporterV4();
db = importer.openDatabase(is, "12345", null);
is.close();
spr = new SprEngineV4();
*/
}
private final String REF = "{REF:P@I:2B1D56590D961F48A8CE8C392CE6CD35}";
private final String ENCODE_UUID = "IN7RkON49Ui1UZ2ddqmLcw==";
private final String RESULT = "Password";
public void testRefReplace() {
/*
TODO TEST
UUID entryUUID = decodeUUID(ENCODE_UUID);
PwEntryV4 entry = (PwEntryV4) db.getEntryById(entryUUID);
assertEquals(RESULT, spr.compile(REF, entry, db));
*/
}
}

View File

@@ -5,7 +5,7 @@
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,20 +17,9 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.database;
package com.kunzisoft.keepass.tests.database;
import java.io.InputStream;
import android.content.Context;
import android.content.res.AssetManager;
import android.net.Uri;
import com.keepassdroid.Database;
import com.keepassdroid.database.PwDatabaseV3Debug;
import com.keepassdroid.database.load.Importer;
import com.keepassdroid.tests.TestUtil;
import com.keepassdroid.utils.EmptyUtils;
import com.keepassdroid.utils.UriUtil;
import com.kunzisoft.keepass.database.element.Database;
public class TestData {
private static final String TEST1_KEYFILE = "";
@@ -39,6 +28,7 @@ public class TestData {
private static Database mDb1;
/*
public static Database GetDb1(Context ctx) throws Exception {
return GetDb1(ctx, false);
@@ -60,10 +50,10 @@ public class TestData {
InputStream keyIs = TestUtil.getKeyFileInputStream(ctx, keyfile);
Db.LoadData(ctx, is, password, keyIs, Importer.DEBUG);
Db.loadData(ctx, is, password, keyIs, Importer.DEBUG);
Uri.Builder b = new Uri.Builder();
Db.mUri = b.scheme("file").path(filename).build();
Db.setUri(b.scheme("file").path(filename).build());
return Db;
@@ -74,6 +64,8 @@ public class TestData {
GetDb1(ctx);
}
return (PwDatabaseV3Debug) mDb1.pm;
//return (PwDatabaseV3Debug) mDb1.getPwDatabase();
return null;
}
*/
}

View File

@@ -5,7 +5,7 @@
*
* KeePass DX 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
@@ -17,35 +17,14 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.tests.output;
package com.kunzisoft.keepass.tests.output;
import static org.junit.Assert.assertArrayEquals;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.DigestOutputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import android.content.res.AssetManager;
import android.test.AndroidTestCase;
import com.keepassdroid.database.PwDatabaseV3Debug;
import com.keepassdroid.database.PwDbHeader;
import com.keepassdroid.database.PwDbHeaderV3;
import com.keepassdroid.database.exception.PwDbOutputException;
import com.keepassdroid.database.save.PwDbHeaderOutputV3;
import com.keepassdroid.database.save.PwDbV3Output;
import com.keepassdroid.database.save.PwDbV3OutputDebug;
import com.keepassdroid.stream.NullOutputStream;
import com.keepassdroid.tests.TestUtil;
import com.keepassdroid.tests.database.TestData;
public class PwManagerOutputTest extends AndroidTestCase {
PwDatabaseV3Debug mPM;
// PwDatabaseV3Debug mPM;
/*
@Override
protected void setUp() throws Exception {
super.setUp();
@@ -60,7 +39,7 @@ public class PwManagerOutputTest extends AndroidTestCase {
pos.outputPlanGroupAndEntries(bos);
assertTrue("No output", bos.toByteArray().length > 0);
assertArrayEquals("Group and entry output doesn't match.", mPM.postHeader, bos.toByteArray());
assertArrayEquals("Group and entry output doesn't match.", mPM.getPostHeader(), bos.toByteArray());
}
@@ -77,7 +56,7 @@ public class PwManagerOutputTest extends AndroidTestCase {
byte[] digest = md.digest();
assertTrue("No output", digest.length > 0);
assertArrayEquals("Hash of groups and entries failed.", mPM.dbHeader.contentsHash, digest);
assertArrayEquals("Hash of groups and entries failed.", mPM.getDbHeader().contentsHash, digest);
}
private void assertHeadersEquals(PwDbHeaderV3 expected, PwDbHeaderV3 actual) {
@@ -100,10 +79,10 @@ public class PwManagerOutputTest extends AndroidTestCase {
PwDbHeaderV3 header = pActual.outputHeader(bActual);
ByteArrayOutputStream bExpected = new ByteArrayOutputStream();
PwDbHeaderOutputV3 outExpected = new PwDbHeaderOutputV3(mPM.dbHeader, bExpected);
PwDbHeaderOutputV3 outExpected = new PwDbHeaderOutputV3(mPM.getDbHeader(), bExpected);
outExpected.output();
assertHeadersEquals(mPM.dbHeader, header);
assertHeadersEquals(mPM.getDbHeader(), header);
assertTrue("No output", bActual.toByteArray().length > 0);
assertArrayEquals("Header does not match.", bExpected.toByteArray(), bActual.toByteArray());
}
@@ -114,7 +93,7 @@ public class PwManagerOutputTest extends AndroidTestCase {
PwDbHeader hActual = pActual.outputHeader(bActual);
byte[] finalKey = pActual.getFinalKey(hActual);
assertArrayEquals("Keys mismatched", mPM.finalKey, finalKey);
assertArrayEquals("Keys mismatched", mPM.getFinalKey(), finalKey);
}
@@ -143,4 +122,5 @@ public class PwManagerOutputTest extends AndroidTestCase {
assertArrayEquals("Databases do not match.", bExpected.toByteArray(), bActual.toByteArray());
}
*/
}

View File

@@ -0,0 +1,70 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests.search;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.test.AndroidTestCase;
import com.kunzisoft.keepass.database.element.Database;
import com.kunzisoft.keepass.database.element.GroupVersioned;
public class SearchTest extends AndroidTestCase {
private Database mDb;
@Override
protected void setUp() throws Exception {
super.setUp();
//mDb = TestData.GetDb1(getContext(), true);
}
public void testSearch() {
GroupVersioned results = mDb.search("Amazon");
//assertTrue("Search result not found.", results.numbersOfChildEntries() > 0);
}
public void testBackupIncluded() {
updateOmitSetting(false);
GroupVersioned results = mDb.search("BackupOnly");
//assertTrue("Search result not found.", results.numbersOfChildEntries() > 0);
}
public void testBackupExcluded() {
updateOmitSetting(true);
GroupVersioned results = mDb.search("BackupOnly");
//assertFalse("Search result found, but should not have been.", results.numbersOfChildEntries() > 0);
}
private void updateOmitSetting(boolean setting) {
Context ctx = getContext();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("settings_omitbackup_key", setting);
editor.commit();
}
}

View File

@@ -0,0 +1,110 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests.stream;
import static org.junit.Assert.assertArrayEquals;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import junit.framework.TestCase;
import com.kunzisoft.keepass.stream.HashedBlockInputStream;
import com.kunzisoft.keepass.stream.HashedBlockOutputStream;
public class HashedBlock extends TestCase {
private static Random rand = new Random();
public void testBlockAligned() throws IOException {
testSize(1024, 1024);
}
public void testOffset() throws IOException {
testSize(1500, 1024);
}
private void testSize(int blockSize, int bufferSize) throws IOException {
byte[] orig = new byte[blockSize];
rand.nextBytes(orig);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
HashedBlockOutputStream output = new HashedBlockOutputStream(bos, bufferSize);
output.write(orig);
output.close();
byte[] encoded = bos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(encoded);
HashedBlockInputStream input = new HashedBlockInputStream(bis);
ByteArrayOutputStream decoded = new ByteArrayOutputStream();
while ( true ) {
byte[] buf = new byte[1024];
int read = input.read(buf);
if ( read == -1 ) {
break;
}
decoded.write(buf, 0, read);
}
byte[] out = decoded.toByteArray();
assertArrayEquals(orig, out);
}
public void testGZIPStream() throws IOException {
final int testLength = 32000;
byte[] orig = new byte[testLength];
rand.nextBytes(orig);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
HashedBlockOutputStream hos = new HashedBlockOutputStream(bos);
GZIPOutputStream zos = new GZIPOutputStream(hos);
zos.write(orig);
zos.close();
byte[] compressed = bos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(compressed);
HashedBlockInputStream his = new HashedBlockInputStream(bis);
GZIPInputStream zis = new GZIPInputStream(his);
byte[] uncompressed = new byte[testLength];
int read = 0;
while (read != -1 && testLength - read > 0) {
read += zis.read(uncompressed, read, testLength - read);
}
assertArrayEquals("Output not equal to input", orig, uncompressed);
}
}

View File

@@ -0,0 +1,57 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.kunzisoft.keepass.tests.utils;
import java.util.Locale;
import com.kunzisoft.keepass.utils.StringUtil;
import junit.framework.TestCase;
public class StringUtilTest extends TestCase {
private final String text = "AbCdEfGhIj";
private final String search = "BcDe";
private final String badSearch = "Ed";
public void testIndexOfIgnoreCase1() {
assertEquals(1, StringUtil.INSTANCE.indexOfIgnoreCase(text, search, Locale.ENGLISH));
}
public void testIndexOfIgnoreCase2() {
assertEquals(-1, StringUtil.INSTANCE.indexOfIgnoreCase(text, search, Locale.ENGLISH), 2);
}
public void testIndexOfIgnoreCase3() {
assertEquals(-1, StringUtil.INSTANCE.indexOfIgnoreCase(text, badSearch, Locale.ENGLISH));
}
private final String repText = "AbCtestingaBc";
private final String repSearch = "ABc";
private final String repSearchBad = "CCCCCC";
private final String repNew = "12345";
private final String repResult = "12345testing12345";
public void testReplaceAllIgnoresCase1() {
assertEquals(repResult, StringUtil.INSTANCE.replaceAllIgnoresCase(repText, repSearch, repNew, Locale.ENGLISH));
}
public void testReplaceAllIgnoresCase2() {
assertEquals(repText, StringUtil.INSTANCE.replaceAllIgnoresCase(repText, repSearchBad, repNew, Locale.ENGLISH));
}
}

View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="108"
android:viewportHeight="108"
android:width="108dp"
android:height="108dp">
<group
android:translateY="-332">
<group
android:translateY="332">
<path
android:pathData="M65.728516 32.791016L58.052734 35.904297 56.173828 48.380859 35.306641 69.267578 35.238281 73.759766 69.478516 108 108 108 108 70.810547 73.09375 35.904297 65.728516 32.791016Z"
android:fillColor="@color/long_shadow"
android:strokeLineJoin="round"
android:strokeLineCap="round"
android:strokeMiterLimit="4" />
</group>
<group
android:scaleX="0.3939503"
android:scaleY="0.3939503"
android:translateX="33.66343"
android:translateY="233.998">
<path
android:pathData="M88.76953 339.91602L4.1718754 424.59766 4.0000004 436 15.400391 435.82813 27.240234 424 40 424l0 -12 12 0 0 -12.73438 34.01172 -33.97656A8 8 0 0 1 84 360a8 8 0 0 1 8 -8 8 8 0 0 1 5.296882 2.01367l2.787098 -2.7832 -11.31445 -11.31445z"
android:fillColor="#eaeaea"
android:strokeWidth="1"
android:strokeColor="#58000000" />
</group>
<group
android:scaleX="0.3939503"
android:scaleY="0.3939503"
android:translateX="33.66343"
android:translateY="233.998">
<path
android:pathData="M4.0000004 340L4.1718754 351.40137 88.59863 435.82812 100 436 99.828122 424.59863 15.401367 340.17188Z"
android:fillColor="#81c784" />
</group>
<group
android:scaleX="0.3939503"
android:scaleY="0.3939503"
android:translateX="33.66343"
android:translateY="233.998">
<path
android:pathData="M81.39454 332.00195a27 27 0 0 0 -19.48634 7.90625 27 27 0 0 0 0 38.1836 27 27 0 0 0 38.1836 0 27 27 0 0 0 0 -38.1836 27 27 0 0 0 -18.69726 -7.90625zM92 352a8 8 0 0 1 8 8 8 8 0 0 1 -8 8 8 8 0 0 1 -8 -8 8 8 0 0 1 8 -8z"
android:fillColor="#eaeaea"
android:strokeWidth="1"
android:strokeColor="#58000000" />
</group>
</group>
</vector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/green" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/green" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="108"
android:viewportHeight="108"
android:width="108dp"
android:height="108dp">
<group
android:translateY="-332">
<group
android:translateY="332">
<path
android:pathData="M65.728516 32.791016L58.052734 35.904297 56.173828 48.380859 35.306641 69.267578 35.238281 73.759766 69.478516 108 108 108 108 70.810547 73.09375 35.904297 65.728516 32.791016Z"
android:fillColor="@color/long_shadow"
android:strokeLineJoin="round"
android:strokeLineCap="round"
android:strokeMiterLimit="4" />
</group>
<group
android:scaleX="0.3939503"
android:scaleY="0.3939503"
android:translateX="33.66343"
android:translateY="233.998">
<path
android:pathData="M88.76953 339.91602L4.1718754 424.59766 4.0000004 436 15.400391 435.82813 27.240234 424 40 424l0 -12 12 0 0 -12.73438 34.01172 -33.97656A8 8 0 0 1 84 360a8 8 0 0 1 8 -8 8 8 0 0 1 5.296882 2.01367l2.787098 -2.7832 -11.31445 -11.31445z"
android:fillColor="#eaeaea"
android:strokeWidth="1"
android:strokeColor="#58000000"/>
</group>
<group
android:scaleX="0.3939503"
android:scaleY="0.3939503"
android:translateX="33.66343"
android:translateY="233.998">
<path
android:pathData="M4.0000004 340L4.1718754 351.40137 88.59863 435.82812 100 436 99.828122 424.59863 15.401367 340.17188Z"
android:fillColor="#64b5f6" />
</group>
<group
android:scaleX="0.3939503"
android:scaleY="0.3939503"
android:translateX="33.66343"
android:translateY="233.998">
<path
android:pathData="M81.39454 332.00195a27 27 0 0 0 -19.48634 7.90625 27 27 0 0 0 0 38.1836 27 27 0 0 0 38.1836 0 27 27 0 0 0 0 -38.1836 27 27 0 0 0 -18.69726 -7.90625zM92 352a8 8 0 0 1 8 8 8 8 0 0 1 -8 8 8 8 0 0 1 -8 -8 8 8 0 0 1 8 -8z"
android:fillColor="#eaeaea"
android:strokeWidth="1"
android:strokeColor="#58000000" />
</group>
</group>
</vector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/green" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/green" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.kunzisoft.keepass"
android:installLocation="auto">
<supports-screens
@@ -15,33 +16,39 @@
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:name="com.keepassdroid.app.App"
android:name="com.kunzisoft.keepass.app.App"
android:allowBackup="true"
android:fullBackupContent="@xml/backup"
android:backupAgent="com.keepassdroid.backup.SettingsBackupAgent"
android:theme="@style/KeepassDXStyle.Light">
android:backupAgent="com.kunzisoft.keepass.backup.SettingsBackupAgent"
android:theme="@style/KeepassDXStyle.Night">
<!-- TODO backup API Key -->
<meta-data android:name="com.google.android.backup.api_key"
<meta-data
android:name="com.google.android.backup.api_key"
android:value="" />
<activity android:name=".KeePass"
android:label="@string/app_name">
<activity
android:name="com.kunzisoft.keepass.activities.FileDatabaseSelectActivity"
android:theme="@style/KeepassDXStyle.SplashScreen"
android:label="@string/app_name"
android:launchMode="singleTop"
android:configChanges="keyboardHidden"
android:windowSoftInputMode="stateHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.keepassdroid.fileselect.FileSelectActivity"
android:configChanges="orientation|keyboardHidden"
android:windowSoftInputMode="stateHidden" />
<activity android:name="com.keepassdroid.AboutActivity"
android:label="@string/menu_about" />
<activity android:name="com.keepassdroid.PasswordActivity" android:configChanges="orientation|keyboardHidden">
<activity
android:name="com.kunzisoft.keepass.activities.PasswordActivity"
android:configChanges="keyboardHidden"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file" />
<data android:mimeType="*/*" />
<data android:scheme="content" />
<data android:mimeType="application/octet-stream" />
<data android:host="*" />
<data android:pathPattern=".*\\.kdb" />
<data android:pathPattern=".*\\..*\\.kdb" />
@@ -64,46 +71,111 @@
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.kdbx" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.kdbx" />
</intent-filter>
<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:mimeType="application/octet-stream"/>
</intent-filter>
</activity>
<activity android:name="com.keepassdroid.GroupActivityV3" android:configChanges="orientation|keyboardHidden">
<!-- This metadata entry causes .app.SearchQueryResults to be the default context -->
<!-- whenever the user invokes search while in this Activity. -->
<meta-data android:name="android.app.default_searchable"
android:value="com.keepassdroid.search.SearchResults" />
<!-- Folder picker -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/nnf_provider_paths" />
</provider>
<activity
android:name=".activities.stylish.FilePickerStylishActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name="com.keepassdroid.GroupActivityV4" android:configChanges="orientation|keyboardHidden">
<!-- This metadata entry causes .app.SearchQueryResults to be the default context -->
<!-- whenever the user invokes search while in this Activity. -->
<meta-data android:name="android.app.default_searchable"
android:value="com.keepassdroid.search.SearchResults"
<!-- Main Activity -->
<activity
android:name="com.kunzisoft.keepass.activities.GroupActivity"
android:configChanges="keyboardHidden"
android:windowSoftInputMode="adjustPan"
android:launchMode="singleTask">
<meta-data
android:name="android.app.default_searchable"
android:value="com.kunzisoft.keepass.search.SearchResults"
android:exported="false"/>
</activity>
<activity
android:name="com.keepassdroid.EntryActivity"
android:configChanges="orientation|keyboardHidden"
android:windowSoftInputMode="stateHidden" />
<activity
android:name="com.keepassdroid.EntryActivityV4"
android:configChanges="orientation|keyboardHidden"
android:windowSoftInputMode="stateHidden" />
<activity
android:name="com.keepassdroid.EntryEditActivityV3"
android:configChanges="orientation|keyboardHidden"
android:windowSoftInputMode="stateHidden" />
<activity
android:name="com.keepassdroid.EntryEditActivityV4"
android:configChanges="orientation|keyboardHidden"
android:windowSoftInputMode="stateHidden" />
<activity android:name="com.keepassdroid.search.SearchResultsActivity" android:launchMode="standard">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable" />
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<activity
android:name="com.kunzisoft.keepass.activities.EntryActivity"
android:configChanges="keyboardHidden" />
<activity
android:name="com.kunzisoft.keepass.activities.EntryEditActivity"
android:configChanges="keyboardHidden"
android:windowSoftInputMode="adjustResize" />
<!-- About and Settings -->
<activity
android:name="com.kunzisoft.keepass.activities.AboutActivity"
android:launchMode="singleTask"
android:label="@string/menu_about" />
<activity android:name="com.kunzisoft.keepass.settings.SettingsActivity" />
<activity android:name="com.kunzisoft.keepass.autofill.AutofillLauncherActivity"
android:configChanges="keyboardHidden" />
<activity android:name="com.kunzisoft.keepass.settings.SettingsAutofillActivity" />
<activity android:name="com.kunzisoft.keepass.magikeyboard.KeyboardLauncherActivity"
android:label="@string/keyboard_name">
</activity>
<activity android:name="com.kunzisoft.keepass.settings.MagikIMESettings"
android:label="@string/keyboard_setting_label">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>
<activity android:name="com.keepassdroid.settings.SettingsActivity" />
<service android:name="com.keepassdroid.services.TimeoutService" />
<service
android:name="com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService"
android:enabled="true"
android:exported="false" />
<service
android:name="com.kunzisoft.keepass.notifications.ClipboardEntryNotificationService"
android:enabled="true"
android:exported="false" />
<!-- Receiver for Autofill -->
<service
android:name="com.kunzisoft.keepass.autofill.KeeAutofillService"
android:label="@string/autofill_service_name"
android:permission="android.permission.BIND_AUTOFILL_SERVICE">
<meta-data
android:name="android.autofill"
android:resource="@xml/dataset_service" />
<intent-filter>
<action android:name="android.service.autofill.AutofillService" />
</intent-filter>
</service>
<service
android:name="com.kunzisoft.keepass.magikeyboard.MagikIME"
android:label="@string/keyboard_label"
android:permission="android.permission.BIND_INPUT_METHOD" >
<meta-data android:name="android.view.im"
android:resource="@xml/keyboard_method"/>
<intent-filter>
<action android:name="android.view.InputMethod" />
</intent-filter>
</service>
<service
android:name="com.kunzisoft.keepass.notifications.KeyboardEntryNotificationService"
android:enabled="true"
android:exported="false" />
<meta-data android:name="com.sec.android.support.multiwindow" android:value="true" />
</application>
</manifest>

Binary file not shown.

View File

@@ -1,225 +0,0 @@
// 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.
package biz.source_code.base64Coder;
/**
* A Base64 encoder/decoder.
*
* <p>
* This class is used to encode and decode data in Base64 format as described in RFC 1521.
*
* <p>
* Project home page: <a href="http://www.source-code.biz/base64coder/java/">www.source-code.biz/base64coder/java</a><br>
* Author: Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland<br>
* Multi-licensed: EPL / LGPL / AL / BSD.
*/
public class Base64Coder {
// The line separator string of the operating system.
private static final String systemLineSeparator = System.getProperty("line.separator");
// Mapping table from 6-bit nibbles to Base64 characters.
private static char[] map1 = new char[64];
static {
int i=0;
for (char c='A'; c<='Z'; c++) map1[i++] = c;
for (char c='a'; c<='z'; c++) map1[i++] = c;
for (char c='0'; c<='9'; c++) map1[i++] = c;
map1[i++] = '+'; map1[i++] = '/'; }
// Mapping table from Base64 characters to 6-bit nibbles.
private static byte[] map2 = new byte[128];
static {
for (int i=0; i<map2.length; i++) map2[i] = -1;
for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; }
/**
* Encodes a string into Base64 format.
* No blanks or line breaks are inserted.
* @param s A String to be encoded.
* @return A String containing the Base64 encoded data.
*/
public static String encodeString (String s) {
return new String(encode(s.getBytes())); }
/**
* Encodes a byte array into Base 64 format and breaks the output into lines of 76 characters.
* This method is compatible with <code>sun.misc.BASE64Encoder.encodeBuffer(byte[])</code>.
* @param in An array containing the data bytes to be encoded.
* @return A String containing the Base64 encoded data, broken into lines.
*/
public static String encodeLines (byte[] in) {
return encodeLines(in, 0, in.length, 76, systemLineSeparator); }
/**
* Encodes a byte array into Base 64 format and breaks the output into lines.
* @param in An array containing the data bytes to be encoded.
* @param iOff Offset of the first byte in <code>in</code> to be processed.
* @param iLen Number of bytes to be processed in <code>in</code>, starting at <code>iOff</code>.
* @param lineLen Line length for the output data. Should be a multiple of 4.
* @param lineSeparator The line separator to be used to separate the output lines.
* @return A String containing the Base64 encoded data, broken into lines.
*/
public static String encodeLines (byte[] in, int iOff, int iLen, int lineLen, String lineSeparator) {
int blockLen = (lineLen*3) / 4;
if (blockLen <= 0) throw new IllegalArgumentException();
int lines = (iLen+blockLen-1) / blockLen;
int bufLen = ((iLen+2)/3)*4 + lines*lineSeparator.length();
StringBuilder buf = new StringBuilder(bufLen);
int ip = 0;
while (ip < iLen) {
int l = Math.min(iLen-ip, blockLen);
buf.append (encode(in, iOff+ip, l));
buf.append (lineSeparator);
ip += l; }
return buf.toString(); }
/**
* Encodes a byte array into Base64 format.
* No blanks or line breaks are inserted in the output.
* @param in An array containing the data bytes to be encoded.
* @return A character array containing the Base64 encoded data.
*/
public static char[] encode (byte[] in) {
return encode(in, 0, in.length); }
/**
* Encodes a byte array into Base64 format.
* No blanks or line breaks are inserted in the output.
* @param in An array containing the data bytes to be encoded.
* @param iLen Number of bytes to process in <code>in</code>.
* @return A character array containing the Base64 encoded data.
*/
public static char[] encode (byte[] in, int iLen) {
return encode(in, 0, iLen); }
/**
* Encodes a byte array into Base64 format.
* No blanks or line breaks are inserted in the output.
* @param in An array containing the data bytes to be encoded.
* @param iOff Offset of the first byte in <code>in</code> to be processed.
* @param iLen Number of bytes to process in <code>in</code>, starting at <code>iOff</code>.
* @return A character array containing the Base64 encoded data.
*/
public static char[] encode (byte[] in, int iOff, int iLen) {
int oDataLen = (iLen*4+2)/3; // output length without padding
int oLen = ((iLen+2)/3)*4; // output length including padding
char[] out = new char[oLen];
int ip = iOff;
int iEnd = iOff + iLen;
int op = 0;
while (ip < iEnd) {
int i0 = in[ip++] & 0xff;
int i1 = ip < iEnd ? in[ip++] & 0xff : 0;
int i2 = ip < iEnd ? in[ip++] & 0xff : 0;
int o0 = i0 >>> 2;
int o1 = ((i0 & 3) << 4) | (i1 >>> 4);
int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
int o3 = i2 & 0x3F;
out[op++] = map1[o0];
out[op++] = map1[o1];
out[op] = op < oDataLen ? map1[o2] : '='; op++;
out[op] = op < oDataLen ? map1[o3] : '='; op++; }
return out; }
/**
* Decodes a string from Base64 format.
* No blanks or line breaks are allowed within the Base64 encoded input data.
* @param s A Base64 String to be decoded.
* @return A String containing the decoded data.
* @throws IllegalArgumentException If the input is not valid Base64 encoded data.
*/
public static String decodeString (String s) {
return new String(decode(s)); }
/**
* Decodes a byte array from Base64 format and ignores line separators, tabs and blanks.
* CR, LF, Tab and Space characters are ignored in the input data.
* This method is compatible with <code>sun.misc.BASE64Decoder.decodeBuffer(String)</code>.
* @param s A Base64 String to be decoded.
* @return An array containing the decoded data bytes.
* @throws IllegalArgumentException If the input is not valid Base64 encoded data.
*/
public static byte[] decodeLines (String s) {
char[] buf = new char[s.length()];
int p = 0;
for (int ip = 0; ip < s.length(); ip++) {
char c = s.charAt(ip);
if (c != ' ' && c != '\r' && c != '\n' && c != '\t')
buf[p++] = c; }
return decode(buf, 0, p); }
/**
* Decodes a byte array from Base64 format.
* No blanks or line breaks are allowed within the Base64 encoded input data.
* @param s A Base64 String to be decoded.
* @return An array containing the decoded data bytes.
* @throws IllegalArgumentException If the input is not valid Base64 encoded data.
*/
public static byte[] decode (String s) {
return decode(s.toCharArray()); }
/**
* Decodes a byte array from Base64 format.
* No blanks or line breaks are allowed within the Base64 encoded input data.
* @param in A character array containing the Base64 encoded data.
* @return An array containing the decoded data bytes.
* @throws IllegalArgumentException If the input is not valid Base64 encoded data.
*/
public static byte[] decode (char[] in) {
return decode(in, 0, in.length); }
/**
* Decodes a byte array from Base64 format.
* No blanks or line breaks are allowed within the Base64 encoded input data.
* @param in A character array containing the Base64 encoded data.
* @param iOff Offset of the first character in <code>in</code> to be processed.
* @param iLen Number of characters to process in <code>in</code>, starting at <code>iOff</code>.
* @return An array containing the decoded data bytes.
* @throws IllegalArgumentException If the input is not valid Base64 encoded data.
*/
public static byte[] decode (char[] in, int iOff, int iLen) {
if (iLen%4 != 0) throw new IllegalArgumentException ("Length of Base64 encoded input string is not a multiple of 4.");
while (iLen > 0 && in[iOff+iLen-1] == '=') iLen--;
int oLen = (iLen*3) / 4;
byte[] out = new byte[oLen];
int ip = iOff;
int iEnd = iOff + iLen;
int op = 0;
while (ip < iEnd) {
int i0 = in[ip++];
int i1 = in[ip++];
int i2 = ip < iEnd ? in[ip++] : 'A';
int i3 = ip < iEnd ? in[ip++] : 'A';
if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)
throw new IllegalArgumentException ("Illegal character in Base64 encoded data.");
int b0 = map2[i0];
int b1 = map2[i1];
int b2 = map2[i2];
int b3 = map2[i3];
if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)
throw new IllegalArgumentException ("Illegal character in Base64 encoded data.");
int o0 = ( b0 <<2) | (b1>>>4);
int o1 = ((b1 & 0xf)<<4) | (b2>>>2);
int o2 = ((b2 & 3)<<6) | b3;
out[op++] = (byte)o0;
if (op<oLen) out[op++] = (byte)o1;
if (op<oLen) out[op++] = (byte)o2; }
return out; }
// Dummy constructor.
private Base64Coder() {}
} // end class Base64Coder

View File

@@ -1,76 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MenuItem;
import android.widget.TextView;
import com.kunzisoft.keepass.R;
import com.keepassdroid.stylish.StylishActivity;
public class AboutActivity extends StylishActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.about);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(getString(R.string.menu_about));
setSupportActionBar(toolbar);
assert getSupportActionBar() != null;
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
String version;
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
version = packageInfo.versionName;
} catch (NameNotFoundException e) {
Log.w(getClass().getSimpleName(), "Unable to get application version", e);
version = "Unable to get application version.";
}
version = getString(R.string.version_label) + " " + version;
TextView versionText = (TextView) findViewById(R.id.activity_about_version);
versionText.setText(version);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
switch (id) {
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}

View File

@@ -1,219 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.SyncFailedException;
import java.util.HashSet;
import java.util.Set;
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.util.Log;
import com.keepassdroid.database.PwDatabase;
import com.keepassdroid.database.PwDatabaseV3;
import com.keepassdroid.database.PwGroup;
import com.keepassdroid.database.exception.ContentFileNotFoundException;
import com.keepassdroid.database.exception.InvalidDBException;
import com.keepassdroid.database.exception.PwDbOutputException;
import com.keepassdroid.database.load.Importer;
import com.keepassdroid.database.load.ImporterFactory;
import com.keepassdroid.database.save.PwDbOutput;
import com.keepassdroid.icons.DrawableFactory;
import com.keepassdroid.search.SearchDbHelper;
import com.keepassdroid.utils.UriUtil;
/**
* @author bpellin
*/
public class Database {
public Set<PwGroup> dirty = new HashSet<PwGroup>();
public PwDatabase pm;
public Uri mUri;
public SearchDbHelper searchHelper;
public boolean readOnly = false;
public boolean passwordEncodingError = false;
public DrawableFactory drawFactory = new DrawableFactory();
private boolean loaded = false;
public boolean Loaded() {
return loaded;
}
public void setLoaded() {
loaded = true;
}
public void LoadData(Context ctx, InputStream is, String password, InputStream keyInputStream) throws IOException, InvalidDBException {
LoadData(ctx, is, password, keyInputStream, new UpdateStatus(), !Importer.DEBUG);
}
public void LoadData(Context ctx, Uri uri, String password, Uri keyfile) throws IOException, FileNotFoundException, InvalidDBException {
LoadData(ctx, uri, password, keyfile, new UpdateStatus(), !Importer.DEBUG);
}
public void LoadData(Context ctx, Uri uri, String password, Uri keyfile, UpdateStatus status) throws IOException, FileNotFoundException, InvalidDBException {
LoadData(ctx, uri, password, keyfile, status, !Importer.DEBUG);
}
public void LoadData(Context ctx, Uri uri, String password, Uri keyfile, UpdateStatus status, boolean debug) throws IOException, FileNotFoundException, InvalidDBException {
mUri = uri;
readOnly = false;
if (uri.getScheme().equals("file")) {
File file = new File(uri.getPath());
readOnly = !file.canWrite();
}
InputStream is, kfIs;
try {
is = UriUtil.getUriInputStream(ctx, uri);
} catch (Exception e) {
Log.e("KPD", "Database::LoadData", e);
throw ContentFileNotFoundException.getInstance(uri);
}
try {
kfIs = UriUtil.getUriInputStream(ctx, keyfile);
} catch (Exception e) {
Log.e("KPD", "Database::LoadData", e);
throw ContentFileNotFoundException.getInstance(keyfile);
}
LoadData(ctx, is, password, kfIs, status, debug);
}
public void LoadData(Context ctx, InputStream is, String password, InputStream kfIs, boolean debug) throws IOException, InvalidDBException {
LoadData(ctx, is, password, kfIs, new UpdateStatus(), debug);
}
public void LoadData(Context ctx, InputStream is, String password, InputStream kfIs, UpdateStatus status, boolean debug) throws IOException, InvalidDBException {
BufferedInputStream bis = new BufferedInputStream(is);
if ( ! bis.markSupported() ) {
throw new IOException("Input stream does not support mark.");
}
// We'll end up reading 8 bytes to identify the header. Might as well use two extra.
bis.mark(10);
Importer imp = ImporterFactory.createImporter(bis, debug);
bis.reset(); // Return to the start
pm = imp.openDatabase(bis, password, kfIs, status);
if ( pm != null ) {
PwGroup root = pm.rootGroup;
pm.populateGlobals(root);
LoadData(ctx, pm, password, kfIs, status);
}
loaded = true;
}
public void LoadData(Context ctx, PwDatabase pm, String password, InputStream keyInputStream, UpdateStatus status) {
if ( pm != null ) {
passwordEncodingError = !pm.validatePasswordEncoding(password);
}
searchHelper = new SearchDbHelper(ctx);
loaded = true;
}
public PwGroup Search(String str) {
if (searchHelper == null) { return null; }
return searchHelper.search(this, str);
}
public void SaveData(Context ctx) throws IOException, PwDbOutputException {
SaveData(ctx, mUri);
}
public void SaveData(Context ctx, Uri uri) throws IOException, PwDbOutputException {
if (uri.getScheme().equals("file")) {
String filename = uri.getPath();
File tempFile = new File(filename + ".tmp");
FileOutputStream fos = new FileOutputStream(tempFile);
//BufferedOutputStream bos = new BufferedOutputStream(fos);
//PwDbV3Output pmo = new PwDbV3Output(pm, bos, App.getCalendar());
PwDbOutput pmo = PwDbOutput.getInstance(pm, fos);
pmo.output();
//bos.flush();
//bos.close();
fos.close();
// Force data to disk before continuing
try {
fos.getFD().sync();
} catch (SyncFailedException e) {
// Ignore if fsync fails. We tried.
}
File orig = new File(filename);
if (!tempFile.renameTo(orig)) {
throw new IOException("Failed to store database.");
}
}
else {
OutputStream os;
try {
os = ctx.getContentResolver().openOutputStream(uri);
} catch (Exception e) {
throw new IOException("Failed to store database.");
}
PwDbOutput pmo = PwDbOutput.getInstance(pm, os);
pmo.output();
os.close();
}
mUri = uri;
}
public void clear() {
dirty.clear();
drawFactory.clear();
pm = null;
mUri = null;
loaded = false;
passwordEncodingError = false;
}
public void markAllGroupsAsDirty() {
for ( PwGroup group : pm.getGroups() ) {
dirty.add(group);
}
// TODO: This should probably be abstracted out
// The root tree in v3 is not an 'official' tree
if ( pm instanceof PwDatabaseV3 ) {
dirty.add(pm.rootGroup);
}
}
}

View File

@@ -1,491 +0,0 @@
/*
*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v7.widget.Toolbar;
import android.support.v4.app.NotificationCompat;
import android.text.SpannableString;
import android.text.method.LinkMovementMethod;
import android.text.method.PasswordTransformationMethod;
import android.text.util.Linkify;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.kunzisoft.keepass.KeePass;
import com.kunzisoft.keepass.R;
import com.keepassdroid.app.App;
import com.keepassdroid.compat.ActivityCompat;
import com.keepassdroid.database.PwDatabase;
import com.keepassdroid.database.PwEntry;
import com.keepassdroid.database.PwEntryV4;
import com.keepassdroid.database.exception.SamsungClipboardException;
import com.keepassdroid.intents.Intents;
import com.keepassdroid.utils.EmptyUtils;
import com.keepassdroid.utils.MenuUtil;
import com.keepassdroid.utils.Types;
import com.keepassdroid.utils.Util;
import java.text.DateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
public class EntryActivity extends LockCloseHideActivity {
public static final String KEY_ENTRY = "entry";
public static final String KEY_REFRESH_POS = "refresh_pos";
public static final int NOTIFY_USERNAME = 1;
public static final int NOTIFY_PASSWORD = 2;
public static void Launch(Activity act, PwEntry pw, int pos) {
Intent i;
if ( pw instanceof PwEntryV4 ) {
i = new Intent(act, EntryActivityV4.class);
} else {
i = new Intent(act, EntryActivity.class);
}
i.putExtra(KEY_ENTRY, Types.UUIDtoBytes(pw.getUUID()));
i.putExtra(KEY_REFRESH_POS, pos);
act.startActivityForResult(i,0);
}
protected PwEntry mEntry;
private Timer mTimer = new Timer();
private boolean mShowPassword;
private int mPos;
private NotificationManager mNM;
private BroadcastReceiver mIntentReceiver;
protected boolean readOnly = false;
private DateFormat dateFormat;
private DateFormat timeFormat;
protected void setEntryView() {
setContentView(R.layout.entry_view);
}
protected void setupEditButtons() {
View edit = findViewById(R.id.entry_edit);
edit.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
EntryEditActivity.Launch(EntryActivity.this, mEntry);
}
});
if (readOnly) {
edit.setVisibility(View.GONE);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
mShowPassword = ! prefs.getBoolean(getString(R.string.maskpass_key), getResources().getBoolean(R.bool.maskpass_default));
super.onCreate(savedInstanceState);
setEntryView();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
assert getSupportActionBar() != null;
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
Context appCtx = getApplicationContext();
dateFormat = android.text.format.DateFormat.getDateFormat(appCtx);
timeFormat = android.text.format.DateFormat.getTimeFormat(appCtx);
Database db = App.getDB();
// Likely the app has been killed exit the activity
if ( ! db.Loaded() ) {
finish();
return;
}
readOnly = db.readOnly;
setResult(KeePass.EXIT_NORMAL);
Intent i = getIntent();
UUID uuid = Types.bytestoUUID(i.getByteArrayExtra(KEY_ENTRY));
mPos = i.getIntExtra(KEY_REFRESH_POS, -1);
assert(uuid != null);
mEntry = db.pm.entries.get(uuid);
if (mEntry == null) {
Toast.makeText(this, R.string.entry_not_found, Toast.LENGTH_LONG).show();
finish();
return;
}
// Refresh Menu contents in case onCreateMenuOptions was called before mEntry was set
ActivityCompat.invalidateOptionsMenu(this);
// Update last access time.
mEntry.touch(false, false);
fillData(false);
setupEditButtons();
// Notification Manager
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if ( mEntry.getPassword().length() > 0 ) {
// only show notification if password is available
Notification password = getNotification(Intents.COPY_PASSWORD, R.string.copy_password);
mNM.notify(NOTIFY_PASSWORD, password);
}
if ( mEntry.getUsername().length() > 0 ) {
// only show notification if username is available
Notification username = getNotification(Intents.COPY_USERNAME, R.string.copy_username);
mNM.notify(NOTIFY_USERNAME, username);
}
mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if ( action.equals(Intents.COPY_USERNAME) ) {
String username = mEntry.getUsername();
if ( username.length() > 0 ) {
timeoutCopyToClipboard(username);
}
} else if ( action.equals(Intents.COPY_PASSWORD) ) {
String password = new String(mEntry.getPassword());
if ( password.length() > 0 ) {
timeoutCopyToClipboard(new String(mEntry.getPassword()));
}
}
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(Intents.COPY_USERNAME);
filter.addAction(Intents.COPY_PASSWORD);
registerReceiver(mIntentReceiver, filter);
}
@Override
protected void onDestroy() {
// These members might never get initialized if the app timed out
if ( mIntentReceiver != null ) {
unregisterReceiver(mIntentReceiver);
}
if ( mNM != null ) {
try {
mNM.cancelAll();
} catch (SecurityException e) {
// Some android devices give a SecurityException when trying to cancel notifications without the WAKE_LOCK permission,
// we'll ignore these.
}
}
super.onDestroy();
}
private Notification getNotification(String intentText, int descResId) {
String desc = getString(descResId);
Intent intent = new Intent(intentText);
PendingIntent pending = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
// no longer supported for api level >22
// notify.setLatestEventInfo(this, getString(R.string.app_name), desc, pending);
// so instead using compat builder and create new notification
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
Notification notify = builder.setContentIntent(pending).setContentText(desc).setContentTitle(getString(R.string.app_name))
.setSmallIcon(R.drawable.notify).setTicker(desc).setWhen(System.currentTimeMillis()).build();
return notify;
}
private String getDateTime(Date dt) {
return dateFormat.format(dt) + " " + timeFormat.format(dt);
}
protected void fillData(boolean trimList) {
ImageView iv = (ImageView) findViewById(R.id.entry_icon);
Database db = App.getDB();
db.drawFactory.assignDrawableTo(iv, getResources(), mEntry.getIcon());
PwDatabase pm = db.pm;
populateText(R.id.entry_title, mEntry.getTitle(true, pm));
populateText(R.id.entry_user_name, mEntry.getUsername(true, pm));
populateText(R.id.entry_url, mEntry.getUrl(true, pm));
populateText(R.id.entry_password, mEntry.getPassword(true, pm));
setPasswordStyle();
populateText(R.id.entry_created, getDateTime(mEntry.getCreationTime()));
populateText(R.id.entry_modified, getDateTime(mEntry.getLastModificationTime()));
populateText(R.id.entry_accessed, getDateTime(mEntry.getLastAccessTime()));
Date expires = mEntry.getExpiryTime();
if ( mEntry.expires() ) {
populateText(R.id.entry_expires, getDateTime(expires));
} else {
populateText(R.id.entry_expires, R.string.never);
}
populateText(R.id.entry_comment, mEntry.getNotes(true, pm));
}
private void populateText(int viewId, int resId) {
TextView tv = (TextView) findViewById(viewId);
tv.setText(resId);
}
private void populateText(int viewId, String text) {
TextView tv = (TextView) findViewById(viewId);
tv.setText(text);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if ( resultCode == KeePass.EXIT_REFRESH || resultCode == KeePass.EXIT_REFRESH_TITLE ) {
fillData(true);
if ( resultCode == KeePass.EXIT_REFRESH_TITLE ) {
Intent ret = new Intent();
ret.putExtra(KEY_REFRESH_POS, mPos);
setResult(KeePass.EXIT_REFRESH, ret);
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
MenuUtil.donationMenuInflater(inflater, menu);
inflater.inflate(R.menu.entry, menu);
inflater.inflate(R.menu.lock_database, menu);
MenuItem togglePassword = menu.findItem(R.id.menu_toggle_pass);
if ( mShowPassword ) {
togglePassword.setTitle(R.string.menu_hide_password);
togglePassword.setIcon(R.drawable.ic_visibility_off_white_24dp);
} else {
togglePassword.setTitle(R.string.menu_showpass);
togglePassword.setIcon(R.drawable.ic_visibility_white_24dp);
}
MenuItem gotoUrl = menu.findItem(R.id.menu_goto_url);
MenuItem copyUser = menu.findItem(R.id.menu_copy_user);
MenuItem copyPass = menu.findItem(R.id.menu_copy_pass);
// In API >= 11 onCreateOptionsMenu may be called before onCreate completes
// so mEntry may not be set
if (mEntry == null) {
gotoUrl.setVisible(false);
copyUser.setVisible(false);
copyPass.setVisible(false);
}
else {
String url = mEntry.getUrl();
if (EmptyUtils.isNullOrEmpty(url)) {
// disable button if url is not available
gotoUrl.setVisible(false);
}
if ( mEntry.getUsername().length() == 0 ) {
// disable button if username is not available
copyUser.setVisible(false);
}
if ( mEntry.getPassword().length() == 0 ) {
// disable button if password is not available
copyPass.setVisible(false);
}
}
return true;
}
private void setPasswordStyle() {
TextView password = (TextView) findViewById(R.id.entry_password);
if ( mShowPassword ) {
password.setTransformationMethod(null);
} else {
password.setTransformationMethod(PasswordTransformationMethod.getInstance());
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch ( item.getItemId() ) {
case R.id.menu_donate:
return MenuUtil.onDonationItemSelected(this);
case R.id.menu_toggle_pass:
if ( mShowPassword ) {
item.setTitle(R.string.menu_showpass);
item.setIcon(R.drawable.ic_visibility_white_24dp);
mShowPassword = false;
} else {
item.setTitle(R.string.menu_hide_password);
item.setIcon(R.drawable.ic_visibility_off_white_24dp);
mShowPassword = true;
}
setPasswordStyle();
return true;
case R.id.menu_goto_url:
String url;
url = mEntry.getUrl();
// Default http:// if no protocol specified
if ( ! url.contains("://") ) {
url = "http://" + url;
}
try {
Util.gotoUrl(this, url);
} catch (ActivityNotFoundException e) {
Toast.makeText(this, R.string.no_url_handler, Toast.LENGTH_LONG).show();
}
return true;
case R.id.menu_copy_user:
timeoutCopyToClipboard(mEntry.getUsername(true, App.getDB().pm));
return true;
case R.id.menu_copy_pass:
timeoutCopyToClipboard(mEntry.getPassword(true, App.getDB().pm));
return true;
case R.id.menu_lock:
App.setShutdown();
setResult(KeePass.EXIT_LOCK);
finish();
return true;
case android.R.id.home :
finish(); // close this activity and return to preview activity (if there is any)
}
return super.onOptionsItemSelected(item);
}
private void timeoutCopyToClipboard(String text) {
try {
Util.copyToClipboard(this, text);
} catch (SamsungClipboardException e) {
showSamsungDialog();
return;
}
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String sClipClear = prefs.getString(getString(R.string.clipboard_timeout_key), getString(R.string.clipboard_timeout_default));
long clipClearTime = Long.parseLong(sClipClear);
if ( clipClearTime > 0 ) {
mTimer.schedule(new ClearClipboardTask(this, text), clipClearTime);
}
}
// Setup to allow the toast to happen in the foreground
final Handler uiThreadCallback = new Handler();
// Task which clears the clipboard, and sends a toast to the foreground.
private class ClearClipboardTask extends TimerTask {
private final String mClearText;
private final Context mCtx;
ClearClipboardTask(Context ctx, String clearText) {
mClearText = clearText;
mCtx = ctx;
}
@Override
public void run() {
String currentClip = Util.getClipboard(mCtx);
if ( currentClip.equals(mClearText) ) {
try {
Util.copyToClipboard(mCtx, "");
uiThreadCallback.post(new UIToastTask(mCtx, R.string.ClearClipboard));
} catch (SamsungClipboardException e) {
uiThreadCallback.post(new UIToastTask(mCtx, R.string.clipboard_error_clear));
}
}
}
}
private void showSamsungDialog() {
String text = getString(R.string.clipboard_error).concat(System.getProperty("line.separator")).concat(getString(R.string.clipboard_error_url));
SpannableString s = new SpannableString(text);
TextView tv = new TextView(this);
tv.setText(s);
tv.setAutoLinkMask(RESULT_OK);
tv.setMovementMethod(LinkMovementMethod.getInstance());
Linkify.addLinks(s, Linkify.WEB_URLS);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.clipboard_error_title)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setView(tv)
.show();
}
}

View File

@@ -1,75 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid;
import java.util.Map;
import android.view.View;
import android.view.ViewGroup;
import com.kunzisoft.keepass.R;
import com.keepassdroid.app.App;
import com.keepassdroid.database.PwDatabase;
import com.keepassdroid.database.PwEntryV4;
import com.keepassdroid.database.security.ProtectedString;
import com.keepassdroid.utils.SprEngine;
import com.keepassdroid.utils.SprEngineV4;
import com.keepassdroid.view.EntrySection;
public class EntryActivityV4 extends EntryActivity {
@Override
protected void setEntryView() {
setContentView(R.layout.entry_view);
}
@Override
protected void fillData(boolean trimList) {
super.fillData(trimList);
ViewGroup group = (ViewGroup) findViewById(R.id.extra_strings);
if (trimList) {
group.removeAllViews();
}
PwEntryV4 entry = (PwEntryV4) mEntry;
PwDatabase pm = App.getDB().pm;
SprEngine spr = SprEngineV4.getInstance(pm);
// Display custom strings
if (entry.strings.size() > 0) {
for (Map.Entry<String, ProtectedString> pair : entry.strings.entrySet()) {
String key = pair.getKey();
if (!PwEntryV4.IsStandardString(key)) {
String text = pair.getValue().toString();
View view = new EntrySection(this, null, key, spr.compile(text, entry, pm));
group.addView(view);
}
}
}
}
}

View File

@@ -1,328 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.kunzisoft.keepass.KeePass;
import com.kunzisoft.keepass.R;
import com.keepassdroid.app.App;
import com.keepassdroid.database.PwDatabase;
import com.keepassdroid.database.PwEntry;
import com.keepassdroid.database.PwEntryV3;
import com.keepassdroid.database.PwEntryV4;
import com.keepassdroid.database.PwGroup;
import com.keepassdroid.database.PwGroupId;
import com.keepassdroid.database.PwGroupV3;
import com.keepassdroid.database.PwGroupV4;
import com.keepassdroid.database.PwIconStandard;
import com.keepassdroid.database.edit.AddEntry;
import com.keepassdroid.database.edit.OnFinish;
import com.keepassdroid.database.edit.RunnableOnFinish;
import com.keepassdroid.database.edit.UpdateEntry;
import com.keepassdroid.icons.Icons;
import com.keepassdroid.utils.MenuUtil;
import com.keepassdroid.utils.Types;
import com.keepassdroid.utils.Util;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;
public abstract class EntryEditActivity extends LockCloseHideActivity
implements IconPickerFragment.IconPickerListener,
GeneratePasswordFragment.GeneratePasswordListener {
public static final String KEY_ENTRY = "entry";
public static final String KEY_PARENT = "parent";
protected PwEntry mEntry;
protected boolean mIsNew;
protected int mSelectedIconID = -1;
public static void Launch(Activity act, PwEntry pw) {
Intent i;
if (pw instanceof PwEntryV3) {
i = new Intent(act, EntryEditActivityV3.class);
}
else if (pw instanceof PwEntryV4) {
i = new Intent(act, EntryEditActivityV4.class);
}
else {
throw new RuntimeException("Not yet implemented.");
}
i.putExtra(KEY_ENTRY, Types.UUIDtoBytes(pw.getUUID()));
act.startActivityForResult(i, 0);
}
public static void Launch(Activity act, PwGroup pw) {
Intent i;
if (pw instanceof PwGroupV3) {
i = new Intent(act, EntryEditActivityV3.class);
EntryEditActivityV3.putParentId(i, KEY_PARENT, (PwGroupV3)pw);
}
else if (pw instanceof PwGroupV4) {
i = new Intent(act, EntryEditActivityV4.class);
EntryEditActivityV4.putParentId(i, KEY_PARENT, (PwGroupV4)pw);
}
else {
throw new RuntimeException("Not yet implemented.");
}
act.startActivityForResult(i, 0);
}
protected abstract PwGroupId getParentGroupId(Intent i, String key);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.entry_edit);
setResult(KeePass.EXIT_NORMAL);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(getString(R.string.app_name));
setSupportActionBar(toolbar);
assert getSupportActionBar() != null;
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
// Likely the app has been killed exit the activity
Database db = App.getDB();
if ( ! db.Loaded() ) {
finish();
return;
}
Intent i = getIntent();
byte[] uuidBytes = i.getByteArrayExtra(KEY_ENTRY);
PwDatabase pm = db.pm;
if ( uuidBytes == null ) {
PwGroupId parentId = getParentGroupId(i, KEY_PARENT);
PwGroup parent = pm.groups.get(parentId);
mEntry = PwEntry.getInstance(parent);
mIsNew = true;
} else {
UUID uuid = Types.bytestoUUID(uuidBytes);
mEntry = pm.entries.get(uuid);
mIsNew = false;
fillData();
}
View scrollView = findViewById(R.id.entry_scroll);
scrollView.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
View iconButton = findViewById(R.id.icon_button);
iconButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
IconPickerFragment.Launch(EntryEditActivity.this);
}
});
// Generate password button
View generatePassword = findViewById(R.id.generate_button);
generatePassword.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
GeneratePasswordFragment generatePasswordFragment = new GeneratePasswordFragment();
generatePasswordFragment.show(getSupportFragmentManager(), "PasswordGeneratorFragment");
}
});
// Save button
View save = findViewById(R.id.entry_save);
save.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
EntryEditActivity act = EntryEditActivity.this;
if (!validateBeforeSaving()) {
return;
}
PwEntry newEntry = populateNewEntry();
if ( newEntry.getTitle().equals(mEntry.getTitle()) ) {
setResult(KeePass.EXIT_REFRESH);
} else {
setResult(KeePass.EXIT_REFRESH_TITLE);
}
RunnableOnFinish task;
OnFinish onFinish = act.new AfterSave(new Handler());
if ( mIsNew ) {
task = AddEntry.getInstance(EntryEditActivity.this, App.getDB(), newEntry, onFinish);
} else {
task = new UpdateEntry(EntryEditActivity.this, App.getDB(), mEntry, newEntry, onFinish);
}
ProgressTask pt = new ProgressTask(act, task, R.string.saving_database);
pt.run();
}
});
}
protected boolean validateBeforeSaving() {
// Require title
String title = Util.getEditText(this, R.id.entry_title);
if ( title.length() == 0 ) {
Toast.makeText(this, R.string.error_title_required, Toast.LENGTH_LONG).show();
return false;
}
// Validate password
String pass = Util.getEditText(this, R.id.entry_password);
String conf = Util.getEditText(this, R.id.entry_confpassword);
if ( ! pass.equals(conf) ) {
Toast.makeText(this, R.string.error_pass_match, Toast.LENGTH_LONG).show();
return false;
}
return true;
}
protected PwEntry populateNewEntry() {
return populateNewEntry(null);
}
protected PwEntry populateNewEntry(PwEntry entry) {
PwEntry newEntry;
if (entry == null) {
newEntry = mEntry.clone(true);
}
else {
newEntry = entry;
}
Date now = Calendar.getInstance().getTime();
newEntry.setLastAccessTime(now);
newEntry.setLastModificationTime(now);
PwDatabase db = App.getDB().pm;
newEntry.setTitle(Util.getEditText(this, R.id.entry_title), db);
if(mSelectedIconID != -1)
newEntry.setIcon(new PwIconStandard(mSelectedIconID));
newEntry.setUrl(Util.getEditText(this, R.id.entry_url), db);
newEntry.setUsername(Util.getEditText(this, R.id.entry_user_name), db);
newEntry.setNotes(Util.getEditText(this, R.id.entry_comment), db);
newEntry.setPassword(Util.getEditText(this, R.id.entry_password), db);
return newEntry;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
MenuUtil.donationMenuInflater(inflater, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch ( item.getItemId() ) {
case R.id.menu_donate:
return MenuUtil.onDonationItemSelected(this);
case android.R.id.home:
finish();
}
return super.onOptionsItemSelected(item);
}
protected void fillData() {
ImageButton currIconButton = (ImageButton) findViewById(R.id.icon_button);
App.getDB().drawFactory.assignDrawableTo(currIconButton, getResources(), mEntry.getIcon());
populateText(R.id.entry_title, mEntry.getTitle());
populateText(R.id.entry_user_name, mEntry.getUsername());
populateText(R.id.entry_url, mEntry.getUrl());
String password = mEntry.getPassword();
populateText(R.id.entry_password, password);
populateText(R.id.entry_confpassword, password);
populateText(R.id.entry_comment, mEntry.getNotes());
}
private void populateText(int viewId, String text) {
TextView tv = (TextView) findViewById(viewId);
tv.setText(text);
}
@Override
public void iconPicked(Bundle bundle) {
mSelectedIconID = bundle.getInt(IconPickerFragment.KEY_ICON_ID);
ImageButton currIconButton = (ImageButton) findViewById(R.id.icon_button);
currIconButton.setImageResource(Icons.iconToResId(mSelectedIconID));
}
@Override
public void acceptPassword(Bundle bundle) {
String generatedPassword = bundle.getString(GeneratePasswordFragment.KEY_PASSWORD_ID);
EditText password = (EditText) findViewById(R.id.entry_password);
EditText confPassword = (EditText) findViewById(R.id.entry_confpassword);
password.setText(generatedPassword);
confPassword.setText(generatedPassword);
}
@Override
public void cancelPassword(Bundle bundle) {
// Do nothing here
}
private final class AfterSave extends OnFinish {
AfterSave(Handler handler) {
super(handler);
}
@Override
public void run() {
if ( mSuccess ) {
finish();
} else {
displayMessage(EntryEditActivity.this);
}
}
}
}

View File

@@ -1,62 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid;
import android.content.Intent;
import com.keepassdroid.app.App;
import com.keepassdroid.database.PwEntry;
import com.keepassdroid.database.PwGroupId;
import com.keepassdroid.database.PwGroupIdV3;
import com.keepassdroid.database.PwGroupV3;
public class EntryEditActivityV3 extends EntryEditActivity {
@Override
protected PwEntry populateNewEntry(PwEntry entry) {
PwEntry newEntry = super.populateNewEntry(entry);
if (mSelectedIconID == -1) {
if (mIsNew) {
newEntry.icon = App.getDB().pm.iconFactory.getIcon(0);
}
else {
// Keep previous icon, if no new one was selected
newEntry.icon = mEntry.icon;
}
}
else {
newEntry.icon = App.getDB().pm.iconFactory.getIcon(mSelectedIconID);
}
return newEntry;
}
protected static void putParentId(Intent i, String parentKey, PwGroupV3 parent) {
i.putExtra(parentKey, parent.groupId);
}
@Override
protected PwGroupId getParentGroupId(Intent i, String key) {
int groupId = i.getIntExtra(key, -1);
return new PwGroupIdV3(groupId);
}
}

View File

@@ -1,206 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import com.kunzisoft.keepass.R;
import com.keepassdroid.app.App;
import com.keepassdroid.database.PwDatabaseV4;
import com.keepassdroid.database.PwEntry;
import com.keepassdroid.database.PwEntryV4;
import com.keepassdroid.database.PwGroupId;
import com.keepassdroid.database.PwGroupIdV4;
import com.keepassdroid.database.PwGroupV4;
import com.keepassdroid.database.security.ProtectedString;
import com.keepassdroid.utils.Types;
import com.keepassdroid.view.EntryEditSection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
public class EntryEditActivityV4 extends EntryEditActivity {
private ScrollView scroll;
private LayoutInflater inflater;
protected static void putParentId(Intent i, String parentKey, PwGroupV4 parent) {
PwGroupId id = parent.getId();
PwGroupIdV4 id4 = (PwGroupIdV4) id;
i.putExtra(parentKey, Types.UUIDtoBytes(id4.getId()));
}
@Override
protected PwGroupId getParentGroupId(Intent i, String key) {
byte[] buf = i.getByteArrayExtra(key);
UUID id = Types.bytestoUUID(buf);
return new PwGroupIdV4(id);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
super.onCreate(savedInstanceState);
scroll = (ScrollView) findViewById(R.id.entry_scroll);
View add = findViewById(R.id.add_advanced);
add.setVisibility(View.VISIBLE);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LinearLayout container = (LinearLayout) findViewById(R.id.advanced_container);
EntryEditSection ees = (EntryEditSection) inflater.inflate(R.layout.entry_edit_section, container, false);
ees.setData("", new ProtectedString(false, ""));
container.addView(ees);
// Scroll bottom
scroll.post(new Runnable() {
@Override
public void run() {
scroll.fullScroll(ScrollView.FOCUS_DOWN);
}
});
}
});
}
@Override
protected void fillData() {
super.fillData();
PwEntryV4 entry = (PwEntryV4) mEntry;
LinearLayout container = (LinearLayout) findViewById(R.id.advanced_container);
if (entry.strings.size() > 0) {
for (Entry<String, ProtectedString> pair : entry.strings.entrySet()) {
String key = pair.getKey();
if (!PwEntryV4.IsStandardString(key)) {
EntryEditSection ees = (EntryEditSection) inflater.inflate(R.layout.entry_edit_section, container, false);
ees.setData(key, pair.getValue());
container.addView(ees);
}
}
}
}
@SuppressWarnings("unchecked")
@Override
protected PwEntry populateNewEntry() {
PwEntryV4 newEntry = (PwEntryV4) mEntry.clone(true);
newEntry.history = (ArrayList<PwEntryV4>) newEntry.history.clone();
newEntry.createBackup((PwDatabaseV4)App.getDB().pm);
newEntry = (PwEntryV4) super.populateNewEntry(newEntry);
Map<String, ProtectedString> strings = newEntry.strings;
// Delete all new standard strings
Iterator<Entry<String, ProtectedString>> iter = strings.entrySet().iterator();
while (iter.hasNext()) {
Entry<String, ProtectedString> pair = iter.next();
if (!PwEntryV4.IsStandardString(pair.getKey())) {
iter.remove();
}
}
LinearLayout container = (LinearLayout) findViewById(R.id.advanced_container);
for (int i = 0; i < container.getChildCount(); i++) {
View view = container.getChildAt(i);
TextView keyView = (TextView)view.findViewById(R.id.title);
String key = keyView.getText().toString();
TextView valueView = (TextView)view.findViewById(R.id.value);
String value = valueView.getText().toString();
CheckBox cb = (CheckBox)view.findViewById(R.id.protection);
boolean protect = cb.isChecked();
strings.put(key, new ProtectedString(protect, value));
}
return newEntry;
}
public void deleteAdvancedString(View view) {
ViewGroup section = (ViewGroup) view.getParent();
LinearLayout container = (LinearLayout) findViewById(R.id.advanced_container);
for (int i = 0; i < container.getChildCount(); i++) {
ViewGroup ees = (ViewGroup) container.getChildAt(i);
if (ees == section) {
container.removeViewAt(i);
container.invalidate();
break;
}
}
}
@Override
protected boolean validateBeforeSaving() {
if(!super.validateBeforeSaving()) {
return false;
}
LinearLayout container = (LinearLayout) findViewById(R.id.advanced_container);
for (int i = 0; i < container.getChildCount(); i++) {
EntryEditSection ees = (EntryEditSection) container.getChildAt(i);
TextView keyView = (TextView) ees.findViewById(R.id.title);
CharSequence key = keyView.getText();
if (key == null || key.length() == 0) {
Toast.makeText(this, R.string.error_string_key, Toast.LENGTH_LONG).show();
return false;
}
}
return true;
}
}

View File

@@ -1,154 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Toast;
import com.kunzisoft.keepass.R;
import com.keepassdroid.password.PasswordGenerator;
public class GeneratePasswordFragment extends DialogFragment {
public static final String KEY_PASSWORD_ID = "KEY_PASSWORD_ID";
private GeneratePasswordListener mListener;
private View root;
private EditText lengthTextView;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mListener = (GeneratePasswordListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()
+ " must implement " + GeneratePasswordListener.class.getName());
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
root = inflater.inflate(R.layout.generate_password, null);
lengthTextView = (EditText) root.findViewById(R.id.length);
SeekBar seekBar = (SeekBar) root.findViewById(R.id.seekbar_length);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
lengthTextView.setText(String.valueOf(progress));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
Button genPassButton = (Button) root.findViewById(R.id.generate_password_button);
genPassButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
fillPassword();
}
});
builder.setView(root)
.setPositiveButton(R.string.accept, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
EditText password = (EditText) root.findViewById(R.id.password);
Bundle bundle = new Bundle();
bundle.putString(KEY_PASSWORD_ID, password.getText().toString());
mListener.acceptPassword(bundle);
dismiss();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Bundle bundle = new Bundle();
mListener.cancelPassword(bundle);
dismiss();
}
});
// Pre-populate a password to possibly save the user a few clicks
fillPassword();
return builder.create();
}
private void fillPassword() {
EditText txtPassword = (EditText) root.findViewById(R.id.password);
txtPassword.setText(generatePassword());
}
public String generatePassword() {
String password = "";
try {
int length = Integer.valueOf(((EditText) root.findViewById(R.id.length)).getText().toString());
((CheckBox) root.findViewById(R.id.cb_uppercase)).isChecked();
PasswordGenerator generator = new PasswordGenerator(getActivity());
password = generator.generatePassword(length,
((CheckBox) root.findViewById(R.id.cb_uppercase)).isChecked(),
((CheckBox) root.findViewById(R.id.cb_lowercase)).isChecked(),
((CheckBox) root.findViewById(R.id.cb_digits)).isChecked(),
((CheckBox) root.findViewById(R.id.cb_minus)).isChecked(),
((CheckBox) root.findViewById(R.id.cb_underline)).isChecked(),
((CheckBox) root.findViewById(R.id.cb_space)).isChecked(),
((CheckBox) root.findViewById(R.id.cb_specials)).isChecked(),
((CheckBox) root.findViewById(R.id.cb_brackets)).isChecked());
} catch (NumberFormatException e) {
Toast.makeText(getContext(), R.string.error_wrong_length, Toast.LENGTH_LONG).show();
} catch (IllegalArgumentException e) {
Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
return password;
}
public interface GeneratePasswordListener {
void acceptPassword(Bundle bundle);
void cancelPassword(Bundle bundle);
}
}

View File

@@ -1,256 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import com.kunzisoft.keepass.KeePass;
import com.kunzisoft.keepass.R;
import com.keepassdroid.app.App;
import com.keepassdroid.database.PwDatabase;
import com.keepassdroid.database.PwDatabaseV3;
import com.keepassdroid.database.PwDatabaseV4;
import com.keepassdroid.database.PwGroup;
import com.keepassdroid.database.PwGroupId;
import com.keepassdroid.database.PwGroupV3;
import com.keepassdroid.database.PwGroupV4;
import com.keepassdroid.database.edit.AddGroup;
import com.keepassdroid.dialog.ReadOnlyDialog;
import com.keepassdroid.view.ClickView;
import com.keepassdroid.view.GroupAddEntryView;
import com.keepassdroid.view.GroupRootView;
import com.keepassdroid.view.GroupViewOnlyView;
public abstract class GroupActivity extends GroupBaseActivity
implements GroupEditFragment.CreateGroupListener, IconPickerFragment.IconPickerListener {
private static final String TAG_CREATE_GROUP = "TAG_CREATE_GROUP";
protected boolean addGroupEnabled = false;
protected boolean addEntryEnabled = false;
protected boolean isRoot = false;
protected boolean readOnly = false;
private static final String TAG = "Group Activity:";
public static void Launch(Activity act) {
Launch(act, null);
}
public static void Launch(Activity act, PwGroup group) {
Intent i;
// Need to use PwDatabase since tree may be null
PwDatabase db = App.getDB().pm;
if ( db instanceof PwDatabaseV3 ) {
i = new Intent(act, GroupActivityV3.class);
if ( group != null ) {
PwGroupV3 g = (PwGroupV3) group;
i.putExtra(KEY_ENTRY, g.groupId);
}
} else if ( db instanceof PwDatabaseV4 ) {
i = new Intent(act, GroupActivityV4.class);
if ( group != null ) {
PwGroupV4 g = (PwGroupV4) group;
i.putExtra(KEY_ENTRY, g.uuid.toString());
}
} else {
// Reached if db is null
Log.d(TAG, "Tried to launch with null db");
return;
}
act.startActivityForResult(i,0);
}
protected abstract PwGroupId retrieveGroupId(Intent i);
protected void setupButtons() {
addGroupEnabled = !readOnly;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ( isFinishing() ) {
return;
}
setResult(KeePass.EXIT_NORMAL);
Log.w(TAG, "Creating tree view");
Intent intent = getIntent();
PwGroupId id = retrieveGroupId(intent);
Database db = App.getDB();
readOnly = db.readOnly;
PwGroup root = db.pm.rootGroup;
if ( id == null ) {
mGroup = root;
} else {
mGroup = db.pm.groups.get(id);
}
Log.w(TAG, "Retrieved tree");
if ( mGroup == null ) {
Log.w(TAG, "Group was null");
return;
}
isRoot = mGroup == root;
setupButtons();
if ( addGroupEnabled && addEntryEnabled ) {
setContentView(new GroupAddEntryView(this));
} else if ( addGroupEnabled ) {
setContentView(new GroupRootView(this));
} else if ( addEntryEnabled ) {
setContentView(new GroupAddEntryView(this));
View addGroup = findViewById(R.id.add_group);
addGroup.setVisibility(View.GONE);
} else {
setContentView(new GroupViewOnlyView(this));
}
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("");
setSupportActionBar(toolbar);
if ( mGroup.getParent() != null )
toolbar.setNavigationIcon(R.drawable.ic_arrow_up_white_24dp);
Log.w(TAG, "Set view");
if ( addGroupEnabled ) {
// Add Group button
View addGroup = findViewById(R.id.add_group);
addGroup.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
GroupEditFragment groupEditFragment = new GroupEditFragment();
groupEditFragment.show(getSupportFragmentManager(), TAG_CREATE_GROUP);
}
});
}
if ( addEntryEnabled ) {
// Add Entry button
View addEntry = findViewById(R.id.add_entry);
addEntry.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
EntryEditActivity.Launch(GroupActivity.this, mGroup);
}
});
}
setGroupTitle();
setGroupIcon();
setListAdapter(new PwGroupListAdapter(this, mGroup));
registerForContextMenu(getListView());
Log.w(TAG, "Finished creating tree");
if (isRoot) {
showWarnings();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
ClickView cv = (ClickView) acmi.targetView;
cv.onCreateMenu(menu, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo();
ClickView cv = (ClickView) acmi.targetView;
return cv.onContextItemSelected(item);
}
@Override
public void approveCreateGroup(Bundle bundle) {
String GroupName = bundle.getString(GroupEditFragment.KEY_NAME);
int GroupIconID = bundle.getInt(GroupEditFragment.KEY_ICON_ID);
GroupActivity act = GroupActivity.this;
Handler handler = new Handler();
AddGroup task = AddGroup.getInstance(this, App.getDB(), GroupName, GroupIconID, mGroup, act.new RefreshTask(handler), false);
ProgressTask pt = new ProgressTask(act, task, R.string.saving_database);
pt.run();
}
@Override
public void cancelCreateGroup(Bundle bundle) {
// Do nothing here
}
@Override
// For icon in create tree dialog
public void iconPicked(Bundle bundle) {
GroupEditFragment groupEditFragment = (GroupEditFragment) getSupportFragmentManager().findFragmentByTag(TAG_CREATE_GROUP);
if (groupEditFragment != null) {
groupEditFragment.iconPicked(bundle);
}
}
protected void showWarnings() {
if (App.getDB().readOnly) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if (prefs.getBoolean(getString(R.string.show_read_only_warning), true)) {
Dialog dialog = new ReadOnlyDialog(this);
dialog.show();
}
}
}
}

View File

@@ -1,44 +0,0 @@
/*
* Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX 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.
*
* KeePass DX 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 KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid;
import android.content.Intent;
import com.keepassdroid.database.PwGroupIdV3;
public class GroupActivityV3 extends GroupActivity {
@Override
protected PwGroupIdV3 retrieveGroupId(Intent i) {
int id = i.getIntExtra(KEY_ENTRY, -1);
if ( id == -1 ) {
return null;
}
return new PwGroupIdV3(id);
}
@Override
protected void setupButtons() {
super.setupButtons();
addEntryEnabled = !isRoot && !readOnly;
}
}

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