Compare commits
542 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
56b63a9e0f | ||
![]() |
2c2b686593 | ||
![]() |
7c2fd5e3e9 | ||
![]() |
7ec0f1f5a8 | ||
![]() |
76b2f377df | ||
![]() |
20c65fbd1e | ||
![]() |
74326616c5 | ||
![]() |
634a5b34f1 | ||
![]() |
8c7cc90363 | ||
![]() |
217ee01572 | ||
![]() |
7a5cd6105c | ||
![]() |
64078933ab | ||
![]() |
e5fbab38d8 | ||
![]() |
e2cf37a91f | ||
![]() |
f62ea95499 | ||
![]() |
b5f4e98925 | ||
![]() |
20aefd0c7a | ||
![]() |
9baf77cbc4 | ||
![]() |
5dfcc72f98 | ||
![]() |
f2a4cc7e66 | ||
![]() |
c4b4be48a5 | ||
![]() |
2c3a1a03cb | ||
![]() |
3c7c3b0a5f | ||
![]() |
eac95df000 | ||
![]() |
db0f091536 | ||
![]() |
5cb6ad6335 | ||
![]() |
f32ed71dfc | ||
![]() |
8a32b3bc5e | ||
![]() |
f53c7e5af5 | ||
![]() |
a1ad86705c | ||
![]() |
a6e92c96d5 | ||
![]() |
640366ad4d | ||
![]() |
af2479da8d | ||
![]() |
dff5f3bc13 | ||
![]() |
12010d47a6 | ||
![]() |
b50fad47ac | ||
![]() |
ed0429ad4e | ||
![]() |
37ddbb3cd2 | ||
![]() |
fcb32efd05 | ||
![]() |
9e64570e3a | ||
![]() |
31c0b23890 | ||
![]() |
33a3796074 | ||
![]() |
1b1643b5d1 | ||
![]() |
244ed42231 | ||
![]() |
af2d0b1429 | ||
![]() |
86f74a00d0 | ||
![]() |
ab6b6f36a0 | ||
![]() |
5a3289ee3c | ||
![]() |
e4bb80b96c | ||
![]() |
d6e726a9cf | ||
![]() |
03855fc411 | ||
![]() |
518dd71de6 | ||
![]() |
41b6247178 | ||
![]() |
2ea656bc27 | ||
![]() |
253bb42ac0 | ||
![]() |
0b5ae1775c | ||
![]() |
9ba6ada266 | ||
![]() |
51e8c042af | ||
![]() |
c9a64be699 | ||
![]() |
15ac8ac4f8 | ||
![]() |
8ca90a070a | ||
![]() |
811887e591 | ||
![]() |
81fa8d5947 | ||
![]() |
5ee5e4998a | ||
![]() |
046cb9bd70 | ||
![]() |
831704f3b2 | ||
![]() |
4d7eae34c2 | ||
![]() |
8d6d937b1b | ||
![]() |
f5bb5985ee | ||
![]() |
6494cdbb4c | ||
![]() |
9de623120b | ||
![]() |
f3b08102c4 | ||
![]() |
29ac4da240 | ||
![]() |
832340e209 | ||
![]() |
dce34de875 | ||
![]() |
40ee047ef0 | ||
![]() |
17dc022e15 | ||
![]() |
620abb96f2 | ||
![]() |
edab0faa94 | ||
![]() |
9e29b5c7b6 | ||
![]() |
2afec91e87 | ||
![]() |
fb022cb5e9 | ||
![]() |
e76e9d42c7 | ||
![]() |
9670a5e74e | ||
![]() |
132ca42ec5 | ||
![]() |
af0c1644a6 | ||
![]() |
d60472328f | ||
![]() |
5e61db630c | ||
![]() |
0cb0373f85 | ||
![]() |
6bbb7dcfac | ||
![]() |
f2ed4e3840 | ||
![]() |
cdbff32f25 | ||
![]() |
f71cca4eba | ||
![]() |
b1180b3341 | ||
![]() |
9a63e80386 | ||
![]() |
b29993abe5 | ||
![]() |
1d581ee027 | ||
![]() |
bf856d278d | ||
![]() |
9b8163c3a4 | ||
![]() |
b9c5869806 | ||
![]() |
4acb3774e6 | ||
![]() |
2fc24be331 | ||
![]() |
bff0b93f5f | ||
![]() |
ca9b88fae8 | ||
![]() |
6e81451f64 | ||
![]() |
d03ffc228c | ||
![]() |
2738a72b43 | ||
![]() |
5d24495704 | ||
![]() |
34fe413dad | ||
![]() |
feafceca57 | ||
![]() |
8acc54225d | ||
![]() |
6e0baf9f2c | ||
![]() |
95bae8377c | ||
![]() |
f07db033c6 | ||
![]() |
4f8c204096 | ||
![]() |
02881889d5 | ||
![]() |
d57d167e9c | ||
![]() |
740994ed48 | ||
![]() |
dbf9587775 | ||
![]() |
7498fe24dc | ||
![]() |
0941ff41b6 | ||
![]() |
12ee4a9446 | ||
![]() |
e07eb2c82c | ||
![]() |
684122c9a9 | ||
![]() |
ba0fc3b886 | ||
![]() |
3fde6aae45 | ||
![]() |
b8564d5c24 | ||
![]() |
d2da13da20 | ||
![]() |
abcb1414a3 | ||
![]() |
ea2e36c676 | ||
![]() |
c1a66a8be9 | ||
![]() |
c8fc25ea5c | ||
![]() |
2f0160438a | ||
![]() |
3c05dd248d | ||
![]() |
48d0f2b159 | ||
![]() |
c7d318236f | ||
![]() |
9b4e6b4e11 | ||
![]() |
3c5f49dc5b | ||
![]() |
d643d338d2 | ||
![]() |
ac6654c532 | ||
![]() |
6a9ed21079 | ||
![]() |
b3bec8b2b4 | ||
![]() |
42ce2a49fa | ||
![]() |
5351392237 | ||
![]() |
672a9fe87f | ||
![]() |
14619cb16e | ||
![]() |
05112e5700 | ||
![]() |
e48ef80e9c | ||
![]() |
afe634d4f2 | ||
![]() |
166a371050 | ||
![]() |
854459068f | ||
![]() |
0a516d526c | ||
![]() |
a02ddc773e | ||
![]() |
198889c7a4 | ||
![]() |
6b1ab1a5ed | ||
![]() |
e07fe032f6 | ||
![]() |
43e3fbaaf0 | ||
![]() |
dad8b1d2ea | ||
![]() |
34808a2caa | ||
![]() |
fbdd97b1be | ||
![]() |
88b76244cf | ||
![]() |
5bf5b93836 | ||
![]() |
07f565aa49 | ||
![]() |
e6db2ce3b9 | ||
![]() |
1f9c25cc91 | ||
![]() |
80ac50a144 | ||
![]() |
34d913ed33 | ||
![]() |
f4b91c17a9 | ||
![]() |
5f2ee86d72 | ||
![]() |
9972b5f531 | ||
![]() |
a6ea307205 | ||
![]() |
24dc07897b | ||
![]() |
def56f745c | ||
![]() |
da8874ded6 | ||
![]() |
2c0844807e | ||
![]() |
2b08af712f | ||
![]() |
dd1a233859 | ||
![]() |
f80e79f71a | ||
![]() |
3662f6aa77 | ||
![]() |
28e6887aa4 | ||
![]() |
fbace75185 | ||
![]() |
8bc76a2a88 | ||
![]() |
6c02c74539 | ||
![]() |
af2ba798a0 | ||
![]() |
647272e9c5 | ||
![]() |
1ca607792d | ||
![]() |
ad8a00d56b | ||
![]() |
40f4428e36 | ||
![]() |
1d008dbd72 | ||
![]() |
c3df16147d | ||
![]() |
af3b4074e2 | ||
![]() |
e72cc7dd73 | ||
![]() |
ecdebd71c1 | ||
![]() |
c81e4e1208 | ||
![]() |
9288bef4f5 | ||
![]() |
5de669eb7b | ||
![]() |
9aa040604a | ||
![]() |
20868ab3a2 | ||
![]() |
c93eacd1d3 | ||
![]() |
a5c7f7bb50 | ||
![]() |
8cd45f57b7 | ||
![]() |
1fd8923746 | ||
![]() |
2a62000b28 | ||
![]() |
e7aa09276e | ||
![]() |
da90319d2d | ||
![]() |
f093291442 | ||
![]() |
b56c5cbde8 | ||
![]() |
3ace4c6cf5 | ||
![]() |
83623c896f | ||
![]() |
92b30ae7ec | ||
![]() |
bd449f3226 | ||
![]() |
6b62beab6e | ||
![]() |
1896883382 | ||
![]() |
94ace985e7 | ||
![]() |
3829bcdd8f | ||
![]() |
4f12f57a0b | ||
![]() |
04fac249f9 | ||
![]() |
f812f0a1ac | ||
![]() |
195e5b53f2 | ||
![]() |
13362c9142 | ||
![]() |
9a65ffe972 | ||
![]() |
19d4f7334c | ||
![]() |
cd1aa6ee4a | ||
![]() |
a542ded97c | ||
![]() |
4ef52c859b | ||
![]() |
7ae65dd656 | ||
![]() |
bb856f89b9 | ||
![]() |
994c5b733a | ||
![]() |
d0e9f133b1 | ||
![]() |
5b123e7944 | ||
![]() |
880621c1fb | ||
![]() |
35af1c6695 | ||
![]() |
cb1ae44a3b | ||
![]() |
41d00135af | ||
![]() |
6f11422604 | ||
![]() |
e657cbf43b | ||
![]() |
6481ecccd7 | ||
![]() |
f60601fa67 | ||
![]() |
194409abd6 | ||
![]() |
5883f49f37 | ||
![]() |
8a4787278d | ||
![]() |
9329df2b48 | ||
![]() |
c34098546d | ||
![]() |
e70777061c | ||
![]() |
d5e6f394b7 | ||
![]() |
35fdcfa28d | ||
![]() |
812bb606c7 | ||
![]() |
db0b659a53 | ||
![]() |
9521f63b3a | ||
![]() |
32f38cc6ed | ||
![]() |
6cd2de35fc | ||
![]() |
b916b76713 | ||
![]() |
5513ff5c1f | ||
![]() |
60908d4b9b | ||
![]() |
514afebcc7 | ||
![]() |
267928d6de | ||
![]() |
7293dd1fb7 | ||
![]() |
3fb3659cc9 | ||
![]() |
254ec73940 | ||
![]() |
72fc00695c | ||
![]() |
14e8bc58f3 | ||
![]() |
e700195f0a | ||
![]() |
a02bceabd2 | ||
![]() |
b4ff1fa36c | ||
![]() |
0acb15de0f | ||
![]() |
aace1dc913 | ||
![]() |
6a273363c4 | ||
![]() |
79ca00604a | ||
![]() |
d2e7d4a5ad | ||
![]() |
d2a4ccbc16 | ||
![]() |
2086e4c7d1 | ||
![]() |
ac2b445db6 | ||
![]() |
dff2f186ce | ||
![]() |
a472ef8a93 | ||
![]() |
d03f5e4977 | ||
![]() |
eb892791f0 | ||
![]() |
442d65a497 | ||
![]() |
884386c924 | ||
![]() |
7bfe9065cf | ||
![]() |
6b3eaa7f3e | ||
![]() |
b77eb4b905 | ||
![]() |
f77975a9f7 | ||
![]() |
ce01f6d7cd | ||
![]() |
07232f04c0 | ||
![]() |
9f3b4dc5ea | ||
![]() |
5d64292ed8 | ||
![]() |
d44486ce94 | ||
![]() |
b2e6dc5fda | ||
![]() |
6d19ab8894 | ||
![]() |
6820400b11 | ||
![]() |
e28f5187bc | ||
![]() |
a8cfefe6c8 | ||
![]() |
fefab7064a | ||
![]() |
9e119230d4 | ||
![]() |
681a0f5638 | ||
![]() |
af4bc3e194 | ||
![]() |
c0b71126bd | ||
![]() |
e355ac54b8 | ||
![]() |
c5e9d3588a | ||
![]() |
f7fd3881e3 | ||
![]() |
cc0530ba46 | ||
![]() |
13c88e1013 | ||
![]() |
013db199cb | ||
![]() |
6e8fa34b1e | ||
![]() |
a3717c7acd | ||
![]() |
1126055015 | ||
![]() |
8499a90caa | ||
![]() |
49f2924532 | ||
![]() |
454dc7169d | ||
![]() |
6f2354c0e9 | ||
![]() |
378c2992cd | ||
![]() |
029b4c25ac | ||
![]() |
6f5f600559 | ||
![]() |
f93adaa854 | ||
![]() |
ddd2fcecea | ||
![]() |
1a81f79df7 | ||
![]() |
8f45431ecb | ||
![]() |
509e218676 | ||
![]() |
cd7a53abbb | ||
![]() |
6b67f587e5 | ||
![]() |
27c5c5d464 | ||
![]() |
1919c23c09 | ||
![]() |
6f14becb8c | ||
![]() |
0eded87dd3 | ||
![]() |
139153d9a3 | ||
![]() |
eee25a1c35 | ||
![]() |
5fb26d666a | ||
![]() |
e1482dee2b | ||
![]() |
c041f45138 | ||
![]() |
286b5cf9a4 | ||
![]() |
d025f02720 | ||
![]() |
a7f857d32c | ||
![]() |
a35f446585 | ||
![]() |
15b8b5d92f | ||
![]() |
0a7585852b | ||
![]() |
1b12c958c5 | ||
![]() |
29726e2bfd | ||
![]() |
a01400e88d | ||
![]() |
3f78e5f7a2 | ||
![]() |
b8f9ac85ec | ||
![]() |
8199bf0869 | ||
![]() |
b612476c56 | ||
![]() |
534b61e9e8 | ||
![]() |
bb37cf3c32 | ||
![]() |
9214ab2038 | ||
![]() |
5dea019309 | ||
![]() |
b6dc5201a8 | ||
![]() |
9d72d8d3f7 | ||
![]() |
3cf14971f2 | ||
![]() |
190a1fa10c | ||
![]() |
35baeaff79 | ||
![]() |
a0874a0d6d | ||
![]() |
e755ee8e04 | ||
![]() |
338fe553ba | ||
![]() |
0592218fa3 | ||
![]() |
a5c1298e32 | ||
![]() |
4dcd41975d | ||
![]() |
f9e6395797 | ||
![]() |
d715bf24bf | ||
![]() |
263ce20473 | ||
![]() |
60b177f668 | ||
![]() |
85d474318b | ||
![]() |
2ce9fff285 | ||
![]() |
b3dc2ae89b | ||
![]() |
825657b217 | ||
![]() |
44b152eb70 | ||
![]() |
16b3d32ca5 | ||
![]() |
cf819e0a3f | ||
![]() |
97adfd5b54 | ||
![]() |
3d1449d4f1 | ||
![]() |
e701ccbd73 | ||
![]() |
420c364bf7 | ||
![]() |
52775d4a3f | ||
![]() |
fb2672e910 | ||
![]() |
64b3695e51 | ||
![]() |
ba1bbd3b52 | ||
![]() |
3bbaeab278 | ||
![]() |
2ee9d501ff | ||
![]() |
58c4d1de1e | ||
![]() |
c1720c3711 | ||
![]() |
c112ffc3fc | ||
![]() |
988bb9c1cd | ||
![]() |
35de521549 | ||
![]() |
5b312889b8 | ||
![]() |
f64fcecde1 | ||
![]() |
7a6505626f | ||
![]() |
1129986f18 | ||
![]() |
8a554b37c0 | ||
![]() |
56178f976a | ||
![]() |
8dec687798 | ||
![]() |
0a2e716525 | ||
![]() |
f9f82e9705 | ||
![]() |
4a30417f76 | ||
![]() |
ba15981700 | ||
![]() |
f9d99fe8ca | ||
![]() |
b84d38e7fb | ||
![]() |
cc35bf2096 | ||
![]() |
b4be71d967 | ||
![]() |
20e8e524a5 | ||
![]() |
5bd871528f | ||
![]() |
bba0c09b42 | ||
![]() |
f703736685 | ||
![]() |
3243243be8 | ||
![]() |
714c0a5be2 | ||
![]() |
1e770e3a71 | ||
![]() |
d90b32a7c9 | ||
![]() |
2c256023a9 | ||
![]() |
52af8a5e2a | ||
![]() |
e1fbed0e25 | ||
![]() |
b1d96cd1ee | ||
![]() |
5226a59ede | ||
![]() |
ea183a6889 | ||
![]() |
ef8c7b0a4c | ||
![]() |
e221f89e68 | ||
![]() |
03ad6c52c0 | ||
![]() |
f381e29f3a | ||
![]() |
ce51534c3a | ||
![]() |
55571b5d1b | ||
![]() |
318157d242 | ||
![]() |
0f7ef275ab | ||
![]() |
880cc230ac | ||
![]() |
8846880015 | ||
![]() |
93831f64a3 | ||
![]() |
3e3e87d3c5 | ||
![]() |
c410c380f6 | ||
![]() |
2d6f2f7895 | ||
![]() |
ad773c567d | ||
![]() |
2dbb29fc85 | ||
![]() |
12be175d58 | ||
![]() |
afc7dcd83c | ||
![]() |
3cbe4df8c7 | ||
![]() |
033dd79c58 | ||
![]() |
6fa34bdbfe | ||
![]() |
188fff1488 | ||
![]() |
6d23a3bd2c | ||
![]() |
a5dee81e45 | ||
![]() |
4030dbc4b4 | ||
![]() |
3efad4e14b | ||
![]() |
ceb2cd2b67 | ||
![]() |
c5eaee80cb | ||
![]() |
ab95690043 | ||
![]() |
37baa6fd25 | ||
![]() |
69f05d4c26 | ||
![]() |
91fafccb0a | ||
![]() |
ef51065c98 | ||
![]() |
03f11ce516 | ||
![]() |
2583cc4aa4 | ||
![]() |
422fd91255 | ||
![]() |
d83743ea0b | ||
![]() |
a81819914d | ||
![]() |
93fedd0fff | ||
![]() |
a73f5bc32e | ||
![]() |
e3a3734bb6 | ||
![]() |
1d00c22244 | ||
![]() |
e180980b90 | ||
![]() |
e6b2e4e95e | ||
![]() |
1af985fde9 | ||
![]() |
5e9fa18a4d | ||
![]() |
e7a5b3939d | ||
![]() |
f096f7d7fa | ||
![]() |
f7735afcd6 | ||
![]() |
56307e6cad | ||
![]() |
1bfb62747c | ||
![]() |
affff20b49 | ||
![]() |
6f64c84c7d | ||
![]() |
f56fcdd79b | ||
![]() |
893b398d73 | ||
![]() |
db98f114f9 | ||
![]() |
b1e7c34b82 | ||
![]() |
54f9b25b52 | ||
![]() |
9366c5c233 | ||
![]() |
e254cad39e | ||
![]() |
ac1347f324 | ||
![]() |
f9f9a34ba3 | ||
![]() |
2b4d286de6 | ||
![]() |
e7fe3ff968 | ||
![]() |
5caf68988e | ||
![]() |
bb4f5c2e94 | ||
![]() |
eaa363d8c0 | ||
![]() |
d181f80c8c | ||
![]() |
33d8b6db62 | ||
![]() |
59e2c38635 | ||
![]() |
dd15db721a | ||
![]() |
ef6d8f1138 | ||
![]() |
612c1098ea | ||
![]() |
ed7b634dbf | ||
![]() |
4c1e5ec74c | ||
![]() |
b0a68ea0de | ||
![]() |
f32dc96757 | ||
![]() |
79ac8b3c95 | ||
![]() |
e5bd5f39fb | ||
![]() |
dfee59742f | ||
![]() |
61f922179b | ||
![]() |
9e81c31e5a | ||
![]() |
bdeef63fe4 | ||
![]() |
ed693e146d | ||
![]() |
14f12b0a25 | ||
![]() |
e05f6a4c5b | ||
![]() |
bd809ba90b | ||
![]() |
15b9e82f93 | ||
![]() |
aa839e2619 | ||
![]() |
a6d3f973fa | ||
![]() |
dab6d9408e | ||
![]() |
6b05b84895 | ||
![]() |
861fe2e5a9 | ||
![]() |
63a5e474a6 | ||
![]() |
b86c3e64ec | ||
![]() |
6cb6f1f007 | ||
![]() |
a2aac7066c | ||
![]() |
c1dbe27f25 | ||
![]() |
9e9ed8b532 | ||
![]() |
de3d40b644 | ||
![]() |
20a2a96222 | ||
![]() |
b1f4e12d34 | ||
![]() |
bc0a5a9440 | ||
![]() |
e16c007d43 | ||
![]() |
924eb6dbc4 | ||
![]() |
b5e0572155 | ||
![]() |
0f3a2531e7 | ||
![]() |
dab7047113 | ||
![]() |
6f20f0e2ec | ||
![]() |
0f7b674cbb | ||
![]() |
e2bf537c4a | ||
![]() |
c5467c43bf | ||
![]() |
806b8b0901 | ||
![]() |
a740fe128c | ||
![]() |
ba8f787d0d | ||
![]() |
65a1d1b0f7 | ||
![]() |
1009650b5c | ||
![]() |
b14bec3bb0 | ||
![]() |
a4c5997050 | ||
![]() |
aa97bd5213 | ||
![]() |
a4d4adb1f6 | ||
![]() |
7e1d980d08 | ||
![]() |
f3f1520f81 | ||
![]() |
7e44b67906 | ||
![]() |
44333fef0a | ||
![]() |
414cb5026c | ||
![]() |
f15ee90429 | ||
![]() |
9bf61bfc5c | ||
![]() |
7edeceec03 | ||
![]() |
692c95b11e |
|
@ -54,6 +54,7 @@ IncludeCategories:
|
|||
IndentCaseLabels: false
|
||||
IndentWidth: 4
|
||||
IndentWrappedFunctionNames: false
|
||||
InsertNewlineAtEOF: true
|
||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||
MacroBlockBegin: ''
|
||||
MacroBlockEnd: ''
|
||||
|
@ -81,7 +82,7 @@ SpacesInContainerLiterals: true
|
|||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInParentheses: false
|
||||
SpacesInSquareBrackets: false
|
||||
Standard: Cpp11
|
||||
Standard: c++17
|
||||
TabWidth: 4
|
||||
UseTab: Never
|
||||
...
|
||||
|
|
9
.github/CONTRIBUTING.md
vendored
|
@ -15,6 +15,7 @@ These are just guidelines, not rules. Use your best judgment, and feel free to p
|
|||
* [Bug reports](#bug-reports)
|
||||
* [Discuss with the team](#discuss-with-the-team)
|
||||
* [Your first code contribution](#your-first-code-contribution)
|
||||
* [Using AI](#using-ai)
|
||||
* [Pull requests](#pull-requests)
|
||||
* [Translations](#translations)
|
||||
|
||||
|
@ -38,7 +39,7 @@ We will accept contributions of good code that we can use from anyone.
|
|||
- “contributions”: This means just about anything you wish to contribute to the project, as long as it is good code we can use. The easier you make it for us to accept your contribution, the happier we are, but if it’s good enough, we will do a reasonable amount of work to use it.
|
||||
- “of good code”: This means that we will accept contributions that work well and efficiently, that fit in with the goals of the project, that match the project’s coding style, and that do not impose an undue maintenance workload on us going forward. This does not mean just program code, either, but documentation and artistic works as appropriate to the project.
|
||||
- “that we can use”: This means that your contribution must be given freely and irrevocably, that you must have the right to contribute it for our unrestricted use, and that your contribution is made under a license that is compatible with the license the project has chosen and that permits us to include, distribute, and modify your work without restriction.
|
||||
- “from anyone”: This means exactly that. We don’t care about anything but your code. We don’t care about your race, religion, national origin, biological gender, perceived gender, sexual orientation, lifestyle, political viewpoint, or anything extraneous like that. We will neither reject your contribution nor grant it preferential treatment on any basis except the code itself. We do, however, reserve the right to tell you to go away if you behave too obnoxiously toward us.
|
||||
- “from anyone”: This means exactly that. We don’t care about anything but your code. We don’t care about your race, religion, national origin, biological gender, perceived gender, sexual orientation, lifestyle, political viewpoint, or anything extraneous like that. We will neither reject your contribution nor grant it preferential treatment on any basis except the code itself. We do, however, reserve the right to limit your access to our community if you violate our [Code of Conduct](../CODE-OF-CONDUCT.md).
|
||||
|
||||
#### If Your Contribution Is Rejected
|
||||
|
||||
|
@ -74,6 +75,10 @@ Unsure where to begin contributing to KeePassXC? You can start by looking throug
|
|||
|
||||
Both issue lists are sorted by total number of comments. While not perfect, looking at the number of comments on an issue can give a general idea of how much an impact a given change will have.
|
||||
|
||||
### Using AI
|
||||
|
||||
Generative AI is fast becoming a first-party feature in most development environments, including GitHub itself. If you use Generative AI to write the vast majority of your submission (e.g., agent-based or vibe coding) then you **must document your use of AI** in your pull request. Please include the service you used and/or model that generated the code. All code submissions go through a rigorous review process regardless of the development workflow used.
|
||||
|
||||
### Pull requests
|
||||
|
||||
Along with our desire to hear your feedback and suggestions, we're also interested in accepting direct assistance in the form of code.
|
||||
|
@ -82,7 +87,7 @@ All pull requests must comply with the above requirements and with the [stylegui
|
|||
|
||||
### Translations
|
||||
|
||||
Translations are managed on [Transifex](https://www.transifex.com/keepassxc/keepassxc/) which offers a web interface.
|
||||
Translations are managed on [Transifex](https://explore.transifex.com/keepassxc/keepassxc/) which offers a web interface.
|
||||
Please join an existing language team or request a new one if there is none.
|
||||
|
||||
If you open a Pull Request with new strings that require translations, you will need to run the following:
|
||||
|
|
39
.github/ISSUE_TEMPLATE/bug-report.md
vendored
|
@ -1,39 +0,0 @@
|
|||
---
|
||||
name: Bug Report
|
||||
about: provide information about a problem
|
||||
title:
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
## Overview
|
||||
[TIP]: # ( DO NOT include screenshots of your actual database! )
|
||||
[NOTE]: # ( Give a BRIEF summary about your problem )
|
||||
|
||||
|
||||
## Steps to Reproduce
|
||||
[NOTE]: # ( Provide a simple set of steps to reproduce this bug. )
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
## Expected Behavior
|
||||
[NOTE]: # ( Tell us what you expected to happen )
|
||||
|
||||
|
||||
## Actual Behavior
|
||||
[NOTE]: # ( Tell us what actually happens )
|
||||
|
||||
|
||||
## Context
|
||||
[NOTE]: # ( Give us any additional information you may have. )
|
||||
|
||||
|
||||
[NOTE]: # ( Paste debug info from Help → About here )
|
||||
KeePassXC - VERSION
|
||||
Revision: REVISION
|
||||
|
||||
[NOTE]: # ( Pick choices based on your environment )
|
||||
Operating System: Windows/Linux/macOS
|
||||
Desktop Env: Gnome/KDE/XFCE/Mate/Cinnamon
|
||||
Windowing System: X11/Wayland
|
83
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
|
@ -0,0 +1,83 @@
|
|||
name: Bug Report
|
||||
description: Provide information about a problem you are experiencing.
|
||||
type: Bug
|
||||
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Have you searched for an existing issue?
|
||||
description: |
|
||||
Use the issue search box to see if one already exists for the bug you encountered.
|
||||
Also take a moment to review our pinned issues.
|
||||
options:
|
||||
- label: Yes, I tried searching and reviewed the pinned issues
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: summary
|
||||
attributes:
|
||||
label: Brief Summary
|
||||
description: |
|
||||
Provide an overview of the problem, include any information that may help us triage this issue.
|
||||
Provide screenshots if possible, but do NOT show sensitive data (use View -> Allow Screen Capture).
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: steps
|
||||
attributes:
|
||||
label: Steps to Reproduce
|
||||
description: Provide a simple set of steps to reproduce this bug.
|
||||
placeholder: |
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected_vs_actual
|
||||
attributes:
|
||||
label: Expected Versus Actual Behavior
|
||||
description: Tell us what you expected to happen and what actually happened.
|
||||
|
||||
- type: textarea
|
||||
id: debug_info
|
||||
attributes:
|
||||
label: KeePassXC Debug Information
|
||||
placeholder: "Paste the output of: Help -> About -> Debug Info"
|
||||
render: Text
|
||||
|
||||
- type: dropdown
|
||||
id: os
|
||||
attributes:
|
||||
label: Operating System
|
||||
description: Select your operating system.
|
||||
options:
|
||||
- Windows
|
||||
- Linux
|
||||
- macOS
|
||||
- Other (BSD, Haiku, etc)
|
||||
|
||||
- type: dropdown
|
||||
id: desktop_env
|
||||
attributes:
|
||||
label: Linux Desktop Environment
|
||||
description: If on Linux, please select your desktop environment.
|
||||
options:
|
||||
- Gnome
|
||||
- KDE
|
||||
- XFCE
|
||||
- Mate / Cinnamon
|
||||
- Sway
|
||||
- i3
|
||||
- Other
|
||||
|
||||
- type: dropdown
|
||||
id: window_system
|
||||
attributes:
|
||||
label: Linux Windowing System
|
||||
description: If on Linux, please select your windowing system.
|
||||
options:
|
||||
- X11
|
||||
- Wayland
|
19
.github/ISSUE_TEMPLATE/feature-request.md
vendored
|
@ -1,19 +0,0 @@
|
|||
---
|
||||
name: Feature Request
|
||||
about: tell us about a new feature you want
|
||||
title:
|
||||
labels: new feature
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
## Summary
|
||||
[TIP]: # ( DO NOT include screenshots of your actual database! )
|
||||
[NOTE]: # ( Provide a brief overview of what the new feature is all about )
|
||||
|
||||
|
||||
## Examples
|
||||
[NOTE]: # ( Show us a picture or mock-up of your proposal )
|
||||
|
||||
|
||||
## Context
|
||||
[NOTE]: # ( Why does this feature matter to you? What unique circumstances do you have? )
|
34
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
|
@ -0,0 +1,34 @@
|
|||
name: Feature Request
|
||||
description: Tell us about a new feature you want.
|
||||
type: Feature
|
||||
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Have you searched for an existing feature request?
|
||||
description: Use the issue search box to see if one already exists for the feature you want.
|
||||
options:
|
||||
- label: Yes, I tried searching
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: summary
|
||||
attributes:
|
||||
label: Brief Summary
|
||||
description: |
|
||||
Provide an overview of the feature you are interested in adding.
|
||||
Provide screenshots if possible, but do NOT show sensitive data (use View -> Allow Screen Capture).
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: example
|
||||
attributes:
|
||||
label: Example
|
||||
description: Provide an example of how this feature would be used.
|
||||
|
||||
- type: textarea
|
||||
id: context
|
||||
attributes:
|
||||
label: Context
|
||||
description: Why does this feature matter to you? What unique circumstances do you have?
|
85
.github/ISSUE_TEMPLATE/prerelease_bug_report.yml
vendored
Normal file
|
@ -0,0 +1,85 @@
|
|||
name: Pre-Release Bug Report
|
||||
description: Report an issue with pre-release code (e.g. snapshot builds).
|
||||
type: Bug
|
||||
labels: PRE-RELEASE BUG
|
||||
assignees: droidmonkey
|
||||
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Have you searched for an existing issue?
|
||||
description: |
|
||||
Use the issue search box to see if one already exists for the bug you encountered.
|
||||
Also take a moment to review our pinned issues.
|
||||
options:
|
||||
- label: Yes, I tried searching and reviewed the pinned issues
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: summary
|
||||
attributes:
|
||||
label: Brief Summary
|
||||
description: |
|
||||
Provide an overview of the problem, include any information that may help us triage this issue.
|
||||
Provide screenshots if possible, but do NOT show sensitive data (use View -> Allow Screen Capture).
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: steps
|
||||
attributes:
|
||||
label: Steps to Reproduce
|
||||
description: Provide a simple set of steps to reproduce this bug.
|
||||
placeholder: |
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected_vs_actual
|
||||
attributes:
|
||||
label: Expected Versus Actual Behavior
|
||||
description: Tell us what you expected to happen and what actually happened.
|
||||
|
||||
- type: textarea
|
||||
id: debug_info
|
||||
attributes:
|
||||
label: KeePassXC Debug Information
|
||||
placeholder: "Paste the output of: Help -> About -> Debug Info"
|
||||
render: Text
|
||||
|
||||
- type: dropdown
|
||||
id: os
|
||||
attributes:
|
||||
label: Operating System
|
||||
description: Select your operating system.
|
||||
options:
|
||||
- Windows
|
||||
- Linux
|
||||
- macOS
|
||||
- Other (BSD, Haiku, etc)
|
||||
|
||||
- type: dropdown
|
||||
id: desktop_env
|
||||
attributes:
|
||||
label: Linux Desktop Environment
|
||||
description: If on Linux, please select your desktop environment.
|
||||
options:
|
||||
- Gnome
|
||||
- KDE
|
||||
- XFCE
|
||||
- Mate / Cinnamon
|
||||
- Sway
|
||||
- i3
|
||||
- Other
|
||||
|
||||
- type: dropdown
|
||||
id: window_system
|
||||
attributes:
|
||||
label: Linux Windowing System
|
||||
description: If on Linux, please select your windowing system.
|
||||
options:
|
||||
- X11
|
||||
- Wayland
|
|
@ -1,39 +0,0 @@
|
|||
---
|
||||
name: Release Preview Bug report
|
||||
about: report a bug with a release preview (e.g., 2.6.0-beta1)
|
||||
title:
|
||||
labels: PRE-RELEASE BUG
|
||||
assignees: droidmonkey
|
||||
|
||||
---
|
||||
## Overview
|
||||
[TIP]: # ( DO NOT include screenshots of your actual database! )
|
||||
[NOTE]: # ( Give a BRIEF summary about your problem )
|
||||
|
||||
|
||||
## Steps to Reproduce
|
||||
[NOTE]: # ( Provide a simple set of steps to reproduce this bug. )
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
## Expected Behavior
|
||||
[NOTE]: # ( Tell us what you expected to happen )
|
||||
|
||||
|
||||
## Actual Behavior
|
||||
[NOTE]: # ( Tell us what actually happens )
|
||||
|
||||
|
||||
## Context
|
||||
[NOTE]: # ( Give us any additional information you may have. )
|
||||
|
||||
|
||||
[NOTE]: # ( Paste debug info from Help → About here )
|
||||
KeePassXC - VERSION
|
||||
Revision: REVISION
|
||||
|
||||
[NOTE]: # ( Pick choices based on your environment )
|
||||
Operating System: Windows/Linux/macOS
|
||||
Desktop Env: Gnome/KDE/XFCE/Mate/Cinnamon
|
||||
Windowing System: X11/Wayland
|
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -1,15 +1,16 @@
|
|||
[NOTE]: # ( Describe your changes in detail, why is this change required? )
|
||||
[NOTE]: # ( Explain large or complex code modifications. )
|
||||
[NOTE]: # ( If it fixes an open issue, please add "Fixes #XXX" )
|
||||
[NOTE]: # ( Describe your changes in detail. Explain large or complex code modifications. )
|
||||
[NOTE]: # ( If it fixes an open issue, please add "Fixes #XXX". )
|
||||
[NOTE]: # ( If you used Generative AI to write the majority of your code, you must state this. )
|
||||
|
||||
|
||||
## Screenshots
|
||||
[TIP]: # ( Do not include screenshots of your actual database! )
|
||||
[NOTE]: # ( Do not include screenshots of your actual database! )
|
||||
[TIP]: # ( Use View -> Allow Screen Capture )
|
||||
|
||||
|
||||
## Testing strategy
|
||||
[NOTE]: # ( Please describe in detail how you tested your changes. )
|
||||
[TIP]: # ( We expect new code to be covered by unit tests and documented with doc blocks! )
|
||||
[TIP]: # ( We expect new code to be covered by unit tests and include helpful comments. )
|
||||
|
||||
|
||||
## Type of change
|
||||
|
|
38
.github/copilot-instructions.md
vendored
Normal file
|
@ -0,0 +1,38 @@
|
|||
This is a C++ based repository that uses Qt5 as a primary support and GUI library. This repository is for a password manager application that stores passwords
|
||||
and other highly sensitive information. The data format that passwords are stored is called KDBX which is a mixed binary and XML format that is fully encrypted
|
||||
at rest. This format is unpacked into a series of data structures: Database, Groups, and Entries. Please follow these guidelines when contributing:
|
||||
|
||||
## Code Standards
|
||||
|
||||
### Required Before Each Commit
|
||||
- Run `cmake --build . --target format` before committing any changes to ensure proper code formatting
|
||||
- This will run clang-format to ensure all code conforms to the style guide
|
||||
- From the checkout directory, also run `./release-tool i18n lupdate` to update translation files
|
||||
|
||||
### Development Flow
|
||||
- Setup Build Folder: `mkdir build; cd build`
|
||||
- Configure: `cmake -G Ninja -DWITH_XC_ALL=ON -DWITH_GUI_TESTS=ON ..`
|
||||
- Build: `cmake --build . -- -j $(nproc)`
|
||||
- Test: `ctest`
|
||||
|
||||
## Repository Structure
|
||||
- `docs/topics`: Documentation written in asciidoctor syntax
|
||||
- `src/`: Main source code files are under this subdirectory
|
||||
- `src/autotype`: Code that emulates a virtual keyboard to type into interfaces
|
||||
- `src/browser`: Interface with the KeePassXC Browser Extension using a JSON-based protocol
|
||||
- `src/cli`: Command Line Interface code
|
||||
- `src/core`: Contains files that define the data model and other shared code structures
|
||||
- `src/format`: Code for import/export and reading/writing of KDBX databases
|
||||
- `src/fdosecrets`: freedesktop.org Secret Service interface code
|
||||
- `src/quickunlock`: Quick unlock interfaces for various platforms
|
||||
- `src/sshagent`: SSH Agent interface code to load private keys from the database into ssh-agent
|
||||
- `tests/`: Test source code files
|
||||
- `tests/gui`: GUI test source code files
|
||||
|
||||
## Key Guidelines
|
||||
1. Follow C++20 and Qt5 best practices and idiomatic patterns
|
||||
2. Maintain existing code structure and organization
|
||||
3. Prefer not to edit cryptographic handling code or other sensitive parts of the code base
|
||||
4. Write unit tests for new functionality using QTest scaffolding
|
||||
5. Suggest changes to the `docs/topics` folder when appropriate
|
||||
6. Unless the change is simple, don't actually make edits to .ui files, just suggest the changes needed
|
29
.github/workflows/copilot-setup-steps.yml
vendored
Normal file
|
@ -0,0 +1,29 @@
|
|||
name: "Copilot Setup Steps"
|
||||
|
||||
# Setup the environment for Copilot agents to run in
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- .github/workflows/copilot-setup-steps.yml
|
||||
pull_request:
|
||||
paths:
|
||||
- .github/workflows/copilot-setup-steps.yml
|
||||
|
||||
jobs:
|
||||
copilot-setup-steps:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# Needed to clone the repository
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
# Install dependencies
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install --no-install-recommends build-essential cmake g++ ninja-build qtbase5-dev qtbase5-private-dev qttools5-dev qttools5-dev-tools libqt5svg5-dev libargon2-dev libkeyutils-dev libminizip-dev libbotan-2-dev libqrencode-dev zlib1g-dev asciidoctor libreadline-dev libpcsclite-dev libusb-1.0-0-dev libxi-dev libxtst-dev libqt5x11extras5-dev
|
1
.gitignore
vendored
|
@ -24,6 +24,7 @@ desktop.ini
|
|||
# MSVC Files
|
||||
CMakeSettings.json
|
||||
CMakePresets.json
|
||||
CMakeUserPresets.json
|
||||
.vs/
|
||||
out/
|
||||
|
||||
|
|
24
.tx/config
|
@ -1,17 +1,19 @@
|
|||
[main]
|
||||
host = https://app.transifex.com
|
||||
host = https://www.transifex.com
|
||||
|
||||
[o:keepassxc:p:keepassxc:r:share-translations-keepassxc-en-ts--develop]
|
||||
file_filter = share/translations/keepassxc_<lang>.ts
|
||||
source_file = share/translations/keepassxc_en.ts
|
||||
type = QT
|
||||
minimum_perc = 0
|
||||
resource_name = keepassxc_en.ts (develop)
|
||||
file_filter = share/translations/keepassxc_<lang>.ts
|
||||
source_file = share/translations/keepassxc_en.ts
|
||||
source_lang = en
|
||||
type = QT
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
|
||||
[o:keepassxc:p:keepassxc:r:share-translations-keepassxc-en-ts--master]
|
||||
file_filter = share/translations/keepassxc_<lang>.ts
|
||||
source_file = share/translations/keepassxc_en.ts
|
||||
type = QT
|
||||
minimum_perc = 0
|
||||
resource_name = keepassxc_en.ts (2.7.x stable)
|
||||
file_filter = share/translations/keepassxc_<lang>.ts
|
||||
source_file = share/translations/keepassxc_en.ts
|
||||
source_lang = en
|
||||
type = QT
|
||||
replace_edited_strings = false
|
||||
keep_translations = false
|
||||
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
# Changelog
|
||||
|
||||
## 2.8.0 (Pending)
|
||||
* Placeholder for future release notes
|
||||
|
||||
## 2.7.10 (2025-03-02)
|
||||
|
||||
### Changes
|
||||
|
|
|
@ -120,8 +120,8 @@ if(UNIX AND NOT APPLE AND NOT WITH_XC_X11)
|
|||
endif()
|
||||
|
||||
set(KEEPASSXC_VERSION_MAJOR "2")
|
||||
set(KEEPASSXC_VERSION_MINOR "7")
|
||||
set(KEEPASSXC_VERSION_PATCH "10")
|
||||
set(KEEPASSXC_VERSION_MINOR "8")
|
||||
set(KEEPASSXC_VERSION_PATCH "0")
|
||||
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}")
|
||||
set(OVERRIDE_VERSION "" CACHE STRING "Override the KeePassXC Version for Snapshot builds")
|
||||
|
||||
|
@ -310,7 +310,7 @@ if(CMAKE_BUILD_TYPE_LOWER STREQUAL "debug")
|
|||
check_add_gcc_compiler_flag("-Wshadow-compatible-local")
|
||||
check_add_gcc_compiler_flag("-Wshadow-local")
|
||||
add_gcc_compiler_flags("-Werror")
|
||||
# This is needed since compiling aginst Botan3 requires compiling against C++20
|
||||
# This is needed since compiling against Botan3 requires compiling against C++20
|
||||
if(WITH_XC_BOTAN3)
|
||||
add_gcc_compiler_cxxflags("-Wno-error=deprecated-enum-enum-conversion -Wno-error=deprecated")
|
||||
endif()
|
||||
|
@ -512,14 +512,8 @@ else()
|
|||
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED)
|
||||
endif()
|
||||
|
||||
if(Qt5Core_VERSION VERSION_LESS "5.2.0")
|
||||
message(FATAL_ERROR "Qt version 5.2.0 or higher is required")
|
||||
endif()
|
||||
|
||||
# CBOR for Passkeys requires Qt 5.12
|
||||
if(Qt5Core_VERSION VERSION_LESS "5.12.0")
|
||||
message(STATUS "Qt version 5.12.0 or higher is required for Passkeys support")
|
||||
set(WITH_XC_BROWSER_PASSKEYS OFF)
|
||||
message(FATAL_ERROR "Qt version 5.12.0 or higher is required")
|
||||
endif()
|
||||
|
||||
get_filename_component(Qt5_PREFIX ${Qt5_DIR}/../../.. REALPATH)
|
||||
|
|
2
COPYING
|
@ -207,6 +207,7 @@ Files: share/icons/application/scalable/actions/application-exit.svg
|
|||
share/icons/application/scalable/actions/password-show-on.svg
|
||||
share/icons/application/scalable/actions/qrcode.svg
|
||||
share/icons/application/scalable/actions/refresh.svg
|
||||
share/icons/application/scalable/actions/remote-sync.svg
|
||||
share/icons/application/scalable/actions/reports.svg
|
||||
share/icons/application/scalable/actions/reports-exclude.svg
|
||||
share/icons/application/scalable/actions/sort-alphabetical-ascending.svg
|
||||
|
@ -222,6 +223,7 @@ Files: share/icons/application/scalable/actions/application-exit.svg
|
|||
share/icons/application/scalable/actions/totp-copy.svg
|
||||
share/icons/application/scalable/actions/totp-copy-password.svg
|
||||
share/icons/application/scalable/actions/totp-edit.svg
|
||||
share/icons/application/scalable/actions/totp-invalid.svg
|
||||
share/icons/application/scalable/actions/trash.svg
|
||||
share/icons/application/scalable/actions/url-copy.svg
|
||||
share/icons/application/scalable/actions/user-guide.svg
|
||||
|
|
|
@ -67,9 +67,9 @@ Note: These steps place the compiled KeePassXC binary inside the `./build/src/`
|
|||
|
||||
## MacOS Build Notes
|
||||
|
||||
If you installed Qt5 via Homebrew and CMake fails to find your Qt installation, you can specify it manually by adding the following parameter:
|
||||
If you installed Qt@5 via Homebrew and CMake fails to find your Qt installation, you can specify it manually by adding the following parameter:
|
||||
|
||||
`-DCMAKE_PREFIX_PATH=$(brew --prefix qt5)/lib/cmake`
|
||||
`-DCMAKE_PREFIX_PATH=$(brew --prefix qt@5)/lib/cmake`
|
||||
|
||||
When building with ASAN support on macOS, you need to use `export ASAN_OPTIONS=detect_leaks=0` before running the tests (LSAN is no supported on macOS).
|
||||
|
||||
|
|
|
@ -56,6 +56,10 @@ You may directly contribute your own code by submitting a pull request. Please r
|
|||
|
||||
Contributors are required to adhere to the project's [Code of Conduct](CODE-OF-CONDUCT.md).
|
||||
|
||||
## Generative AI
|
||||
|
||||
Generative AI is fast becoming a first-party feature in most development environments, including GitHub itself. If the majority of a code submission is made using Generative AI (e.g., agent-based or vibe coding) then **we will document that in the pull request.** All code submissions go through a rigorous review process regardless of the development workflow or submitter.
|
||||
|
||||
## License
|
||||
|
||||
KeePassXC code is licensed under GPL-2 or GPL-3. Additional licensing for third-party files is detailed in [COPYING](./COPYING).
|
||||
|
|
46
SECURITY.md
Normal file
|
@ -0,0 +1,46 @@
|
|||
### Reporting Security Issues
|
||||
|
||||
The KeePassXC team takes security vulnerabilities very seriously and appreciates your responsible disclosure efforts. We will make every effort to acknowledge your contributions and handle them promptly.
|
||||
|
||||
To report a security issue, please use one of the following methods:
|
||||
|
||||
- **GitHub Security Advisory:** Use the ["Report a Vulnerability"](https://github.com/keepassxreboot/keepassxc/security/advisories/new) tab on our GitHub repository.
|
||||
- **Private Matrix Message:** Contact any of the following KeePassXC team members privately (also encrypted):
|
||||
- [@droidmonkey_kpxc](https://matrix.to/#/@droidmonkey_kpxc:matrix.org)
|
||||
- [@varjolintu](https://matrix.to/#/@varjolintu:matrix.org)
|
||||
- [@phoerious](https://matrix.to/#/@phoerious:matrix.org)
|
||||
- **Send an Email:** Send your report to team@keepassxc.org. We recommend encrypting the email if possible.
|
||||
|
||||
Please **DO NOT** use public channels (e.g., GitHub issues, Matrix chat channels) for initial reporting of bona fide security vulnerabilities.
|
||||
|
||||
Once you report a security issue, our team will respond with the next steps. After our initial reply, we will keep you informed of the progress towards a fix and full announcement. We may ask for additional information or guidance during this process. If we disagree that your report constitutes a genuine security vulnerability, we will inform you and close the report. Your report may be turned into an issue for further tracking.
|
||||
|
||||
If you discover vulnerabilities in third-party modules used by KeePassXC, please report them to the maintainers of the respective modules. If the vulnerability impacts KeePassXC directly, we encourage you to notify us using the above methods. We will validate if the vulnerability is exploitable from KeePassXC code; please note that not all vulnerabilities are actually exploitable and do not constitute an immediate concern for the KeePassXC application.
|
||||
|
||||
### Example Security Vulnerabilities
|
||||
|
||||
When reporting, please ensure the issue falls under what can be considered a genuine security vulnerability for KeePassXC. Some examples include:
|
||||
|
||||
- Unauthorized access to sensitive user data (e.g., passwords).
|
||||
- Remote code execution or escalation of privileges.
|
||||
- Bypassing authentication or encryption mechanisms.
|
||||
- Broken or improperly implemented encryption methods.
|
||||
|
||||
### Counter Examples
|
||||
|
||||
The following issues are **not** considered security vulnerabilities:
|
||||
|
||||
- Bugs caused by locally modifying the application (e.g., injecting DLLs, altering code).
|
||||
- Crashes or misbehavior resulting from normal use (report this as a normal issue).
|
||||
- Vulnerabilities found in third-party modules (should be reported to the module’s maintainers).
|
||||
|
||||
### CVE Reporting Policy
|
||||
|
||||
Please **DO NOT** submit a report to a Common Vulnerabilities and Exposures (CVE) Numbering Authority (CNA) before confirming the security vulnerability with the KeePassXC team. If we do not respond to your report within 30 days, this restriction no longer applies.
|
||||
|
||||
|
||||
### Other Communication
|
||||
|
||||
For other inquiries (e.g., developer questions, user questions), please use the public channels on Matrix:
|
||||
- **User's Channel:** [#keepassxc:mozilla.org](https://matrix.to/#/#keepassxc:mozilla.org)
|
||||
- **Developer's Channel:** [#keepassxc-dev:mozilla.org](https://matrix.to/#/#keepassxc-dev:mozilla.org)
|
|
@ -17,7 +17,7 @@ set(EXCLUDED_DIRS
|
|||
# third-party directories
|
||||
src/thirdparty
|
||||
# objective-c directories
|
||||
src/touchid
|
||||
src/quickunlock/touchid
|
||||
src/autotype/mac
|
||||
src/gui/osutils/macutils)
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Running macdeployqt on a POST_BUILD copied binaries is pointless when using CPack because
|
||||
# the copied binaries will be overriden by the corresponding install(TARGETS) commands.
|
||||
# the copied binaries will be overridden by the corresponding install(TARGETS) commands.
|
||||
# That's why we run macdeployqt using install(CODE) on the already installed binaries.
|
||||
# The precondition is that all install(TARGETS) calls have to be called before this function is
|
||||
# called.
|
||||
|
|
|
@ -7,6 +7,7 @@ KeePassXC Team <team@keepassxc.org>
|
|||
:imagesdir: images
|
||||
:stylesheet: styles/dark.css
|
||||
:toc: left
|
||||
:experimental:
|
||||
ifdef::backend-pdf[]
|
||||
:title-page:
|
||||
:title-logo-image: {imagesdir}/kpxc_logo.png
|
||||
|
|
|
@ -7,6 +7,7 @@ KeePassXC Team <team@keepassxc.org>
|
|||
:stylesheet: styles/dark.css
|
||||
:toc: left
|
||||
:sectanchors:
|
||||
:experimental:
|
||||
ifdef::backend-pdf[]
|
||||
:title-page:
|
||||
:title-logo-image: {imagesdir}/kpxc_logo.png
|
||||
|
|
BIN
docs/images/sync_remote_settings.png
Normal file
After Width: | Height: | Size: 43 KiB |
|
@ -28,26 +28,35 @@ keepassxc - a modern open-source password manager
|
|||
*keepassxc* [_options_] [_filename(s)_]
|
||||
|
||||
== DESCRIPTION
|
||||
*KeePassXC* is a free/open-source password manager or safe which helps you to manage your passwords in a secure way.
|
||||
The complete database is always encrypted with the industry-standard AES (alias Rijndael) encryption algorithm using a 256 bit key.
|
||||
*KeePassXC* is a free/open-source password manager or safe which helps you to manage your passwords securely.
|
||||
The complete database is always encrypted with the industry-standard AES (also known as Rijndael) encryption algorithm using a 256-bit key.
|
||||
KeePassXC uses a database format that is compatible with KeePass Password Safe.
|
||||
Your wallet works offline and requires no Internet connection.
|
||||
Your database works offline and requires no internet connection.
|
||||
|
||||
== OPTIONS
|
||||
*-h*, *--help*::
|
||||
Displays this help.
|
||||
|
||||
*--help-all*::
|
||||
Displays help including Qt specific options.
|
||||
|
||||
*-v*, *--version*::
|
||||
Displays version information.
|
||||
|
||||
*--config* <__config__>::
|
||||
Path to a custom config file.
|
||||
|
||||
*--localconfig* <__localconfig__>::
|
||||
Path to a custom local config file.
|
||||
|
||||
*--lock*::
|
||||
Locks all open databases.
|
||||
|
||||
*--keyfile* <__keyfile__>::
|
||||
Key file of the database.
|
||||
|
||||
*--pw-stdin*::
|
||||
Read password of the database from stdin.
|
||||
Reads password of the database from stdin.
|
||||
|
||||
*--minimized*::
|
||||
Starts KeePassXC minimized to the system tray.
|
||||
|
|
|
@ -4,3 +4,4 @@ KeePassXC Team <team@keepassxc.org>
|
|||
:stylesheet: ../styles/dark.css
|
||||
:icons: font
|
||||
:toc: left
|
||||
:experimental:
|
||||
|
|
|
@ -24,13 +24,13 @@ You can also set the time to remember the last used entry between presses of the
|
|||
=== Configure Auto-Type Sequences
|
||||
Each entry in your database can have multiple Auto-Type sequences associated with various window titles. Simulated key presses can be sent to any other currently open window of your choice (web browser windows, login dialogs boxes, and so on). When the Global Auto-Type hotkey is pressed, KeePassXC will search your database for entries matching the current selected window title.
|
||||
|
||||
NOTE: The default Auto-Type sequence is `{USERNAME}{TAB}{PASSWORD}{ENTER}`. This means that it first types the username of the selected entry, then presses the `Tab` key, then types the password of the entry and finally presses the `Enter` key.
|
||||
NOTE: The default Auto-Type sequence is `{USERNAME}{TAB}{PASSWORD}{ENTER}`. This means that it first types the username of the selected entry, then presses the kbd:[Tab] key, then types the password of the entry and finally presses the kbd:[Enter] key.
|
||||
|
||||
TIP: To change the default Auto-Type sequence for all entries of your database, edit the root (top-most) group of your database and set a specific sequence. Child groups and entries will inherit this sequence by default.
|
||||
|
||||
To configure Auto-Type sequences for your entries, perform the following steps:
|
||||
|
||||
1. Navigate to the entries list and open the desired entry for editing. Click the _Auto-Type_ item from the left-hand menu bar *(1)*. Press the `+` button *(2)* to add a new sequence entry. Select the desired window using the drop-down menu, or simply type a window title in the box *(3)*.
|
||||
1. Navigate to the entries list and open the desired entry for editing. Click the _Auto-Type_ item from the left-hand menu bar *(1)*. Press the kbd:[+] button *(2)* to add a new sequence entry. Select the desired window using the drop-down menu, or simply type a window title in the box *(3)*.
|
||||
+
|
||||
TIP: You can use an asterisk (`\*`) to match any value (e.g., when a window title contains a dynamic filename or website name). Set the window title to `*` to match all windows. Leave the window title blank to offer additional default Auto-Type sequences, such as custom attributes.
|
||||
+
|
||||
|
@ -60,7 +60,7 @@ image::autotype_entry_sequences.png[]
|
|||
|Press the corresponding keyboard key
|
||||
|
||||
|{UP}, {DOWN}, {LEFT}, {RIGHT} |Press the corresponding arrow key
|
||||
|{LEFTBRACE}, {RIGHTBRACE} |Press `{` or `}`, respectively
|
||||
|{LEFTBRACE}, {RIGHTBRACE} |Press kbd:[{] or kbd:[}], respectively
|
||||
|{<KEY> X} |Repeat <KEY> X times (e.g., {SPACE 5} inserts five spaces)
|
||||
|{DELAY=X} |Set delay between key presses to X milliseconds
|
||||
|{DELAY X} |Pause typing for X milliseconds
|
||||
|
@ -89,7 +89,7 @@ When you press the global Auto-Type hotkey, KeePassXC searches all unlocked data
|
|||
.Auto-Type sequence selection
|
||||
image::autotype_selection_dialog.png[,70%]
|
||||
|
||||
Perform the selected Auto-Type sequence by double clicking the desired row or pressing _Enter_. Press the up and down arrows to navigate the list. Sequences can be filtered through the text edit field.
|
||||
Perform the selected Auto-Type sequence by double clicking the desired row or pressing kbd:[Enter]. Press the up and down arrows to navigate the list. Sequences can be filtered through the text edit field.
|
||||
|
||||
.Auto-Type search database
|
||||
image::autotype_selection_dialog_search.png[,70%]
|
||||
|
@ -104,7 +104,7 @@ The option to type just the username, password, or current TOTP value is availab
|
|||
TIP: On Windows, you will see an option to use a virtual keyboard in this sub-menu. This is an experimental feature that allows you to type into virtual machines by simulating actual keyboard presses. Some international keyboards may be unsupported due to limitations in the Windows API.
|
||||
|
||||
=== Performing Entry-Level Auto-Type
|
||||
You can quickly activate the default Auto-Type sequence for a particular entry using Entry-Level Auto-Type. For this operation, the KeePassXC window will be minimized and the Auto-Type sequence occurs in the previously selected window. You can perform Entry-Level Auto-Type from the toolbar icon *(A)*, entry context menu *(B)*, or by pressing `Ctrl+Shift+V`.
|
||||
You can quickly activate the default Auto-Type sequence for a particular entry using Entry-Level Auto-Type. For this operation, the KeePassXC window will be minimized and the Auto-Type sequence occurs in the previously selected window. You can perform Entry-Level Auto-Type from the toolbar icon *(A)*, entry context menu *(B)*, or by pressing kbd:[Ctrl+Shift+V].
|
||||
|
||||
WARNING: Be careful when using Entry-Level Auto-Type as you can inadvertently type into the wrong window. For example, a chat window or email.
|
||||
|
||||
|
|
|
@ -1,201 +1,201 @@
|
|||
= KeePassXC – Browser Plugin
|
||||
include::.sharedheader[]
|
||||
:imagesdir: ../images
|
||||
|
||||
// tag::content[]
|
||||
== Browser Integration
|
||||
The KeePassXC-Browser extension is installed within your web browser so that you can automatically pull usernames and passwords from KeePassXC and populate them directly into website fields. It is a very useful and secure extension that enhances your productivity while using KeePassXC. With this extension, you do not need to manually copy the data from your KeePassXC database and paste it into the website fields.
|
||||
|
||||
The KeePassXC-Browser extension is available on the following web browsers:
|
||||
|
||||
* Google Chrome, Vivaldi, and Brave
|
||||
* Mozilla Firefox and Tor-Browser
|
||||
* Microsoft Edge
|
||||
* Chromium
|
||||
|
||||
NOTE: On Linux, Flatpak and Snap based browsers are generally not supported. Ubuntu's Firefox Snap is currently the only known exception.
|
||||
|
||||
=== Install the Browser Extension
|
||||
You can download the KeePassXC-Browser extension from your web browser. To download the KeePassXC-Browser extension, perform the following steps:
|
||||
|
||||
1. Click the link corresponding to your browser:
|
||||
* https://chromewebstore.google.com/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk[Chrome, Chromium, Vivaldi, and Brave]
|
||||
* https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser[Mozilla Firefox and Tor-Browser]
|
||||
* https://microsoftedge.microsoft.com/addons/detail/keepassxcbrowser/pdffhmdngciaglkoonimfcmckehcpafo[Microsoft Edge]
|
||||
|
||||
2. Click the button to install/add the extension to the browser. Accept any confirmation dialogs.
|
||||
|
||||
TIP: For the most up-to-date troubleshooting advice on all platforms, please read our https://github.com/keepassxreboot/keepassxc-browser/wiki/Troubleshooting-guide[Troubleshooting Guide].
|
||||
|
||||
// tag::advanced[]
|
||||
NOTE: When Microsoft Edge is installed as a managed application, system administrators are required to deploy a custom native messaging configuration. Instructions for this are found in the advanced section below.
|
||||
// end::advanced[]
|
||||
|
||||
=== Configure KeePassXC-Browser
|
||||
To start using KeePassXC-Browser, you must configure it so that it can communicate with the KeePassXC application on your desktop.
|
||||
|
||||
To configure KeePassXC-Browser, perform the following steps:
|
||||
|
||||
1. Open the KeePassXC application on your desktop and navigate to Tools > Settings.
|
||||
|
||||
2. Click the Browser Integration option on the left-hand side *(1)*. The following screen appears:
|
||||
+
|
||||
.Browser Settings
|
||||
image::browser_settings.png[]
|
||||
|
||||
3. Click the _Enable browser integration_ checkbox *(2)*. Then select the browsers for which you have downloaded the KeePassXC-Browser extension *(3)* and click *OK*.
|
||||
|
||||
4. Ensure your database is unlocked, then open (or restart) your browser.
|
||||
|
||||
5. Click the KeePassXC-Browser extension icon *(A)* in your browser (see figure below). A pop-up window appears.
|
||||
+
|
||||
.Connect Extension to KeePassXC
|
||||
image::browser_extension_connect.png[,80%]
|
||||
|
||||
6. Click the _Connect_ button *(B)* in the pop-up window to complete integrating the KeePassXC-Browser extension with your KeePassXC desktop application.
|
||||
|
||||
7. You are now prompted to enter a unique name to identify the connection between this browser and your database. Enter a unique name in the field (e.g., firefox-laptop) and click the _Save and allow access_ button.
|
||||
+
|
||||
.Extension Association Dialog
|
||||
image::browser_extension_association.png[,80%]
|
||||
|
||||
WARNING: If you reuse a connection name in a database, the previous browser connection will be overwritten and prevent access.
|
||||
|
||||
=== Using the Browser Extension
|
||||
The KeePassXC-Browser extension lets you automatically populate the entries from your KeePassXC database into the fields on websites you visit. To do so, perform the following steps:
|
||||
|
||||
1. Open your KeePassXC desktop application and unlock your database.
|
||||
|
||||
2. Open your web browser. The KeePassXC-Browser extension icon in your browser window will change based on its connection state. The figure below shows the different states.
|
||||
+
|
||||
*(A)* KeePassXC is not running or is disconnected. +
|
||||
*(B)* KeePassXC is running, but KeePassXC Browser Extension is not connected to the current database. +
|
||||
*\(C)* Connected to KeePassXC, but database is locked. +
|
||||
*(D)* Connected to KeePassXC and ready to use. If the icon is shown with a number, it indicates the number of credentials found for the current site.
|
||||
+
|
||||
.Extension Icon States
|
||||
image::browser_extension_icons.png[,70%]
|
||||
|
||||
3. If the KeePassXC desktop application is not connected with the KeePassXC-Browser extension, click the extension icon in your web browser and click _Reload_ from the pop-up window as shown in the following screen.
|
||||
+
|
||||
.Reload Extension Connection
|
||||
image::browser_extension_reload.png[,80%]
|
||||
|
||||
4. Open the URL for which you want to use with your database. If you have previously created an entry in your database then the KeePassXC-Browser Confirm Access dialog may appear:
|
||||
+
|
||||
.Confirm Access Dialog
|
||||
image::browser_confirm_access_dialog.png[,80%]
|
||||
|
||||
5. Ensure the credentials you want to use are checked, then click *(A)* Remember _(optional)_, then click _Allow Selected_ *(B)*.
|
||||
|
||||
6. In your website, the KeePassXC icon will appear in the username field of the login form *(A)*. Click the icon to populate the field with your stored credentials. If you have more than one credential for this website, a dropdown will appear to choose the one to use.
|
||||
+
|
||||
.Fill Credentials
|
||||
image::browser_fill_credentials.png[,80%]
|
||||
|
||||
=== Generate Passwords
|
||||
The KeePassXC-Browser Extension also lets you generate passwords directly in your browser.
|
||||
This feature can be used for websites with existing credentials as well as for new websites.
|
||||
You can then choose to update/add the credentials to your KeePassXC database directly from the Browser.
|
||||
|
||||
1. Ensure your database is unlocked and configured to use the Browser extension as shown above.
|
||||
|
||||
2. Right click on a password field and from the KeePassXC sub-menu choose _Show Password Generater_. The standard KeePassXC password generator will appear.
|
||||
|
||||
3. Configure the password generation options and click _Apply Password_ when done. The generated password will be filled into the previously selected field.
|
||||
|
||||
4. When you have succussfully submitted the password on the website, a popup will appear asking you to either udpate an existing entry or add a new one.
|
||||
|
||||
// tag::advanced[]
|
||||
=== Browser statistics
|
||||
You can see a cross-section of all browser-related settings applied to entries within a database through the Browser Statistics report. To access these, use the _Database_ -> _Database reports..._ menu option then click on _Browser Statistics_ on the left-hand menu. From here you can see all entries with URLs applied to them, explicitly allowed and denied URLs, and any entries with custom browser settings.
|
||||
|
||||
.Browser statistics
|
||||
image::browser_statistics.png[]
|
||||
|
||||
=== Advanced Usage
|
||||
You can configure unique browser integration behavior for each entry. This allows you to add multiple URLs to an entry, hide an entry from the browser integration, and more. To access these settings, open an entry for editing then click on _Browser Integration_ option in the left-hand menu *(1)*.
|
||||
|
||||
After opening the settings you can add any number of additional URLs by clicking the _Add_ button *(2)* and typing the URL in the list to the left *(3)*.
|
||||
|
||||
Additional URLs also supports wildcards (with KeePassXC 2.7.10 and later). You can use URLs like:
|
||||
----
|
||||
https://*.example.com
|
||||
https://example.com/*/path
|
||||
https://sub.*.example.com/path/*
|
||||
----
|
||||
|
||||
.Entry browser settings
|
||||
image::browser_entry_settings.png[]
|
||||
|
||||
To set options for all entries within a group, edit the group and go to the browser integration section *(1)*. Here you can explicitly disable access to all entries under a group hierarchy to the browser extension. You can set other useful options for groups of entries as well.
|
||||
|
||||
.Group browser settings
|
||||
image::browser_group_settings.png[]
|
||||
|
||||
Database-wide operations are available in the database settings. To access these use the _Database_ -> _Database settings..._ menu option. Click on _Browser Integration_ on the left-hand menu. From here you can disconnect all browsers, convert legacy KeePass-HTTP settings, reset all entry-level settings, and refresh the database root group ID (useful when making copies of your database file).
|
||||
|
||||
.Database browser settings
|
||||
image::browser_database_settings.png[]
|
||||
|
||||
Finally, advanced application-wide settings are available in the Browser Integration tab of the application settings.
|
||||
|
||||
WARNING: We do not recommend changing any of these settings as they may break the browser integration plugin.
|
||||
|
||||
.Advanced browser settings
|
||||
image::browser_advanced_settings.png[]
|
||||
|
||||
=== Advanced Setup
|
||||
==== Custom Browser option
|
||||
It is possible to enable support for a custom browser (e.g. LibreWolf, WaterFox, Arc, beta and nightly browsers, etc.) using this feature.
|
||||
This feature is only available for Linux and macOS.
|
||||
|
||||
.Custom browser configuration
|
||||
image::browser_custom_browser_configuration.png[]
|
||||
|
||||
The native messaging script file needed for the custom browser depends on the browser type. For Firefox based browsers like Librefox the _Browser type_ must be _Firefox_. For Arc, Opera, etc. the type must be set to _Chromium_.
|
||||
|
||||
_Config location_ must have the exact path for the browser's _native-messaging-hosts_ folder. If you are unsure, refer to our https://github.com/keepassxreboot/keepassxc-browser/wiki/Troubleshooting-guide#1-after-enabling-browser-integration-and-support-for-your-browser[Troubleshooting Guide] for listing of the most common paths, and a few ways for finding a path when it's not known.
|
||||
|
||||
When a Custom Browser has been successfully set, KeePassXC will automatically write the needed native messaging script file to the folder.
|
||||
|
||||
If you wish to support multiple custom browsers, you can copy the native messaging script files manually to the _native-messaging-hosts_ folder from other browsers.
|
||||
|
||||
==== Managed Microsoft Edge on Windows
|
||||
1. Deploy *org.keepassxc.keepassxc_browser_edge.json* to, for example, `C:\ProgramData\KeePassXC\` on all managed platforms.
|
||||
+
|
||||
----
|
||||
{
|
||||
"allowed_origins": [
|
||||
"chrome-extension://pdffhmdngciaglkoonimfcmckehcpafo/"
|
||||
],
|
||||
"description": "KeePassXC integration with native messaging support",
|
||||
"name": "org.keepassxc.keepassxc_browser",
|
||||
"path": "C:\\Program Files\\KeePassXC\\keepassxc-proxy.exe",
|
||||
"type": "stdio"
|
||||
}
|
||||
----
|
||||
|
||||
2. Configure GPO options (see https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies#native-messaging[Microsoft Edge Native Messaging Policies] for more information.):
|
||||
+
|
||||
----
|
||||
Windows Registry Editor Version 5.00
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\org.keepassxc.keepassxc_browser]
|
||||
@="C:\ProgramData\KeepassXC\org.keepassxc.keepassxc_browser_edge.json"
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge]
|
||||
"NativeMessagingUserLevelHosts"=dword:00000000
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\ExtensionInstallAllowlist]
|
||||
"1"="pdffhmdngciaglkoonimfcmckehcpafo"
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\NativeMessagingAllowlist]
|
||||
"1"="org.keepassxc.keepassxc_browser"
|
||||
----
|
||||
|
||||
==== Managed Microsoft Edge on macOS
|
||||
1. Deploy *org.keepassxc.keepassxc_browser_edge.json* to `/Library/Microsoft/Edge/NativeMessagingHosts`.
|
||||
|
||||
2. You may need to configure Edge to allowlist the extension and native messaging host. See https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies#native-messaging[Microsoft Edge Native Messaging Policies] for more information.
|
||||
// end::advanced[]
|
||||
// end::content[]
|
||||
= KeePassXC – Browser Plugin
|
||||
include::.sharedheader[]
|
||||
:imagesdir: ../images
|
||||
|
||||
// tag::content[]
|
||||
== Browser Integration
|
||||
The KeePassXC-Browser extension is installed within your web browser so that you can automatically pull usernames and passwords from KeePassXC and populate them directly into website fields. It is a very useful and secure extension that enhances your productivity while using KeePassXC. With this extension, you do not need to manually copy the data from your KeePassXC database and paste it into the website fields.
|
||||
|
||||
The KeePassXC-Browser extension is available on the following web browsers:
|
||||
|
||||
* Google Chrome, Vivaldi, and Brave
|
||||
* Mozilla Firefox and Tor-Browser
|
||||
* Microsoft Edge
|
||||
* Chromium
|
||||
|
||||
NOTE: On Linux, Flatpak and Snap based browsers are generally not supported. Ubuntu's Firefox Snap is currently the only known exception.
|
||||
|
||||
=== Install the Browser Extension
|
||||
You can download the KeePassXC-Browser extension from your web browser. To download the KeePassXC-Browser extension, perform the following steps:
|
||||
|
||||
1. Click the link corresponding to your browser:
|
||||
* https://chromewebstore.google.com/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk[Chrome, Chromium, Vivaldi, and Brave]
|
||||
* https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser[Mozilla Firefox and Tor-Browser]
|
||||
* https://microsoftedge.microsoft.com/addons/detail/keepassxcbrowser/pdffhmdngciaglkoonimfcmckehcpafo[Microsoft Edge]
|
||||
|
||||
2. Click the button to install/add the extension to the browser. Accept any confirmation dialogs.
|
||||
|
||||
TIP: For the most up-to-date troubleshooting advice on all platforms, please read our https://github.com/keepassxreboot/keepassxc-browser/wiki/Troubleshooting-guide[Troubleshooting Guide].
|
||||
|
||||
// tag::advanced[]
|
||||
NOTE: When Microsoft Edge is installed as a managed application, system administrators are required to deploy a custom native messaging configuration. Instructions for this are found in the advanced section below.
|
||||
// end::advanced[]
|
||||
|
||||
=== Configure KeePassXC-Browser
|
||||
To start using KeePassXC-Browser, you must configure it so that it can communicate with the KeePassXC application on your desktop.
|
||||
|
||||
To configure KeePassXC-Browser, perform the following steps:
|
||||
|
||||
1. Open the KeePassXC application on your desktop and navigate to Tools > Settings.
|
||||
|
||||
2. Click the Browser Integration option on the left-hand side *(1)*. The following screen appears:
|
||||
+
|
||||
.Browser Settings
|
||||
image::browser_settings.png[]
|
||||
|
||||
3. Click the _Enable browser integration_ checkbox *(2)*. Then select the browsers for which you have downloaded the KeePassXC-Browser extension *(3)* and click *OK*.
|
||||
|
||||
4. Ensure your database is unlocked, then open (or restart) your browser.
|
||||
|
||||
5. Click the KeePassXC-Browser extension icon *(A)* in your browser (see figure below). A pop-up window appears.
|
||||
+
|
||||
.Connect Extension to KeePassXC
|
||||
image::browser_extension_connect.png[,80%]
|
||||
|
||||
6. Click the _Connect_ button *(B)* in the pop-up window to complete integrating the KeePassXC-Browser extension with your KeePassXC desktop application.
|
||||
|
||||
7. You are now prompted to enter a unique name to identify the connection between this browser and your database. Enter a unique name in the field (e.g., firefox-laptop) and click the _Save and allow access_ button.
|
||||
+
|
||||
.Extension Association Dialog
|
||||
image::browser_extension_association.png[,80%]
|
||||
|
||||
WARNING: If you reuse a connection name in a database, the previous browser connection will be overwritten and prevent access.
|
||||
|
||||
=== Using the Browser Extension
|
||||
The KeePassXC-Browser extension lets you automatically populate the entries from your KeePassXC database into the fields on websites you visit. To do so, perform the following steps:
|
||||
|
||||
1. Open your KeePassXC desktop application and unlock your database.
|
||||
|
||||
2. Open your web browser. The KeePassXC-Browser extension icon in your browser window will change based on its connection state. The figure below shows the different states.
|
||||
+
|
||||
*(A)* KeePassXC is not running or is disconnected. +
|
||||
*(B)* KeePassXC is running, but KeePassXC Browser Extension is not connected to the current database. +
|
||||
*\(C)* Connected to KeePassXC, but database is locked. +
|
||||
*(D)* Connected to KeePassXC and ready to use. If the icon is shown with a number, it indicates the number of credentials found for the current site.
|
||||
+
|
||||
.Extension Icon States
|
||||
image::browser_extension_icons.png[,70%]
|
||||
|
||||
3. If the KeePassXC desktop application is not connected with the KeePassXC-Browser extension, click the extension icon in your web browser and click _Reload_ from the pop-up window as shown in the following screen.
|
||||
+
|
||||
.Reload Extension Connection
|
||||
image::browser_extension_reload.png[,80%]
|
||||
|
||||
4. Open the URL for which you want to use with your database. If you have previously created an entry in your database then the KeePassXC-Browser Confirm Access dialog may appear:
|
||||
+
|
||||
.Confirm Access Dialog
|
||||
image::browser_confirm_access_dialog.png[,80%]
|
||||
|
||||
5. Ensure the credentials you want to use are checked, then click *(A)* Remember _(optional)_, then click _Allow Selected_ *(B)*.
|
||||
|
||||
6. In your website, the KeePassXC icon will appear in the username field of the login form *(A)*. Click the icon to populate the field with your stored credentials. If you have more than one credential for this website, a dropdown will appear to choose the one to use.
|
||||
+
|
||||
.Fill Credentials
|
||||
image::browser_fill_credentials.png[,80%]
|
||||
|
||||
=== Generate Passwords
|
||||
The KeePassXC-Browser Extension also lets you generate passwords directly in your browser.
|
||||
This feature can be used for websites with existing credentials as well as for new websites.
|
||||
You can then choose to update/add the credentials to your KeePassXC database directly from the Browser.
|
||||
|
||||
1. Ensure your database is unlocked and configured to use the Browser extension as shown above.
|
||||
|
||||
2. Right click on a password field and from the KeePassXC sub-menu choose _Show Password Generator_. The standard KeePassXC password generator will appear.
|
||||
|
||||
3. Configure the password generation options and click _Apply Password_ when done. The generated password will be filled into the previously selected field.
|
||||
|
||||
4. When you have successfully submitted the password on the website, a popup will appear asking you to either update an existing entry or add a new one.
|
||||
|
||||
// tag::advanced[]
|
||||
=== Browser statistics
|
||||
You can see a cross-section of all browser-related settings applied to entries within a database through the Browser Statistics report. To access these, use the _Database_ -> _Database reports..._ menu option then click on _Browser Statistics_ on the left-hand menu. From here you can see all entries with URLs applied to them, explicitly allowed and denied URLs, and any entries with custom browser settings.
|
||||
|
||||
.Browser statistics
|
||||
image::browser_statistics.png[]
|
||||
|
||||
=== Advanced Usage
|
||||
You can configure unique browser integration behavior for each entry. This allows you to add multiple URLs to an entry, hide an entry from the browser integration, and more. To access these settings, open an entry for editing then click on _Browser Integration_ option in the left-hand menu *(1)*.
|
||||
|
||||
After opening the settings you can add any number of additional URLs by clicking the _Add_ button *(2)* and typing the URL in the list to the left *(3)*.
|
||||
|
||||
Additional URLs also supports wildcards (with KeePassXC 2.7.10 and later). You can use URLs like:
|
||||
----
|
||||
https://*.example.com
|
||||
https://example.com/*/path
|
||||
https://sub.*.example.com/path/*
|
||||
----
|
||||
|
||||
.Entry browser settings
|
||||
image::browser_entry_settings.png[]
|
||||
|
||||
To set options for all entries within a group, edit the group and go to the browser integration section *(1)*. Here you can explicitly disable access to all entries under a group hierarchy to the browser extension. You can set other useful options for groups of entries as well.
|
||||
|
||||
.Group browser settings
|
||||
image::browser_group_settings.png[]
|
||||
|
||||
Database-wide operations are available in the database settings. To access these use the _Database_ -> _Database settings..._ menu option. Click on _Browser Integration_ on the left-hand menu. From here you can disconnect all browsers, convert legacy KeePass-HTTP settings, reset all entry-level settings, and refresh the database root group ID (useful when making copies of your database file).
|
||||
|
||||
.Database browser settings
|
||||
image::browser_database_settings.png[]
|
||||
|
||||
Finally, advanced application-wide settings are available in the Browser Integration tab of the application settings.
|
||||
|
||||
WARNING: We do not recommend changing any of these settings as they may break the browser integration plugin.
|
||||
|
||||
.Advanced browser settings
|
||||
image::browser_advanced_settings.png[]
|
||||
|
||||
=== Advanced Setup
|
||||
==== Custom Browser option
|
||||
It is possible to enable support for a custom browser (e.g. LibreWolf, WaterFox, Arc, beta and nightly browsers, etc.) using this feature.
|
||||
This feature is only available for Linux and macOS.
|
||||
|
||||
.Custom browser configuration
|
||||
image::browser_custom_browser_configuration.png[]
|
||||
|
||||
The native messaging script file needed for the custom browser depends on the browser type. For Firefox based browsers like Librefox the _Browser type_ must be _Firefox_. For Arc, Opera, etc. the type must be set to _Chromium_.
|
||||
|
||||
_Config location_ must have the exact path for the browser's _native-messaging-hosts_ folder. If you are unsure, refer to our https://github.com/keepassxreboot/keepassxc-browser/wiki/Troubleshooting-guide#1-after-enabling-browser-integration-and-support-for-your-browser[Troubleshooting Guide] for listing of the most common paths, and a few ways for finding a path when it's not known.
|
||||
|
||||
When a Custom Browser has been successfully set, KeePassXC will automatically write the needed native messaging script file to the folder.
|
||||
|
||||
If you wish to support multiple custom browsers, you can copy the native messaging script files manually to the _native-messaging-hosts_ folder from other browsers.
|
||||
|
||||
==== Managed Microsoft Edge on Windows
|
||||
1. Deploy *org.keepassxc.keepassxc_browser_edge.json* to, for example, `C:\ProgramData\KeePassXC\` on all managed platforms.
|
||||
+
|
||||
----
|
||||
{
|
||||
"allowed_origins": [
|
||||
"chrome-extension://pdffhmdngciaglkoonimfcmckehcpafo/"
|
||||
],
|
||||
"description": "KeePassXC integration with native messaging support",
|
||||
"name": "org.keepassxc.keepassxc_browser",
|
||||
"path": "C:\\Program Files\\KeePassXC\\keepassxc-proxy.exe",
|
||||
"type": "stdio"
|
||||
}
|
||||
----
|
||||
|
||||
2. Configure GPO options (see https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies#native-messaging[Microsoft Edge Native Messaging Policies] for more information.):
|
||||
+
|
||||
----
|
||||
Windows Registry Editor Version 5.00
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\org.keepassxc.keepassxc_browser]
|
||||
@="C:\ProgramData\KeepassXC\org.keepassxc.keepassxc_browser_edge.json"
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge]
|
||||
"NativeMessagingUserLevelHosts"=dword:00000000
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\ExtensionInstallAllowlist]
|
||||
"1"="pdffhmdngciaglkoonimfcmckehcpafo"
|
||||
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\NativeMessagingAllowlist]
|
||||
"1"="org.keepassxc.keepassxc_browser"
|
||||
----
|
||||
|
||||
==== Managed Microsoft Edge on macOS
|
||||
1. Deploy *org.keepassxc.keepassxc_browser_edge.json* to `/Library/Microsoft/Edge/NativeMessagingHosts`.
|
||||
|
||||
2. You may need to configure Edge to allowlist the extension and native messaging host. See https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies#native-messaging[Microsoft Edge Native Messaging Policies] for more information.
|
||||
// end::advanced[]
|
||||
// end::content[]
|
||||
|
|
|
@ -75,7 +75,7 @@ NOTE: On Windows, you will be prompted to authenticate to Windows Hello after un
|
|||
.Windows Hello example
|
||||
image::quick_unlock_windows_hello.png[]
|
||||
|
||||
When your database is locked, you will see the following unlock dialog. Simply press _Enter_ or click on _Unlock Database_ to initiate the biometric authentication process. If you are using a hardware key (e.g. Yubikey), it must be connected to your computer to complete the unlock.
|
||||
When your database is locked, you will see the following unlock dialog. Simply press kbd:[Enter] or click on _Unlock Database_ to initiate the biometric authentication process. If you are using a hardware key (e.g. Yubikey), it must be connected to your computer to complete the unlock.
|
||||
|
||||
.Quick Unlock
|
||||
image::quick_unlock.png[]
|
||||
|
@ -92,7 +92,7 @@ All the details such as usernames, passwords, URLs, attachments, notes, and so o
|
|||
|
||||
To add an entry, perform the following step:
|
||||
|
||||
1. Navigate to Entries > New Entry (Or, press Ctrl+N). The following screen appears:
|
||||
1. Navigate to Entries > New Entry (or press kbd:[Ctrl+N]). The following screen appears:
|
||||
+
|
||||
.Adding a new entry
|
||||
image::edit_entry.png[]
|
||||
|
@ -115,7 +115,7 @@ To edit the details in an entry, perform the following steps:
|
|||
|
||||
1. Select the entry you want to edit.
|
||||
|
||||
2. Press `Enter`, click the edit toolbar icon, or right-click and select Edit Entry from the menu.
|
||||
2. Press kbd:[Enter], click the edit toolbar icon, or right-click and select Edit Entry from the menu.
|
||||
|
||||
3. Make the desired changes.
|
||||
|
||||
|
@ -156,13 +156,13 @@ TIP: Each KeePass application has different default icons. If you use a mobile a
|
|||
==== Deleting an Entry
|
||||
To delete an entry, perform the following steps:
|
||||
|
||||
1. Select the entry you want to delete and press the `Delete` button on your keyboard.
|
||||
1. Select the entry you want to delete and press the kbd:[Del] button on your keyboard.
|
||||
|
||||
2. You will be prompted to move the entry to the Recycle Bin (if enabled).
|
||||
+
|
||||
NOTE: You can disable the recycle bin within the Database Settings. If the recycle bin is disabled then deleted entries will be permanently removed from the database.
|
||||
|
||||
3. To permanently delete the entry, navigate to the Recycle Bin, select the entry you want to delete and press the `Delete` button on your keyboard.
|
||||
3. To permanently delete the entry, navigate to the Recycle Bin, select the entry you want to delete and press the kbd:[Del] button on your keyboard.
|
||||
|
||||
// tag::advanced[]
|
||||
==== Clone an Entry
|
||||
|
@ -170,7 +170,7 @@ Creating a clone of an entry provides you a ready-to-use template for creating n
|
|||
|
||||
To create a clone of an existing entry, perform the following steps:
|
||||
|
||||
1. Right-click on the entry for which you want to create a clone and select _Clone Entry_. Alternatively, select the desired entry and press `Ctrl+K`.
|
||||
1. Right-click on the entry for which you want to create a clone and select _Clone Entry_. Alternatively, select the desired entry and press kbd:[Ctrl+K].
|
||||
+
|
||||
.Clone entry from context menu
|
||||
image::clone_entry.png[]
|
||||
|
@ -416,5 +416,23 @@ The following key derivation functions are supported:
|
|||
KeePassXC offers some maintenance features that can be applied to clean up your database. Navigate to _Database_ -> _Database settings_ then click on _Maintenance_ on the left hand panel. The following screen appears. On this screen you can delete multiple icons at once and purge any unused icons in your database.
|
||||
|
||||
image::database_maintenance.png[]
|
||||
|
||||
== Remote database support
|
||||
KeePassXC provides support for syncing database files that reside in a remote location. If you can download/upload the database file via a commandline tool (e.g. rsync, ssh, scp etc.) KeePassXC offers easy to use functionality to sync the remote database.
|
||||
|
||||
=== Sync with remote database
|
||||
Open the remote sync settings via _Database > Database Settings… > Remote_ to create commands to sync a local database or a temporary local copy of a remote database.
|
||||
|
||||
Define a name for your sync command and specify a download *(A)* as well as an upload command *(B)*. The command and/or input need a `{TEMP_DATABASE}` placeholder specified where the remote database is temporarily stored. Do not forget to save the command settings with the save button *\(C)*. Remote settings are added as menu entries below the _Remote Sync…_ menu for quick access.
|
||||
|
||||
WARNING: If your download or upload command require a password prompt, the command will most likely not succeed. In case of an SSH connection (e.g. sftp), it is recommended to use <<KeePassXC – SSH Agent integration,SSH agent>> so that no password prompt is needed.
|
||||
|
||||
.Remote sync settings
|
||||
image::sync_remote_settings.png[]
|
||||
|
||||
Select the remote sync command from the _Database > Remote Sync…_ menu to start the syncing process and a progress bar will show up in the lower right corner.
|
||||
|
||||
WARNING: In case the remote database is changed by another user/process after the downloading command finishes and before uploading again, those changes will be overwritten. Syncing is not an atomic operation.
|
||||
|
||||
// end::advanced[]
|
||||
// end::content[]
|
||||
|
|
|
@ -38,7 +38,7 @@ To install KeePassXC on Microsoft Windows, perform the following steps:
|
|||
.Install wizard
|
||||
image::install_wizard_1.png[,80%]
|
||||
|
||||
2. Click Next and follow the simple instructions on the KeepPassXC Setup Wizard to complete the installation. You will have the option to choose your install location, add a desktop shortcut, and launch on startup.
|
||||
2. Click Next and follow the simple instructions on the KeePassXC Setup Wizard to complete the installation. You will have the option to choose your install location, add a desktop shortcut, and launch on startup.
|
||||
+
|
||||
.Install wizard (cont)
|
||||
image::install_wizard_2.png[,80%]
|
||||
|
@ -59,7 +59,7 @@ image::linux_store.png[]
|
|||
|
||||
The Snap and Flatpak options are sandboxed applications (more secure). The Native option is installed with the operating system files. Read more about the limitations of these options here: https://keepassxc.org/docs/#faq-appsnap-yubikey[KeePassXC Snap FAQ]
|
||||
|
||||
NOTE: KeePassXC stores a configuration file in `~/.cache` to remember window position, recent files, and other local settings. If you mount this folder to a tmpdisk you will lose settings after reboot.
|
||||
NOTE: KeePassXC stores a configuration file in `~/.local/state` to remember window position, recent files, and other local settings. If you mount this folder to a tmpdisk you will lose settings after reboot.
|
||||
|
||||
=== macOS
|
||||
To install the KeePassXC app on macOS, double click on the downloaded DMG file and use the click and drag option as shown:
|
||||
|
|
|
@ -12,6 +12,7 @@ KeePassXC allows you to import external databases from the following options:
|
|||
* Bitwarden (.json)
|
||||
* Proton Pass (.json)
|
||||
* KeePass 1 Database (.kdb)
|
||||
* Remote database (.kdbx)
|
||||
|
||||
To import any of these files, start KeePassXC and either click the `Import File` button on the welcome screen or use the menu Database > Import... to launch the Import Wizard.
|
||||
|
||||
|
@ -78,6 +79,21 @@ To import a KeePass 1 database file in KeePassXC, perform the following steps:
|
|||
|
||||
3. Click `Continue` to unlock and preview the import. Click `Done` to complete the import.
|
||||
|
||||
=== Importing Remote Database
|
||||
Database files that are stored in a remote location can be imported or opened with KeePassXC if you provide a command to download the file from the remote location.
|
||||
|
||||
To import (or temporarily open) a remote database file in KeePassXC, perform the following steps:
|
||||
|
||||
1. Open the Import Wizard as shown above. Select the Remote Database option.
|
||||
|
||||
2. Enter a command to download the remote database. If necessary, enter input that needs to be passed to the command. The command and/or input need a `{TEMP_DATABASE}` placeholder specified where the remote database is temporarily stored.
|
||||
|
||||
3. Enter the password for your database and optionally provide a key file.
|
||||
|
||||
4. Click `Continue` to unlock and preview the import. Click `Done` to complete the import.
|
||||
|
||||
Opening without importing a remote database is possible by selecting Temporary Database in the Import Into section of the wizard.
|
||||
|
||||
== Exporting Databases
|
||||
KeePassXC supports multiple ways to export your database for transfer to another program or to print out and archive.
|
||||
|
||||
|
|
|
@ -3,52 +3,62 @@ include::.sharedheader[]
|
|||
:imagesdir: ../images
|
||||
|
||||
// tag::content[]
|
||||
NOTE: On macOS please substitute `Ctrl` with `Cmd` (aka `⌘`).
|
||||
NOTE: On macOS please substitute kbd:[Ctrl] with kbd:[Cmd] (AKA kbd:[⌘]).
|
||||
|
||||
[grid=rows, frame=none, width=75%]
|
||||
|===
|
||||
|Action | Keyboard Shortcut
|
||||
|Action | Keyboard Shortcut
|
||||
|
||||
|Settings | Ctrl + ,
|
||||
|Open Database | Ctrl + O
|
||||
|Save Database | Ctrl + S
|
||||
|Save Database As | Ctrl + Shift + S
|
||||
|New Database | Ctrl + Shift + N
|
||||
|Close Database | Ctrl + W ; Ctrl + F4
|
||||
|Lock Current Database | Ctrl + L
|
||||
|Lock All Databases | Ctrl + Shift + L
|
||||
|Database Settings | Ctrl + Shift + ,
|
||||
|Database Reports | Ctrl + Shift + R
|
||||
|Quit | Ctrl + Q
|
||||
|New Entry | Ctrl + N
|
||||
|Edit Entry | Enter ; Ctrl + E
|
||||
|Delete Entry | Delete
|
||||
|Clone Entry | Ctrl + K
|
||||
|Copy Username | Ctrl + B
|
||||
|Copy Password | Ctrl + C
|
||||
|Copy URL | Ctrl + U
|
||||
|Open URL | Ctrl + Shift + U
|
||||
|Copy TOTP | Ctrl + T
|
||||
|Copy Password and TOTP | Ctrl + Y
|
||||
|Show TOTP | Ctrl + Shift + T
|
||||
|Trigger AutoType | Ctrl + Shift + V
|
||||
|Add key to SSH Agent | Ctrl + H
|
||||
|Remove key from SSH Agent | Ctrl + Shift + H
|
||||
|Move entry up (if unsorted) | Ctrl + Alt + Up
|
||||
|Move entry down (if unsorted) | Ctrl + Alt + Down
|
||||
|Sort Groups A-Z | Ctrl + Down
|
||||
|Sort Groups Z-A | Ctrl + Up
|
||||
|Minimize Window | Ctrl + M
|
||||
|Hide Window | Ctrl + Shift + M
|
||||
|Select Next Database Tab | Ctrl + Tab ; Ctrl + PageDn
|
||||
|Select Previous Database Tab | Ctrl + Shift + Tab ; Ctrl + PageUp
|
||||
|Select the nth database | Ctrl + n, where n is the number of the database tab
|
||||
|Toggle Passwords Hidden | Ctrl + Shift + C
|
||||
|Toggle Usernames Hidden | Ctrl + Shift + B
|
||||
|Focus Groups (edit if focused) | F1
|
||||
|Focus Entries (edit if focused) | F2
|
||||
|Focus Search | F3 ; Ctrl + F
|
||||
|Clear Search | Escape
|
||||
|Show Keyboard Shortcuts | Ctrl + /
|
||||
|Settings | kbd:[Ctrl + ,]
|
||||
|Open Database | kbd:[Ctrl + O]
|
||||
|Save Database | kbd:[Ctrl + S]
|
||||
|Save Database As | kbd:[Ctrl + Shift + S]
|
||||
|New Database | kbd:[Ctrl + Shift + N]
|
||||
|Close Database | kbd:[Ctrl + W] +
|
||||
_or_ +
|
||||
kbd:[Ctrl + F4]
|
||||
|Lock Current Database | kbd:[Ctrl + L]
|
||||
|Lock All Databases | kbd:[Ctrl + Shift + L]
|
||||
|Database Settings | kbd:[Ctrl + Shift + ,]
|
||||
|Database Reports | kbd:[Ctrl + Shift + R]
|
||||
|Quit | kbd:[Ctrl + Q]
|
||||
|New Entry | kbd:[Ctrl + N]
|
||||
|Edit Entry | kbd:[Enter] +
|
||||
_or_ +
|
||||
kbd:[Ctrl + E]
|
||||
|Delete Entry | kbd:[Del]
|
||||
|Clone Entry | kbd:[Ctrl + D]
|
||||
|Copy Username | kbd:[Ctrl + B]
|
||||
|Copy Password | kbd:[Ctrl + C]
|
||||
|Copy URL | kbd:[Ctrl + U]
|
||||
|Open URL | kbd:[Ctrl + Shift + U]
|
||||
|Copy TOTP | kbd:[Ctrl + T]
|
||||
|Copy Password and TOTP | kbd:[Ctrl + Y]
|
||||
|Show TOTP | kbd:[Ctrl + Shift + T]
|
||||
|Trigger AutoType | kbd:[Ctrl + Shift + V]
|
||||
|Add key to SSH Agent | kbd:[Ctrl + H]
|
||||
|Remove key from SSH Agent | kbd:[Ctrl + Shift + H]
|
||||
|Move entry up (if unsorted) | kbd:[Ctrl + Alt + Up]
|
||||
|Move entry down (if unsorted) | kbd:[Ctrl + Alt + Down]
|
||||
|Sort Groups A-Z | kbd:[Ctrl + Down]
|
||||
|Sort Groups Z-A | kbd:[Ctrl + Up]
|
||||
|Minimize Window | kbd:[Ctrl + M]
|
||||
|Hide Window | kbd:[Ctrl + Shift + M]
|
||||
|Select Next Database Tab | kbd:[Ctrl + Tab] +
|
||||
_or_ +
|
||||
kbd:[Ctrl + PgDn]
|
||||
|Select Previous Database Tab | kbd:[Ctrl + Shift + Tab] +
|
||||
_or_ +
|
||||
kbd:[Ctrl + PgUp]
|
||||
|Select the nth database | kbd:[Ctrl + <n>], where kbd:[<n>] is the number of the database tab
|
||||
|Toggle Passwords Hidden | kbd:[Ctrl + Shift + C]
|
||||
|Toggle Usernames Hidden | kbd:[Ctrl + Shift + B]
|
||||
|Focus Groups (edit if focused) | kbd:[F1]
|
||||
|Focus Entries (edit if focused) | kbd:[F2]
|
||||
|Focus Search | kbd:[F3] +
|
||||
_or_ +
|
||||
kbd:[Ctrl + F]
|
||||
|Clear Search | kbd:[Esc]
|
||||
|Show Keyboard Shortcuts | kbd:[Ctrl + /]
|
||||
|===
|
||||
// end::content[]
|
||||
|
|
|
@ -19,8 +19,8 @@ image::password_generator.png[]
|
|||
|
||||
3. Select the length of the desired password by dragging the Length slider.
|
||||
4. Select the character-sets that you want to include in your password.
|
||||
5. Use the regenerate button (Ctrl + R) to make a new password using the chosen options.
|
||||
6. Use the clipboard button (Ctrl + C) to copy the generated password to the clipboard.
|
||||
5. Use the regenerate button (kbd:[Ctrl + R]) to make a new password using the chosen options.
|
||||
6. Use the clipboard button (kbd:[Ctrl + C]) to copy the generated password to the clipboard.
|
||||
7. Click the Advanced button to specify additional conditions for your desired password.
|
||||
+
|
||||
.Advanced Password Generator Options
|
||||
|
@ -39,6 +39,6 @@ Word Count slider.
|
|||
3. In the Word Separator field, enter a character, word, number, or space that you want to use as a separator between the words in your passphrase.
|
||||
4. _(Optional)_ You can choose a word case between lower, upper, and title case options.
|
||||
5. _(Optional)_ You can also load your own custom word lists. Click the plus sign button to the right of the wordlist selection dialog to choose a custom word list. You can download alternative lists from the https://www.eff.org/deeplinks/2016/07/new-wordlists-random-passphrases[EFF's Website] or from https://github.com/redacted/XKCD-password-generator#additional-languages[GitHub].
|
||||
6. Click the Regenerate button (Ctrl + R) to generate a new random passphrase.
|
||||
7. Click the Clipboard button (Ctrl + C) to copy the passphrase to the clipboard.
|
||||
6. Click the Regenerate button (kbd:[Ctrl + R]) to generate a new random passphrase.
|
||||
7. Click the Clipboard button (kbd:[Ctrl + C]) to copy the passphrase to the clipboard.
|
||||
// end::content[]
|
||||
|
|
|
@ -77,8 +77,8 @@ Examples: +
|
|||
|Press the corresponding keyboard key
|
||||
|
||||
|{UP}, {DOWN}, {LEFT}, {RIGHT} |Press the corresponding arrow key
|
||||
|{F1}, {F2}, ..., {F16} |Press F1, F2, etc.
|
||||
|{LEFTBRACE}, {RIGHTBRACE} |Press `{` or `}`, respectively
|
||||
|{F1}, {F2}, ..., {F16} |Press kbd:[F1], kbd:[F2], etc.
|
||||
|{LEFTBRACE}, {RIGHTBRACE} |Press kbd:[{] or kbd:[}], respectively
|
||||
|{<KEY> X} |Repeat <KEY> X times (e.g., {SPACE 5} inserts five spaces)
|
||||
|{DELAY=X} |Set delay between key presses to X milliseconds
|
||||
|{DELAY X} |Pause typing for X milliseconds
|
||||
|
@ -90,10 +90,10 @@ Examples: +
|
|||
|===
|
||||
|Modifier |Description
|
||||
|
||||
|+ |SHIFT
|
||||
|^ |CTRL
|
||||
|% |ALT
|
||||
|# |WIN/CMD
|
||||
|+ |kbd:[Shift]
|
||||
|^ |kbd:[Ctrl]
|
||||
|% |kbd:[Alt]
|
||||
|# |kbd:[Win]/kbd:[Cmd]
|
||||
|===
|
||||
*Text Conversions:*
|
||||
|
||||
|
|
|
@ -58,7 +58,12 @@ if(UNIX AND NOT APPLE AND NOT HAIKU)
|
|||
EXCLUDE PATTERN "actions" EXCLUDE PATTERN "categories" EXCLUDE)
|
||||
endif(KEEPASSXC_DIST_FLATPAK)
|
||||
configure_file(linux/${APP_ID}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/linux/${APP_ID}.desktop @ONLY)
|
||||
configure_file(linux/${APP_ID}.policy.in ${CMAKE_CURRENT_BINARY_DIR}/linux/${APP_ID}.policy @ONLY)
|
||||
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/linux/${APP_ID}.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
|
||||
if("${CMAKE_SYSTEM}" MATCHES "Linux")
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/linux/${APP_ID}.policy DESTINATION ${CMAKE_INSTALL_DATADIR}/polkit-1/actions)
|
||||
endif()
|
||||
install(FILES linux/${APP_ID}.appdata.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
|
||||
endif(UNIX AND NOT APPLE AND NOT HAIKU)
|
||||
|
||||
|
|
1
share/icons/application/scalable/actions/remote-sync.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.03 18C13.08 18.7 13.24 19.38 13.5 20H6.5C5 20 3.69 19.5 2.61 18.43C1.54 17.38 1 16.09 1 14.58C1 13.28 1.39 12.12 2.17 11.1S4 9.43 5.25 9.15C5.67 7.62 6.5 6.38 7.75 5.43S10.42 4 12 4C13.95 4 15.6 4.68 16.96 6.04C18.32 7.4 19 9.05 19 11C19.04 11 19.07 11 19.1 11C18.36 11.07 17.65 11.23 17 11.5V11C17 9.62 16.5 8.44 15.54 7.46C14.56 6.5 13.38 6 12 6S9.44 6.5 8.46 7.46C7.5 8.44 7 9.62 7 11H6.5C5.53 11 4.71 11.34 4.03 12.03C3.34 12.71 3 13.53 3 14.5S3.34 16.29 4.03 17C4.71 17.66 5.53 18 6.5 18H13.03M19 13.5V12L16.75 14.25L19 16.5V15C20.38 15 21.5 16.12 21.5 17.5C21.5 17.9 21.41 18.28 21.24 18.62L22.33 19.71C22.75 19.08 23 18.32 23 17.5C23 15.29 21.21 13.5 19 13.5M19 20C17.62 20 16.5 18.88 16.5 17.5C16.5 17.1 16.59 16.72 16.76 16.38L15.67 15.29C15.25 15.92 15 16.68 15 17.5C15 19.71 16.79 21.5 19 21.5V23L21.25 20.75L19 18.5V20Z" /></svg>
|
After Width: | Height: | Size: 914 B |
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.47 15.08L11 13V7H12.5V12.25L15.58 14.08C15.17 14.36 14.79 14.7 14.47 15.08M13.08 19.92C12.72 19.97 12.37 20 12 20C7.58 20 4 16.42 4 12S7.58 4 12 4 20 7.58 20 12C20 12.37 19.97 12.72 19.92 13.08C20.61 13.18 21.25 13.4 21.84 13.72C21.94 13.16 22 12.59 22 12C22 6.5 17.5 2 12 2S2 6.5 2 12C2 17.5 6.47 22 12 22C12.59 22 13.16 21.94 13.72 21.84C13.4 21.25 13.18 20.61 13.08 19.92M21.12 15.46L19 17.59L16.88 15.47L15.47 16.88L17.59 19L15.47 21.12L16.88 22.54L19 20.41L21.12 22.54L22.54 21.12L20.41 19L22.54 16.88L21.12 15.46Z" /></svg>
|
After Width: | Height: | Size: 602 B |
|
@ -76,6 +76,7 @@
|
|||
<file>application/scalable/actions/proton.svg</file>
|
||||
<file>application/scalable/actions/qrcode.svg</file>
|
||||
<file>application/scalable/actions/refresh.svg</file>
|
||||
<file>application/scalable/actions/remote-sync.svg</file>
|
||||
<file>application/scalable/actions/reports.svg</file>
|
||||
<file>application/scalable/actions/reports-exclude.svg</file>
|
||||
<file>application/scalable/actions/sort-alphabetical-ascending.svg</file>
|
||||
|
@ -91,6 +92,7 @@
|
|||
<file>application/scalable/actions/totp-copy.svg</file>
|
||||
<file>application/scalable/actions/totp-copy-password.svg</file>
|
||||
<file>application/scalable/actions/totp-edit.svg</file>
|
||||
<file>application/scalable/actions/totp-invalid.svg</file>
|
||||
<file>application/scalable/actions/trash.svg</file>
|
||||
<file>application/scalable/actions/url-copy.svg</file>
|
||||
<file>application/scalable/actions/user-guide.svg</file>
|
||||
|
|
|
@ -52,6 +52,13 @@
|
|||
</screenshots>
|
||||
|
||||
<releases>
|
||||
<release version="2.8.0" date="2025-01-01">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Placeholder for future release notes</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.7.10" date="2025-03-02">
|
||||
<description>
|
||||
<ul>
|
||||
|
|
18
share/linux/org.keepassxc.KeePassXC.policy.in
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE policyconfig PUBLIC
|
||||
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
|
||||
<policyconfig>
|
||||
<vendor>KeePassXC Developers</vendor>
|
||||
<vendor_url></vendor_url>
|
||||
<icon_name>@APP_ICON_NAME@</icon_name>
|
||||
|
||||
<action id="org.keepassxc.KeePassXC.unlockDatabase">
|
||||
<description>Quick Unlock for a KeePassXC Database</description>
|
||||
<message>Authentication is required to unlock a KeePassXC Database</message>
|
||||
<defaults>
|
||||
<allow_inactive>no</allow_inactive>
|
||||
<allow_active>auth_self</allow_active>
|
||||
</defaults>
|
||||
</action>
|
||||
</policyconfig>
|
0
share/macosx/keepassxc.iconset/icon_128x128.png
Executable file → Normal file
Before Width: | Height: | Size: 8 KiB After Width: | Height: | Size: 8 KiB |
0
share/macosx/keepassxc.iconset/icon_128x128@2x.png
Executable file → Normal file
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
0
share/macosx/keepassxc.iconset/icon_16x16.png
Executable file → Normal file
Before Width: | Height: | Size: 708 B After Width: | Height: | Size: 708 B |
0
share/macosx/keepassxc.iconset/icon_16x16@2x.png
Executable file → Normal file
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
0
share/macosx/keepassxc.iconset/icon_256x256.png
Executable file → Normal file
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
0
share/macosx/keepassxc.iconset/icon_256x256@2x.png
Executable file → Normal file
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
0
share/macosx/keepassxc.iconset/icon_32x32.png
Executable file → Normal file
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
0
share/macosx/keepassxc.iconset/icon_32x32@2x.png
Executable file → Normal file
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
0
share/macosx/keepassxc.iconset/icon_512x512.png
Executable file → Normal file
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
0
share/macosx/keepassxc.iconset/icon_512x512@2x.png
Executable file → Normal file
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
|
@ -11,7 +11,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source>
|
||||
<translation>Informeu d'errors a: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation>
|
||||
<translation>Reporteu errors a: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
|
||||
|
@ -50,7 +50,7 @@
|
|||
<name>AccessControlDialog</name>
|
||||
<message>
|
||||
<source>KeePassXC - Access Request</source>
|
||||
<translation>KeePassXC - Sol·licitud d'accés</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Non-existing/inaccessible executable path. Please double-check the client is legit.</source>
|
||||
|
@ -78,7 +78,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Details</source>
|
||||
<translation>Detalls</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remember</source>
|
||||
|
@ -94,18 +94,18 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Deny All && Future</source>
|
||||
<translation>Denegar-ho tot & Futur</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow All && &Future</source>
|
||||
<translation>Permet-ho tot & Futur</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AccessControlDialog::DenyButton</name>
|
||||
<message>
|
||||
<source>Deny for this program</source>
|
||||
<translation>Denega per a aquest programa</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -116,7 +116,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Use Pageant</source>
|
||||
<translation>Usa Pageant</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use OpenSSH</source>
|
||||
|
@ -124,7 +124,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>SSH_AUTH_SOCK override</source>
|
||||
<translation>SSH_AUTH_SOCK override</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>SSH_AUTH_SOCK value</source>
|
||||
|
@ -140,7 +140,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>SSH_SK_PROVIDER override</source>
|
||||
<translation>SSH_SK_PROVIDER override</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>No SSH Agent socket available. Either make sure SSH_AUTH_SOCK environment variable exists or set an override.</source>
|
||||
|
@ -150,16 +150,12 @@
|
|||
<source>SSH Agent connection is working!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use both agents</source>
|
||||
<translation>Usa ambdós agents</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidget</name>
|
||||
<message>
|
||||
<source>Application Settings</source>
|
||||
<translation>Paràmetres de l'aplicació</translation>
|
||||
<translation>Configuració de l'aplicació</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>General</source>
|
||||
|
@ -225,10 +221,6 @@
|
|||
<source>Select backup storage directory</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This setting cannot be enabled when minimize on unlock is enabled.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetGeneral</name>
|
||||
|
@ -278,12 +270,12 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>On database unlock, show entries that </source>
|
||||
<translation>Al desbloquejar la base de dades, mostra les entrades que </translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>have expired</source>
|
||||
<comment>On database unlock, show entries that...</comment>
|
||||
<translation>ha caducat</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> days</source>
|
||||
|
@ -414,7 +406,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Use monospaced font for notes</source>
|
||||
<translation>Fer servir fonts monoespaiada per les notes</translation>
|
||||
<translation>Usa lletra monoespaiada per a les notes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Minimize instead of app exit</source>
|
||||
|
@ -497,14 +489,6 @@
|
|||
<source>Remember last typed entry for:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> recent files</source>
|
||||
<translation> fitxers recents</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show passwords in color</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetSecurity</name>
|
||||
|
@ -603,7 +587,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Auto-Type Error</source>
|
||||
<translation>Error de tecleig automàtic</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Permission Required</source>
|
||||
|
@ -619,7 +603,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Invalid entry provided</source>
|
||||
<translation>Entrada proporcionada no vàlida</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bracket imbalance detected, found extra { or }</source>
|
||||
|
@ -654,10 +638,6 @@
|
|||
<source>Invalid placeholder: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry does not have attribute for PICKCHARS: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AutoTypeAssociationsModel</name>
|
||||
|
@ -705,7 +685,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Sequence aborted: Caps Lock is on</source>
|
||||
<translation>Seqüència avortada: el bloqueig de majúscules està activat</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sequence aborted: Modifier keys held by user</source>
|
||||
|
@ -737,11 +717,11 @@ Ctrl+4 - Use Virtual Keyboard (Windows Only)</p></source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Search all open databases</source>
|
||||
<translation>Cerca totes les bases de dades obertes</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search…</source>
|
||||
<translation>Cerca...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type Sequence</source>
|
||||
|
@ -765,19 +745,19 @@ Ctrl+4 - Use Virtual Keyboard (Windows Only)</p></source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Copy Username</source>
|
||||
<translation>Copia el nom d'usuari</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy Password</source>
|
||||
<translation>Copia la contrasenya</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy TOTP</source>
|
||||
<translation>Copia TOTP</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use Virtual Keyboard</source>
|
||||
<translation>Utilitza el teclat virtual</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -804,11 +784,11 @@ Ctrl+4 - Use Virtual Keyboard (Windows Only)</p></source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Allow Selected</source>
|
||||
<translation>Permet la selecció</translation>
|
||||
<translation>Permet els seleccionats</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Deny All</source>
|
||||
<translation>Denegar tot</translation>
|
||||
<translation>Denega-ho tot</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable for this site</source>
|
||||
|
@ -1095,7 +1075,7 @@ Would you like to migrate your existing settings now?</source>
|
|||
<message>
|
||||
<source>Browse…</source>
|
||||
<extracomment>Button for opening file dialog</extracomment>
|
||||
<translation>Explora...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use a custom browser configuration location:</source>
|
||||
|
@ -1429,6 +1409,10 @@ Còpia de seguretat de la base de dades situada a %2</translation>
|
|||
<source>Key File:</source>
|
||||
<translation>Fitxer clau:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file help</source>
|
||||
<translation type="unfinished"/>
|
||||
|
@ -1441,13 +1425,18 @@ Còpia de seguretat de la base de dades situada a %2</translation>
|
|||
<source>Hardware Key:</source>
|
||||
<translation>Motxilla:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hardware key help</source>
|
||||
<translation>Ajuda de la motxilla</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file to unlock the database</source>
|
||||
<translation>Fitxer clau per desbloquejar la base de dades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for key file</source>
|
||||
|
@ -1455,7 +1444,7 @@ Còpia de seguretat de la base de dades situada a %2</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation>Explora...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh hardware tokens</source>
|
||||
|
@ -1467,7 +1456,7 @@ Còpia de seguretat de la base de dades situada a %2</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>Unlock Database</source>
|
||||
<translation>Desbloqueja la base de dades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cancel</source>
|
||||
|
@ -1475,7 +1464,7 @@ Còpia de seguretat de la base de dades situada a %2</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>Unlock</source>
|
||||
<translation>Desbloqueja</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue…</source>
|
||||
|
@ -1501,7 +1490,7 @@ We recommend you update your KeePassXC installation.</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Database unlock canceled.</source>
|
||||
<translation>Desbloqueig de la base de dades cancel·lat.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock failed and no password given</source>
|
||||
|
@ -1575,15 +1564,6 @@ If you do not have a key file, please leave the field empty.</source>
|
|||
<source>Select hardware key…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseSettingWidgetMetaData</name>
|
||||
|
@ -1608,7 +1588,7 @@ If you do not have a key file, please leave the field empty.</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Database Credentials</source>
|
||||
<translation>Credencials de la base de dades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Settings</source>
|
||||
|
@ -1663,7 +1643,7 @@ If you do not have a key file, please leave the field empty.</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Remove</source>
|
||||
<translation>Suprimiu</translation>
|
||||
<translation>Suprimeix</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete the selected key?</source>
|
||||
|
@ -2223,21 +2203,13 @@ This is definitely a bug, please report it to the developers.</source>
|
|||
<comment>Database tab name modifier</comment>
|
||||
<translation>%1 [bloquejat]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Export database to XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Writing the XML file failed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseWidget</name>
|
||||
<message>
|
||||
<source>Database Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searching…</source>
|
||||
<translation type="unfinished"/>
|
||||
|
@ -2284,7 +2256,7 @@ This is definitely a bug, please report it to the developers.</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Expired entries</source>
|
||||
<translation>Entrades caducades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>No current database.</source>
|
||||
|
@ -2404,22 +2376,6 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
|
|||
<source>Entries expiring within %1 day(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searches and Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a unique name or overwrite an existing search from the list:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
<translation>Desa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidget</name>
|
||||
|
@ -2556,6 +2512,10 @@ Would you like to correct it?</source>
|
|||
<source>Hide</source>
|
||||
<translation>Oculta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tomorrow</source>
|
||||
<translation>Demà</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n week(s)</source>
|
||||
<translation><numerusform>% n setmana/es</numerusform><numerusform>%n setmana/es</numerusform></translation>
|
||||
|
@ -2568,10 +2528,6 @@ Would you like to correct it?</source>
|
|||
<source>%n year(s)</source>
|
||||
<translation><numerusform>% n any/s</numerusform><numerusform>%n any/s</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n hour(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidgetAdvanced</name>
|
||||
|
@ -2959,7 +2915,7 @@ Would you like to correct it?</source>
|
|||
<message>
|
||||
<source>Browse…</source>
|
||||
<extracomment>Button for opening file dialog</extracomment>
|
||||
<translation>Explora...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Attachment</source>
|
||||
|
@ -3087,14 +3043,6 @@ Would you like to correct it?</source>
|
|||
<source>Do not use HTTP Auth toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditGroupWidgetKeeShare</name>
|
||||
|
@ -3128,7 +3076,7 @@ Would you like to correct it?</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation>Explora...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear fields</source>
|
||||
|
@ -3676,10 +3624,6 @@ Error: %1</source>
|
|||
<source>Auto-Type</source>
|
||||
<translation>Compleció automàtica</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryModel</name>
|
||||
|
@ -3786,14 +3730,14 @@ Error: %1</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Has TOTP</source>
|
||||
<translation>Disposa de TOTP</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryPreviewWidget</name>
|
||||
<message>
|
||||
<source>Display current TOTP value</source>
|
||||
<translation>Mostra el valor actual de TOTP</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Close</source>
|
||||
|
@ -3887,10 +3831,6 @@ Error: %1</source>
|
|||
<source>Disabled</source>
|
||||
<translation>Inhabilitat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double click to copy value</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryURLModel</name>
|
||||
|
@ -4808,7 +4748,7 @@ If this reoccurs, then your database file may be corrupt.</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
|
||||
<translation>Nota: NO utilitzeu un fitxer que pugui canviar, ja que us impedirà desbloquejar la base de dades.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for key file</source>
|
||||
|
@ -4816,7 +4756,7 @@ If this reoccurs, then your database file may be corrupt.</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation>Explora...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Old key file format</source>
|
||||
|
@ -5060,7 +5000,7 @@ Are you sure you want to continue with this file?</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Database &Reports…</source>
|
||||
<translation>Informes de la base de dades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Statistics, health check, etc.</source>
|
||||
|
@ -5132,11 +5072,11 @@ Are you sure you want to continue with this file?</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>&Lock Database</source>
|
||||
<translation>B&loqueja la base de dades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Lock &All Databases</source>
|
||||
<translation>Bloqueja totes les bases de dades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Title</source>
|
||||
|
@ -5200,11 +5140,11 @@ Are you sure you want to continue with this file?</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Show QR Code</source>
|
||||
<translation>Mostra el codi QR</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set up TOTP…</source>
|
||||
<translation>Configura el TOTP...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy &TOTP</source>
|
||||
|
@ -5252,7 +5192,7 @@ Are you sure you want to continue with this file?</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Save Database Backup…</source>
|
||||
<translation>Desa una còpia de seguretat...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Add key to SSH Agent</source>
|
||||
|
@ -5276,11 +5216,11 @@ Are you sure you want to continue with this file?</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Dark</source>
|
||||
<translation>Fosc</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Classic (Platform-native)</source>
|
||||
<translation>Clàssic (natiu de la plataforma)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show Toolbar</source>
|
||||
|
@ -5374,30 +5314,6 @@ We recommend you use the AppImage available on our downloads page.</source>
|
|||
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>No Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 Entry(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy Password and TOTP</source>
|
||||
<translation>Copia la contrasenya i el TOTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ManageDatabase</name>
|
||||
|
@ -5547,7 +5463,7 @@ We recommend you use the AppImage available on our downloads page.</source>
|
|||
<name>NewDatabaseWizardPageDatabaseKey</name>
|
||||
<message>
|
||||
<source>Database Credentials</source>
|
||||
<translation>Credencials de la base de dades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>A set of credentials known only to you that protects your database.</source>
|
||||
|
@ -5768,6 +5684,29 @@ We recommend you use the AppImage available on our downloads page.</source>
|
|||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEdit</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEditWidget</name>
|
||||
<message>
|
||||
|
@ -5946,6 +5885,10 @@ We recommend you use the AppImage available on our downloads page.</source>
|
|||
<source>Also choose from:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exclude look-alike characters</source>
|
||||
<translation>Excloure caràcters d'aspecte semblant</translation>
|
||||
|
@ -6095,57 +6038,6 @@ Do you want to overwrite it?</source>
|
|||
<comment>Password quality</comment>
|
||||
<translation>Excel·lent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordWidget</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quality: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Poor</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Pobre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Weak</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Feble</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Good</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Bona</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excellent</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Excel·lent</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PickcharsDialog</name>
|
||||
|
@ -6490,7 +6382,7 @@ Do you want to overwrite it?</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Copy the current TOTP to the clipboard (equivalent to "-a totp").</source>
|
||||
<translation>Copia el TOTP actual al porta-retalls (equivalent a "-a totp").</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Must match only one entry, otherwise a list of possible matches is shown.</source>
|
||||
|
@ -6527,11 +6419,11 @@ Do you want to overwrite it?</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>ERROR: Please specify one of --attribute or --totp, not both.</source>
|
||||
<translation>ERROR: Especifiqueu un, --atribut o --totp, no tots dos.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry with path %1 has no TOTP set up.</source>
|
||||
<translation>L'entrada amb la ruta %1 no té configurat TOTP.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>ERROR: attribute %1 is ambiguous, it matches %2.</source>
|
||||
|
@ -7203,7 +7095,7 @@ Available commands:
|
|||
</message>
|
||||
<message>
|
||||
<source>Show the entry's current TOTP.</source>
|
||||
<translation>Mostra el TOTP actual de l'entrada.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show the protected attributes in clear text.</source>
|
||||
|
@ -7276,6 +7168,10 @@ Please consider generating a new key file.</source>
|
|||
<source>Invalid YubiKey serial %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter password to encrypt database (optional): </source>
|
||||
<translation type="unfinished"/>
|
||||
|
@ -7423,7 +7319,7 @@ Nucli: %3 %4</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>Quick Unlock</source>
|
||||
<translation>Desbloqueig ràpid</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Secret Service Integration</source>
|
||||
|
@ -7649,11 +7545,11 @@ Nucli: %3 %4</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>Browser Statistics</source>
|
||||
<translation>Estadístiques del navegador</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Health Check</source>
|
||||
<translation>Informe de salut</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>HIBP</source>
|
||||
|
@ -7661,7 +7557,7 @@ Nucli: %3 %4</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>Statistics</source>
|
||||
<translation>Estadístiques</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unsupported key file version: %1</source>
|
||||
|
@ -7693,7 +7589,7 @@ Nucli: %3 %4</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>lock all open databases</source>
|
||||
<translation>bloqueja totes les bases de dades obertes</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>key file of the database</source>
|
||||
|
@ -7709,11 +7605,11 @@ Nucli: %3 %4</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>Locked databases.</source>
|
||||
<translation>Bases de dades bloquejades.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database failed to lock.</source>
|
||||
<translation>La base de dades no s'ha pogut bloquejar.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Another instance of KeePassXC is already running.</source>
|
||||
|
@ -7753,67 +7649,6 @@ Nucli: %3 %4</translation>
|
|||
<source>Failed to sign challenge using Windows Hello.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all the attributes of the entry.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not change the database key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database was not modified.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully edited the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading the new key file failed: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the password for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the key file for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot use %1 and %2 at the same time.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove all the keys from a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove password: The database does not have a password.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove file key: The database does not have a file key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Found unexpected Key type %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the key file for the database.
|
||||
This options is deprecated, use --set-key-file instead.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QtIOCompressor</name>
|
||||
|
@ -8361,10 +8196,6 @@ This options is deprecated, use --set-key-file instead.</source>
|
|||
<source>Limit search to selected group</source>
|
||||
<translation>Limitar la cerca al grup seleccionat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsClientModel</name>
|
||||
|
@ -8577,39 +8408,16 @@ This options is deprecated, use --set-key-file instead.</source>
|
|||
</context>
|
||||
<context>
|
||||
<name>TagModel</name>
|
||||
<message>
|
||||
<source>All</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expired</source>
|
||||
<translation>Caducades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Weak Passwords</source>
|
||||
<translation>Contrasenyes febles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>All Entries</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TagView</name>
|
||||
<message>
|
||||
<source>Remove Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirm Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove tag "%1" from all entries in this database?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
|
@ -8641,7 +8449,7 @@ This options is deprecated, use --set-key-file instead.</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>There was an error creating the QR code.</source>
|
||||
<translation>Hi hagut un error creant el codi QR</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Closing in %1 seconds.</source>
|
||||
|
@ -8709,7 +8517,7 @@ This options is deprecated, use --set-key-file instead.</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Invalid TOTP Secret</source>
|
||||
<translation>Secret de TOTP no vàlid</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>You have entered an invalid secret key. The key must be in Base32 format.
|
||||
|
@ -8718,7 +8526,7 @@ Example: JBSWY3DPEHPK3PXP</source>
|
|||
</message>
|
||||
<message>
|
||||
<source>Confirm Remove TOTP Settings</source>
|
||||
<translation>Confirma l'eliminació de la configuració de TOTP</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Are you sure you want to delete TOTP settings for this entry?</source>
|
||||
|
|
|
@ -150,10 +150,6 @@
|
|||
<source>SSH Agent connection is working!</source>
|
||||
<translation>SSH Agent veza radi!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use both agents</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidget</name>
|
||||
|
@ -225,10 +221,6 @@
|
|||
<source>Select backup storage directory</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This setting cannot be enabled when minimize on unlock is enabled.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetGeneral</name>
|
||||
|
@ -497,14 +489,6 @@
|
|||
<source>Remember last typed entry for:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> recent files</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show passwords in color</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetSecurity</name>
|
||||
|
@ -654,10 +638,6 @@
|
|||
<source>Invalid placeholder: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry does not have attribute for PICKCHARS: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AutoTypeAssociationsModel</name>
|
||||
|
@ -1437,6 +1417,10 @@ Sigurnosna kopija baza podataka nalazi se na %2</translation>
|
|||
<source>Key File:</source>
|
||||
<translation>Datoteka ključa:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file help</source>
|
||||
<translation>Datoteka ključa pomoć</translation>
|
||||
|
@ -1449,6 +1433,11 @@ Sigurnosna kopija baza podataka nalazi se na %2</translation>
|
|||
<source>Hardware Key:</source>
|
||||
<translation>Hardverski ključ:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hardware key help</source>
|
||||
<translation>Hardverski ključ pomoć</translation>
|
||||
|
@ -1584,15 +1573,6 @@ Ako nemate datoteku ključa, ostavite polje prazno.</translation>
|
|||
<source>Select hardware key…</source>
|
||||
<translation>Odaberite hardverski ključ...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseSettingWidgetMetaData</name>
|
||||
|
@ -2239,21 +2219,13 @@ Ovo je definitivno pogreška, molimo prijavite to programerima.</translation>
|
|||
<comment>Database tab name modifier</comment>
|
||||
<translation>%1 [Zaključano]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Export database to XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Writing the XML file failed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseWidget</name>
|
||||
<message>
|
||||
<source>Database Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searching…</source>
|
||||
<translation type="unfinished"/>
|
||||
|
@ -2418,22 +2390,6 @@ Disable safe saves and try again?</source>
|
|||
<source>Entries expiring within %1 day(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searches and Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a unique name or overwrite an existing search from the list:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
<translation>Spremi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidget</name>
|
||||
|
@ -2570,6 +2526,10 @@ Would you like to correct it?</source>
|
|||
<source>Hide</source>
|
||||
<translation>Sakrij</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tomorrow</source>
|
||||
<translation>Sutra</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n week(s)</source>
|
||||
<translation><numerusform>%n tjedan</numerusform><numerusform>%n tjedana</numerusform><numerusform>%n tjedana</numerusform></translation>
|
||||
|
@ -2582,10 +2542,6 @@ Would you like to correct it?</source>
|
|||
<source>%n year(s)</source>
|
||||
<translation><numerusform>%n godina</numerusform><numerusform>%n godine</numerusform><numerusform>%n godina</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n hour(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidgetAdvanced</name>
|
||||
|
@ -3101,14 +3057,6 @@ Would you like to correct it?</source>
|
|||
<source>Do not use HTTP Auth toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditGroupWidgetKeeShare</name>
|
||||
|
@ -3690,10 +3638,6 @@ Error: %1</source>
|
|||
<source>Auto-Type</source>
|
||||
<translation>Auto-tipkanje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryModel</name>
|
||||
|
@ -3901,10 +3845,6 @@ Error: %1</source>
|
|||
<source>Disabled</source>
|
||||
<translation>Onemogući</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double click to copy value</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryURLModel</name>
|
||||
|
@ -5389,30 +5329,6 @@ We recommend you use the AppImage available on our downloads page.</source>
|
|||
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
|
||||
<translation>Morate ponovno pokrenuti aplikaciju da biste primijenili tu postavku. Želite li ju ponovno pokrenuti sada?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>No Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 Entry(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy Password and TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ManageDatabase</name>
|
||||
|
@ -5783,6 +5699,29 @@ We recommend you use the AppImage available on our downloads page.</source>
|
|||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEdit</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation>Lozinke se ne podudaraju</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation>Lozinke se zasad podudaraju</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation>Proizvedi Lozinku (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation>Upozorenje: Caps Lock uključen!</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEditWidget</name>
|
||||
<message>
|
||||
|
@ -5961,6 +5900,10 @@ We recommend you use the AppImage available on our downloads page.</source>
|
|||
<source>Also choose from:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation>Izostavi znakove: "0", "1", "l", "I", "O", "|", "".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exclude look-alike characters</source>
|
||||
<translation>Izostavi slične znakove</translation>
|
||||
|
@ -6110,57 +6053,6 @@ Do you want to overwrite it?</source>
|
|||
<comment>Password quality</comment>
|
||||
<translation>Izvrsna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation>Izostavi znakove: "0", "1", "l", "I", "O", "|", "".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordWidget</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation>Lozinke se ne podudaraju</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation>Lozinke se zasad podudaraju</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation>Proizvedi Lozinku (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation>Upozorenje: Caps Lock uključen!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quality: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Poor</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>bijedna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Weak</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Slaba</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Good</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Dobra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excellent</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Izvrsna</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PickcharsDialog</name>
|
||||
|
@ -7293,6 +7185,10 @@ Please consider generating a new key file.</source>
|
|||
<source>Invalid YubiKey serial %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter password to encrypt database (optional): </source>
|
||||
<translation type="unfinished"/>
|
||||
|
@ -7768,67 +7664,6 @@ Kernel: %3 %4</source>
|
|||
<source>Failed to sign challenge using Windows Hello.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all the attributes of the entry.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not change the database key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database was not modified.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully edited the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading the new key file failed: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the password for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the key file for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot use %1 and %2 at the same time.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove all the keys from a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove password: The database does not have a password.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove file key: The database does not have a file key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Found unexpected Key type %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the key file for the database.
|
||||
This options is deprecated, use --set-key-file instead.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QtIOCompressor</name>
|
||||
|
@ -8376,10 +8211,6 @@ This options is deprecated, use --set-key-file instead.</source>
|
|||
<source>Limit search to selected group</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsClientModel</name>
|
||||
|
@ -8592,6 +8423,10 @@ This options is deprecated, use --set-key-file instead.</source>
|
|||
</context>
|
||||
<context>
|
||||
<name>TagModel</name>
|
||||
<message>
|
||||
<source>All</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expired</source>
|
||||
<translation type="unfinished"/>
|
||||
|
@ -8600,33 +8435,6 @@ This options is deprecated, use --set-key-file instead.</source>
|
|||
<source>Weak Passwords</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>All Entries</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TagView</name>
|
||||
<message>
|
||||
<source>Remove Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirm Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove tag "%1" from all entries in this database?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TotpDialog</name>
|
||||
|
|
|
@ -1297,7 +1297,7 @@ Vuoi sovrascrivere la passkey in %1 - %2?</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>Browsers installed using Snap or Flatpak are not supported with exception to Firefox installed using Snap.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>I browser installati tramite Snap o Flatpak non sono supportati, ad eccezione di Firefox installato tramite Snap.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -1520,11 +1520,11 @@ Database di backup che si trova in %2</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>Database file read error.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Errore di lettura del file del database.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No file path was provided.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Non è stato fornito alcun percorso del file.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -2492,7 +2492,13 @@ exit
|
|||
{TEMP_DATABASE} is used as placeholder to store the database in a temporary location
|
||||
The command has to exit. In case of `sftp` as last command `exit` has to be sent
|
||||
</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ad es.:
|
||||
get DatabaseOnRemote.kdbx {TEMP_DATABASE}
|
||||
exit
|
||||
---
|
||||
{TEMP_DATABASE} è utilizzato come segnaposto per memorizzare il database in una posizione temporanea
|
||||
Il comando deve uscire. In caso di `sftp` come ultimo comando `exit` deve essere inviato
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>e.g.:
|
||||
|
@ -2502,7 +2508,13 @@ exit
|
|||
{TEMP_DATABASE} is used as placeholder to store the database in a temporary location
|
||||
The command has to exit. In case of `sftp` as last command `exit` has to be sent
|
||||
</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ad es.:
|
||||
put {TEMP_DATABASE} DatabaseOnRemote.kdbx
|
||||
exit
|
||||
---
|
||||
{TEMP_DATABASE} è utilizzato come segnaposto per memorizzare il database in una posizione temporanea
|
||||
Il comando deve uscire. In caso di `sftp` come ultimo comando `exit` deve essere inviato
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Timeout:</source>
|
||||
|
@ -2803,47 +2815,47 @@ Vuoi disabilitare i salvataggi sicuri e riprovare?</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>The database file "%1" was modified externally</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Il file di database "%1" è stato modificato esternamente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you want to load the changes?</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Vuoi caricare le modifiche?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reload database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ricarica il database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reloading database…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ricaricamento del database…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reload canceled</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ricaricamento annullato</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reload successful</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ricaricamento completato correttamente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reload pending user action…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ricaricamento in attesa di azione dell'utente...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The database file "%1" was modified externally.<br>How would you like to proceed?<br><br>Merge all changes<br>Ignore the changes on disk until save<br>Discard unsaved changes</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Il file di database "%1" è stato modificato esternamente.<br> Come desideri procedere?<br><br>Unisci tutte le modifiche<br>Ignora le modifiche sul disco fino al salvataggio<br>Ignora le modifiche non salvate</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The database file "%1" was modified externally.<br>How would you like to proceed?<br><br>Merge all changes then save<br>Overwrite the changes on disk<br>Discard unsaved changes</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Il file di database "%1" è stato modificato esternamente.<br>Come desideri procedere?<br><br>Unisci tutte le modifiche, quindi salva<br>Sovrascrivi le modifiche sul disco<br>Ignora le modifiche non salvate</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database file overwritten.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>File di database sovrascritto.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database file on disk cannot be unlocked with current credentials.<br>Enter new credentials and/or present hardware key to continue.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Il file del database sul disco non può essere sbloccato con le credenziali attuali.<br> Digita le nuove credenziali e/o presenta la chiave hardware per continuare.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -3433,7 +3445,7 @@ Vuoi correggerla?</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>Clear agent</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Cancella agent</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -4823,7 +4835,13 @@ exit
|
|||
{TEMP_DATABASE} is used as placeholder to store the database in a temporary location
|
||||
The command has to exit. In case of `sftp` as last commend `exit` has to be sent
|
||||
</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ad es.:
|
||||
get DatabaseOnRemote.kdbx {TEMP_DATABASE}
|
||||
exit
|
||||
---
|
||||
{TEMP_DATABASE} è utilizzato come segnaposto per memorizzare il database in una posizione temporanea
|
||||
Il comando deve uscire. In caso di `sftp` come ultimo comando `exit` deve essere inviato
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remote Database (.kdbx)</source>
|
||||
|
@ -6320,11 +6338,11 @@ Aspettatevi alcuni bug e problemi minori, questa versione è pensata per scopi d
|
|||
</message>
|
||||
<message>
|
||||
<source>Clear SSH Agent</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Cancella SSH Agent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear all identities in ssh-agent</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Cancella tutte le identità in ssh-agent</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -9196,23 +9214,23 @@ Questa opzione è deprecata, utilizza invece --set-key-file.</translation>
|
|||
</message>
|
||||
<message>
|
||||
<source>Format to use when exporting. Available choices are 'xml', 'csv' or 'html'. Defaults to 'xml'.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Formato da utilizzare per l'esportazione. Scelte disponibili sono 'xml', 'csv' o 'html'. Predefinito è 'xml'.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>start minimized to the system tray</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>avvia minimizzato nell'area di notifica di sistema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>malformed string, possible unescaped delimiter</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>stringa non valida, possibile delimitatore senza escape</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>missing closing delimiter</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>delimitatore di chiusura mancante</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1, row: %2, column: %3</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1, riga: %2, colonna: %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
|
@ -9796,11 +9814,11 @@ La funzionalità di rete è richiesta per verificare la password con i database
|
|||
</message>
|
||||
<message>
|
||||
<source>Failed to remove all SSH identities from agent.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Rimozione delle identità SSH dall'agent non riuscite.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>All SSH identities removed from agent.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tutte le identità SSH rimosse dall'agent.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
|
|
@ -150,10 +150,6 @@
|
|||
<source>SSH Agent connection is working!</source>
|
||||
<translation>Povezava s SSH agentom deluje!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use both agents</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidget</name>
|
||||
|
@ -225,10 +221,6 @@
|
|||
<source>Select backup storage directory</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This setting cannot be enabled when minimize on unlock is enabled.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetGeneral</name>
|
||||
|
@ -497,14 +489,6 @@
|
|||
<source>Remember last typed entry for:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> recent files</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show passwords in color</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetSecurity</name>
|
||||
|
@ -654,10 +638,6 @@
|
|||
<source>Invalid placeholder: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry does not have attribute for PICKCHARS: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AutoTypeAssociationsModel</name>
|
||||
|
@ -1427,6 +1407,10 @@ Varnostna kopija baze se nahaja na %2</translation>
|
|||
<source>Key File:</source>
|
||||
<translation>Datoteka s ključi:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file help</source>
|
||||
<translation type="unfinished"/>
|
||||
|
@ -1439,6 +1423,11 @@ Varnostna kopija baze se nahaja na %2</translation>
|
|||
<source>Hardware Key:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hardware key help</source>
|
||||
<translation type="unfinished"/>
|
||||
|
@ -1573,15 +1562,6 @@ If you do not have a key file, please leave the field empty.</source>
|
|||
<source>Select hardware key…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseSettingWidgetMetaData</name>
|
||||
|
@ -2222,21 +2202,13 @@ This is definitely a bug, please report it to the developers.</source>
|
|||
<comment>Database tab name modifier</comment>
|
||||
<translation>%1 [Zaklenjeno]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Export database to XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Writing the XML file failed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseWidget</name>
|
||||
<message>
|
||||
<source>Database Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searching…</source>
|
||||
<translation type="unfinished"/>
|
||||
|
@ -2401,22 +2373,6 @@ Disable safe saves and try again?</source>
|
|||
<source>Entries expiring within %1 day(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searches and Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a unique name or overwrite an existing search from the list:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
<translation>Shrani</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidget</name>
|
||||
|
@ -2554,6 +2510,10 @@ Would you like to correct it?</source>
|
|||
<source>Hide</source>
|
||||
<translation>Skrij</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tomorrow</source>
|
||||
<translation>Jutri</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n week(s)</source>
|
||||
<translation><numerusform>%n ted(ov)</numerusform><numerusform>%n ted(ov)</numerusform><numerusform>%n ted(ov)</numerusform><numerusform>%n teden(ov)</numerusform></translation>
|
||||
|
@ -2566,10 +2526,6 @@ Would you like to correct it?</source>
|
|||
<source>%n year(s)</source>
|
||||
<translation><numerusform>%n let</numerusform><numerusform>%n let</numerusform><numerusform>%n let</numerusform><numerusform>%n let</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n hour(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidgetAdvanced</name>
|
||||
|
@ -3085,14 +3041,6 @@ Would you like to correct it?</source>
|
|||
<source>Do not use HTTP Auth toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditGroupWidgetKeeShare</name>
|
||||
|
@ -3675,10 +3623,6 @@ Error: %1</source>
|
|||
<source>Auto-Type</source>
|
||||
<translation>Samodejno tipkanje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryModel</name>
|
||||
|
@ -3886,10 +3830,6 @@ Error: %1</source>
|
|||
<source>Disabled</source>
|
||||
<translation>Onemogočen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double click to copy value</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryURLModel</name>
|
||||
|
@ -5379,30 +5319,6 @@ We recommend you use the AppImage available on our downloads page.</source>
|
|||
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
|
||||
<translation>Če želite uporabiti to nastavitev, morate znova zagnati aplikacijo. Ali želite znova zagnati zdaj?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>No Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 Entry(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy Password and TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ManageDatabase</name>
|
||||
|
@ -5773,6 +5689,29 @@ We recommend you use the AppImage available on our downloads page.</source>
|
|||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEdit</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEditWidget</name>
|
||||
<message>
|
||||
|
@ -5951,6 +5890,10 @@ We recommend you use the AppImage available on our downloads page.</source>
|
|||
<source>Also choose from:</source>
|
||||
<translation>Izberi tudi med:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exclude look-alike characters</source>
|
||||
<translation>Izključi podobne znake</translation>
|
||||
|
@ -6100,57 +6043,6 @@ Do you want to overwrite it?</source>
|
|||
<comment>Password quality</comment>
|
||||
<translation>Odlična</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordWidget</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quality: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Poor</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Slabo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Weak</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Šibko</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Good</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Dobra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excellent</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Odlična</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PickcharsDialog</name>
|
||||
|
@ -7279,6 +7171,10 @@ Please consider generating a new key file.</source>
|
|||
<source>Invalid YubiKey serial %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter password to encrypt database (optional): </source>
|
||||
<translation>Vnesite geslo za šifriranje baze (neobvezno): </translation>
|
||||
|
@ -7756,67 +7652,6 @@ Jedro: %3 %4</translation>
|
|||
<source>Failed to sign challenge using Windows Hello.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all the attributes of the entry.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not change the database key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database was not modified.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully edited the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading the new key file failed: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the password for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the key file for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot use %1 and %2 at the same time.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove all the keys from a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove password: The database does not have a password.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove file key: The database does not have a file key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Found unexpected Key type %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the key file for the database.
|
||||
This options is deprecated, use --set-key-file instead.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QtIOCompressor</name>
|
||||
|
@ -8364,10 +8199,6 @@ This options is deprecated, use --set-key-file instead.</source>
|
|||
<source>Limit search to selected group</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsClientModel</name>
|
||||
|
@ -8580,6 +8411,10 @@ This options is deprecated, use --set-key-file instead.</source>
|
|||
</context>
|
||||
<context>
|
||||
<name>TagModel</name>
|
||||
<message>
|
||||
<source>All</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expired</source>
|
||||
<translation type="unfinished"/>
|
||||
|
@ -8588,33 +8423,6 @@ This options is deprecated, use --set-key-file instead.</source>
|
|||
<source>Weak Passwords</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>All Entries</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TagView</name>
|
||||
<message>
|
||||
<source>Remove Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirm Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove tag "%1" from all entries in this database?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TotpDialog</name>
|
||||
|
|
|
@ -9224,15 +9224,15 @@ Bu seçenekler kullanımdan kaldırıldı. yerine --set-key-file kullanın.</tra
|
|||
</message>
|
||||
<message>
|
||||
<source>malformed string, possible unescaped delimiter</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>dizge bozuk, büyük olasılıkla kaçış karakteri olmayan tırnak var</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>missing closing delimiter</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>kapanış tırnağı eksik</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1, row: %2, column: %3</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1, %2. satır, %3. sütun</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
|
|
|
@ -73,6 +73,7 @@
|
|||
Name="KeePassXC - User Guide"
|
||||
Target="[#CM_FP_share.docs.KeePassXC_UserGuide.html]"
|
||||
WorkingDirectory="INSTALL_ROOT" />
|
||||
<RemoveFile Id="RemoveShortcuts" Name="*.*" On="uninstall" />
|
||||
<RemoveFolder Id="ApplicationProgramsFolder" On="uninstall" />
|
||||
<RegistryValue Root="HKCU" Key="Software\KeePassXC" Name="StartMenuShortcut" Type="integer" Value="1" KeyPath="yes"/>
|
||||
</Component>
|
||||
|
@ -115,14 +116,6 @@
|
|||
<ComponentRef Id="DesktopShortcut" />
|
||||
</FeatureRef>
|
||||
|
||||
<!-- Detect VCRedist Version -->
|
||||
<Property Id="VCREDISTINSTALLED">
|
||||
<RegistrySearch Id="SearchVCRedist" Root="HKLM" Key="SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64" Name="Version" Type="raw" Win64="yes"/>
|
||||
</Property>
|
||||
<Condition Message="The installed version of Visual Studio Redistributable is too old. Please install the latest version from: https://aka.ms/vs/17/release/vc_redist.x64.exe">
|
||||
<![CDATA[VCREDISTINSTALLED AND VCREDISTINSTALLED > "14.32.31332.0"]]>
|
||||
</Condition>
|
||||
|
||||
<!-- Action to launch application after installer exits -->
|
||||
<Property Id="WixShellExecTarget" Value="[#CM_FP_KeePassXC.exe]" />
|
||||
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
|
||||
|
|
|
@ -65,6 +65,7 @@ parts:
|
|||
- libxtst-dev
|
||||
- asciidoctor
|
||||
- libfreetype-dev
|
||||
- libkeyutils-dev
|
||||
stage-packages:
|
||||
- dbus
|
||||
- libbotan-2-19
|
||||
|
@ -76,6 +77,7 @@ parts:
|
|||
- libxtst6
|
||||
- libfreetype6
|
||||
- xclip
|
||||
- libkeyutils1
|
||||
lint:
|
||||
ignore:
|
||||
- library:
|
||||
|
|
|
@ -16,7 +16,19 @@
|
|||
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
set(keepassx_SOURCES
|
||||
add_feature_info(Auto-Type WITH_XC_AUTOTYPE "Automatic password typing")
|
||||
add_feature_info(Networking WITH_XC_NETWORKING "Compile KeePassXC with network access code (e.g. for downloading website icons)")
|
||||
add_feature_info(KeePassXC-Browser WITH_XC_BROWSER "Browser integration with KeePassXC-Browser")
|
||||
add_feature_info(Passkeys WITH_XC_BROWSER_PASSKEYS "Passkeys support for browser integration")
|
||||
add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent")
|
||||
add_feature_info(KeeShare WITH_XC_KEESHARE "Sharing integration with KeeShare")
|
||||
add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response")
|
||||
add_feature_info(UpdateCheck WITH_XC_UPDATECHECK "Automatic update checking")
|
||||
if(UNIX AND NOT APPLE)
|
||||
add_feature_info(FdoSecrets WITH_XC_FDOSECRETS "Implement freedesktop.org Secret Storage Spec server side API.")
|
||||
endif()
|
||||
|
||||
set(core_SOURCES
|
||||
core/Alloc.cpp
|
||||
core/AutoTypeAssociations.cpp
|
||||
core/Base32.cpp
|
||||
|
@ -47,7 +59,6 @@ set(keepassx_SOURCES
|
|||
core/Tools.cpp
|
||||
core/Totp.cpp
|
||||
core/Translator.cpp
|
||||
core/UrlTools.cpp
|
||||
cli/Utils.cpp
|
||||
cli/TextStream.cpp
|
||||
crypto/Crypto.cpp
|
||||
|
@ -81,6 +92,19 @@ set(keepassx_SOURCES
|
|||
format/OpVaultReaderBandEntry.cpp
|
||||
format/OpVaultReaderSections.cpp
|
||||
format/ProtonPassReader.cpp
|
||||
keys/CompositeKey.cpp
|
||||
keys/FileKey.cpp
|
||||
keys/PasswordKey.cpp
|
||||
keys/ChallengeResponseKey.cpp
|
||||
streams/HashedBlockStream.cpp
|
||||
streams/HashingStream.cpp
|
||||
streams/HmacBlockStream.cpp
|
||||
streams/LayeredStream.cpp
|
||||
streams/qtiocompressor.cpp
|
||||
streams/StoreDataStream.cpp
|
||||
streams/SymmetricCipherStream.cpp)
|
||||
|
||||
set(gui_SOURCES
|
||||
gui/styles/styles.qrc
|
||||
gui/styles/StateColorPalette.cpp
|
||||
gui/styles/base/phantomcolor.cpp
|
||||
|
@ -88,6 +112,7 @@ set(keepassx_SOURCES
|
|||
gui/styles/dark/DarkStyle.cpp
|
||||
gui/styles/light/LightStyle.cpp
|
||||
gui/AboutDialog.cpp
|
||||
gui/ActionCollection.cpp
|
||||
gui/Application.cpp
|
||||
gui/CategoryListWidget.cpp
|
||||
gui/Clipboard.cpp
|
||||
|
@ -119,11 +144,13 @@ set(keepassx_SOURCES
|
|||
gui/SettingsWidget.cpp
|
||||
gui/SortFilterHideProxyModel.cpp
|
||||
gui/SquareSvgWidget.cpp
|
||||
gui/ShortcutSettingsPage.cpp
|
||||
gui/TotpSetupDialog.cpp
|
||||
gui/TotpDialog.cpp
|
||||
gui/TotpExportSettingsDialog.cpp
|
||||
gui/DatabaseOpenDialog.cpp
|
||||
gui/URLEdit.cpp
|
||||
gui/UrlTools.cpp
|
||||
gui/WelcomeWidget.cpp
|
||||
gui/csvImport/CsvImportWidget.cpp
|
||||
gui/csvImport/CsvParserModel.cpp
|
||||
|
@ -132,8 +159,14 @@ set(keepassx_SOURCES
|
|||
gui/entry/EntryAttachmentsModel.cpp
|
||||
gui/entry/EntryAttachmentsWidget.cpp
|
||||
gui/entry/EntryAttributesModel.cpp
|
||||
gui/entry/NewEntryAttachmentsDialog.cpp
|
||||
gui/entry/EditEntryAttachmentsDialog.cpp
|
||||
gui/entry/PreviewEntryAttachmentsDialog.cpp
|
||||
gui/entry/attachments/TextAttachmentsWidget.cpp
|
||||
gui/entry/attachments/ImageAttachmentsWidget.cpp
|
||||
gui/entry/attachments/ImageAttachmentsView.cpp
|
||||
gui/entry/attachments/TextAttachmentsPreviewWidget.cpp
|
||||
gui/entry/attachments/TextAttachmentsEditWidget.cpp
|
||||
gui/entry/attachments/AttachmentWidget.cpp
|
||||
gui/entry/EntryHistoryModel.cpp
|
||||
gui/entry/EntryModel.cpp
|
||||
gui/entry/EntryView.cpp
|
||||
|
@ -155,6 +188,10 @@ set(keepassx_SOURCES
|
|||
gui/dbsettings/DatabaseSettingsWidgetMetaDataSimple.cpp
|
||||
gui/dbsettings/DatabaseSettingsWidgetEncryption.cpp
|
||||
gui/dbsettings/DatabaseSettingsWidgetDatabaseKey.cpp
|
||||
gui/remote/DatabaseSettingsWidgetRemote.cpp
|
||||
gui/remote/RemoteHandler.cpp
|
||||
gui/remote/RemoteProcess.cpp
|
||||
gui/remote/RemoteSettings.cpp
|
||||
gui/reports/ReportsWidget.cpp
|
||||
gui/reports/ReportsDialog.cpp
|
||||
gui/reports/ReportsWidgetHealthcheck.cpp
|
||||
|
@ -169,6 +206,7 @@ set(keepassx_SOURCES
|
|||
gui/widgets/ElidedLabel.cpp
|
||||
gui/widgets/KPToolBar.cpp
|
||||
gui/widgets/PopupHelpWidget.cpp
|
||||
gui/widgets/ShortcutWidget.cpp
|
||||
gui/wizard/ImportWizard.cpp
|
||||
gui/wizard/ImportWizardPageReview.cpp
|
||||
gui/wizard/ImportWizardPageSelect.cpp
|
||||
|
@ -177,84 +215,82 @@ set(keepassx_SOURCES
|
|||
gui/wizard/NewDatabaseWizardPageMetaData.cpp
|
||||
gui/wizard/NewDatabaseWizardPageEncryption.cpp
|
||||
gui/wizard/NewDatabaseWizardPageDatabaseKey.cpp
|
||||
keys/CompositeKey.cpp
|
||||
keys/FileKey.cpp
|
||||
keys/PasswordKey.cpp
|
||||
keys/ChallengeResponseKey.cpp
|
||||
streams/HashedBlockStream.cpp
|
||||
streams/HashingStream.cpp
|
||||
streams/HmacBlockStream.cpp
|
||||
streams/LayeredStream.cpp
|
||||
streams/qtiocompressor.cpp
|
||||
streams/StoreDataStream.cpp
|
||||
streams/SymmetricCipherStream.cpp)
|
||||
quickunlock/QuickUnlockInterface.cpp
|
||||
../share/icons/icons.qrc
|
||||
../share/wizard/wizard.qrc)
|
||||
|
||||
if(APPLE)
|
||||
set(keepassx_SOURCES
|
||||
${keepassx_SOURCES}
|
||||
core/MacPasteboard.cpp
|
||||
list(APPEND gui_SOURCES
|
||||
gui/osutils/macutils/MacPasteboard.cpp
|
||||
gui/osutils/macutils/MacUtils.cpp
|
||||
gui/osutils/macutils/ScreenLockListenerMac.cpp
|
||||
gui/osutils/macutils/AppKitImpl.mm
|
||||
gui/osutils/macutils/AppKit.h)
|
||||
gui/osutils/macutils/AppKit.h
|
||||
quickunlock/TouchID.mm)
|
||||
|
||||
# TODO: Remove -Wno-error once deprecation warnings have been resolved.
|
||||
set_source_files_properties(quickunlock/TouchID.mm PROPERTY COMPILE_FLAGS "-Wno-old-style-cast")
|
||||
endif()
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
set(keepassx_SOURCES
|
||||
${keepassx_SOURCES}
|
||||
list(APPEND gui_SOURCES
|
||||
gui/osutils/nixutils/ScreenLockListenerDBus.cpp
|
||||
gui/osutils/nixutils/NixUtils.cpp)
|
||||
if("${CMAKE_SYSTEM}" MATCHES "Linux")
|
||||
list(APPEND core_SOURCES
|
||||
quickunlock/Polkit.cpp
|
||||
quickunlock/PolkitDbusTypes.cpp)
|
||||
endif()
|
||||
if(WITH_XC_X11)
|
||||
list(APPEND keepassx_SOURCES
|
||||
list(APPEND gui_SOURCES
|
||||
gui/osutils/nixutils/X11Funcs.cpp)
|
||||
endif()
|
||||
qt5_add_dbus_adaptor(keepassx_SOURCES
|
||||
qt5_add_dbus_adaptor(gui_SOURCES
|
||||
gui/org.keepassxc.KeePassXC.MainWindow.xml
|
||||
gui/MainWindow.h
|
||||
MainWindow)
|
||||
|
||||
set_source_files_properties(
|
||||
quickunlock/dbus/org.freedesktop.PolicyKit1.Authority.xml
|
||||
PROPERTIES
|
||||
INCLUDE "quickunlock/PolkitDbusTypes.h"
|
||||
)
|
||||
qt5_add_dbus_interface(core_SOURCES
|
||||
quickunlock/dbus/org.freedesktop.PolicyKit1.Authority.xml
|
||||
polkit_dbus
|
||||
)
|
||||
|
||||
find_library(KEYUTILS_LIBRARIES NAMES keyutils)
|
||||
if(NOT KEYUTILS_LIBRARIES)
|
||||
message(FATAL_ERROR "Could not find libkeyutils")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
set(keepassx_SOURCES
|
||||
${keepassx_SOURCES}
|
||||
list(APPEND gui_SOURCES
|
||||
gui/osutils/winutils/ScreenLockListenerWin.cpp
|
||||
gui/osutils/winutils/WinUtils.cpp)
|
||||
if (MSVC)
|
||||
list(APPEND keepassx_SOURCES winhello/WindowsHello.cpp)
|
||||
list(APPEND gui_SOURCES quickunlock/WindowsHello.cpp)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_XC_YUBIKEY)
|
||||
set(keepassx_SOURCES ${keepassx_SOURCES} gui/osutils/DeviceListener.cpp)
|
||||
list(APPEND gui_SOURCES gui/osutils/DeviceListener.cpp)
|
||||
if(APPLE)
|
||||
set(keepassx_SOURCES ${keepassx_SOURCES} gui/osutils/macutils/DeviceListenerMac.cpp)
|
||||
list(APPEND gui_SOURCES gui/osutils/macutils/DeviceListenerMac.cpp)
|
||||
elseif(UNIX)
|
||||
set(keepassx_SOURCES ${keepassx_SOURCES} gui/osutils/nixutils/DeviceListenerLibUsb.cpp)
|
||||
list(APPEND gui_SOURCES gui/osutils/nixutils/DeviceListenerLibUsb.cpp)
|
||||
elseif(WIN32)
|
||||
set(keepassx_SOURCES ${keepassx_SOURCES} gui/osutils/winutils/DeviceListenerWin.cpp)
|
||||
list(APPEND gui_SOURCES gui/osutils/winutils/DeviceListenerWin.cpp)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(keepassx_SOURCES ${keepassx_SOURCES}
|
||||
../share/icons/icons.qrc
|
||||
../share/wizard/wizard.qrc)
|
||||
|
||||
set(keepassx_SOURCES_MAINEXE main.cpp)
|
||||
|
||||
add_feature_info(Auto-Type WITH_XC_AUTOTYPE "Automatic password typing")
|
||||
add_feature_info(Networking WITH_XC_NETWORKING "Compile KeePassXC with network access code (e.g. for downloading website icons)")
|
||||
add_feature_info(KeePassXC-Browser WITH_XC_BROWSER "Browser integration with KeePassXC-Browser")
|
||||
add_feature_info(Passkeys WITH_XC_BROWSER_PASSKEYS "Passkeys support for browser integration")
|
||||
add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent")
|
||||
add_feature_info(KeeShare WITH_XC_KEESHARE "Sharing integration with KeeShare")
|
||||
add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response")
|
||||
add_feature_info(UpdateCheck WITH_XC_UPDATECHECK "Automatic update checking")
|
||||
if(UNIX AND NOT APPLE)
|
||||
add_feature_info(FdoSecrets WITH_XC_FDOSECRETS "Implement freedesktop.org Secret Storage Spec server side API.")
|
||||
endif()
|
||||
|
||||
add_subdirectory(browser)
|
||||
add_subdirectory(proxy)
|
||||
if(WITH_XC_BROWSER)
|
||||
set(keepassxcbrowser_LIB keepassxcbrowser)
|
||||
set(keepassx_SOURCES ${keepassx_SOURCES}
|
||||
set(browser_LIB browser)
|
||||
list(APPEND gui_SOURCES
|
||||
gui/dbsettings/DatabaseSettingsWidgetBrowser.cpp
|
||||
gui/entry/EntryURLModel.cpp
|
||||
gui/reports/ReportsWidgetBrowserStatistics.cpp
|
||||
|
@ -262,7 +298,7 @@ if(WITH_XC_BROWSER)
|
|||
endif()
|
||||
|
||||
if(WITH_XC_BROWSER_PASSKEYS)
|
||||
set(keepassx_SOURCES ${keepassx_SOURCES}
|
||||
list(APPEND gui_SOURCES
|
||||
gui/reports/ReportsWidgetPasskeys.cpp
|
||||
gui/reports/ReportsPagePasskeys.cpp
|
||||
gui/passkeys/PasskeyExporter.cpp
|
||||
|
@ -294,123 +330,114 @@ endif()
|
|||
add_subdirectory(thirdparty)
|
||||
|
||||
set(autotype_SOURCES
|
||||
core/Tools.cpp
|
||||
autotype/AutoType.cpp
|
||||
autotype/AutoTypeAction.cpp
|
||||
autotype/AutoTypeMatchModel.cpp
|
||||
autotype/AutoTypeMatchView.cpp
|
||||
autotype/AutoTypeSelectDialog.cpp
|
||||
autotype/PickcharsDialog.cpp
|
||||
autotype/ShortcutWidget.cpp
|
||||
autotype/WindowSelectComboBox.cpp)
|
||||
|
||||
if(WIN32)
|
||||
set(keepassx_SOURCES_MAINEXE ${keepassx_SOURCES_MAINEXE} ${CMAKE_SOURCE_DIR}/share/windows/icon.rc)
|
||||
endif()
|
||||
add_library(autotype STATIC ${autotype_SOURCES})
|
||||
target_link_libraries(autotype Qt5::Core Qt5::Widgets)
|
||||
|
||||
if(WITH_XC_YUBIKEY)
|
||||
list(APPEND keepassx_SOURCES
|
||||
list(APPEND core_SOURCES
|
||||
keys/drivers/YubiKey.h
|
||||
keys/drivers/YubiKey.cpp
|
||||
keys/drivers/YubiKeyInterface.cpp
|
||||
keys/drivers/YubiKeyInterfaceUSB.cpp
|
||||
keys/drivers/YubiKeyInterfacePCSC.cpp)
|
||||
else()
|
||||
list(APPEND keepassx_SOURCES
|
||||
list(APPEND core_SOURCES
|
||||
keys/drivers/YubiKey.h
|
||||
keys/drivers/YubiKeyStub.cpp)
|
||||
endif()
|
||||
|
||||
if(WITH_XC_NETWORKING)
|
||||
list(APPEND keepassx_SOURCES
|
||||
core/HibpDownloader.cpp
|
||||
core/NetworkManager.cpp
|
||||
list(APPEND gui_SOURCES
|
||||
networking/HibpDownloader.cpp
|
||||
networking/NetworkManager.cpp
|
||||
networking/UpdateChecker.cpp
|
||||
gui/UpdateCheckDialog.cpp
|
||||
gui/IconDownloader.cpp
|
||||
gui/IconDownloaderDialog.cpp
|
||||
updatecheck/UpdateChecker.cpp)
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
list(APPEND keepassx_SOURCES touchid/TouchID.mm)
|
||||
# TODO: Remove -Wno-error once deprecation warnings have been resolved.
|
||||
set_source_files_properties(touchid/TouchID.mm PROPERTY COMPILE_FLAGS "-Wno-old-style-cast")
|
||||
gui/IconDownloaderDialog.cpp)
|
||||
endif()
|
||||
|
||||
configure_file(config-keepassx.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-keepassx.h)
|
||||
configure_file(git-info.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/git-info.h)
|
||||
|
||||
add_library(autotype STATIC ${autotype_SOURCES})
|
||||
target_link_libraries(autotype Qt5::Core Qt5::Widgets)
|
||||
|
||||
add_library(keepassx_core STATIC ${keepassx_SOURCES})
|
||||
|
||||
set_target_properties(keepassx_core PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE)
|
||||
target_link_libraries(keepassx_core
|
||||
autotype
|
||||
${keepassxcbrowser_LIB}
|
||||
# Core Library Definition
|
||||
add_library(keepassxc_core STATIC ${core_SOURCES})
|
||||
set_target_properties(keepassxc_core PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE)
|
||||
target_link_libraries(keepassxc_core
|
||||
${qrcode_LIB}
|
||||
${fdosecrets_LIB}
|
||||
Qt5::Core
|
||||
Qt5::Concurrent
|
||||
Qt5::Network
|
||||
Qt5::Widgets
|
||||
${BOTAN_LIBRARIES}
|
||||
${PCSC_LIBRARIES}
|
||||
${ZXCVBN_LIBRARIES}
|
||||
${ZLIB_LIBRARIES}
|
||||
${MINIZIP_LIBRARIES}
|
||||
${ARGON2_LIBRARIES}
|
||||
${thirdparty_LIBRARIES}
|
||||
)
|
||||
${KEYUTILS_LIBRARIES}
|
||||
${thirdparty_LIBRARIES})
|
||||
|
||||
if(WITH_XC_SSHAGENT)
|
||||
target_link_libraries(keepassx_core sshagent)
|
||||
endif()
|
||||
if(WITH_XC_KEESHARE)
|
||||
target_link_libraries(keepassx_core keeshare)
|
||||
endif()
|
||||
# GUI Library Definition
|
||||
add_library(keepassxc_gui STATIC ${gui_SOURCES})
|
||||
set_target_properties(keepassxc_gui PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE)
|
||||
target_link_libraries(keepassxc_gui
|
||||
keepassxc_core
|
||||
Qt5::Network
|
||||
Qt5::Widgets
|
||||
autotype
|
||||
${browser_LIB}
|
||||
${fdosecrets_LIB}
|
||||
${keeshare_LIB}
|
||||
${sshagent_LIB})
|
||||
|
||||
if(APPLE)
|
||||
target_link_libraries(keepassx_core "-framework Foundation -framework AppKit -framework Carbon -framework Security -framework LocalAuthentication -framework ScreenCaptureKit")
|
||||
target_link_libraries(keepassxc_gui "-framework Foundation -framework AppKit -framework Carbon -framework Security -framework LocalAuthentication -framework ScreenCaptureKit")
|
||||
if(Qt5MacExtras_FOUND)
|
||||
target_link_libraries(keepassx_core Qt5::MacExtras)
|
||||
target_link_libraries(keepassxc_gui Qt5::MacExtras)
|
||||
endif()
|
||||
endif()
|
||||
if(HAIKU)
|
||||
target_link_libraries(keepassx_core network)
|
||||
target_link_libraries(keepassxc_gui network)
|
||||
endif()
|
||||
if(UNIX AND NOT APPLE)
|
||||
target_link_libraries(keepassx_core Qt5::DBus ${LIBUSB_LIBRARIES})
|
||||
target_link_libraries(keepassxc_core Qt5::DBus ${LIBUSB_LIBRARIES})
|
||||
if(WITH_XC_X11)
|
||||
target_link_libraries(keepassx_core Qt5::X11Extras X11)
|
||||
target_link_libraries(keepassxc_gui Qt5::X11Extras X11)
|
||||
endif()
|
||||
include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS})
|
||||
endif()
|
||||
if(WIN32)
|
||||
target_link_libraries(keepassx_core Wtsapi32.lib Ws2_32.lib)
|
||||
target_link_libraries(keepassxc_gui Wtsapi32.lib Ws2_32.lib)
|
||||
if (MSVC)
|
||||
target_link_libraries(keepassx_core WindowsApp.lib)
|
||||
target_link_libraries(keepassxc_gui WindowsApp.lib)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Main Executable Definition
|
||||
if(WIN32)
|
||||
include(GenerateProductVersion)
|
||||
generate_product_version(
|
||||
WIN32_ProductVersionFiles
|
||||
WIN32_ResourceFiles
|
||||
NAME "KeePassXC"
|
||||
COMPANY_NAME "KeePassXC Team"
|
||||
VERSION_MAJOR ${KEEPASSXC_VERSION_MAJOR}
|
||||
VERSION_MINOR ${KEEPASSXC_VERSION_MINOR}
|
||||
VERSION_PATCH ${KEEPASSXC_VERSION_PATCH}
|
||||
)
|
||||
list(APPEND WIN32_ResourceFiles "${CMAKE_SOURCE_DIR}/share/windows/icon.rc")
|
||||
endif()
|
||||
|
||||
add_executable(${PROGNAME} WIN32 ${keepassx_SOURCES_MAINEXE} ${WIN32_ProductVersionFiles})
|
||||
target_link_libraries(${PROGNAME} keepassx_core)
|
||||
|
||||
add_executable(${PROGNAME} WIN32 main.cpp ${WIN32_ResourceFiles})
|
||||
target_link_libraries(${PROGNAME} keepassxc_gui)
|
||||
set_target_properties(${PROGNAME} PROPERTIES ENABLE_EXPORTS ON)
|
||||
|
||||
# macOS App Bundle
|
||||
if(APPLE AND WITH_APP_BUNDLE)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/share/macosx/embedded.provisionprofile DESTINATION ${BUNDLE_INSTALL_DIR})
|
||||
configure_file(${CMAKE_SOURCE_DIR}/share/macosx/Info.plist.cmake ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
|
||||
|
@ -439,6 +466,7 @@ install(TARGETS ${PROGNAME}
|
|||
BUNDLE DESTINATION . COMPONENT Runtime
|
||||
RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT Runtime)
|
||||
|
||||
# Windows Installer Definition
|
||||
if(WIN32)
|
||||
if(${CMAKE_SIZEOF_VOID_P} EQUAL "8")
|
||||
set(OUTPUT_FILE_POSTFIX "Win64")
|
||||
|
@ -550,5 +578,5 @@ if(WIN32)
|
|||
endif()
|
||||
|
||||
# The install commands in this subdirectory will be executed after all the install commands in the
|
||||
# current scope are ran. It is required for correct functtioning of macdeployqt.
|
||||
# current scope are ran. It is required for correct functioning of macdeployqt.
|
||||
add_subdirectory(post_install)
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "autotype/AutoTypePlatformPlugin.h"
|
||||
#include "autotype/AutoTypeSelectDialog.h"
|
||||
#include "autotype/PickcharsDialog.h"
|
||||
#include "core/Global.h"
|
||||
#include "core/Resources.h"
|
||||
#include "core/Tools.h"
|
||||
#include "gui/MainWindow.h"
|
||||
|
@ -227,7 +228,7 @@ void AutoType::createTestInstance()
|
|||
QStringList AutoType::windowTitles()
|
||||
{
|
||||
if (!m_plugin) {
|
||||
return QStringList();
|
||||
return {};
|
||||
}
|
||||
|
||||
return m_plugin->windowTitles();
|
||||
|
@ -359,7 +360,7 @@ void AutoType::executeAutoTypeActions(const Entry* entry,
|
|||
|
||||
/**
|
||||
* Single Autotype entry-point function
|
||||
* Look up the Auto-Type sequence for the given entry then perfom Auto-Type in the active window
|
||||
* Look up the Auto-Type sequence for the given entry then perform Auto-Type in the active window
|
||||
*/
|
||||
void AutoType::performAutoType(const Entry* entry)
|
||||
{
|
||||
|
@ -375,7 +376,7 @@ void AutoType::performAutoType(const Entry* entry)
|
|||
|
||||
/**
|
||||
* Extra Autotype entry-point function
|
||||
* Perfom Auto-Type of the directly specified sequence in the active window
|
||||
* Perform Auto-Type of the directly specified sequence in the active window
|
||||
*/
|
||||
void AutoType::performAutoTypeWithSequence(const Entry* entry, const QString& sequence)
|
||||
{
|
||||
|
@ -636,10 +637,16 @@ AutoType::parseSequence(const QString& entrySequence, const Entry* entry, QStrin
|
|||
// Platform-specific field clearing
|
||||
actions << QSharedPointer<AutoTypeClearField>::create();
|
||||
} else if (placeholder == "totp") {
|
||||
// Entry totp (requires special handling)
|
||||
QString totp = entry->totp();
|
||||
for (const auto& ch : totp) {
|
||||
actions << QSharedPointer<AutoTypeKey>::create(ch);
|
||||
if (entry->hasValidTotp()) {
|
||||
// Entry totp (requires special handling)
|
||||
QString totp = entry->totp();
|
||||
for (const auto& ch : totp) {
|
||||
actions << QSharedPointer<AutoTypeKey>::create(ch);
|
||||
}
|
||||
} else if (entry->hasTotp()) {
|
||||
// Entry has TOTP configured but invalid settings
|
||||
error = tr("Entry has invalid TOTP settings");
|
||||
return {};
|
||||
}
|
||||
} else if (placeholder.startsWith("pickchars")) {
|
||||
// Reset to the original capture to preserve case
|
||||
|
|
|
@ -38,17 +38,17 @@ public:
|
|||
|
||||
static Result Ok()
|
||||
{
|
||||
return Result(true, false, QString());
|
||||
return {true, false, QString()};
|
||||
}
|
||||
|
||||
static Result Retry(const QString& error)
|
||||
{
|
||||
return Result(false, true, error);
|
||||
return {false, true, error};
|
||||
}
|
||||
|
||||
static Result Failed(const QString& error)
|
||||
{
|
||||
return Result(false, false, error);
|
||||
return {false, false, error};
|
||||
}
|
||||
|
||||
bool isOk() const
|
||||
|
|
|
@ -25,9 +25,7 @@
|
|||
class AutoTypePlatformInterface
|
||||
{
|
||||
public:
|
||||
virtual ~AutoTypePlatformInterface()
|
||||
{
|
||||
}
|
||||
virtual ~AutoTypePlatformInterface() = default;
|
||||
virtual bool isAvailable() = 0;
|
||||
virtual QStringList windowTitles() = 0;
|
||||
virtual WId activeWindow() = 0;
|
||||
|
|
|
@ -21,12 +21,8 @@
|
|||
|
||||
#include <QCloseEvent>
|
||||
#include <QMenu>
|
||||
#include <QShortcut>
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
|
||||
#include <QScreen>
|
||||
#else
|
||||
#include <QDesktopWidget>
|
||||
#endif
|
||||
#include <QShortcut>
|
||||
|
||||
#include "core/Config.h"
|
||||
#include "core/Database.h"
|
||||
|
@ -96,9 +92,7 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent)
|
|||
}
|
||||
|
||||
// Required for QScopedPointer
|
||||
AutoTypeSelectDialog::~AutoTypeSelectDialog()
|
||||
{
|
||||
}
|
||||
AutoTypeSelectDialog::~AutoTypeSelectDialog() = default;
|
||||
|
||||
void AutoTypeSelectDialog::setMatches(const QList<AutoTypeMatch>& matches,
|
||||
const QList<QSharedPointer<Database>>& dbs,
|
||||
|
@ -270,7 +264,7 @@ void AutoTypeSelectDialog::updateActionMenu(const AutoTypeMatch& match)
|
|||
|
||||
bool hasUsername = !match.first->username().isEmpty();
|
||||
bool hasPassword = !match.first->password().isEmpty();
|
||||
bool hasTotp = match.first->hasTotp();
|
||||
bool hasTotp = match.first->hasValidTotp();
|
||||
|
||||
for (auto action : m_actionMenu->actions()) {
|
||||
auto prop = action->property(MENU_FIELD_PROP_NAME);
|
||||
|
@ -330,7 +324,7 @@ void AutoTypeSelectDialog::buildActionMenu()
|
|||
submitAutoTypeMatch(match);
|
||||
});
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
|
||||
auto typeVirtualAction = new QAction(icons()->icon("auto-type"), tr("Use Virtual Keyboard"), nullptr);
|
||||
m_actionMenu->insertAction(copyUsernameAction, typeVirtualAction);
|
||||
typeVirtualAction->setShortcut(Qt::CTRL + Qt::Key_4);
|
||||
|
@ -370,35 +364,29 @@ void AutoTypeSelectDialog::buildActionMenu()
|
|||
}
|
||||
});
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
|
||||
// Qt 5.10 introduced a new "feature" to hide shortcuts in context menus
|
||||
// Unfortunately, Qt::AA_DontShowShortcutsInContextMenus is broken, have to manually enable them
|
||||
typeUsernameAction->setShortcutVisibleInContextMenu(true);
|
||||
typePasswordAction->setShortcutVisibleInContextMenu(true);
|
||||
typeTotpAction->setShortcutVisibleInContextMenu(true);
|
||||
#if defined(Q_OS_WIN)
|
||||
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
|
||||
typeVirtualAction->setShortcutVisibleInContextMenu(true);
|
||||
#endif
|
||||
copyUsernameAction->setShortcutVisibleInContextMenu(true);
|
||||
copyPasswordAction->setShortcutVisibleInContextMenu(true);
|
||||
copyTotpAction->setShortcutVisibleInContextMenu(true);
|
||||
#endif
|
||||
}
|
||||
|
||||
void AutoTypeSelectDialog::showEvent(QShowEvent* event)
|
||||
{
|
||||
QDialog::showEvent(event);
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
|
||||
auto screen = QApplication::screenAt(QCursor::pos());
|
||||
if (!screen) {
|
||||
// screenAt can return a nullptr, default to the primary screen
|
||||
screen = QApplication::primaryScreen();
|
||||
}
|
||||
QRect screenGeometry = screen->availableGeometry();
|
||||
#else
|
||||
QRect screenGeometry = QApplication::desktop()->availableGeometry(QCursor::pos());
|
||||
#endif
|
||||
|
||||
// Resize to last used size
|
||||
QSize size = config()->get(Config::GUI_AutoTypeSelectDialogSize).toSize();
|
||||
|
|
|
@ -21,12 +21,8 @@
|
|||
#include "gui/Icons.h"
|
||||
|
||||
#include <QPushButton>
|
||||
#include <QShortcut>
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
|
||||
#include <QScreen>
|
||||
#else
|
||||
#include <QDesktopWidget>
|
||||
#endif
|
||||
#include <QShortcut>
|
||||
|
||||
PickcharsDialog::PickcharsDialog(const QString& string, QWidget* parent)
|
||||
: QDialog(parent)
|
||||
|
@ -157,15 +153,11 @@ void PickcharsDialog::showEvent(QShowEvent* event)
|
|||
QDialog::showEvent(event);
|
||||
|
||||
// Center on active screen
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
|
||||
auto screen = QApplication::screenAt(QCursor::pos());
|
||||
if (!screen) {
|
||||
// screenAt can return a nullptr, default to the primary screen
|
||||
screen = QApplication::primaryScreen();
|
||||
}
|
||||
QRect screenGeometry = screen->availableGeometry();
|
||||
#else
|
||||
QRect screenGeometry = QApplication::desktop()->availableGeometry(QCursor::pos());
|
||||
#endif
|
||||
move(screenGeometry.center().x() - (size().width() / 2), screenGeometry.center().y() - (size().height() / 2));
|
||||
}
|
||||
|
|
|
@ -250,6 +250,10 @@ AutoTypeAction::Result AutoTypeExecutorMac::execType(const AutoTypeKey* action)
|
|||
int ch = action->character.toUpper().toLatin1();
|
||||
m_platform->sendKey(static_cast<Qt::Key>(ch), true, action->modifiers);
|
||||
m_platform->sendKey(static_cast<Qt::Key>(ch), false, action->modifiers);
|
||||
} else if (mode == Mode::VIRTUAL) {
|
||||
int ch = action->character.toLatin1();
|
||||
m_platform->sendKey(static_cast<Qt::Key>(ch), true, action->modifiers);
|
||||
m_platform->sendKey(static_cast<Qt::Key>(ch), false, action->modifiers);
|
||||
} else {
|
||||
m_platform->sendChar(action->character, true);
|
||||
m_platform->sendChar(action->character, false);
|
||||
|
|
|
@ -29,7 +29,7 @@ QString AutoTypePlatformTest::keyToString(Qt::Key key)
|
|||
|
||||
QStringList AutoTypePlatformTest::windowTitles()
|
||||
{
|
||||
return QStringList();
|
||||
return {};
|
||||
}
|
||||
|
||||
WId AutoTypePlatformTest::activeWindow()
|
||||
|
|
|
@ -23,9 +23,7 @@
|
|||
class AutoTypeTestInterface
|
||||
{
|
||||
public:
|
||||
virtual ~AutoTypeTestInterface()
|
||||
{
|
||||
}
|
||||
virtual ~AutoTypeTestInterface() = default;
|
||||
virtual void setActiveWindowTitle(const QString& title) = 0;
|
||||
|
||||
virtual QString actionChars() = 0;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
set(autotype_test_SOURCES AutoTypeTest.cpp)
|
||||
|
||||
add_library(keepassxc-autotype-test MODULE ${autotype_test_SOURCES})
|
||||
target_link_libraries(keepassxc-autotype-test keepassx_core ${autotype_LIB} Qt5::Core Qt5::Widgets)
|
||||
target_link_libraries(keepassxc-autotype-test keepassxc_gui ${autotype_LIB} Qt5::Core Qt5::Widgets)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
set(autotype_win_SOURCES AutoTypeWindows.cpp)
|
||||
|
||||
add_library(keepassxc-autotype-windows MODULE ${autotype_win_SOURCES})
|
||||
target_link_libraries(keepassxc-autotype-windows keepassx_core ${autotype_LIB} Qt5::Core Qt5::Widgets)
|
||||
target_link_libraries(keepassxc-autotype-windows keepassxc_gui ${autotype_LIB} Qt5::Core Qt5::Widgets)
|
||||
install(TARGETS keepassxc-autotype-windows
|
||||
BUNDLE DESTINATION . COMPONENT Runtime
|
||||
LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)
|
||||
|
|
|
@ -181,17 +181,17 @@ QString AutoTypePlatformX11::windowTitle(Window window, bool useBlacklist)
|
|||
|
||||
if (useBlacklist && !title.isEmpty()) {
|
||||
if (window == m_rootWindow) {
|
||||
return QString();
|
||||
return {};
|
||||
}
|
||||
|
||||
QString className = windowClassName(window);
|
||||
if (m_classBlacklist.contains(className)) {
|
||||
return QString();
|
||||
return {};
|
||||
}
|
||||
|
||||
QList<Window> keepassxWindows = widgetsToX11Windows(QApplication::topLevelWidgets());
|
||||
if (keepassxWindows.contains(window)) {
|
||||
return QString();
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ include_directories(SYSTEM ${X11_X11_INCLUDE_PATH})
|
|||
set(autotype_XCB_SOURCES AutoTypeXCB.cpp)
|
||||
|
||||
add_library(keepassxc-autotype-xcb MODULE ${autotype_XCB_SOURCES})
|
||||
target_link_libraries(keepassxc-autotype-xcb keepassx_core Qt5::Core Qt5::Widgets Qt5::X11Extras ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_XTest_LIB})
|
||||
target_link_libraries(keepassxc-autotype-xcb keepassxc_gui Qt5::Core Qt5::Widgets Qt5::X11Extras ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_XTest_LIB})
|
||||
install(TARGETS keepassxc-autotype-xcb
|
||||
BUNDLE DESTINATION . COMPONENT Runtime
|
||||
LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)
|
||||
|
|
0
src/browser/BrowserAccessControlDialog.ui
Executable file → Normal file
|
@ -108,6 +108,8 @@ QJsonObject BrowserAction::handleAction(QLocalSocket* socket, const QJsonObject&
|
|||
return handleDeleteEntry(json, action);
|
||||
} else if (action.compare(BROWSER_REQUEST_REQUEST_AUTOTYPE) == 0) {
|
||||
return handleGlobalAutoType(json, action);
|
||||
} else if (action.compare("get-database-entries", Qt::CaseSensitive) == 0) {
|
||||
return handleGetDatabaseEntries(json, action);
|
||||
#ifdef WITH_XC_BROWSER_PASSKEYS
|
||||
} else if (action.compare(BROWSER_REQUEST_PASSKEYS_GET) == 0) {
|
||||
return handlePasskeysGet(json, action);
|
||||
|
@ -387,6 +389,36 @@ QJsonObject BrowserAction::handleGetDatabaseGroups(const QJsonObject& json, cons
|
|||
return buildResponse(action, browserRequest.incrementedNonce, params);
|
||||
}
|
||||
|
||||
QJsonObject BrowserAction::handleGetDatabaseEntries(const QJsonObject& json, const QString& action)
|
||||
{
|
||||
if (!m_associated) {
|
||||
return getErrorReply(action, ERROR_KEEPASS_ASSOCIATION_FAILED);
|
||||
}
|
||||
|
||||
const auto browserRequest = decodeRequest(json);
|
||||
if (browserRequest.isEmpty()) {
|
||||
return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE);
|
||||
}
|
||||
|
||||
const auto command = browserRequest.getString("action");
|
||||
if (command.isEmpty() || command.compare("get-database-entries") != 0) {
|
||||
return getErrorReply(action, ERROR_KEEPASS_INCORRECT_ACTION);
|
||||
}
|
||||
|
||||
if (!browserSettings()->allowGetDatabaseEntriesRequest()) {
|
||||
return getErrorReply(action, ERROR_KEEPASS_ACCESS_TO_ALL_ENTRIES_DENIED);
|
||||
}
|
||||
|
||||
const QJsonArray entries = browserService()->getDatabaseEntries();
|
||||
if (entries.isEmpty()) {
|
||||
return getErrorReply(action, ERROR_KEEPASS_NO_GROUPS_FOUND);
|
||||
}
|
||||
|
||||
const Parameters params{{"entries", entries}};
|
||||
|
||||
return buildResponse(action, browserRequest.incrementedNonce, params);
|
||||
}
|
||||
|
||||
QJsonObject BrowserAction::handleCreateNewGroup(const QJsonObject& json, const QString& action)
|
||||
{
|
||||
if (!m_associated) {
|
||||
|
|
|
@ -79,6 +79,7 @@ private:
|
|||
QJsonObject handleSetLogin(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleLockDatabase(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleGetDatabaseGroups(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleGetDatabaseEntries(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleCreateNewGroup(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleGetTotp(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleDeleteEntry(const QJsonObject& json, const QString& action);
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "BrowserEntryConfig.h"
|
||||
|
||||
#include "core/Entry.h"
|
||||
#include "core/Global.h"
|
||||
#include "core/Tools.h"
|
||||
|
||||
#include <QJsonDocument>
|
||||
|
@ -34,22 +35,22 @@ BrowserEntryConfig::BrowserEntryConfig(QObject* parent)
|
|||
|
||||
QStringList BrowserEntryConfig::allowedHosts() const
|
||||
{
|
||||
return m_allowedHosts.toList();
|
||||
return m_allowedHosts.values();
|
||||
}
|
||||
|
||||
void BrowserEntryConfig::setAllowedHosts(const QStringList& allowedHosts)
|
||||
{
|
||||
m_allowedHosts = allowedHosts.toSet();
|
||||
m_allowedHosts = Tools::asSet(allowedHosts);
|
||||
}
|
||||
|
||||
QStringList BrowserEntryConfig::deniedHosts() const
|
||||
{
|
||||
return m_deniedHosts.toList();
|
||||
return m_deniedHosts.values();
|
||||
}
|
||||
|
||||
void BrowserEntryConfig::setDeniedHosts(const QStringList& deniedHosts)
|
||||
{
|
||||
m_deniedHosts = deniedHosts.toSet();
|
||||
m_deniedHosts = Tools::asSet(deniedHosts);
|
||||
}
|
||||
|
||||
bool BrowserEntryConfig::isAllowed(const QString& host) const
|
||||
|
|
0
src/browser/BrowserEntrySaveDialog.ui
Executable file → Normal file
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2024 KeePassXC Team <team@keepassxc.org>
|
||||
* Copyright (C) 2025 KeePassXC Team <team@keepassxc.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -71,7 +71,7 @@ PublicKeyCredential BrowserPasskeys::buildRegisterPublicKeyCredential(const QJso
|
|||
}
|
||||
|
||||
const auto authenticatorAttachment = credentialCreationOptions["authenticatorAttachment"];
|
||||
const auto clientDataJson = credentialCreationOptions["clientDataJSON"].toObject();
|
||||
const auto clientDataJson = credentialCreationOptions["clientDataJSON"].toString();
|
||||
const auto extensions = credentialCreationOptions["extensions"].toString();
|
||||
const auto credentialId = testingVariables.credentialId.isEmpty()
|
||||
? browserMessageBuilder()->getRandomBytesAsBase64(ID_BYTES)
|
||||
|
@ -98,7 +98,7 @@ PublicKeyCredential BrowserPasskeys::buildRegisterPublicKeyCredential(const QJso
|
|||
// Response
|
||||
QJsonObject responseObject;
|
||||
responseObject["attestationObject"] = browserMessageBuilder()->getBase64FromArray(attestationObject);
|
||||
responseObject["clientDataJSON"] = browserMessageBuilder()->getBase64FromJson(clientDataJson);
|
||||
responseObject["clientDataJSON"] = browserMessageBuilder()->getBase64FromArray(clientDataJson.toUtf8());
|
||||
responseObject["clientExtensionResults"] = credentialCreationOptions["clientExtensionResults"];
|
||||
|
||||
// Additions for extension side functions
|
||||
|
@ -130,8 +130,8 @@ QJsonObject BrowserPasskeys::buildGetPublicKeyCredential(const QJsonObject& asse
|
|||
|
||||
const auto authenticatorData =
|
||||
buildAuthenticatorData(assertionOptions["rpId"].toString(), assertionOptions["extensions"].toString());
|
||||
const auto clientDataJson = assertionOptions["clientDataJson"].toObject();
|
||||
const auto clientDataArray = QJsonDocument(clientDataJson).toJson(QJsonDocument::Compact);
|
||||
const auto clientDataJson = assertionOptions["clientDataJson"].toString();
|
||||
const auto clientDataArray = clientDataJson.toUtf8();
|
||||
|
||||
const auto signature = buildSignature(authenticatorData, clientDataArray, privateKeyPem);
|
||||
if (signature.isEmpty()) {
|
||||
|
@ -140,7 +140,7 @@ QJsonObject BrowserPasskeys::buildGetPublicKeyCredential(const QJsonObject& asse
|
|||
|
||||
QJsonObject responseObject;
|
||||
responseObject["authenticatorData"] = browserMessageBuilder()->getBase64FromArray(authenticatorData);
|
||||
responseObject["clientDataJSON"] = browserMessageBuilder()->getBase64FromJson(clientDataJson);
|
||||
responseObject["clientDataJSON"] = browserMessageBuilder()->getBase64FromArray(clientDataArray);
|
||||
responseObject["clientExtensionResults"] = assertionOptions["clientExtensionResults"];
|
||||
responseObject["signature"] = browserMessageBuilder()->getBase64FromArray(signature);
|
||||
responseObject["userHandle"] = userHandle;
|
||||
|
|
|
@ -155,4 +155,4 @@ void BrowserPasskeysConfirmationDialog::updateEntriesToTable(const QList<Entry*>
|
|||
|
||||
m_ui->credentialsTable->resizeColumnsToContents();
|
||||
m_ui->credentialsTable->horizontalHeader()->setStretchLastSection(true);
|
||||
}
|
||||
}
|
||||
|
|
0
src/browser/BrowserPasskeysConfirmationDialog.ui
Executable file → Normal file
|
@ -26,9 +26,9 @@
|
|||
#include "BrowserSettings.h"
|
||||
#include "core/EntryAttributes.h"
|
||||
#include "core/Tools.h"
|
||||
#include "core/UrlTools.h"
|
||||
#include "gui/MainWindow.h"
|
||||
#include "gui/MessageBox.h"
|
||||
#include "gui/UrlTools.h"
|
||||
#include "gui/osutils/OSUtils.h"
|
||||
#ifdef WITH_XC_BROWSER_PASSKEYS
|
||||
#include "BrowserPasskeys.h"
|
||||
|
@ -49,6 +49,7 @@
|
|||
#include <QJsonObject>
|
||||
#include <QListWidget>
|
||||
#include <QLocalSocket>
|
||||
#include <QLocale>
|
||||
#include <QProgressDialog>
|
||||
#include <QStringView>
|
||||
#include <QUrl>
|
||||
|
@ -70,6 +71,7 @@ const QString BrowserService::OPTION_HIDE_ENTRY = QStringLiteral("BrowserHideEnt
|
|||
const QString BrowserService::OPTION_ONLY_HTTP_AUTH = QStringLiteral("BrowserOnlyHttpAuth");
|
||||
const QString BrowserService::OPTION_NOT_HTTP_AUTH = QStringLiteral("BrowserNotHttpAuth");
|
||||
const QString BrowserService::OPTION_OMIT_WWW = QStringLiteral("BrowserOmitWww");
|
||||
const QString BrowserService::OPTION_RESTRICT_KEY = QStringLiteral("BrowserRestrictKey");
|
||||
|
||||
Q_GLOBAL_STATIC(BrowserService, s_browserService);
|
||||
|
||||
|
@ -328,6 +330,7 @@ QJsonObject BrowserService::createNewGroup(const QString& groupName, bool isPass
|
|||
}
|
||||
#endif
|
||||
name = newGroup->name();
|
||||
newGroup->setCustomDataTriState(BrowserService::OPTION_HIDE_ENTRY, Group::Disable);
|
||||
uuid = Tools::uuidToHex(newGroup->uuid());
|
||||
previousGroup = newGroup;
|
||||
continue;
|
||||
|
@ -601,7 +604,8 @@ QString BrowserService::storeKey(const QString& key)
|
|||
return {};
|
||||
}
|
||||
|
||||
contains = db->metadata()->customData()->contains(CustomData::BrowserKeyPrefix + id);
|
||||
contains =
|
||||
db->metadata()->customData()->contains(CustomData::getKeyWithPrefix(CustomData::BrowserKeyPrefix, id));
|
||||
if (contains) {
|
||||
dialogResult = MessageBox::warning(m_currentDatabaseWidget,
|
||||
tr("KeePassXC - Overwrite existing key?"),
|
||||
|
@ -614,8 +618,8 @@ QString BrowserService::storeKey(const QString& key)
|
|||
} while (contains && dialogResult == MessageBox::Cancel);
|
||||
|
||||
hideWindow();
|
||||
db->metadata()->customData()->set(CustomData::BrowserKeyPrefix + id, key);
|
||||
db->metadata()->customData()->set(QString("%1%2").arg(CustomData::Created, id),
|
||||
db->metadata()->customData()->set(CustomData::getKeyWithPrefix(CustomData::BrowserKeyPrefix, id), key);
|
||||
db->metadata()->customData()->set(CustomData::getKeyWithPrefix(CustomData::Created, id),
|
||||
QLocale::system().toString(Clock::currentDateTime(), QLocale::ShortFormat));
|
||||
return id;
|
||||
}
|
||||
|
@ -627,7 +631,7 @@ QString BrowserService::getKey(const QString& id)
|
|||
return {};
|
||||
}
|
||||
|
||||
return db->metadata()->customData()->value(CustomData::BrowserKeyPrefix + id);
|
||||
return db->metadata()->customData()->value(CustomData::getKeyWithPrefix(CustomData::BrowserKeyPrefix, id));
|
||||
}
|
||||
|
||||
#ifdef WITH_XC_BROWSER_PASSKEYS
|
||||
|
@ -1009,6 +1013,7 @@ void BrowserService::removePluginData(Entry* entry) const
|
|||
QList<Entry*> BrowserService::searchEntries(const QSharedPointer<Database>& db,
|
||||
const QString& siteUrl,
|
||||
const QString& formUrl,
|
||||
const QStringList& keys,
|
||||
bool passkey)
|
||||
{
|
||||
QList<Entry*> entries;
|
||||
|
@ -1023,6 +1028,12 @@ QList<Entry*> BrowserService::searchEntries(const QSharedPointer<Database>& db,
|
|||
continue;
|
||||
}
|
||||
|
||||
// If a key restriction is specified and not contained in the keys list then skip this group.
|
||||
auto restrictKey = group->resolveCustomDataString(BrowserService::OPTION_RESTRICT_KEY);
|
||||
if (!restrictKey.isEmpty() && !keys.contains(restrictKey)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const auto omitWwwSubdomain =
|
||||
group->resolveCustomDataTriState(BrowserService::OPTION_OMIT_WWW) == Group::Enable;
|
||||
|
||||
|
@ -1059,30 +1070,36 @@ QList<Entry*> BrowserService::searchEntries(const QString& siteUrl,
|
|||
const StringPairList& keyList,
|
||||
bool passkey)
|
||||
{
|
||||
// Check if database is connected with KeePassXC-Browser
|
||||
// Check if database is connected with KeePassXC-Browser. If so, return browser key (otherwise empty)
|
||||
auto databaseConnected = [&](const QSharedPointer<Database>& db) {
|
||||
for (const StringPair& keyPair : keyList) {
|
||||
QString key = db->metadata()->customData()->value(CustomData::BrowserKeyPrefix + keyPair.first);
|
||||
const auto key = db->metadata()->customData()->value(
|
||||
CustomData::getKeyWithPrefix(CustomData::BrowserKeyPrefix, keyPair.first));
|
||||
if (!key.isEmpty() && keyPair.second == key) {
|
||||
return true;
|
||||
return keyPair.first;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return QString();
|
||||
};
|
||||
|
||||
// Get the list of databases to search
|
||||
QList<QSharedPointer<Database>> databases;
|
||||
QStringList keys;
|
||||
if (browserSettings()->searchInAllDatabases()) {
|
||||
for (auto dbWidget : getMainWindow()->getOpenDatabases()) {
|
||||
auto db = dbWidget->database();
|
||||
if (db && databaseConnected(dbWidget->database())) {
|
||||
auto key = databaseConnected(dbWidget->database());
|
||||
if (db && !key.isEmpty()) {
|
||||
databases << db;
|
||||
keys << key;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const auto& db = getDatabase();
|
||||
if (databaseConnected(db)) {
|
||||
auto key = databaseConnected(db);
|
||||
if (!key.isEmpty()) {
|
||||
databases << db;
|
||||
keys << key;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1091,84 +1108,16 @@ QList<Entry*> BrowserService::searchEntries(const QString& siteUrl,
|
|||
QList<Entry*> entries;
|
||||
do {
|
||||
for (const auto& db : databases) {
|
||||
entries << searchEntries(db, siteUrl, formUrl, passkey);
|
||||
entries << searchEntries(db, siteUrl, formUrl, keys, passkey);
|
||||
}
|
||||
} while (entries.isEmpty() && removeFirstDomain(hostname));
|
||||
|
||||
return entries;
|
||||
}
|
||||
|
||||
void BrowserService::convertAttributesToCustomData(QSharedPointer<Database> db)
|
||||
QString BrowserService::decodeCustomDataRestrictKey(const QString& key)
|
||||
{
|
||||
if (!db) {
|
||||
return;
|
||||
}
|
||||
|
||||
QList<Entry*> entries = db->rootGroup()->entriesRecursive();
|
||||
QProgressDialog progress(tr("Converting attributes to custom data…"), tr("Abort"), 0, entries.count());
|
||||
progress.setWindowModality(Qt::WindowModal);
|
||||
|
||||
int counter = 0;
|
||||
int keyCounter = 0;
|
||||
for (auto* entry : entries) {
|
||||
if (progress.wasCanceled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (moveSettingsToCustomData(entry, KEEPASSHTTP_NAME)) {
|
||||
++counter;
|
||||
}
|
||||
|
||||
if (moveSettingsToCustomData(entry, KEEPASSXCBROWSER_OLD_NAME)) {
|
||||
++counter;
|
||||
}
|
||||
|
||||
if (moveSettingsToCustomData(entry, KEEPASSXCBROWSER_NAME)) {
|
||||
++counter;
|
||||
}
|
||||
|
||||
if (entry->title() == KEEPASSHTTP_NAME || entry->title().contains(KEEPASSXCBROWSER_NAME, Qt::CaseInsensitive)) {
|
||||
keyCounter += moveKeysToCustomData(entry, db);
|
||||
db->recycleEntry(entry);
|
||||
}
|
||||
|
||||
progress.setValue(progress.value() + 1);
|
||||
}
|
||||
progress.reset();
|
||||
|
||||
if (counter > 0) {
|
||||
MessageBox::information(nullptr,
|
||||
tr("KeePassXC: Converted KeePassHTTP attributes"),
|
||||
tr("Successfully converted attributes from %1 entry(s).\n"
|
||||
"Moved %2 keys to custom data.",
|
||||
"")
|
||||
.arg(counter)
|
||||
.arg(keyCounter),
|
||||
MessageBox::Ok);
|
||||
} else if (counter == 0 && keyCounter > 0) {
|
||||
MessageBox::information(nullptr,
|
||||
tr("KeePassXC: Converted KeePassHTTP attributes"),
|
||||
tr("Successfully moved %n keys to custom data.", "", keyCounter),
|
||||
MessageBox::Ok);
|
||||
} else {
|
||||
MessageBox::information(nullptr,
|
||||
tr("KeePassXC: No entry with KeePassHTTP attributes found!"),
|
||||
tr("The active database does not contain an entry with KeePassHTTP attributes."),
|
||||
MessageBox::Ok);
|
||||
}
|
||||
|
||||
// Rename password groupName
|
||||
Group* rootGroup = db->rootGroup();
|
||||
if (!rootGroup) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (auto* g : rootGroup->groupsRecursive(true)) {
|
||||
if (g->name() == KEEPASSHTTP_GROUP_NAME) {
|
||||
g->setName(KEEPASSXCBROWSER_GROUP_NAME);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return key.isEmpty() ? tr("Disable") : key;
|
||||
}
|
||||
|
||||
void BrowserService::requestGlobalAutoType(const QString& search)
|
||||
|
@ -1243,7 +1192,7 @@ QJsonObject BrowserService::prepareEntry(const Entry* entry)
|
|||
res["uuid"] = entry->resolveMultiplePlaceholders(entry->uuidToHex());
|
||||
res["group"] = entry->resolveMultiplePlaceholders(entry->group()->name());
|
||||
|
||||
if (entry->hasTotp()) {
|
||||
if (entry->hasValidTotp()) {
|
||||
res["totp"] = entry->totp();
|
||||
}
|
||||
|
||||
|
@ -1623,11 +1572,11 @@ bool BrowserService::handleURLWithWildcards(const QUrl& entryQUrl, const QString
|
|||
}
|
||||
|
||||
// Escape illegal characters
|
||||
auto re = firstPart.replace(QRegularExpression(R"(([!\^\$\+\-\(\)@<>]))"), "\\\\1");
|
||||
auto re = Tools::escapeRegex(firstPart);
|
||||
|
||||
if (hostnameUsed) {
|
||||
// Replace all host parts with wildcards
|
||||
re = re.replace(QString("%1.").arg(UrlTools::URL_WILDCARD), "(.*?)");
|
||||
re = re.replace(QString("%1.").arg(UrlTools::URL_WILDCARD), "(.*?)\\.");
|
||||
}
|
||||
|
||||
// Append a + to the end of regex to match all paths after the last asterisk
|
||||
|
@ -1707,84 +1656,6 @@ QSharedPointer<Database> BrowserService::selectedDatabase()
|
|||
return getDatabase();
|
||||
}
|
||||
|
||||
bool BrowserService::moveSettingsToCustomData(Entry* entry, const QString& name)
|
||||
{
|
||||
if (entry->attributes()->contains(name)) {
|
||||
QString attr = entry->attributes()->value(name);
|
||||
entry->beginUpdate();
|
||||
if (!attr.isEmpty()) {
|
||||
entry->customData()->set(KEEPASSXCBROWSER_NAME, attr);
|
||||
}
|
||||
entry->attributes()->remove(name);
|
||||
entry->endUpdate();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int BrowserService::moveKeysToCustomData(Entry* entry, QSharedPointer<Database> db)
|
||||
{
|
||||
int keyCounter = 0;
|
||||
for (const auto& key : entry->attributes()->keys()) {
|
||||
if (key.contains(CustomData::BrowserLegacyKeyPrefix)) {
|
||||
QString publicKey = key;
|
||||
publicKey.remove(CustomData::BrowserLegacyKeyPrefix);
|
||||
|
||||
// Add key to database custom data
|
||||
if (db && !db->metadata()->customData()->contains(CustomData::BrowserKeyPrefix + publicKey)) {
|
||||
db->metadata()->customData()->set(CustomData::BrowserKeyPrefix + publicKey,
|
||||
entry->attributes()->value(key));
|
||||
++keyCounter;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return keyCounter;
|
||||
}
|
||||
|
||||
bool BrowserService::checkLegacySettings(QSharedPointer<Database> db)
|
||||
{
|
||||
if (!db || !browserSettings()->isEnabled() || browserSettings()->noMigrationPrompt()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool legacySettingsFound = false;
|
||||
QList<Entry*> entries = db->rootGroup()->entriesRecursive();
|
||||
for (const auto& e : entries) {
|
||||
if (e->isRecycled()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((e->attributes()->contains(KEEPASSHTTP_NAME) || e->attributes()->contains(KEEPASSXCBROWSER_NAME))
|
||||
|| (e->title() == KEEPASSHTTP_NAME || e->title().contains(KEEPASSXCBROWSER_NAME, Qt::CaseInsensitive))) {
|
||||
legacySettingsFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!legacySettingsFound) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto* checkbox = new QCheckBox(tr("Don't show this warning again"));
|
||||
QObject::connect(checkbox, &QCheckBox::stateChanged, [&](int state) {
|
||||
browserSettings()->setNoMigrationPrompt(static_cast<Qt::CheckState>(state) == Qt::CheckState::Checked);
|
||||
});
|
||||
|
||||
auto dialogResult =
|
||||
MessageBox::warning(nullptr,
|
||||
tr("KeePassXC: Legacy browser integration settings detected"),
|
||||
tr("Your KeePassXC-Browser settings need to be moved into the database settings.\n"
|
||||
"This is necessary to maintain your current browser connections.\n"
|
||||
"Would you like to migrate your existing settings now?"),
|
||||
MessageBox::Yes | MessageBox::No,
|
||||
MessageBox::NoButton,
|
||||
MessageBox::Raise,
|
||||
checkbox);
|
||||
|
||||
return dialogResult == MessageBox::Yes;
|
||||
}
|
||||
|
||||
void BrowserService::hideWindow() const
|
||||
{
|
||||
if (m_prevWindowState == WindowState::Minimized) {
|
||||
|
@ -1868,11 +1739,6 @@ void BrowserService::databaseUnlocked(DatabaseWidget* dbWidget)
|
|||
QJsonObject msg;
|
||||
msg["action"] = QString("database-unlocked");
|
||||
m_browserHost->broadcastClientMessage(msg);
|
||||
|
||||
auto db = dbWidget->database();
|
||||
if (checkLegacySettings(db)) {
|
||||
convertAttributesToCustomData(db);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -122,7 +122,8 @@ public:
|
|||
void removePluginData(Entry* entry) const;
|
||||
QJsonArray findEntries(const EntryParameters& entryParameters, const StringPairList& keyList, bool* entriesFound);
|
||||
void requestGlobalAutoType(const QString& search);
|
||||
static void convertAttributesToCustomData(QSharedPointer<Database> db);
|
||||
|
||||
static QString decodeCustomDataRestrictKey(const QString& key);
|
||||
|
||||
static const QString KEEPASSXCBROWSER_NAME;
|
||||
static const QString KEEPASSXCBROWSER_OLD_NAME;
|
||||
|
@ -131,6 +132,8 @@ public:
|
|||
static const QString OPTION_ONLY_HTTP_AUTH;
|
||||
static const QString OPTION_NOT_HTTP_AUTH;
|
||||
static const QString OPTION_OMIT_WWW;
|
||||
static const QString ADDITIONAL_URL;
|
||||
static const QString OPTION_RESTRICT_KEY;
|
||||
|
||||
signals:
|
||||
void requestUnlock();
|
||||
|
@ -163,6 +166,7 @@ private:
|
|||
QList<Entry*> searchEntries(const QSharedPointer<Database>& db,
|
||||
const QString& siteUrl,
|
||||
const QString& formUrl,
|
||||
const QStringList& keys = {},
|
||||
bool passkey = false);
|
||||
QList<Entry*>
|
||||
searchEntries(const QString& siteUrl, const QString& formUrl, const StringPairList& keyList, bool passkey = false);
|
||||
|
@ -201,15 +205,10 @@ private:
|
|||
bool handleURLWithWildcards(const QUrl& entryQUrl, const QString& siteUrl);
|
||||
QString getDatabaseRootUuid();
|
||||
QString getDatabaseRecycleBinUuid();
|
||||
bool checkLegacySettings(QSharedPointer<Database> db);
|
||||
void hideWindow() const;
|
||||
void raiseWindow(const bool force = false);
|
||||
|
||||
void updateWindowState();
|
||||
|
||||
static bool moveSettingsToCustomData(Entry* entry, const QString& name);
|
||||
static int moveKeysToCustomData(Entry* entry, QSharedPointer<Database> db);
|
||||
|
||||
QPointer<BrowserHost> m_browserHost;
|
||||
QHash<QString, QSharedPointer<BrowserAction>> m_browserClients;
|
||||
|
||||
|
|
|
@ -237,6 +237,16 @@ void BrowserSettings::setUpdateBinaryPath(bool enabled)
|
|||
config()->set(Config::Browser_UpdateBinaryPath, enabled);
|
||||
}
|
||||
|
||||
bool BrowserSettings::allowGetDatabaseEntriesRequest()
|
||||
{
|
||||
return config()->get(Config::Browser_AllowGetDatabaseEntriesRequest).toBool();
|
||||
}
|
||||
|
||||
void BrowserSettings::setAllowGetDatabaseEntriesRequest(bool enabled)
|
||||
{
|
||||
config()->set(Config::Browser_AllowGetDatabaseEntriesRequest, enabled);
|
||||
}
|
||||
|
||||
bool BrowserSettings::allowExpiredCredentials()
|
||||
{
|
||||
return config()->get(Config::Browser_AllowExpiredCredentials).toBool();
|
||||
|
|
|
@ -66,6 +66,8 @@ public:
|
|||
#endif
|
||||
bool updateBinaryPath();
|
||||
void setUpdateBinaryPath(bool enabled);
|
||||
bool allowGetDatabaseEntriesRequest();
|
||||
void setAllowGetDatabaseEntriesRequest(bool enabled);
|
||||
bool allowExpiredCredentials();
|
||||
void setAllowExpiredCredentials(bool enabled);
|
||||
|
||||
|
|
|
@ -118,6 +118,7 @@ void BrowserSettingsWidget::loadSettings()
|
|||
m_ui->useCustomProxy->setChecked(settings->useCustomProxy());
|
||||
m_ui->customProxyLocation->setText(settings->replaceHomePath(settings->customProxyLocation()));
|
||||
m_ui->updateBinaryPath->setChecked(settings->updateBinaryPath());
|
||||
m_ui->allowGetDatabaseEntriesRequest->setChecked(settings->allowGetDatabaseEntriesRequest());
|
||||
m_ui->allowExpiredCredentials->setChecked(settings->allowExpiredCredentials());
|
||||
m_ui->chromeSupport->setChecked(settings->browserSupport(BrowserShared::CHROME));
|
||||
m_ui->chromiumSupport->setChecked(settings->browserSupport(BrowserShared::CHROMIUM));
|
||||
|
@ -231,6 +232,7 @@ void BrowserSettingsWidget::saveSettings()
|
|||
settings->setCustomProxyLocation(resolveCustomProxyLocation());
|
||||
|
||||
settings->setUpdateBinaryPath(m_ui->updateBinaryPath->isChecked());
|
||||
settings->setAllowGetDatabaseEntriesRequest(m_ui->allowGetDatabaseEntriesRequest->isChecked());
|
||||
settings->setAllowExpiredCredentials(m_ui->allowExpiredCredentials->isChecked());
|
||||
settings->setAlwaysAllowAccess(m_ui->alwaysAllowAccess->isChecked());
|
||||
settings->setAlwaysAllowUpdate(m_ui->alwaysAllowUpdate->isChecked());
|
||||
|
|
|
@ -340,6 +340,16 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="allowGetDatabaseEntriesRequest">
|
||||
<property name="toolTip">
|
||||
<string>Allow keepassxc-proxy to list all entries with their title, URL and UUID in connected databases.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Allow limited access to all entries in connected databases (ignores site access restrictions)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="useCustomProxy">
|
||||
<property name="toolTip">
|
||||
|
|
11
src/browser/CMakeLists.txt
Executable file → Normal file
|
@ -16,7 +16,7 @@
|
|||
if(WITH_XC_BROWSER)
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
set(keepassxcbrowser_SOURCES
|
||||
set(browser_SOURCES
|
||||
BrowserAccessControlDialog.cpp
|
||||
BrowserAction.cpp
|
||||
BrowserEntryConfig.cpp
|
||||
|
@ -29,11 +29,10 @@ if(WITH_XC_BROWSER)
|
|||
BrowserSettings.cpp
|
||||
BrowserShared.cpp
|
||||
CustomTableWidget.cpp
|
||||
NativeMessageInstaller.cpp
|
||||
)
|
||||
NativeMessageInstaller.cpp)
|
||||
|
||||
if(WITH_XC_BROWSER_PASSKEYS)
|
||||
list(APPEND keepassxcbrowser_SOURCES
|
||||
list(APPEND browser_SOURCES
|
||||
BrowserCbor.cpp
|
||||
BrowserPasskeys.cpp
|
||||
BrowserPasskeysClient.cpp
|
||||
|
@ -41,6 +40,6 @@ if(WITH_XC_BROWSER)
|
|||
PasskeyUtils.cpp)
|
||||
endif()
|
||||
|
||||
add_library(keepassxcbrowser STATIC ${keepassxcbrowser_SOURCES})
|
||||
target_link_libraries(keepassxcbrowser Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network ${BOTAN_LIBRARIES})
|
||||
add_library(browser STATIC ${browser_SOURCES})
|
||||
target_link_libraries(browser Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network ${BOTAN_LIBRARIES})
|
||||
endif()
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com>
|
||||
* Copyright (C) 2021 KeePassXC Team <team@keepassxc.org>
|
||||
* Copyright (C) 2025 KeePassXC Team <team@keepassxc.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -70,7 +69,7 @@ namespace
|
|||
const QString TARGET_DIR_FIREFOX = QStringLiteral("/.mozilla/native-messaging-hosts");
|
||||
const QString TARGET_DIR_VIVALDI = QStringLiteral("/vivaldi/NativeMessagingHosts");
|
||||
const QString TARGET_DIR_TOR_BROWSER = QStringLiteral(
|
||||
"/torbrowser/tbb/x86_64/tor-browser_en-US/Browser/TorBrowser/Data/Browser/.mozilla/native-messaging-hosts");
|
||||
"/torbrowser/tbb/x86_64/tor-browser/Browser/TorBrowser/Data/Browser/.mozilla/native-messaging-hosts");
|
||||
const QString TARGET_DIR_BRAVE = QStringLiteral("/BraveSoftware/Brave-Browser/NativeMessagingHosts");
|
||||
const QString TARGET_DIR_EDGE = QStringLiteral("/microsoft-edge/NativeMessagingHosts");
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2024 KeePassXC Team <team@keepassxc.org>
|
||||
* Copyright (C) 2025 KeePassXC Team <team@keepassxc.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -20,7 +20,7 @@
|
|||
#include "BrowserPasskeys.h"
|
||||
#include "core/EntryAttributes.h"
|
||||
#include "core/Tools.h"
|
||||
#include "core/UrlTools.h"
|
||||
#include "gui/UrlTools.h"
|
||||
|
||||
#include <QList>
|
||||
#include <QUrl>
|
||||
|
@ -53,8 +53,8 @@ bool PasskeyUtils::checkCredentialCreationOptions(const QJsonObject& credentialC
|
|||
{
|
||||
if (!credentialCreationOptions["attestation"].isString()
|
||||
|| credentialCreationOptions["attestation"].toString().isEmpty()
|
||||
|| !credentialCreationOptions["clientDataJSON"].isObject()
|
||||
|| credentialCreationOptions["clientDataJSON"].toObject().isEmpty()
|
||||
|| !credentialCreationOptions["clientDataJSON"].isString()
|
||||
|| credentialCreationOptions["clientDataJSON"].toString().isEmpty()
|
||||
|| !credentialCreationOptions["rp"].isObject() || credentialCreationOptions["rp"].toObject().isEmpty()
|
||||
|| !credentialCreationOptions["user"].isObject() || credentialCreationOptions["user"].toObject().isEmpty()
|
||||
|| !credentialCreationOptions["residentKey"].isBool() || credentialCreationOptions["residentKey"].isUndefined()
|
||||
|
@ -75,7 +75,7 @@ bool PasskeyUtils::checkCredentialCreationOptions(const QJsonObject& credentialC
|
|||
// Basic check for the object that it contains necessary variables in a correct form
|
||||
bool PasskeyUtils::checkCredentialAssertionOptions(const QJsonObject& assertionOptions) const
|
||||
{
|
||||
if (!assertionOptions["clientDataJson"].isObject() || assertionOptions["clientDataJson"].toObject().isEmpty()
|
||||
if (!assertionOptions["clientDataJson"].isString() || assertionOptions["clientDataJson"].toString().isEmpty()
|
||||
|| !assertionOptions["rpId"].isString() || assertionOptions["rpId"].toString().isEmpty()
|
||||
|| !assertionOptions["userPresence"].isBool() || assertionOptions["userPresence"].isUndefined()
|
||||
|| !assertionOptions["userVerification"].isBool() || assertionOptions["userVerification"].isUndefined()) {
|
||||
|
@ -352,15 +352,11 @@ ExtensionResult PasskeyUtils::buildExtensionData(QJsonObject& extensionObject) c
|
|||
return {};
|
||||
}
|
||||
|
||||
QJsonObject PasskeyUtils::buildClientDataJson(const QJsonObject& publicKey, const QString& origin, bool get) const
|
||||
// Serialization order: https://w3c.github.io/webauthn/#clientdatajson-serialization
|
||||
QString PasskeyUtils::buildClientDataJson(const QJsonObject& publicKey, const QString& origin, bool get) const
|
||||
{
|
||||
QJsonObject clientData;
|
||||
clientData["challenge"] = publicKey["challenge"];
|
||||
clientData["crossOrigin"] = false;
|
||||
clientData["origin"] = origin;
|
||||
clientData["type"] = get ? QString("webauthn.get") : QString("webauthn.create");
|
||||
|
||||
return clientData;
|
||||
return QString("{\"type\":\"%1\",\"challenge\":\"%2\",\"origin\":\"%3\",\"crossOrigin\":false}")
|
||||
.arg((get ? QString("webauthn.get") : QString("webauthn.create")), publicKey["challenge"].toString(), origin);
|
||||
}
|
||||
|
||||
QStringList PasskeyUtils::getAllowedCredentialsFromAssertionOptions(const QJsonObject& assertionOptions) const
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2024 KeePassXC Team <team@keepassxc.org>
|
||||
* Copyright (C) 2025 KeePassXC Team <team@keepassxc.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -58,7 +58,7 @@ public:
|
|||
bool isUserVerificationRequired(const QJsonObject& authenticatorSelection) const;
|
||||
bool isOriginAllowedWithLocalhost(bool allowLocalhostWithPasskeys, const QString& origin) const;
|
||||
ExtensionResult buildExtensionData(QJsonObject& extensionObject) const;
|
||||
QJsonObject buildClientDataJson(const QJsonObject& publicKey, const QString& origin, bool get) const;
|
||||
QString buildClientDataJson(const QJsonObject& publicKey, const QString& origin, bool get) const;
|
||||
QStringList getAllowedCredentialsFromAssertionOptions(const QJsonObject& assertionOptions) const;
|
||||
QString getCredentialIdFromEntry(const Entry* entry) const;
|
||||
QString getUsernameFromEntry(const Entry* entry) const;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
#include "Generate.h"
|
||||
#include "Utils.h"
|
||||
#include "core/Global.h"
|
||||
#include "core/Group.h"
|
||||
#include "core/PasswordGenerator.h"
|
||||
|
||||
|
@ -74,7 +75,7 @@ int Add::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<Q
|
|||
|
||||
// Cannot use those 2 options at the same time!
|
||||
if (parser->isSet(Add::GenerateOption) && parser->isSet(Add::PasswordPromptOption)) {
|
||||
err << QObject::tr("Cannot generate a password and prompt at the same time.") << endl;
|
||||
err << QObject::tr("Cannot generate a password and prompt at the same time.") << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -90,7 +91,7 @@ int Add::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<Q
|
|||
|
||||
Entry* entry = database->rootGroup()->addEntryWithPath(entryPath);
|
||||
if (!entry) {
|
||||
err << QObject::tr("Could not create entry with path %1.").arg(entryPath) << endl;
|
||||
err << QObject::tr("Could not create entry with path %1.").arg(entryPath) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -108,7 +109,7 @@ int Add::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<Q
|
|||
|
||||
if (parser->isSet(Add::PasswordPromptOption)) {
|
||||
if (!parser->isSet(Command::QuietOption)) {
|
||||
out << QObject::tr("Enter password for new entry: ") << flush;
|
||||
out << QObject::tr("Enter password for new entry: ") << Qt::flush;
|
||||
}
|
||||
QString password = Utils::getPassword(parser->isSet(Command::QuietOption));
|
||||
entry->setPassword(password);
|
||||
|
@ -119,12 +120,12 @@ int Add::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<Q
|
|||
|
||||
QString errorMessage;
|
||||
if (!database->save(Database::Atomic, {}, &errorMessage)) {
|
||||
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << endl;
|
||||
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (!parser->isSet(Command::QuietOption)) {
|
||||
out << QObject::tr("Successfully added entry %1.").arg(entry->title()) << endl;
|
||||
out << QObject::tr("Successfully added entry %1.").arg(entry->title()) << Qt::endl;
|
||||
}
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "AddGroup.h"
|
||||
|
||||
#include "Utils.h"
|
||||
#include "core/Global.h"
|
||||
#include "core/Group.h"
|
||||
|
||||
#include <QCommandLineParser>
|
||||
|
@ -29,9 +30,7 @@ AddGroup::AddGroup()
|
|||
positionalArguments.append({QString("group"), QObject::tr("Path of the group to add."), QString("")});
|
||||
}
|
||||
|
||||
AddGroup::~AddGroup()
|
||||
{
|
||||
}
|
||||
AddGroup::~AddGroup() = default;
|
||||
|
||||
int AddGroup::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
|
||||
{
|
||||
|
@ -47,29 +46,29 @@ int AddGroup::executeWithDatabase(QSharedPointer<Database> database, QSharedPoin
|
|||
|
||||
Group* group = database->rootGroup()->findGroupByPath(groupPath);
|
||||
if (group) {
|
||||
err << QObject::tr("Group %1 already exists!").arg(groupPath) << endl;
|
||||
err << QObject::tr("Group %1 already exists!").arg(groupPath) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
Group* parentGroup = database->rootGroup()->findGroupByPath(parentGroupPath);
|
||||
if (!parentGroup) {
|
||||
err << QObject::tr("Group %1 not found.").arg(parentGroupPath) << endl;
|
||||
err << QObject::tr("Group %1 not found.").arg(parentGroupPath) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
Group* newGroup = new Group();
|
||||
auto newGroup = new Group();
|
||||
newGroup->setUuid(QUuid::createUuid());
|
||||
newGroup->setName(groupName);
|
||||
newGroup->setParent(parentGroup);
|
||||
|
||||
QString errorMessage;
|
||||
if (!database->save(Database::Atomic, {}, &errorMessage)) {
|
||||
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << endl;
|
||||
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (!parser->isSet(Command::QuietOption)) {
|
||||
out << QObject::tr("Successfully added group %1.").arg(groupName) << endl;
|
||||
out << QObject::tr("Successfully added group %1.").arg(groupName) << Qt::endl;
|
||||
}
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -24,9 +24,9 @@ class AddGroup : public DatabaseCommand
|
|||
{
|
||||
public:
|
||||
AddGroup();
|
||||
~AddGroup();
|
||||
~AddGroup() override;
|
||||
|
||||
int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser);
|
||||
int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
|
||||
};
|
||||
|
||||
#endif // KEEPASSXC_ADDGROUP_H
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "Analyze.h"
|
||||
|
||||
#include "Utils.h"
|
||||
#include "core/Global.h"
|
||||
#include "core/Group.h"
|
||||
#include "core/HibpOffline.h"
|
||||
|
||||
|
@ -60,23 +61,24 @@ int Analyze::executeWithDatabase(QSharedPointer<Database> database, QSharedPoint
|
|||
|
||||
auto okon = parser->value(Analyze::OkonOption);
|
||||
if (!okon.isEmpty()) {
|
||||
out << QObject::tr("Evaluating database entries using okon…") << endl;
|
||||
out << QObject::tr("Evaluating database entries using okon…") << Qt::endl;
|
||||
|
||||
if (!HibpOffline::okonReport(database, okon, hibpDatabase, findings, &error)) {
|
||||
err << error << endl;
|
||||
err << error << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
} else {
|
||||
QFile hibpFile(hibpDatabase);
|
||||
if (!hibpFile.open(QFile::ReadOnly)) {
|
||||
err << QObject::tr("Failed to open HIBP file %1: %2").arg(hibpDatabase).arg(hibpFile.errorString()) << endl;
|
||||
err << QObject::tr("Failed to open HIBP file %1: %2").arg(hibpDatabase).arg(hibpFile.errorString())
|
||||
<< Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
out << QObject::tr("Evaluating database entries against HIBP file, this will take a while…") << endl;
|
||||
out << QObject::tr("Evaluating database entries against HIBP file, this will take a while…") << Qt::endl;
|
||||
|
||||
if (!HibpOffline::report(database, hibpFile, findings, &error)) {
|
||||
err << error << endl;
|
||||
err << error << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
@ -91,9 +93,10 @@ int Analyze::executeWithDatabase(QSharedPointer<Database> database, QSharedPoint
|
|||
}
|
||||
|
||||
if (count > 0) {
|
||||
out << QObject::tr("Password for '%1' has been leaked %2 time(s)!", "", count).arg(path).arg(count) << endl;
|
||||
out << QObject::tr("Password for '%1' has been leaked %2 time(s)!", "", count).arg(path).arg(count)
|
||||
<< Qt::endl;
|
||||
} else {
|
||||
out << QObject::tr("Password for '%1' has been leaked!").arg(path) << endl;
|
||||
out << QObject::tr("Password for '%1' has been leaked!").arg(path) << Qt::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "AttachmentExport.h"
|
||||
|
||||
#include "Utils.h"
|
||||
#include "core/Global.h"
|
||||
#include "core/Group.h"
|
||||
|
||||
#include <QCommandLineParser>
|
||||
|
@ -49,7 +50,7 @@ int AttachmentExport::executeWithDatabase(QSharedPointer<Database> database, QSh
|
|||
|
||||
auto entry = database->rootGroup()->findEntryByPath(entryPath);
|
||||
if (!entry) {
|
||||
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl;
|
||||
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -57,32 +58,32 @@ int AttachmentExport::executeWithDatabase(QSharedPointer<Database> database, QSh
|
|||
|
||||
auto attachments = entry->attachments();
|
||||
if (!attachments->hasKey(attachmentName)) {
|
||||
err << QObject::tr("Could not find attachment with name %1.").arg(attachmentName) << endl;
|
||||
err << QObject::tr("Could not find attachment with name %1.").arg(attachmentName) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (parser->isSet(AttachmentExport::StdoutOption)) {
|
||||
// Output to STDOUT even in quiet mode
|
||||
Utils::STDOUT << attachments->value(attachmentName) << flush;
|
||||
Utils::STDOUT << attachments->value(attachmentName) << Qt::flush;
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
if (args.size() < 4) {
|
||||
err << QObject::tr("No export target given. Please use '--stdout' or specify an 'export-file'.") << endl;
|
||||
err << QObject::tr("No export target given. Please use '--stdout' or specify an 'export-file'.") << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
auto exportFileName = args.at(3);
|
||||
QFile exportFile(exportFileName);
|
||||
if (!exportFile.open(QIODevice::WriteOnly)) {
|
||||
err << QObject::tr("Could not open output file %1.").arg(exportFileName) << endl;
|
||||
err << QObject::tr("Could not open output file %1.").arg(exportFileName) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
exportFile.write(attachments->value(attachmentName));
|
||||
|
||||
out << QObject::tr("Successfully exported attachment %1 of entry %2 to %3.")
|
||||
.arg(attachmentName, entryPath, exportFileName)
|
||||
<< endl;
|
||||
<< Qt::endl;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "AttachmentImport.h"
|
||||
|
||||
#include "Utils.h"
|
||||
#include "core/Global.h"
|
||||
#include "core/Group.h"
|
||||
|
||||
#include <QCommandLineParser>
|
||||
|
@ -48,7 +49,7 @@ int AttachmentImport::executeWithDatabase(QSharedPointer<Database> database, QSh
|
|||
|
||||
auto entry = database->rootGroup()->findEntryByPath(entryPath);
|
||||
if (!entry) {
|
||||
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl;
|
||||
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -56,7 +57,7 @@ int AttachmentImport::executeWithDatabase(QSharedPointer<Database> database, QSh
|
|||
|
||||
auto attachments = entry->attachments();
|
||||
if (attachments->hasKey(attachmentName) && !parser->isSet(AttachmentImport::ForceOption)) {
|
||||
err << QObject::tr("Attachment %1 already exists for entry %2.").arg(attachmentName, entryPath) << endl;
|
||||
err << QObject::tr("Attachment %1 already exists for entry %2.").arg(attachmentName, entryPath) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -64,7 +65,7 @@ int AttachmentImport::executeWithDatabase(QSharedPointer<Database> database, QSh
|
|||
|
||||
QFile importFile(importFileName);
|
||||
if (!importFile.open(QIODevice::ReadOnly)) {
|
||||
err << QObject::tr("Could not open attachment file %1.").arg(importFileName) << endl;
|
||||
err << QObject::tr("Could not open attachment file %1.").arg(importFileName) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -74,12 +75,12 @@ int AttachmentImport::executeWithDatabase(QSharedPointer<Database> database, QSh
|
|||
|
||||
QString errorMessage;
|
||||
if (!database->save(Database::Atomic, {}, &errorMessage)) {
|
||||
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << endl;
|
||||
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
out << QObject::tr("Successfully imported attachment %1 as %2 to entry %3.")
|
||||
.arg(importFileName, attachmentName, entryPath)
|
||||
<< endl;
|
||||
<< Qt::endl;
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "AttachmentRemove.h"
|
||||
|
||||
#include "Utils.h"
|
||||
#include "core/Global.h"
|
||||
#include "core/Group.h"
|
||||
|
||||
#include <QCommandLineParser>
|
||||
|
@ -41,7 +42,7 @@ int AttachmentRemove::executeWithDatabase(QSharedPointer<Database> database, QSh
|
|||
|
||||
auto entry = database->rootGroup()->findEntryByPath(entryPath);
|
||||
if (!entry) {
|
||||
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl;
|
||||
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -49,7 +50,7 @@ int AttachmentRemove::executeWithDatabase(QSharedPointer<Database> database, QSh
|
|||
|
||||
auto attachments = entry->attachments();
|
||||
if (!attachments->hasKey(attachmentName)) {
|
||||
err << QObject::tr("Could not find attachment with name %1.").arg(attachmentName) << endl;
|
||||
err << QObject::tr("Could not find attachment with name %1.").arg(attachmentName) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -59,10 +60,10 @@ int AttachmentRemove::executeWithDatabase(QSharedPointer<Database> database, QSh
|
|||
|
||||
QString errorMessage;
|
||||
if (!database->save(Database::Atomic, {}, &errorMessage)) {
|
||||
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << endl;
|
||||
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
out << QObject::tr("Successfully removed attachment %1 from entry %2.").arg(attachmentName, entryPath) << endl;
|
||||
out << QObject::tr("Successfully removed attachment %1 from entry %2.").arg(attachmentName, entryPath) << Qt::endl;
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@ add_executable(keepassxc-cli keepassxc-cli.cpp)
|
|||
target_link_libraries(keepassxc-cli
|
||||
${GPGERROR_LIBRARIES}
|
||||
cli
|
||||
keepassx_core)
|
||||
keepassxc_core)
|
||||
|
||||
install(TARGETS keepassxc-cli
|
||||
BUNDLE DESTINATION . COMPONENT Runtime
|
||||
|
|
|
@ -69,7 +69,7 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
|
|||
bool ok;
|
||||
timeout = args.at(2).toInt(&ok);
|
||||
if (!ok) {
|
||||
err << QObject::tr("Invalid timeout value %1.").arg(args.at(2)) << endl;
|
||||
err << QObject::tr("Invalid timeout value %1.").arg(args.at(2)) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
@ -80,14 +80,14 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
|
|||
const auto& searchTerm = args.at(1);
|
||||
const auto results = searcher.search(QString("title:%1").arg(searchTerm), database->rootGroup(), true);
|
||||
if (results.count() > 1) {
|
||||
err << QObject::tr("Multiple entries matching:") << endl;
|
||||
err << QObject::tr("Multiple entries matching:") << Qt::endl;
|
||||
for (const Entry* result : results) {
|
||||
err << result->path().prepend('/') << endl;
|
||||
err << result->path().prepend('/') << Qt::endl;
|
||||
}
|
||||
return EXIT_FAILURE;
|
||||
} else {
|
||||
entryPath = (results.isEmpty()) ? searchTerm : results[0]->path().prepend('/');
|
||||
out << QObject::tr("Using matching entry: %1").arg(entryPath) << endl;
|
||||
out << QObject::tr("Using matching entry: %1").arg(entryPath) << Qt::endl;
|
||||
}
|
||||
} else {
|
||||
entryPath = args.at(1);
|
||||
|
@ -95,12 +95,12 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
|
|||
|
||||
auto* entry = database->rootGroup()->findEntryByPath(entryPath);
|
||||
if (!entry) {
|
||||
err << QObject::tr("Entry %1 not found.").arg(entryPath) << endl;
|
||||
err << QObject::tr("Entry %1 not found.").arg(entryPath) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (parser->isSet(AttributeOption) && parser->isSet(TotpOption)) {
|
||||
err << QObject::tr("ERROR: Please specify one of --attribute or --totp, not both.") << endl;
|
||||
err << QObject::tr("ERROR: Please specify one of --attribute or --totp, not both.") << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -109,7 +109,7 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
|
|||
bool found = false;
|
||||
if (parser->isSet(TotpOption) || selectedAttribute == "totp") {
|
||||
if (!entry->hasTotp()) {
|
||||
err << QObject::tr("Entry with path %1 has no TOTP set up.").arg(entryPath) << endl;
|
||||
err << QObject::tr("Entry with path %1 has no TOTP set up.").arg(entryPath) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -124,7 +124,7 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
|
|||
if (attrs.size() > 1) {
|
||||
err << QObject::tr("ERROR: attribute %1 is ambiguous, it matches %2.")
|
||||
.arg(selectedAttribute, QLocale().createSeparatedList(attrs))
|
||||
<< endl;
|
||||
<< Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
} else if (attrs.size() == 1) {
|
||||
found = true;
|
||||
|
@ -134,7 +134,7 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
|
|||
}
|
||||
|
||||
if (!found) {
|
||||
out << QObject::tr("Attribute \"%1\" not found.").arg(selectedAttribute) << endl;
|
||||
out << QObject::tr("Attribute \"%1\" not found.").arg(selectedAttribute) << Qt::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
@ -143,7 +143,7 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
|
|||
return exitCode;
|
||||
}
|
||||
|
||||
out << QObject::tr("Entry's \"%1\" attribute copied to the clipboard!").arg(selectedAttribute) << endl;
|
||||
out << QObject::tr("Entry's \"%1\" attribute copied to the clipboard!").arg(selectedAttribute) << Qt::endl;
|
||||
|
||||
if (timeout <= 0) {
|
||||
return exitCode;
|
||||
|
@ -153,13 +153,13 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
|
|||
while (timeout > 0) {
|
||||
out << '\r' << QString(lastLine.size(), ' ') << '\r';
|
||||
lastLine = QObject::tr("Clearing the clipboard in %1 second(s)...", "", timeout).arg(timeout);
|
||||
out << lastLine << flush;
|
||||
out << lastLine << Qt::flush;
|
||||
Tools::sleep(1000);
|
||||
--timeout;
|
||||
}
|
||||
Utils::clipText("");
|
||||
out << '\r' << QString(lastLine.size(), ' ') << '\r';
|
||||
out << QObject::tr("Clipboard cleared!") << endl;
|
||||
out << QObject::tr("Clipboard cleared!") << Qt::endl;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -100,9 +100,7 @@ Command::Command()
|
|||
options.append(Command::QuietOption);
|
||||
}
|
||||
|
||||
Command::~Command()
|
||||
{
|
||||
}
|
||||
Command::~Command() = default;
|
||||
|
||||
QString Command::getDescriptionLine()
|
||||
{
|
||||
|
|