mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Merge branch 'upstream-update' 2.2.0.9 into develop #11
This commit is contained in:
33
CHANGELOG
33
CHANGELOG
@@ -1,3 +1,9 @@
|
||||
KeepassDX (2.5.0.0beta3)
|
||||
* Merge KeePassDroid 2.2.0.9
|
||||
|
||||
KeepassDX (2.5.0.0beta2)
|
||||
* Remove libs for F-Droid
|
||||
|
||||
KeepassDX (2.5.0.0beta1)
|
||||
* Fork KeepassDroid
|
||||
* Add Material Design
|
||||
@@ -7,6 +13,33 @@ KeepassDX (2.5.0.0beta1)
|
||||
* Update French translation
|
||||
* Change donation (see KeepassDroid to contribute on both projects)
|
||||
|
||||
KeePassDroid (2.2.0.9)
|
||||
* Update build tools version to workaround CM/Lineage bug (closes: #249)
|
||||
* Update Russian translations
|
||||
* Update Polish translations
|
||||
|
||||
KeePassDroid (2.2.0.8)
|
||||
* Add corruption fix mode
|
||||
* Update Hungarian translations
|
||||
|
||||
KeePassDroid (2.2.0.7)
|
||||
* Fix KDBX3 encryption rounds corruption
|
||||
* Fix KDBX4 attachement crashes
|
||||
|
||||
KeePassDroid (2.2.0.6)
|
||||
* Add additional ndk ABIs
|
||||
|
||||
KeePassDroid (2.2.0.5)
|
||||
* Don't show fingerprint prompt on devices without fingerprint hardware
|
||||
* Fix dateformat crashes
|
||||
|
||||
KeePassDroid (2.2.0.4)
|
||||
* Fingerprint fixes
|
||||
|
||||
KeePassDroid (2.2.0.3)
|
||||
* Search crash fix
|
||||
* Improve fingerprint handling
|
||||
|
||||
KeePassDroid (2.2.0.2)
|
||||
* Fix non fingerprint password layout
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ Tadashi Saito
|
||||
vhschlenker
|
||||
bumper314 - Samsung multiwindow support
|
||||
Hans Cappelle - fingerprint sensor integration
|
||||
Jeremy Jamet - Material Design - Patches
|
||||
Jeremy Jamet - Keepass DX Material Design - Patches
|
||||
|
||||
Translations:
|
||||
Diego Pierotto - Italian
|
||||
@@ -30,7 +30,7 @@ Matsuu Takuto - Japanese
|
||||
Carlos Schlyter - Portugese (Brazil)
|
||||
YSmhXQDd6Z - Portugese (Portugal)
|
||||
andriykopanytsia - Ukranian
|
||||
intel - Hungarian
|
||||
intel, Zoltán Antal - Hungarian
|
||||
H Vanek - Czech
|
||||
jipanos - Spanish
|
||||
Erik Fdevriendt, Erik Jan Meijer - Dutch
|
||||
|
||||
@@ -2,17 +2,22 @@ apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
compileSdkVersion = 25
|
||||
buildToolsVersion = "26.0.2"
|
||||
buildToolsVersion = "27.0.1"
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.kunzisoft.keepass"
|
||||
minSdkVersion 14
|
||||
targetSdkVersion 25
|
||||
versionCode = 2
|
||||
versionName = "2.5.0.0beta2"
|
||||
versionCode = 3
|
||||
versionName = "2.5.0.0beta3"
|
||||
|
||||
testApplicationId = "com.keepassdroid.tests"
|
||||
testInstrumentationRunner = "android.test.InstrumentationTestRunner"
|
||||
|
||||
ndk {
|
||||
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
|
||||
'arm64-v8a', 'mips', 'mips64'
|
||||
}
|
||||
}
|
||||
|
||||
externalNativeBuild {
|
||||
@@ -21,6 +26,7 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled = false
|
||||
|
||||
@@ -19,9 +19,29 @@
|
||||
*/
|
||||
package com.keepassdroid;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.net.Uri;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Log;
|
||||
|
||||
import com.keepassdroid.database.PwDatabase;
|
||||
import com.keepassdroid.database.PwDatabaseV3;
|
||||
import com.keepassdroid.database.PwGroup;
|
||||
import com.keepassdroid.database.exception.ContentFileNotFoundException;
|
||||
import com.keepassdroid.database.exception.InvalidDBException;
|
||||
import com.keepassdroid.database.exception.InvalidPasswordException;
|
||||
import com.keepassdroid.database.exception.PwDbOutputException;
|
||||
import com.keepassdroid.database.load.Importer;
|
||||
import com.keepassdroid.database.load.ImporterFactory;
|
||||
import com.keepassdroid.database.save.PwDbOutput;
|
||||
import com.keepassdroid.icons.DrawableFactory;
|
||||
import com.keepassdroid.search.SearchDbHelper;
|
||||
import com.keepassdroid.utils.UriUtil;
|
||||
import com.kunzisoft.keepass.R;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
@@ -31,24 +51,6 @@ import java.io.SyncFailedException;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
|
||||
import com.keepassdroid.database.PwDatabase;
|
||||
import com.keepassdroid.database.PwDatabaseV3;
|
||||
import com.keepassdroid.database.PwGroup;
|
||||
import com.keepassdroid.database.exception.ContentFileNotFoundException;
|
||||
import com.keepassdroid.database.exception.InvalidDBException;
|
||||
import com.keepassdroid.database.exception.PwDbOutputException;
|
||||
import com.keepassdroid.database.load.Importer;
|
||||
import com.keepassdroid.database.load.ImporterFactory;
|
||||
import com.keepassdroid.database.save.PwDbOutput;
|
||||
import com.keepassdroid.icons.DrawableFactory;
|
||||
import com.keepassdroid.search.SearchDbHelper;
|
||||
import com.keepassdroid.utils.UriUtil;
|
||||
|
||||
/**
|
||||
* @author bpellin
|
||||
*/
|
||||
@@ -92,6 +94,26 @@ public class Database {
|
||||
readOnly = !file.canWrite();
|
||||
}
|
||||
|
||||
try {
|
||||
passUrisAsInputStreams(ctx, uri, password, keyfile, status, debug, 0);
|
||||
} catch (InvalidPasswordException e) {
|
||||
// Retry with rounds fix
|
||||
try {
|
||||
passUrisAsInputStreams(ctx, uri, password, keyfile, status, debug, getFixRounds(ctx));
|
||||
} catch (Exception e2) {
|
||||
// Rethrow original exception
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private long getFixRounds(Context ctx) {
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
|
||||
return prefs.getLong(ctx.getString(R.string.roundsFix_key), ctx.getResources().getInteger(R.integer.roundsFix_default));
|
||||
}
|
||||
|
||||
|
||||
private void passUrisAsInputStreams(Context ctx, Uri uri, String password, Uri keyfile, UpdateStatus status, boolean debug, long roundsFix) throws IOException, FileNotFoundException, InvalidDBException {
|
||||
InputStream is, kfIs;
|
||||
try {
|
||||
is = UriUtil.getUriInputStream(ctx, uri);
|
||||
@@ -106,7 +128,7 @@ public class Database {
|
||||
Log.e("KPD", "Database::LoadData", e);
|
||||
throw ContentFileNotFoundException.getInstance(keyfile);
|
||||
}
|
||||
LoadData(ctx, is, password, kfIs, status, debug);
|
||||
LoadData(ctx, is, password, kfIs, status, debug, roundsFix);
|
||||
}
|
||||
|
||||
public void LoadData(Context ctx, InputStream is, String password, InputStream kfIs, boolean debug) throws IOException, InvalidDBException {
|
||||
@@ -114,6 +136,10 @@ public class Database {
|
||||
}
|
||||
|
||||
public void LoadData(Context ctx, InputStream is, String password, InputStream kfIs, UpdateStatus status, boolean debug) throws IOException, InvalidDBException {
|
||||
LoadData(ctx, is, password, kfIs, status, debug, 0);
|
||||
}
|
||||
|
||||
public void LoadData(Context ctx, InputStream is, String password, InputStream kfIs, UpdateStatus status, boolean debug, long roundsFix) throws IOException, InvalidDBException {
|
||||
BufferedInputStream bis = new BufferedInputStream(is);
|
||||
|
||||
if ( ! bis.markSupported() ) {
|
||||
@@ -127,7 +153,7 @@ public class Database {
|
||||
|
||||
bis.reset(); // Return to the start
|
||||
|
||||
pm = imp.openDatabase(bis, password, kfIs, status);
|
||||
pm = imp.openDatabase(bis, password, kfIs, status, roundsFix);
|
||||
if ( pm != null ) {
|
||||
PwGroup root = pm.rootGroup;
|
||||
pm.populateGlobals(root);
|
||||
|
||||
@@ -151,14 +151,15 @@ public abstract class GroupBaseActivity extends LockCloseListActivity
|
||||
|
||||
private void ensureCorrectListView(){
|
||||
mList = (ListView)findViewById(R.id.group_list);
|
||||
mList.setOnItemClickListener(
|
||||
new AdapterView.OnItemClickListener() {
|
||||
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
|
||||
{
|
||||
onListItemClick((ListView)parent, v, position, id);
|
||||
if (mList != null) {
|
||||
mList.setOnItemClickListener(
|
||||
new AdapterView.OnItemClickListener() {
|
||||
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
|
||||
onListItemClick((ListView) parent, v, position, id);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright 2017 Brian Pellin.
|
||||
*
|
||||
* This file is part of KeePassDroid.
|
||||
*
|
||||
* KeePassDroid is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* KeePassDroid is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with KeePassDroid. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.keepassdroid.compat;
|
||||
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Method;
|
||||
import java.security.spec.AlgorithmParameterSpec;
|
||||
|
||||
public class KeyGenParameterSpecCompat {
|
||||
private static Class builder;
|
||||
private static Constructor buildConst;
|
||||
private static Method builderBuild;
|
||||
private static Method setBlockModes;
|
||||
private static Method setUserAuthReq;
|
||||
private static Method setEncPad;
|
||||
|
||||
private static boolean available;
|
||||
|
||||
static {
|
||||
try {
|
||||
builder = Class.forName("android.security.keystore.KeyGenParameterSpec$Builder");
|
||||
buildConst = builder.getConstructor(String.class, int.class);
|
||||
builderBuild = builder.getMethod("build", (Class [])null);
|
||||
setBlockModes = builder.getMethod("setBlockModes", String[].class);
|
||||
setUserAuthReq = builder.getMethod("setUserAuthenticationRequired", new Class []{boolean.class});
|
||||
setEncPad = builder.getMethod("setEncryptionPaddings", String[].class);
|
||||
|
||||
|
||||
available = true;
|
||||
} catch (Exception e) {
|
||||
available = false;
|
||||
}
|
||||
}
|
||||
|
||||
public static AlgorithmParameterSpec build(String keystoreAlias, int purpose, String blockMode,
|
||||
boolean userAuthReq, String encPadding) {
|
||||
|
||||
if (!available) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
Object inst = buildConst.newInstance(keystoreAlias, purpose);
|
||||
inst = setBlockModes.invoke(inst, new Object[] {new String[] {blockMode}});
|
||||
inst = setUserAuthReq.invoke(inst, userAuthReq);
|
||||
inst = setEncPad.invoke(inst, new Object[] {new String[] {encPadding}});
|
||||
|
||||
return (AlgorithmParameterSpec) builderBuild.invoke(inst, null);
|
||||
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright 2017 Brian Pellin.
|
||||
*
|
||||
* This file is part of KeePassDroid.
|
||||
*
|
||||
* KeePassDroid is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* KeePassDroid is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with KeePassDroid. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
package com.keepassdroid.compat;
|
||||
|
||||
import android.app.KeyguardManager;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class KeyguardManagerCompat {
|
||||
private static Method isKeyguardSecure;
|
||||
|
||||
private static boolean available;
|
||||
|
||||
static {
|
||||
try {
|
||||
isKeyguardSecure = KeyguardManager.class.getMethod("isKeyguardSecure", (Class[]) null);
|
||||
|
||||
available = true;
|
||||
} catch (Exception e) {
|
||||
available = false;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isKeyguardSecure(KeyguardManager inst) {
|
||||
if (!available) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
return (boolean) isKeyguardSecure.invoke(inst, null);
|
||||
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@
|
||||
*/
|
||||
package com.keepassdroid.database;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
@@ -50,6 +51,14 @@ public class BinaryPool {
|
||||
return pool.entrySet();
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
pool.clear();
|
||||
}
|
||||
|
||||
public Collection<ProtectedBinary> binaries() {
|
||||
return pool.values();
|
||||
}
|
||||
|
||||
private class AddBinaries extends EntryHandler<PwEntryV4> {
|
||||
|
||||
@Override
|
||||
@@ -72,7 +81,7 @@ public class BinaryPool {
|
||||
|
||||
}
|
||||
|
||||
private void poolAdd(ProtectedBinary pb) {
|
||||
public void poolAdd(ProtectedBinary pb) {
|
||||
assert(pb != null);
|
||||
|
||||
if (poolFind(pb) != -1) return;
|
||||
|
||||
@@ -69,6 +69,7 @@ public class PwDatabaseV4 extends PwDatabase {
|
||||
public UUID dataCipher = AesEngine.CIPHER_UUID;
|
||||
public CipherEngine dataEngine = new AesEngine();
|
||||
public PwCompressionAlgorithm compressionAlgorithm = PwCompressionAlgorithm.Gzip;
|
||||
// TODO: Refactor me away to get directly from kdfParameters
|
||||
public long numKeyEncRounds = 6000;
|
||||
public Date nameChanged = DEFAULT_NOW;
|
||||
public Date settingsChanged = DEFAULT_NOW;
|
||||
@@ -99,6 +100,7 @@ public class PwDatabaseV4 extends PwDatabase {
|
||||
public Map<String, String> customData = new HashMap<String, String>();
|
||||
public KdfParameters kdfParameters = KdfFactory.getDefaultParameters();
|
||||
public VariantDictionary publicCustomData = new VariantDictionary();
|
||||
public BinaryPool binPool = new BinaryPool();
|
||||
|
||||
public String localizedAppName = "KeePassDroid";
|
||||
|
||||
@@ -169,13 +171,24 @@ public class PwDatabaseV4 extends PwDatabase {
|
||||
Arrays.fill(cmpKey, (byte)0);
|
||||
}
|
||||
}
|
||||
|
||||
public void makeFinalKey(byte[] masterSeed, KdfParameters kdfP) throws IOException {
|
||||
makeFinalKey(masterSeed, kdfP, 0);
|
||||
}
|
||||
|
||||
public void makeFinalKey(byte[] masterSeed, KdfParameters kdfP, long roundsFix)
|
||||
throws IOException {
|
||||
|
||||
KdfEngine kdfEngine = KdfFactory.get(kdfP.kdfUUID);
|
||||
if (kdfEngine == null) {
|
||||
throw new IOException("Unknown key derivation function");
|
||||
}
|
||||
|
||||
// Set to 6000 rounds to open corrupted database
|
||||
if (roundsFix > 0 && kdfP.kdfUUID.equals(AesKdf.CIPHER_UUID)) {
|
||||
kdfP.setUInt32(AesKdf.ParamRounds, roundsFix);
|
||||
numKeyEncRounds = roundsFix;
|
||||
}
|
||||
|
||||
byte[] transformedMasterKey = kdfEngine.transform(masterKey, kdfP);
|
||||
if (transformedMasterKey.length != 32) {
|
||||
transformedMasterKey = CryptoUtil.hashSha256(transformedMasterKey);
|
||||
|
||||
@@ -23,16 +23,8 @@ import android.annotation.SuppressLint;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.TimeZone;
|
||||
|
||||
@SuppressLint("SimpleDateFormat")
|
||||
public class PwDatabaseV4XML {
|
||||
|
||||
public static final SimpleDateFormat dateFormat;
|
||||
|
||||
static {
|
||||
dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
|
||||
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
}
|
||||
|
||||
public static final String ElemDocNode = "KeePassFile";
|
||||
public static final String ElemMeta = "Meta";
|
||||
public static final String ElemRoot = "Root";
|
||||
@@ -134,4 +126,15 @@ public class PwDatabaseV4XML {
|
||||
|
||||
public static final String ElemCustomData = "CustomData";
|
||||
public static final String ElemStringDictExItem = "Item";
|
||||
|
||||
public static final ThreadLocal<SimpleDateFormat> dateFormatter =
|
||||
new ThreadLocal<SimpleDateFormat>() {
|
||||
@Override
|
||||
protected SimpleDateFormat initialValue() {
|
||||
SimpleDateFormat dateFormat;
|
||||
dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
|
||||
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
return dateFormat;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -95,7 +95,6 @@ public class PwDbHeaderV4 extends PwDbHeader {
|
||||
public byte[] streamStartBytes = new byte[32];
|
||||
public CrsAlgorithm innerRandomStream;
|
||||
public long version;
|
||||
public List<ProtectedBinary> binaries = new ArrayList<ProtectedBinary>();
|
||||
|
||||
public PwDbHeaderV4(PwDatabaseV4 d) {
|
||||
db = d;
|
||||
@@ -194,7 +193,9 @@ public class PwDbHeaderV4 extends PwDbHeader {
|
||||
if (!db.kdfParameters.kdfUUID.equals(kdfR.uuid)) {
|
||||
db.kdfParameters = kdfR.getDefaultParameters();
|
||||
}
|
||||
db.kdfParameters.setUInt64(AesKdf.ParamRounds, LEDataInputStream.readLong(fieldData, 0));
|
||||
long rounds = LEDataInputStream.readLong(fieldData, 0);
|
||||
db.kdfParameters.setUInt64(AesKdf.ParamRounds, rounds);
|
||||
db.numKeyEncRounds = rounds;
|
||||
break;
|
||||
|
||||
case PwDbHeaderV4Fields.EncryptionIV:
|
||||
|
||||
@@ -33,7 +33,7 @@ public abstract class Importer {
|
||||
public abstract PwDatabase openDatabase( InputStream inStream, String password, InputStream keyInputStream)
|
||||
throws IOException, InvalidDBException;
|
||||
|
||||
public abstract PwDatabase openDatabase( InputStream inStream, String password, InputStream keyInputStream, UpdateStatus status )
|
||||
public abstract PwDatabase openDatabase( InputStream inStream, String password, InputStream keyInputStream, UpdateStatus status, long roundsFix)
|
||||
throws IOException, InvalidDBException;
|
||||
|
||||
|
||||
|
||||
@@ -125,10 +125,10 @@ public class ImporterV3 extends Importer {
|
||||
public PwDatabaseV3 openDatabase( InputStream inStream, String password, InputStream kfIs)
|
||||
throws IOException, InvalidDBException
|
||||
{
|
||||
return openDatabase(inStream, password, kfIs, new UpdateStatus());
|
||||
return openDatabase(inStream, password, kfIs, new UpdateStatus(), 0);
|
||||
}
|
||||
|
||||
public PwDatabaseV3 openDatabase( InputStream inStream, String password, InputStream kfIs, UpdateStatus status )
|
||||
public PwDatabaseV3 openDatabase( InputStream inStream, String password, InputStream kfIs, UpdateStatus status, long roundsFix)
|
||||
throws IOException, InvalidDBException
|
||||
{
|
||||
PwDatabaseV3 newManager;
|
||||
|
||||
@@ -35,9 +35,10 @@ public class ImporterV3Debug extends ImporterV3 {
|
||||
|
||||
@Override
|
||||
public PwDatabaseV3Debug openDatabase(InputStream inStream, String password,
|
||||
InputStream keyInputStream, UpdateStatus status) throws IOException,
|
||||
InputStream keyInputStream, UpdateStatus status, long roundsFix) throws IOException,
|
||||
InvalidDBException {
|
||||
return (PwDatabaseV3Debug) super.openDatabase(inStream, password, keyInputStream, status);
|
||||
return (PwDatabaseV3Debug) super.openDatabase(inStream, password, keyInputStream, status,
|
||||
roundsFix);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -78,11 +78,11 @@ public class ImporterV4 extends Importer {
|
||||
|
||||
private StreamCipher randomStream;
|
||||
private PwDatabaseV4 db;
|
||||
private BinaryPool binPool = new BinaryPool();
|
||||
|
||||
private byte[] hashOfHeader = null;
|
||||
private byte[] pbHeader = null;
|
||||
private long version;
|
||||
private int binNum = 0;
|
||||
Calendar utcCal;
|
||||
|
||||
public ImporterV4() {
|
||||
@@ -98,18 +98,17 @@ public class ImporterV4 extends Importer {
|
||||
public PwDatabaseV4 openDatabase(InputStream inStream, String password,
|
||||
InputStream keyInputStream) throws IOException, InvalidDBException {
|
||||
|
||||
return openDatabase(inStream, password, keyInputStream, new UpdateStatus());
|
||||
return openDatabase(inStream, password, keyInputStream, new UpdateStatus(), 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PwDatabaseV4 openDatabase(InputStream inStream, String password,
|
||||
InputStream keyInputStream, UpdateStatus status) throws IOException,
|
||||
InvalidDBException {
|
||||
|
||||
public PwDatabaseV4 openDatabase(InputStream inStream, String password,
|
||||
InputStream keyInputStream, UpdateStatus status, long roundsFix) throws IOException,
|
||||
InvalidDBException {
|
||||
db = createDB();
|
||||
|
||||
PwDbHeaderV4 header = new PwDbHeaderV4(db);
|
||||
header.binaries.clear();
|
||||
db.binPool.clear();
|
||||
|
||||
PwDbHeaderV4.HeaderAndHash hh = header.loadFromFile(inStream);
|
||||
version = header.version;
|
||||
@@ -118,7 +117,7 @@ public class ImporterV4 extends Importer {
|
||||
pbHeader = hh.header;
|
||||
|
||||
db.setMasterKey(password, keyInputStream);
|
||||
db.makeFinalKey(header.masterSeed, db.kdfParameters);
|
||||
db.makeFinalKey(header.masterSeed, db.kdfParameters, roundsFix);
|
||||
|
||||
CipherEngine engine;
|
||||
Cipher cipher;
|
||||
@@ -253,6 +252,7 @@ public class ImporterV4 extends Importer {
|
||||
byte[] bin = new byte[data.length - 1];
|
||||
System.arraycopy(data, 1, bin, 0, data.length-1);
|
||||
ProtectedBinary pb = new ProtectedBinary(prot, bin);
|
||||
db.binPool.poolAdd(pb);
|
||||
|
||||
if (prot) {
|
||||
Arrays.fill(data, (byte)0);
|
||||
@@ -511,7 +511,7 @@ public class ImporterV4 extends Importer {
|
||||
if ( key != null ) {
|
||||
ProtectedBinary pbData = ReadProtectedBinary(xpp);
|
||||
int id = Integer.parseInt(key);
|
||||
binPool.put(id, pbData);
|
||||
db.binPool.put(id, pbData);
|
||||
} else {
|
||||
ReadUnknown(xpp);
|
||||
}
|
||||
@@ -932,7 +932,7 @@ public class ImporterV4 extends Importer {
|
||||
} else {
|
||||
|
||||
try {
|
||||
utcDate = PwDatabaseV4XML.dateFormat.parse(sDate);
|
||||
utcDate = PwDatabaseV4XML.dateFormatter.get().parse(sDate);
|
||||
} catch (ParseException e) {
|
||||
// Catch with null test below
|
||||
}
|
||||
@@ -1061,7 +1061,7 @@ public class ImporterV4 extends Importer {
|
||||
xpp.next(); // Consume end tag
|
||||
|
||||
int id = Integer.parseInt(ref);
|
||||
return binPool.get(id);
|
||||
return db.binPool.get(id);
|
||||
}
|
||||
|
||||
boolean compressed = false;
|
||||
|
||||
@@ -35,9 +35,10 @@ public class ImporterV4Debug extends ImporterV4 {
|
||||
|
||||
@Override
|
||||
public PwDatabaseV4Debug openDatabase(InputStream inStream, String password,
|
||||
InputStream keyInputFile, UpdateStatus status) throws IOException,
|
||||
InputStream keyInputFile, UpdateStatus status, long roundsFix) throws IOException,
|
||||
InvalidDBException {
|
||||
return (PwDatabaseV4Debug) super.openDatabase(inStream, password, keyInputFile, status);
|
||||
return (PwDatabaseV4Debug) super.openDatabase(inStream, password, keyInputFile, status,
|
||||
roundsFix);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ public class PwDbInnerHeaderOutputV4 {
|
||||
los.writeInt(streamKeySize);
|
||||
los.write(header.innerRandomStreamKey);
|
||||
|
||||
for (ProtectedBinary bin : header.binaries) {
|
||||
for (ProtectedBinary bin : db.binPool.binaries()) {
|
||||
byte flag = KdbxBinaryFlags.None;
|
||||
if (bin.isProtected()) {
|
||||
flag |= KdbxBinaryFlags.Protected;
|
||||
|
||||
@@ -19,36 +19,13 @@
|
||||
*/
|
||||
package com.keepassdroid.database.save;
|
||||
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Stack;
|
||||
import java.util.UUID;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.CipherOutputStream;
|
||||
|
||||
import org.joda.time.DateTime;
|
||||
import org.spongycastle.crypto.StreamCipher;
|
||||
import org.xmlpull.v1.XmlSerializer;
|
||||
|
||||
import android.util.Xml;
|
||||
import biz.source_code.base64Coder.Base64Coder;
|
||||
|
||||
import com.keepassdroid.crypto.CipherFactory;
|
||||
import com.keepassdroid.crypto.PwStreamCipherFactory;
|
||||
import com.keepassdroid.crypto.engine.CipherEngine;
|
||||
import com.keepassdroid.crypto.keyDerivation.KdfEngine;
|
||||
import com.keepassdroid.crypto.keyDerivation.KdfFactory;
|
||||
import com.keepassdroid.database.BinaryPool;
|
||||
import com.keepassdroid.database.CrsAlgorithm;
|
||||
import com.keepassdroid.database.EntryHandler;
|
||||
import com.keepassdroid.database.GroupHandler;
|
||||
@@ -78,11 +55,115 @@ import com.keepassdroid.utils.EmptyUtils;
|
||||
import com.keepassdroid.utils.MemUtil;
|
||||
import com.keepassdroid.utils.Types;
|
||||
|
||||
import org.joda.time.DateTime;
|
||||
import org.spongycastle.crypto.StreamCipher;
|
||||
import org.xmlpull.v1.XmlSerializer;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Stack;
|
||||
import java.util.UUID;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
import javax.crypto.Cipher;
|
||||
import javax.crypto.CipherOutputStream;
|
||||
|
||||
import biz.source_code.base64Coder.Base64Coder;
|
||||
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.AttrCompressed;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.AttrId;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.AttrProtected;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.AttrRef;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemAutoType;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemAutoTypeDefaultSeq;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemAutoTypeEnabled;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemAutoTypeItem;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemAutoTypeObfuscation;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemBgColor;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemBinaries;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemBinary;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemCreationTime;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemCustomData;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemCustomIconID;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemCustomIconItem;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemCustomIconItemData;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemCustomIconItemID;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemCustomIcons;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDbColor;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDbDefaultUser;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDbDefaultUserChanged;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDbDesc;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDbDescChanged;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDbKeyChangeForce;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDbKeyChangeRec;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDbKeyChanged;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDbMntncHistoryDays;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDbName;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDbNameChanged;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDeletedObject;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDeletedObjects;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDeletionTime;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemDocNode;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemEnableAutoType;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemEnableSearching;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemEntry;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemEntryTemplatesGroup;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemEntryTemplatesGroupChanged;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemExpires;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemExpiryTime;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemFgColor;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemGenerator;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemGroup;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemGroupDefaultAutoTypeSeq;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemHeaderHash;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemHistory;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemHistoryMaxItems;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemHistoryMaxSize;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemIcon;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemIsExpanded;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemKey;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemKeystrokeSequence;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemLastAccessTime;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemLastModTime;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemLastSelectedGroup;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemLastTopVisibleEntry;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemLastTopVisibleGroup;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemLocationChanged;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemMemoryProt;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemMeta;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemName;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemNotes;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemOverrideUrl;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemProtNotes;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemProtPassword;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemProtTitle;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemProtURL;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemProtUserName;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemRecycleBinChanged;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemRecycleBinEnabled;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemRecycleBinUuid;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemRoot;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemString;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemStringDictExItem;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemTags;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemTimes;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemUsageCount;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemUuid;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemValue;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ElemWindow;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ValFalse;
|
||||
import static com.keepassdroid.database.PwDatabaseV4XML.ValTrue;
|
||||
|
||||
public class PwDbV4Output extends PwDbOutput {
|
||||
|
||||
PwDatabaseV4 mPM;
|
||||
private StreamCipher randomStream;
|
||||
private BinaryPool binPool;
|
||||
private XmlSerializer xml;
|
||||
private PwDbHeaderV4 header;
|
||||
private byte[] hashOfHeader;
|
||||
@@ -201,7 +282,6 @@ public class PwDbV4Output extends PwDbOutput {
|
||||
}
|
||||
|
||||
private void outputDatabase(OutputStream os) throws IllegalArgumentException, IllegalStateException, IOException {
|
||||
binPool = new BinaryPool((PwGroupV4)mPM.rootGroup);
|
||||
|
||||
xml = Xml.newSerializer();
|
||||
|
||||
@@ -420,7 +500,7 @@ public class PwDbV4Output extends PwDbOutput {
|
||||
xml.startTag(null, ElemValue);
|
||||
String strRef = null;
|
||||
if (allowRef) {
|
||||
int ref = binPool.poolFind(value);
|
||||
int ref = mPM.binPool.poolFind(value);
|
||||
strRef = Integer.toString(ref);
|
||||
}
|
||||
|
||||
@@ -480,7 +560,7 @@ public class PwDbV4Output extends PwDbOutput {
|
||||
|
||||
private void writeObject(String name, Date value) throws IllegalArgumentException, IllegalStateException, IOException {
|
||||
if (header.version < PwDbHeaderV4.FILE_VERSION_32_4) {
|
||||
writeObject(name, PwDatabaseV4XML.dateFormat.format(value));
|
||||
writeObject(name, PwDatabaseV4XML.dateFormatter.get().format(value));
|
||||
} else {
|
||||
DateTime dt = new DateTime(value);
|
||||
long seconds = DateUtil.convertDateToKDBX4Time(dt);
|
||||
@@ -720,7 +800,7 @@ public class PwDbV4Output extends PwDbOutput {
|
||||
private void writeBinPool() throws IllegalArgumentException, IllegalStateException, IOException {
|
||||
xml.startTag(null, ElemBinaries);
|
||||
|
||||
for (Entry<Integer, ProtectedBinary> pair : binPool.entrySet()) {
|
||||
for (Entry<Integer, ProtectedBinary> pair : mPM.binPool.entrySet()) {
|
||||
xml.startTag(null, ElemBinary);
|
||||
xml.attribute(null, AttrId, Integer.toString(pair.getKey()));
|
||||
|
||||
|
||||
@@ -28,7 +28,6 @@ import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.preference.PreferenceManager;
|
||||
@@ -175,11 +174,7 @@ public class FileSelectActivity extends StylishActivity implements
|
||||
}
|
||||
else {
|
||||
Intent i;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
i = new Intent(Intent.ACTION_OPEN_DOCUMENT);
|
||||
} else {
|
||||
i = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
}
|
||||
i = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
i.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
i.setType("*/*");
|
||||
|
||||
|
||||
@@ -2,12 +2,14 @@ package com.keepassdroid.settings;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.preference.EditTextPreference;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceFragmentCompat;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.kunzisoft.keepass.R;
|
||||
import com.keepassdroid.Database;
|
||||
import com.keepassdroid.app.App;
|
||||
import com.kunzisoft.keepass.R;
|
||||
|
||||
public class MainPreferenceFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener {
|
||||
|
||||
@@ -40,6 +42,21 @@ public class MainPreferenceFragment extends PreferenceFragmentCompat implements
|
||||
} else {
|
||||
preference.setOnPreferenceClickListener(this);
|
||||
}
|
||||
|
||||
EditTextPreference fixDatabaseRoundPref = (EditTextPreference)
|
||||
getPreferenceScreen().findPreference(getString(R.string.roundsFix_key));
|
||||
fixDatabaseRoundPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
try {
|
||||
Long.valueOf(newValue.toString());
|
||||
return true;
|
||||
} catch (NumberFormatException e) {
|
||||
Toast.makeText(getContext(), R.string.error_rounds_not_number, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="?attr/iconPreferenceColor"
|
||||
android:pathData="M11,4.07L11,2.05c-2.01,0.2 -3.84,1 -5.32,2.21L7.1,5.69c1.11,-0.86 2.44,-1.44 3.9,-1.62zM18.32,4.26C16.84,3.05 15.01,2.25 13,2.05v2.02c1.46,0.18 2.79,0.76 3.9,1.62l1.42,-1.43zM19.93,11h2.02c-0.2,-2.01 -1,-3.84 -2.21,-5.32L18.31,7.1c0.86,1.11 1.44,2.44 1.62,3.9zM5.69,7.1L4.26,5.68C3.05,7.16 2.25,8.99 2.05,11h2.02c0.18,-1.46 0.76,-2.79 1.62,-3.9zM4.07,13L2.05,13c0.2,2.01 1,3.84 2.21,5.32l1.43,-1.43c-0.86,-1.1 -1.44,-2.43 -1.62,-3.89zM15,12c0,-1.66 -1.34,-3 -3,-3s-3,1.34 -3,3 1.34,3 3,3 3,-1.34 3,-3zM18.31,16.9l1.43,1.43c1.21,-1.48 2.01,-3.32 2.21,-5.32h-2.02c-0.18,1.45 -0.76,2.78 -1.62,3.89zM13,19.93v2.02c2.01,-0.2 3.84,-1 5.32,-2.21l-1.43,-1.43c-1.1,0.86 -2.43,1.44 -3.89,1.62zM5.68,19.74C7.16,20.95 9,21.75 11,21.95v-2.02c-1.46,-0.18 -2.79,-0.76 -3.9,-1.62l-1.42,1.43z"/>
|
||||
</vector>
|
||||
@@ -24,13 +24,13 @@
|
||||
android:id="@+id/group_header"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"/>
|
||||
<ListView android:id="@android:id/list"
|
||||
<ListView android:id="@+id/group_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/group_header"/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@android:id/list"
|
||||
android:layout_below="@id/group_list"
|
||||
android:text="@string/no_results"/>
|
||||
</RelativeLayout>
|
||||
@@ -1,4 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2009-2016 Brian Pellin.
|
||||
|
||||
This file is part of KeePassDroid.
|
||||
KeePassDroid is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
KeePassDroid is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with KeePassDroid. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<resources>
|
||||
<string name="about_feedback">Visszajelzés:</string>
|
||||
<string name="about_homepage">Weboldal:</string>
|
||||
@@ -35,7 +50,7 @@
|
||||
<string name="decrypting_entry">Bejegyzés dekódolása</string>
|
||||
<string name="default_checkbox">Adatbázis beállítása alapértelmezettként</string>
|
||||
<string name="digits">Számok</string>
|
||||
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft. Ehhez a programhoz SEMMILYEN GARANCIA NEM JÁR; Ez egy szabad szoftver, GNU General Public License v2 vagy későbbi verziójának feltételei mellett terjeszthető, illetve módosítható. Fordította: intel</string>
|
||||
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft. Ehhez a programhoz SEMMILYEN GARANCIA NEM JÁR; Ez egy szabad szoftver, GNU General Public License v2 vagy későbbi verziójának feltételei mellett terjeszthető, illetve módosítható. Fordította: Eversmann</string>
|
||||
<string name="ellipsis">…</string>
|
||||
<string name="enter_filename">Adja meg az adatbázis fájlnevét:</string>
|
||||
<string name="entry_accessed">Utolsó hozzáférés:</string>
|
||||
@@ -63,19 +78,20 @@
|
||||
<string name="error_file_not_create">Nem sikerült létrehozni a fájlt:</string>
|
||||
<string name="error_invalid_db">Érvénytelen adatbázis.</string>
|
||||
<string name="error_invalid_path">Érvénytelen útvonal.</string>
|
||||
<string name="error_no_name">Egy névre van szükség.</string>
|
||||
<string name="error_no_name">Név szükséges.</string>
|
||||
<string name="error_nokeyfile">Jelszóra vagy kulcsfájlra van szükség.</string>
|
||||
<string name="error_out_of_memory">A telefon memóriája megtelt az adatbázis feldolgozása közben. Lehet túl sok ez a telefonnak.</string>
|
||||
<string name="error_pass_gen_type">Legalább egy jelszógenerálási típust kell választania</string>
|
||||
<string name="error_pass_match">A jelszavak nem egyeznek meg.</string>
|
||||
<string name="error_rounds_not_number">A mező csak számokat tartalmazhat.</string>
|
||||
<string name="error_rounds_too_large">A menetek száma túl nagy. A maximális 2147483648.</string>
|
||||
<string name="error_string_key">A megnevezés mező kitöltése kötelező.</string>
|
||||
<string name="error_title_required">Cím szükséges.</string>
|
||||
<string name="error_string_key">Az érték mező kitöltése kötelező.</string>
|
||||
<string name="error_title_required">Név szükséges.</string>
|
||||
<string name="error_wrong_length">Írjon be egy pozitív egész számot a hossz mezőbe</string>
|
||||
<string name="field_name">Megnevezés</string>
|
||||
<string name="field_value">Érték</string>
|
||||
<string name="FileNotFound">A fájl nem található.</string>
|
||||
<string name="FileNotFound">A fájl nem található</string>
|
||||
<string name="file_not_found_content">A fájl nem található. Próbálja meg újra megnyitni.</string>
|
||||
<string name="file_browser">Fájlkezelő</string>
|
||||
<string name="generate_password">Jelszó generálás</string>
|
||||
<string name="group">Csoport</string>
|
||||
@@ -114,7 +130,7 @@
|
||||
<string name="menu_db_settings">Adatbázis beállítások</string>
|
||||
<string name="menu_delete">Törlés</string>
|
||||
<string name="menu_donate">Támogatás</string>
|
||||
<string name="menu_edit">Szerkeszt</string>
|
||||
<string name="menu_edit">Szerkesztés</string>
|
||||
<string name="menu_hide_password">Jelszó elrejtése</string>
|
||||
<string name="menu_homepage">Weboldal megtekintése</string>
|
||||
<string name="menu_lock">Adatbázis lezárása</string>
|
||||
@@ -132,10 +148,15 @@
|
||||
<string name="omitbackup_title">Keresési kivételek</string>
|
||||
<string name="omitbackup_summary">A Backup és Lomtár csoportok kihagyása a keresésből</string>
|
||||
<string name="pass_filename">KeePass adatbázis fájlnév:</string>
|
||||
<string name="password_title">Adatbázis jelszó megadása</string>
|
||||
<string name="password_title">Adatbázis jelszó</string>
|
||||
<string name="progress_create">Új adatbázis létrehozása…</string>
|
||||
<string name="progress_title">Feldolgozás…</string>
|
||||
<string name="protection">Memórián belüli védelem</string>
|
||||
<string name="read_only">Csak olvasható</string>
|
||||
<string name="read_only_warning">A programnak nincs engedélye az adatbázis írásához a jelenlegi helyén, ezért a megnyitása után csak olvasható lesz.</string>
|
||||
<string name="read_only_kitkat_warning">A KitKat-es android verziótól kezdődően a futó alkalmazásoknak nincs jogosultságuk írni a külső SD kártyára.</string>
|
||||
<string name="recentfile_title">Adatbázis mentése</string>
|
||||
<string name="recentfile_summary">Jegyezze meg az adatbázisok helyét</string>
|
||||
<string name="remember_keyfile_summary">Jegyezze meg a kulcsfájlok helyét</string>
|
||||
<string name="remember_keyfile_title">Kulcsfájl mentése</string>
|
||||
<string name="remove_from_filelist">Eltávolítás</string>
|
||||
@@ -151,15 +172,26 @@
|
||||
<string name="sort_name">Rendezés név alapján</string>
|
||||
<string name="sort_db">Rendezés dátum alapján</string>
|
||||
<string name="special">Speciális</string>
|
||||
<string name="search_hint">Bejegyzés cím/leírás</string>
|
||||
<string name="search_hint">Bejegyzés név/leírás</string>
|
||||
<string name="search_results">Keresés eredménye</string>
|
||||
<string name="twofish">Twofish</string>
|
||||
<string name="underline">Aláhúzás</string>
|
||||
<string name="unsupported_db_version">Nem támogatott adatbázis.</string>
|
||||
<string name="uppercase">Nagybetűk</string>
|
||||
<string name="use_saf_summary">Használja az Android Storage Access Framework-öt a fájlok böngészéséhez (KitKat vagy későbbi)</string>
|
||||
<string name="use_saf_title">Storage Access Framework</string>
|
||||
<string name="warning">Figyelmeztetés</string>
|
||||
<string name="warning_password_encoding">A .kdb formátum csak a Latin1 karakterkészletet támogatja. A jelenlegi jelszó olyan karaktereket is tartalmazhat, amik ezen kívül esnek. Az összes ilyen karakter át lesz lesz konvertálva, viszont ez nagyban csökkenteni fogja a jelszó erősségét. Mielőbbi megváltoztatása ajánlott.</string>
|
||||
<string name="warning_read_only">A memóriakártya jelenleg csak olvasható. Lehet, hogy nem tudja menteni a módosításokat az adatbázisban.</string>
|
||||
<string name="warning_unmounted">A memóriakártya jelenleg el van távolítva. Nem fogja tudni az adatbázist betölteni vagy módosítani.</string>
|
||||
<string name="version_label">Verzió:</string>
|
||||
<string name="configure_fingerprint">Az ujjlenyomat használat nincs még beállítva az eszközön</string>
|
||||
<string name="scanning_fingerprint">Várakozás az ujjelnyomat megadására</string>
|
||||
<string name="encrypted_value_stored">Titkosított jelszó elmentve</string>
|
||||
<string name="fingerprint_invalid_key">Érvénytelen kulcs</string>
|
||||
<string name="fingerprint_error">Érvénytelen ujjlenyomat</string>
|
||||
<string name="store_with_fingerprint">Használjon ujjlenyomatot a jelszó elmentéséhez</string>
|
||||
<string name="no_password_stored">Nincs még jelszó beállítva ehhez az adatbázishoz</string>
|
||||
|
||||
<string-array name="clipboard_timeout_options">
|
||||
<item>30 másodperc</item>
|
||||
|
||||
@@ -134,10 +134,14 @@ along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
|
||||
<string name="no_results">Brak wyników wyszukiwania</string>
|
||||
<string name="no_url_handler">Brak obsługi dla tego urla.</string>
|
||||
<string name="open_recent">Otwórz ostatnio używaną bazę danych (kliknij by otworzyć):</string>
|
||||
<string name="omitbackup_title">Nie wyszukuj zapasowych wpisów</string>
|
||||
<string name="omitbackup_summary">Pomiń kopię zapasową grupy z wyników wyszukiwania (dotyczy tylko .kdb)</string>
|
||||
<string name="pass_filename">Nazwa pliku bazy danych KeePass:</string>
|
||||
<string name="password_title">Wprowadź hasło bazy danych</string>
|
||||
<string name="progress_create">Tworzenie nowej bazy danych…</string>
|
||||
<string name="progress_title">Pracuję…</string>
|
||||
<string name="recentfile_title">Najnowsza historia plików</string>
|
||||
<string name="recentfile_summary">Zapamiętaj ostatnio uzywane nazwy plików</string>
|
||||
<string name="remember_keyfile_summary">Zapamiętaj lokację plików kluczy</string>
|
||||
<string name="remember_keyfile_title">Zapisz plik klucza</string>
|
||||
<string name="remove_from_filelist">Usuń</string>
|
||||
@@ -145,6 +149,8 @@ along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
|
||||
<string name="root">Root</string>
|
||||
<string name="rounds">Złożoność szyfrowania</string>
|
||||
<string name="rounds_explaination">Większa złożoność szyfrowania zapewnia dodatkowe zabezpieczenie przed atakiem brute force, ale może spowolnić wczytywanie i zapisywanie bazy danych.</string>
|
||||
<string name="rounds_fix">Kluczowe rundy szyfrowania przed zniszczeniem</string>
|
||||
<string name="rounds_fix_explaination">Jeśli twoja baza danych została uszkodzona przez KeePassDroid w wersji 2.2.0.0 do 2.2.0.6, wprowadź liczbę rund użytych poprzednio, a to pozwoli ci otworzyć twoją bazę danych.</string>
|
||||
<string name="rounds_hint">złożoność</string>
|
||||
<string name="saving_database">Zapisywanie bazy danych…</string>
|
||||
<string name="space">Spacja</string>
|
||||
@@ -158,6 +164,8 @@ along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
|
||||
<string name="underline">Podkreślenie</string>
|
||||
<string name="unsupported_db_version">Nieobsługiwana wersja bazy danych.</string>
|
||||
<string name="uppercase">Wielkie litery</string>
|
||||
<string name="use_saf_summary">Użyj przeglądarki Android Storage Access Framework do przeglądania plików (KitKat i nowsze)</string>
|
||||
<string name="use_saf_title">Storage Access Framework</string>
|
||||
<string name="warning_read_only">Karta SD jest obecnie w trybie tylko do odczytu. Możesz nie być w stanie zapisać zmian w bazie danych.</string>
|
||||
<string name="warning_unmounted">Karta SD nie jest obecnie zamontowana w urządzeniu. Możesz nie być w stanie wczytać lub utworzyć bazy danych.</string>
|
||||
|
||||
|
||||
@@ -53,10 +53,7 @@
|
||||
<string name="decrypting_entry">Расшифровка записи…</string>
|
||||
<string name="default_checkbox">По умолчанию</string>
|
||||
<string name="digits">Цифры 0…9</string>
|
||||
<string name="disclaimer_formal">"KeePass DX © 2009–2013
|
||||
Разработчик Brian Pellin
|
||||
|
||||
Программа предоставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Распространяется свободно по лицензии GPL v2 или новее"</string>
|
||||
<string name="disclaimer_formal">"KeePass DX © 2009–2017 Разработчик Brian Pellin, Jeremy JAMET / Kunzisoft Программа предоставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Распространяется свободно по лицензии GPL v2 или новее"</string>
|
||||
<string name="ellipsis">…</string>
|
||||
<string name="enter_filename">Путь к базе KeePass:</string>
|
||||
<string name="entry_accessed">Доступ:</string>
|
||||
@@ -169,6 +166,8 @@
|
||||
<string name="root">База</string>
|
||||
<string name="rounds">Проходы шифрования</string>
|
||||
<string name="rounds_explaination">Больше проходов – выше стойкость базы к подбору пароля, но медленнее открытие и сохранение</string>
|
||||
<string name="rounds_fix">Проходы до поломки базы</string>
|
||||
<string name="rounds_fix_explaination">Если база была повреждена в KeePassDroid 2.2.0.0–2.2.0.6, введите ранее используемое количество проходов шифрования, чтобы открыть её</string>
|
||||
<string name="rounds_hint">проходы</string>
|
||||
<string name="saving_database">Сохранение базы…</string>
|
||||
<string name="space">П р о б е л</string>
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
<string name="clipboard_timeout_key" translatable="false">clip_timeout_key</string>
|
||||
<string name="db_key" translatable="false">db</string>
|
||||
<string name="rounds_key" translatable="false">rounds</string>
|
||||
<string name="roundsFix_key" translatable="false">roundsFix</string>
|
||||
<string name="keyfile_key" translatable="false">keyfile</string>
|
||||
<string name="maskpass_key" translatable="false">maskpass</string>
|
||||
<string name="omitbackup_key" translatable="false">omitbackup</string>
|
||||
@@ -50,6 +51,7 @@
|
||||
<string name="sort_key" translatable="false">sort_key</string>
|
||||
<string name="timeout_key" translatable="false">timeout_key</string>
|
||||
<string name="saf_key" translatable="false">storage_access_framework_key</string>
|
||||
<integer name="roundsFix_default" translatable="false">100000</integer>
|
||||
<string name="setting_style_key" translatable="false">setting_style_key</string>
|
||||
<string name="clipboard_notifications_key" translatable="false">clipboard_notifications_key</string>
|
||||
<string name="lock_database_screen_off_key" translatable="false">lock_database_screen_off_key</string>
|
||||
|
||||
@@ -171,6 +171,9 @@
|
||||
<string name="root">Root</string>
|
||||
<string name="rounds">Encryption Rounds</string>
|
||||
<string name="rounds_explaination">Higher encryption rounds provide additional protection against brute force attacks, but can really slow down loading and saving.</string>
|
||||
<string name="rounds_fix_title">Fix of database encryption rounds</string>
|
||||
<string name="rounds_fix">Key encryption rounds before corruption</string>
|
||||
<string name="rounds_fix_explaination">If your database was corrupted by KeePassDroid version 2.2.0.0 to 2.2.0.6, enter the number of rounds used previously and this will allow you to open your database.</string>
|
||||
<string name="rounds_hint">rounds</string>
|
||||
<string name="saving_database">Saving database…</string>
|
||||
<string name="space">Space</string>
|
||||
|
||||
@@ -36,5 +36,16 @@
|
||||
android:title="@string/menu_db_settings"
|
||||
android:icon="@drawable/ic_data_usage_white_24dp"
|
||||
android:persistent="false" />
|
||||
<!-- TODO change dialog android:summary="@string/rounds_fix_explaination" -->
|
||||
<EditTextPreference
|
||||
android:key="@string/roundsFix_key"
|
||||
android:title="@string/rounds_fix_title"
|
||||
android:summary="@string/rounds_fix"
|
||||
android:defaultValue="@integer/roundsFix_default"
|
||||
android:icon="@drawable/ic_filter_tilt_shift_pref_24dp"
|
||||
android:numeric="integer"
|
||||
android:inputType="numberDecimal"
|
||||
android:digits="0123456789"/>
|
||||
</PreferenceCategory>
|
||||
|
||||
</PreferenceScreen>
|
||||
|
||||
Reference in New Issue
Block a user