diff options
author | Miroojin Bakshi <gaglu231094@gmail.com> | 2014-03-06 01:49:36 +0530 |
---|---|---|
committer | Miroojin Bakshi <gaglu231094@gmail.com> | 2014-03-06 01:49:36 +0530 |
commit | f99b7585fc14e1f479f4b86f2444dcd14ba103f9 (patch) | |
tree | 1ff0207f7d5c687a51cb59563986b37032ffef30 | |
parent | 127ab0fd817efa62b5375e9e158c68d5e50dad6c (diff) | |
parent | 9646a3d4719acaffeeb74268f4f4c469a51df45c (diff) | |
download | open-keychain-f99b7585fc14e1f479f4b86f2444dcd14ba103f9.tar.gz open-keychain-f99b7585fc14e1f479f4b86f2444dcd14ba103f9.tar.bz2 open-keychain-f99b7585fc14e1f479f4b86f2444dcd14ba103f9.zip |
Merge branch 'master' of https://github.com/openpgp-keychain/openpgp-keychain into datefix
43 files changed, 1109 insertions, 590 deletions
diff --git a/.travis.yml b/.travis.yml index 28827f332..946125fe0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ before_install: - export PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools # Install required Android components. - - echo "y" | android update sdk -a --filter build-tools-19.0.1,android-19,platform-tools,extra-android-support,extra-android-m2repository,android-17 --no-ui --force + - echo "y" | android update sdk -a --filter build-tools-19.0.3,android-19,platform-tools,extra-android-support,extra-android-m2repository,android-17 --no-ui --force install: echo "Installation done" script: gradle assemble -S -q diff --git a/OpenPGP-Keychain-API/example-app/build.gradle b/OpenPGP-Keychain-API/example-app/build.gradle index 1f8854431..975666b19 100644 --- a/OpenPGP-Keychain-API/example-app/build.gradle +++ b/OpenPGP-Keychain-API/example-app/build.gradle @@ -18,7 +18,7 @@ dependencies { android { compileSdkVersion 19 - buildToolsVersion "19.0.1" + buildToolsVersion "19.0.3" defaultConfig { minSdkVersion 9 diff --git a/OpenPGP-Keychain-API/libraries/keychain-api-library/build.gradle b/OpenPGP-Keychain-API/libraries/keychain-api-library/build.gradle index 1d5911783..7c923e7f6 100644 --- a/OpenPGP-Keychain-API/libraries/keychain-api-library/build.gradle +++ b/OpenPGP-Keychain-API/libraries/keychain-api-library/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'android-library' android { compileSdkVersion 19 - buildToolsVersion '19.0.1' + buildToolsVersion '19.0.3' // NOTE: We are using the old folder structure to also support Eclipse sourceSets { diff --git a/OpenPGP-Keychain-API/libraries/keychain-api-library/build.xml b/OpenPGP-Keychain-API/libraries/keychain-api-library/build.xml new file mode 100644 index 000000000..48ebf198c --- /dev/null +++ b/OpenPGP-Keychain-API/libraries/keychain-api-library/build.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="keychain-api-library" default="help"> + + <!-- The local.properties file is created and updated by the 'android' tool. + It contains the path to the SDK. It should *NOT* be checked into + Version Control Systems. --> + <property file="local.properties" /> + + <!-- The ant.properties file can be created by you. It is only edited by the + 'android' tool to add properties to it. + This is the place to change some Ant specific build properties. + Here are some properties you may want to change/update: + + source.dir + The name of the source directory. Default is 'src'. + out.dir + The name of the output directory. Default is 'bin'. + + For other overridable properties, look at the beginning of the rules + files in the SDK, at tools/ant/build.xml + + Properties related to the SDK location or the project target should + be updated using the 'android' tool with the 'update' action. + + This file is an integral part of the build system for your + application and should be checked into Version Control Systems. + + --> + <property file="ant.properties" /> + + <!-- if sdk.dir was not set from one of the property file, then + get it from the ANDROID_HOME env var. + This must be done before we load project.properties since + the proguard config can use sdk.dir --> + <property environment="env" /> + <condition property="sdk.dir" value="${env.ANDROID_HOME}"> + <isset property="env.ANDROID_HOME" /> + </condition> + + <!-- The project.properties file is created and updated by the 'android' + tool, as well as ADT. + + This contains project specific properties such as project target, and library + dependencies. Lower level build properties are stored in ant.properties + (or in .classpath for Eclipse projects). + + This file is an integral part of the build system for your + application and should be checked into Version Control Systems. --> + <loadproperties srcFile="project.properties" /> + + <!-- quick check on sdk.dir --> + <fail + message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." + unless="sdk.dir" + /> + + <!-- + Import per project custom build rules if present at the root of the project. + This is the place to put custom intermediary targets such as: + -pre-build + -pre-compile + -post-compile (This is typically used for code obfuscation. + Compiled code location: ${out.classes.absolute.dir} + If this is not done in place, override ${out.dex.input.absolute.dir}) + -post-package + -post-build + -pre-clean + --> + <import file="custom_rules.xml" optional="true" /> + + <!-- Import the actual build file. + + To customize existing targets, there are two options: + - Customize only one target: + - copy/paste the target into this file, *before* the + <import> task. + - customize it to your needs. + - Customize the whole content of build.xml + - copy/paste the content of the rules files (minus the top node) + into this file, replacing the <import> task. + - customize to your needs. + + *********************** + ****** IMPORTANT ****** + *********************** + In all cases you must update the value of version-tag below to read 'custom' instead of an integer, + in order to avoid having your file be overridden by tools such as "android update project" + --> + <!-- version-tag: 1 --> + <import file="${sdk.dir}/tools/ant/build.xml" /> + +</project> diff --git a/OpenPGP-Keychain-API/libraries/keychain-api-library/proguard-project.txt b/OpenPGP-Keychain-API/libraries/keychain-api-library/proguard-project.txt new file mode 100644 index 000000000..f2fe1559a --- /dev/null +++ b/OpenPGP-Keychain-API/libraries/keychain-api-library/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/OpenPGP-Keychain-API/libraries/keychain-api-library/src/org/openintents/openpgp/OpenPgpSignatureResult.java b/OpenPGP-Keychain-API/libraries/keychain-api-library/src/org/openintents/openpgp/OpenPgpSignatureResult.java index 431d4be24..cb220cf6d 100644 --- a/OpenPGP-Keychain-API/libraries/keychain-api-library/src/org/openintents/openpgp/OpenPgpSignatureResult.java +++ b/OpenPGP-Keychain-API/libraries/keychain-api-library/src/org/openintents/openpgp/OpenPgpSignatureResult.java @@ -38,24 +38,40 @@ public class OpenPgpSignatureResult implements Parcelable { return status; } + public void setStatus(int status) { + this.status = status; + } + public boolean isSignatureOnly() { return signatureOnly; } + public void setSignatureOnly(boolean signatureOnly) { + this.signatureOnly = signatureOnly; + } + public String getUserId() { return userId; } + public void setUserId(String userId) { + this.userId = userId; + } + public long getKeyId() { return keyId; } + public void setKeyId(long keyId) { + this.keyId = keyId; + } + public OpenPgpSignatureResult() { } public OpenPgpSignatureResult(int signatureStatus, String signatureUserId, - boolean signatureOnly, long keyId) { + boolean signatureOnly, long keyId) { this.status = signatureStatus; this.signatureOnly = signatureOnly; this.userId = signatureUserId; diff --git a/OpenPGP-Keychain/build.gradle b/OpenPGP-Keychain/build.gradle index 1e48d8bcd..284f0430c 100644 --- a/OpenPGP-Keychain/build.gradle +++ b/OpenPGP-Keychain/build.gradle @@ -18,7 +18,7 @@ dependencies { android { compileSdkVersion 19 - buildToolsVersion "19.0.1" + buildToolsVersion "19.0.3" defaultConfig { minSdkVersion 9 diff --git a/OpenPGP-Keychain/src/main/AndroidManifest.xml b/OpenPGP-Keychain/src/main/AndroidManifest.xml index 749229115..10a307bfb 100644 --- a/OpenPGP-Keychain/src/main/AndroidManifest.xml +++ b/OpenPGP-Keychain/src/main/AndroidManifest.xml @@ -2,8 +2,8 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.sufficientlysecure.keychain" android:installLocation="auto" - android:versionCode="23101" - android:versionName="2.3.1 beta1"> + android:versionCode="23102" + android:versionName="2.3.1 beta2"> <!-- General remarks @@ -22,7 +22,8 @@ Remarks about the ugly android:pathPattern: - We are matching all files with a specific file ending. This is done in an ugly way because of Android limitations. - Read http://stackoverflow.com/questions/1733195/android-intent-filter-for-a-particular-file-extension and http://stackoverflow.com/questions/3400072/pathpattern-to-match-file-extension-does-not-work-if-a-period-exists-elsewhere-i/8599921 + Read http://stackoverflow.com/questions/1733195/android-intent-filter-for-a-particular-file-extension + and http://stackoverflow.com/questions/3400072/pathpattern-to-match-file-extension-does-not-work-if-a-period-exists-elsewhere-i/8599921 for more information. - Do _not_ set mimeType for gpg! Cyanogenmod's file manager will only show Keychain for gpg files if no mimeType is set! @@ -276,7 +277,16 @@ <activity android:name=".ui.PreferencesActivity" android:configChanges="orientation|screenSize|keyboardHidden|keyboard" - android:label="@string/title_preferences" /> + android:label="@string/title_preferences" > + <intent-filter> + <action android:name="org.sufficientlysecure.keychain.ui.PREFS_GEN" /> + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> + <intent-filter> + <action android:name="org.sufficientlysecure.keychain.ui.PREFS_ADV" /> + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> + </activity> <activity android:name=".ui.PreferencesKeyServerActivity" android:configChanges="orientation|screenSize|keyboardHidden|keyboard" diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java index fb97f3a5c..c568f462a 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerify.java @@ -18,8 +18,8 @@ package org.sufficientlysecure.keychain.pgp; import android.content.Context; -import android.os.Bundle; +import org.openintents.openpgp.OpenPgpSignatureResult; import org.spongycastle.bcpg.ArmoredInputStream; import org.spongycastle.bcpg.SignatureSubpacketTags; import org.spongycastle.openpgp.PGPCompressedData; @@ -36,6 +36,7 @@ import org.spongycastle.openpgp.PGPPublicKey; import org.spongycastle.openpgp.PGPPublicKeyEncryptedData; import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPSecretKey; +import org.spongycastle.openpgp.PGPSecretKeyRing; import org.spongycastle.openpgp.PGPSignature; import org.spongycastle.openpgp.PGPSignatureList; import org.spongycastle.openpgp.PGPSignatureSubpacketVector; @@ -53,7 +54,7 @@ import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.provider.ProviderHelper; -import org.sufficientlysecure.keychain.service.KeychainIntentService; +import org.sufficientlysecure.keychain.service.PassphraseCacheService; import org.sufficientlysecure.keychain.util.InputData; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.ProgressDialogUpdater; @@ -75,9 +76,10 @@ public class PgpDecryptVerify { private InputData data; private OutputStream outStream; - private ProgressDialogUpdater progress; - boolean assumeSymmetric; - String passphrase; + private ProgressDialogUpdater progressDialogUpdater; + private boolean assumeSymmetric; + private String passphrase; + private long enforcedKeyId; private PgpDecryptVerify(Builder builder) { // private Constructor can only be called from Builder @@ -85,9 +87,10 @@ public class PgpDecryptVerify { this.data = builder.data; this.outStream = builder.outStream; - this.progress = builder.progress; + this.progressDialogUpdater = builder.progressDialogUpdater; this.assumeSymmetric = builder.assumeSymmetric; this.passphrase = builder.passphrase; + this.enforcedKeyId = builder.enforcedKeyId; } public static class Builder { @@ -97,9 +100,10 @@ public class PgpDecryptVerify { private OutputStream outStream; // optional - private ProgressDialogUpdater progress = null; + private ProgressDialogUpdater progressDialogUpdater = null; private boolean assumeSymmetric = false; private String passphrase = ""; + private long enforcedKeyId = 0; public Builder(Context context, InputData data, OutputStream outStream) { this.context = context; @@ -107,8 +111,8 @@ public class PgpDecryptVerify { this.outStream = outStream; } - public Builder progress(ProgressDialogUpdater progress) { - this.progress = progress; + public Builder progressDialogUpdater(ProgressDialogUpdater progressDialogUpdater) { + this.progressDialogUpdater = progressDialogUpdater; return this; } @@ -122,20 +126,32 @@ public class PgpDecryptVerify { return this; } + /** + * Allow this key id alone for decryption. + * This means only ciphertexts encrypted for this private key can be decrypted. + * + * @param enforcedKeyId + * @return + */ + public Builder enforcedKeyId(long enforcedKeyId) { + this.enforcedKeyId = enforcedKeyId; + return this; + } + public PgpDecryptVerify build() { return new PgpDecryptVerify(this); } } public void updateProgress(int message, int current, int total) { - if (progress != null) { - progress.setProgress(message, current, total); + if (progressDialogUpdater != null) { + progressDialogUpdater.setProgress(message, current, total); } } public void updateProgress(int current, int total) { - if (progress != null) { - progress.setProgress(current, total); + if (progressDialogUpdater != null) { + progressDialogUpdater.setProgress(current, total); } } @@ -177,9 +193,8 @@ public class PgpDecryptVerify { * @throws PGPException * @throws SignatureException */ - public Bundle execute() + public PgpDecryptVerifyResult execute() throws IOException, PgpGeneralException, PGPException, SignatureException { - // automatically works with ascii armor input and binary InputStream in = PGPUtil.getDecoderStream(data.getInputStream()); if (in instanceof ArmoredInputStream) { @@ -207,9 +222,9 @@ public class PgpDecryptVerify { * @throws PGPException * @throws SignatureException */ - private Bundle decryptVerify(InputStream in) + private PgpDecryptVerifyResult decryptVerify(InputStream in) throws IOException, PgpGeneralException, PGPException, SignatureException { - Bundle returnData = new Bundle(); + PgpDecryptVerifyResult returnData = new PgpDecryptVerifyResult(); PGPObjectFactory pgpF = new PGPObjectFactory(in); PGPEncryptedDataList enc; @@ -277,9 +292,40 @@ public class PgpDecryptVerify { PGPPublicKeyEncryptedData encData = (PGPPublicKeyEncryptedData) obj; secretKey = ProviderHelper.getPGPSecretKeyByKeyId(context, encData.getKeyID()); if (secretKey != null) { + // secret key exists in database + + // allow only a specific key for decryption? + if (enforcedKeyId != 0) { + // TODO: improve this code! get master key directly! + PGPSecretKeyRing secretKeyRing = ProviderHelper.getPGPSecretKeyRingByKeyId(context, encData.getKeyID()); + long masterKeyId = PgpKeyHelper.getMasterKey(secretKeyRing).getKeyID(); + Log.d(Constants.TAG, "encData.getKeyID():" + encData.getKeyID()); + Log.d(Constants.TAG, "enforcedKeyId: " + enforcedKeyId); + Log.d(Constants.TAG, "masterKeyId: " + masterKeyId); + + if (enforcedKeyId != masterKeyId) { + throw new PgpGeneralException(context.getString(R.string.error_no_secret_key_found)); + } + } + pbe = encData; + + // if no passphrase was explicitly set try to get it from the cache service + if (passphrase == null) { + // returns "" if key has no passphrase + passphrase = PassphraseCacheService.getCachedPassphrase(context, encData.getKeyID()); + + // if passphrase was not cached, return here indicating that a passphrase is missing! + if (passphrase == null) { + returnData.setKeyPassphraseNeeded(true); + return returnData; + } + } + break; } + + } } @@ -317,6 +363,7 @@ public class PgpDecryptVerify { PGPObjectFactory plainFact = new PGPObjectFactory(clear); Object dataChunk = plainFact.nextObject(); PGPOnePassSignature signature = null; + OpenPgpSignatureResult signatureResult = null; PGPPublicKey signatureKey = null; int signatureIndex = -1; @@ -334,7 +381,7 @@ public class PgpDecryptVerify { if (dataChunk instanceof PGPOnePassSignatureList) { updateProgress(R.string.progress_processing_signature, currentProgress, 100); - returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE, true); + signatureResult = new OpenPgpSignatureResult(); PGPOnePassSignatureList sigList = (PGPOnePassSignatureList) dataChunk; for (int i = 0; i < sigList.size(); ++i) { signature = sigList.get(i); @@ -354,12 +401,12 @@ public class PgpDecryptVerify { if (signKeyRing != null) { userId = PgpKeyHelper.getMainUserId(PgpKeyHelper.getMasterKey(signKeyRing)); } - returnData.putString(KeychainIntentService.RESULT_SIGNATURE_USER_ID, userId); + signatureResult.setUserId(userId); break; } } - returnData.putLong(KeychainIntentService.RESULT_SIGNATURE_KEY_ID, signatureKeyId); + signatureResult.setKeyId(signatureKeyId); if (signature != null) { JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = new JcaPGPContentVerifierBuilderProvider() @@ -367,7 +414,7 @@ public class PgpDecryptVerify { signature.init(contentVerifierBuilderProvider, signatureKey); } else { - returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE_UNKNOWN, true); + signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY); } dataChunk = plainFact.nextObject(); @@ -405,8 +452,7 @@ public class PgpDecryptVerify { try { signature.update(buffer, 0, n); } catch (SignatureException e) { - returnData - .putBoolean(KeychainIntentService.RESULT_SIGNATURE_SUCCESS, false); + signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_ERROR); signature = null; } } @@ -430,17 +476,20 @@ public class PgpDecryptVerify { PGPSignature messageSignature = signatureList.get(signatureIndex); // these are not cleartext signatures! - returnData.putBoolean(KeychainIntentService.RESULT_CLEARTEXT_SIGNATURE_ONLY, false); + // TODO: what about binary signatures? + signatureResult.setSignatureOnly(false); //Now check binding signatures - boolean keyBinding_isok = verifyKeyBinding(context, messageSignature, signatureKey); - boolean sig_isok = signature.verify(messageSignature); + boolean validKeyBinding = verifyKeyBinding(context, messageSignature, signatureKey); + boolean validSignature = signature.verify(messageSignature); - returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE_SUCCESS, keyBinding_isok & sig_isok); + // TODO: implement CERTIFIED! + if (validKeyBinding & validSignature) { + signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED); + } } } - // TODO: test if this integrity really check works! if (encryptedData.isIntegrityProtected()) { updateProgress(R.string.progress_verifying_integrity, 95, 100); @@ -455,9 +504,12 @@ public class PgpDecryptVerify { } else { // no integrity check Log.e(Constants.TAG, "Encrypted data was not integrity protected!"); + // TODO: inform user? } updateProgress(R.string.progress_done, 100, 100); + + returnData.setSignatureResult(signatureResult); return returnData; } @@ -474,11 +526,12 @@ public class PgpDecryptVerify { * @throws PGPException * @throws SignatureException */ - private Bundle verifyCleartextSignature(ArmoredInputStream aIn) + private PgpDecryptVerifyResult verifyCleartextSignature(ArmoredInputStream aIn) throws IOException, PgpGeneralException, PGPException, SignatureException { - Bundle returnData = new Bundle(); + PgpDecryptVerifyResult returnData = new PgpDecryptVerifyResult(); + OpenPgpSignatureResult signatureResult = new OpenPgpSignatureResult(); // cleartext signatures are never encrypted ;) - returnData.putBoolean(KeychainIntentService.RESULT_CLEARTEXT_SIGNATURE_ONLY, true); + signatureResult.setSignatureOnly(true); ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -504,8 +557,6 @@ public class PgpDecryptVerify { byte[] clearText = out.toByteArray(); outStream.write(clearText); - returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE, true); - updateProgress(R.string.progress_processing_signature, 60, 100); PGPObjectFactory pgpFact = new PGPObjectFactory(aIn); @@ -533,15 +584,15 @@ public class PgpDecryptVerify { if (signKeyRing != null) { userId = PgpKeyHelper.getMainUserId(PgpKeyHelper.getMasterKey(signKeyRing)); } - returnData.putString(KeychainIntentService.RESULT_SIGNATURE_USER_ID, userId); + signatureResult.setUserId(userId); break; } } - returnData.putLong(KeychainIntentService.RESULT_SIGNATURE_KEY_ID, signatureKeyId); + signatureResult.setKeyId(signatureKeyId); if (signature == null) { - returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE_UNKNOWN, true); + signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY); updateProgress(R.string.progress_done, 100, 100); return returnData; } @@ -569,47 +620,52 @@ public class PgpDecryptVerify { } while (lookAhead != -1); } - boolean sig_isok = signature.verify(); - //Now check binding signatures - boolean keyBinding_isok = verifyKeyBinding(context, signature, signatureKey); + boolean validKeyBinding = verifyKeyBinding(context, signature, signatureKey); + boolean validSignature = signature.verify(); - returnData.putBoolean(KeychainIntentService.RESULT_SIGNATURE_SUCCESS, sig_isok & keyBinding_isok); + if (validSignature & validKeyBinding) { + signatureResult.setStatus(OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED); + } + + // TODO: what about SIGNATURE_SUCCESS_CERTIFIED and SIGNATURE_ERROR???? updateProgress(R.string.progress_done, 100, 100); + + returnData.setSignatureResult(signatureResult); return returnData; } private static boolean verifyKeyBinding(Context context, PGPSignature signature, PGPPublicKey signatureKey) { long signatureKeyId = signature.getKeyID(); - boolean keyBinding_isok = false; - String userId = null; + boolean validKeyBinding = false; + PGPPublicKeyRing signKeyRing = ProviderHelper.getPGPPublicKeyRingByKeyId(context, signatureKeyId); PGPPublicKey mKey = null; if (signKeyRing != null) { mKey = PgpKeyHelper.getMasterKey(signKeyRing); } + if (signature.getKeyID() != mKey.getKeyID()) { - keyBinding_isok = verifyKeyBinding(mKey, signatureKey); + validKeyBinding = verifyKeyBinding(mKey, signatureKey); } else { //if the key used to make the signature was the master key, no need to check binding sigs - keyBinding_isok = true; + validKeyBinding = true; } - return keyBinding_isok; + return validKeyBinding; } private static boolean verifyKeyBinding(PGPPublicKey masterPublicKey, PGPPublicKey signingPublicKey) { - boolean subkeyBinding_isok = false; - boolean tmp_subkeyBinding_isok = false; - boolean primkeyBinding_isok = false; - JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = new JcaPGPContentVerifierBuilderProvider() - .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); + boolean validSubkeyBinding = false; + boolean validTempSubkeyBinding = false; + boolean validPrimaryKeyBinding = false; + + JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = + new JcaPGPContentVerifierBuilderProvider() + .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); Iterator<PGPSignature> itr = signingPublicKey.getSignatures(); - subkeyBinding_isok = false; - tmp_subkeyBinding_isok = false; - primkeyBinding_isok = false; while (itr.hasNext()) { //what does gpg do if the subkey binding is wrong? //gpg has an invalid subkey binding error on key import I think, but doesn't shout //about keys without subkey signing. Can't get it to import a slightly broken one @@ -619,32 +675,36 @@ public class PgpDecryptVerify { //check and if ok, check primary key binding. try { sig.init(contentVerifierBuilderProvider, masterPublicKey); - tmp_subkeyBinding_isok = sig.verifyCertification(masterPublicKey, signingPublicKey); + validTempSubkeyBinding = sig.verifyCertification(masterPublicKey, signingPublicKey); } catch (PGPException e) { continue; } catch (SignatureException e) { continue; } - if (tmp_subkeyBinding_isok) - subkeyBinding_isok = true; - if (tmp_subkeyBinding_isok) { - primkeyBinding_isok = verifyPrimaryBinding(sig.getUnhashedSubPackets(), masterPublicKey, signingPublicKey); - if (primkeyBinding_isok) + if (validTempSubkeyBinding) + validSubkeyBinding = true; + if (validTempSubkeyBinding) { + validPrimaryKeyBinding = verifyPrimaryKeyBinding(sig.getUnhashedSubPackets(), + masterPublicKey, signingPublicKey); + if (validPrimaryKeyBinding) break; - primkeyBinding_isok = verifyPrimaryBinding(sig.getHashedSubPackets(), masterPublicKey, signingPublicKey); - if (primkeyBinding_isok) + validPrimaryKeyBinding = verifyPrimaryKeyBinding(sig.getHashedSubPackets(), + masterPublicKey, signingPublicKey); + if (validPrimaryKeyBinding) break; } } } - return (subkeyBinding_isok & primkeyBinding_isok); + return (validSubkeyBinding & validPrimaryKeyBinding); } - private static boolean verifyPrimaryBinding(PGPSignatureSubpacketVector Pkts, PGPPublicKey masterPublicKey, PGPPublicKey signingPublicKey) { - boolean primkeyBinding_isok = false; - JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = new JcaPGPContentVerifierBuilderProvider() - .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); + private static boolean verifyPrimaryKeyBinding(PGPSignatureSubpacketVector Pkts, + PGPPublicKey masterPublicKey, PGPPublicKey signingPublicKey) { + boolean validPrimaryKeyBinding = false; + JcaPGPContentVerifierBuilderProvider contentVerifierBuilderProvider = + new JcaPGPContentVerifierBuilderProvider() + .setProvider(Constants.BOUNCY_CASTLE_PROVIDER_NAME); PGPSignatureList eSigList; if (Pkts.hasSubpacket(SignatureSubpacketTags.EMBEDDED_SIGNATURE)) { @@ -660,8 +720,8 @@ public class PgpDecryptVerify { if (emSig.getSignatureType() == PGPSignature.PRIMARYKEY_BINDING) { try { emSig.init(contentVerifierBuilderProvider, signingPublicKey); - primkeyBinding_isok = emSig.verifyCertification(masterPublicKey, signingPublicKey); - if (primkeyBinding_isok) + validPrimaryKeyBinding = emSig.verifyCertification(masterPublicKey, signingPublicKey); + if (validPrimaryKeyBinding) break; } catch (PGPException e) { continue; @@ -671,7 +731,8 @@ public class PgpDecryptVerify { } } } - return primkeyBinding_isok; + + return validPrimaryKeyBinding; } /** diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyResult.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyResult.java new file mode 100644 index 000000000..0477c4fdf --- /dev/null +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpDecryptVerifyResult.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.sufficientlysecure.keychain.pgp; + +import android.os.Parcel; +import android.os.Parcelable; + +import org.openintents.openpgp.OpenPgpSignatureResult; + +public class PgpDecryptVerifyResult implements Parcelable { + boolean symmetricPassphraseNeeded; + boolean keyPassphraseNeeded; + OpenPgpSignatureResult signatureResult; + + public boolean isSymmetricPassphraseNeeded() { + return symmetricPassphraseNeeded; + } + + public void setSymmetricPassphraseNeeded(boolean symmetricPassphraseNeeded) { + this.symmetricPassphraseNeeded = symmetricPassphraseNeeded; + } + + public boolean isKeyPassphraseNeeded() { + return keyPassphraseNeeded; + } + + public void setKeyPassphraseNeeded(boolean keyPassphraseNeeded) { + this.keyPassphraseNeeded = keyPassphraseNeeded; + } + + public OpenPgpSignatureResult getSignatureResult() { + return signatureResult; + } + + public void setSignatureResult(OpenPgpSignatureResult signatureResult) { + this.signatureResult = signatureResult; + } + + public PgpDecryptVerifyResult() { + + } + + public PgpDecryptVerifyResult(PgpDecryptVerifyResult b) { + this.symmetricPassphraseNeeded = b.symmetricPassphraseNeeded; + this.keyPassphraseNeeded = b.keyPassphraseNeeded; + this.signatureResult = b.signatureResult; + } + + + public int describeContents() { + return 0; + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeByte((byte) (symmetricPassphraseNeeded ? 1 : 0)); + dest.writeByte((byte) (keyPassphraseNeeded ? 1 : 0)); + dest.writeParcelable(signatureResult, 0); + } + + public static final Creator<PgpDecryptVerifyResult> CREATOR = new Creator<PgpDecryptVerifyResult>() { + public PgpDecryptVerifyResult createFromParcel(final Parcel source) { + PgpDecryptVerifyResult vr = new PgpDecryptVerifyResult(); + vr.symmetricPassphraseNeeded = source.readByte() == 1; + vr.keyPassphraseNeeded = source.readByte() == 1; + vr.signatureResult = source.readParcelable(OpenPgpSignatureResult.class.getClassLoader()); + return vr; + } + + public PgpDecryptVerifyResult[] newArray(final int size) { + return new PgpDecryptVerifyResult[size]; + } + }; +} diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java index 302dbea0b..cf507826e 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java @@ -44,6 +44,7 @@ import org.sufficientlysecure.keychain.helper.OtherHelper; import org.sufficientlysecure.keychain.helper.Preferences; import org.sufficientlysecure.keychain.pgp.PgpConversionHelper; import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify; +import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult; import org.sufficientlysecure.keychain.pgp.PgpHelper; import org.sufficientlysecure.keychain.pgp.PgpImportExport; import org.sufficientlysecure.keychain.pgp.PgpKeyOperation; @@ -181,13 +182,7 @@ public class KeychainIntentService extends IntentService implements ProgressDial // decrypt/verify public static final String RESULT_DECRYPTED_STRING = "decrypted_message"; public static final String RESULT_DECRYPTED_BYTES = "decrypted_data"; - public static final String RESULT_SIGNATURE = "signature"; - public static final String RESULT_SIGNATURE_KEY_ID = "signature_key_id"; - public static final String RESULT_SIGNATURE_USER_ID = "signature_user_id"; - public static final String RESULT_CLEARTEXT_SIGNATURE_ONLY = "signature_only"; - - public static final String RESULT_SIGNATURE_SUCCESS = "signature_success"; - public static final String RESULT_SIGNATURE_UNKNOWN = "signature_unknown"; + public static final String RESULT_DECRYPT_VERIFY_RESULT = "signature"; // import public static final String RESULT_IMPORT_ADDED = "added"; @@ -206,7 +201,7 @@ public class KeychainIntentService extends IntentService implements ProgressDial private boolean mIsCanceled; public KeychainIntentService() { - super("ApgService"); + super("KeychainIntentService"); } @Override @@ -489,15 +484,17 @@ public class KeychainIntentService extends IntentService implements ProgressDial // verifyText and decrypt returning additional resultData values for the // verification of signatures PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(this, inputData, outStream); - builder.progress(this); + builder.progressDialogUpdater(this); builder.assumeSymmetric(assumeSymmetricEncryption) .passphrase(PassphraseCacheService.getCachedPassphrase(this, secretKeyId)); - resultData = builder.build().execute(); + PgpDecryptVerifyResult decryptVerifyResult = builder.build().execute(); outStream.close(); + resultData.putParcelable(RESULT_DECRYPT_VERIFY_RESULT, decryptVerifyResult); + /* Output */ switch (target) { @@ -867,10 +864,10 @@ public class KeychainIntentService extends IntentService implements ProgressDial } /** - * Set progress of ProgressDialog by sending message to handler on UI thread + * Set progressDialogUpdater of ProgressDialog by sending message to handler on UI thread */ public void setProgress(String message, int progress, int max) { - Log.d(Constants.TAG, "Send message by setProgress with progress=" + progress + ", max=" + Log.d(Constants.TAG, "Send message by setProgress with progressDialogUpdater=" + progress + ", max=" + max); Bundle data = new Bundle(); diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/remote/OpenPgpService.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/remote/OpenPgpService.java index 8c8e6f00a..8b34c4421 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/remote/OpenPgpService.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/remote/OpenPgpService.java @@ -21,7 +21,6 @@ import android.app.PendingIntent; import android.content.Intent; import android.database.Cursor; import android.net.Uri; -import android.os.Bundle; import android.os.IBinder; import android.os.ParcelFileDescriptor; @@ -33,9 +32,10 @@ import org.spongycastle.util.Arrays; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Id; import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify; +import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult; import org.sufficientlysecure.keychain.pgp.PgpSignEncrypt; +import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; import org.sufficientlysecure.keychain.provider.KeychainContract; -import org.sufficientlysecure.keychain.service.KeychainIntentService; import org.sufficientlysecure.keychain.service.PassphraseCacheService; import org.sufficientlysecure.keychain.util.InputData; import org.sufficientlysecure.keychain.util.Log; @@ -284,97 +284,29 @@ public class OpenPgpService extends RemoteService { Intent result = new Intent(); try { - // TODO: - // fix the mess: http://stackoverflow.com/questions/148130/how-do-i-peek-at-the-first-two-bytes-in-an-inputstream - // should we allow to decrypt everything under every key id or only the one set? - // TODO: instead of trying to get the passphrase before - // pause stream when passphrase is missing and then resume - - // TODO: put this code into PgpDecryptVerify class - - // TODO: This allows to decrypt messages with ALL secret keys, not only the one for the - // app, Fix this? -// String passphrase = null; -// if (!signedOnly) { -// // BEGIN Get key -// // TODO: this input stream is consumed after PgpMain.getDecryptionKeyId()... do it -// // better! -// InputStream inputStream2 = new ByteArrayInputStream(inputBytes); -// -// // TODO: duplicates functions from DecryptActivity! -// long secretKeyId; -// try { -// if (inputStream2.markSupported()) { -// // should probably set this to the max size of two -// // pgpF objects, if it even needs to be anything other -// // than 0. -// inputStream2.mark(200); -// } -// secretKeyId = PgpHelper.getDecryptionKeyId(this, inputStream2); -// if (secretKeyId == Id.key.none) { -// throw new PgpGeneralException(getString(R.string.error_no_secret_key_found)); -// } -// } catch (NoAsymmetricEncryptionException e) { -// if (inputStream2.markSupported()) { -// inputStream2.reset(); -// } -// secretKeyId = Id.key.symmetric; -// if (!PgpDecryptVerify.hasSymmetricEncryption(this, inputStream2)) { -// throw new PgpGeneralException( -// getString(R.string.error_no_known_encryption_found)); -// } -// // we do not support symmetric decryption from the API! -// throw new Exception("Symmetric decryption is not supported!"); -// } -// -// Log.d(Constants.TAG, "secretKeyId " + secretKeyId); - - // NOTE: currently this only gets the passphrase for the key set for this client - String passphrase; - if (data.hasExtra(OpenPgpApi.EXTRA_PASSPHRASE)) { - passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE); - } else { - passphrase = PassphraseCacheService.getCachedPassphrase(getContext(), appSettings.getKeyId()); - } - if (passphrase == null) { - // get PendingIntent for passphrase input, add it to given params and return to client - Intent passphraseBundle = getPassphraseBundleIntent(data, appSettings.getKeyId()); - return passphraseBundle; - } - + String passphrase = data.getStringExtra(OpenPgpApi.EXTRA_PASSPHRASE); long inputLength = is.available(); InputData inputData = new InputData(is, inputLength); - Bundle outputBundle; PgpDecryptVerify.Builder builder = new PgpDecryptVerify.Builder(this, inputData, os); - - builder.assumeSymmetric(false) + builder.assumeSymmetric(false) // no support for symmetric encryption + .enforcedKeyId(appSettings.getKeyId()) // allow only the private key for this app for decryption .passphrase(passphrase); - // TODO: this also decrypts with other secret keys that have no passphrase!!! - outputBundle = builder.build().execute(); - - //TODO: instead of using all these wrapping use OpenPgpSignatureResult directly - // in DecryptVerify class and then in DecryptActivity - boolean signature = outputBundle.getBoolean(KeychainIntentService.RESULT_SIGNATURE, false); - if (signature) { - long signatureKeyId = outputBundle - .getLong(KeychainIntentService.RESULT_SIGNATURE_KEY_ID, 0); - String signatureUserId = outputBundle - .getString(KeychainIntentService.RESULT_SIGNATURE_USER_ID); - boolean signatureSuccess = outputBundle - .getBoolean(KeychainIntentService.RESULT_SIGNATURE_SUCCESS, false); - boolean signatureUnknown = outputBundle - .getBoolean(KeychainIntentService.RESULT_SIGNATURE_UNKNOWN, false); - boolean signatureOnly = outputBundle - .getBoolean(KeychainIntentService.RESULT_CLEARTEXT_SIGNATURE_ONLY, false); - - int signatureStatus = OpenPgpSignatureResult.SIGNATURE_ERROR; - if (signatureSuccess) { - signatureStatus = OpenPgpSignatureResult.SIGNATURE_SUCCESS_CERTIFIED; - } else if (signatureUnknown) { - signatureStatus = OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY; + // TODO: currently does not support binary signed-only content + PgpDecryptVerifyResult decryptVerifyResult = builder.build().execute(); + if (decryptVerifyResult.isKeyPassphraseNeeded()) { + // get PendingIntent for passphrase input, add it to given params and return to client + Intent passphraseBundle = getPassphraseBundleIntent(data, appSettings.getKeyId()); + return passphraseBundle; + } else if (decryptVerifyResult.isSymmetricPassphraseNeeded()) { + throw new PgpGeneralException("Decryption of symmetric content not supported by API!"); + } + + OpenPgpSignatureResult signatureResult = decryptVerifyResult.getSignatureResult(); + if (signatureResult != null) { + if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY) { // If signature is unknown we return an additional PendingIntent // to retrieve the missing key // TODO!!! @@ -389,11 +321,9 @@ public class OpenPgpService extends RemoteService { result.putExtra(OpenPgpApi.RESULT_INTENT, pi); } - - OpenPgpSignatureResult sigResult = new OpenPgpSignatureResult(signatureStatus, - signatureUserId, signatureOnly, signatureKeyId); - result.putExtra(OpenPgpApi.RESULT_SIGNATURE, sigResult); + result.putExtra(OpenPgpApi.RESULT_SIGNATURE, signatureResult); } + } finally { is.close(); os.close(); diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java index 9bb675db0..42288ca37 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptActivity.java @@ -25,6 +25,7 @@ import java.io.FileNotFoundException; import java.io.InputStream; import java.util.regex.Matcher; +import org.openintents.openpgp.OpenPgpSignatureResult; import org.spongycastle.openpgp.PGPPublicKeyRing; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Id; @@ -32,6 +33,7 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.compatibility.ClipboardReflection; import org.sufficientlysecure.keychain.helper.ActionBarHelper; import org.sufficientlysecure.keychain.helper.FileHelper; +import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult; import org.sufficientlysecure.keychain.pgp.PgpHelper; import org.sufficientlysecure.keychain.pgp.PgpKeyHelper; import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify; @@ -690,11 +692,15 @@ public class DecryptActivity extends DrawerActivity { } - if (returnData.getBoolean(KeychainIntentService.RESULT_SIGNATURE)) { - String userId = returnData - .getString(KeychainIntentService.RESULT_SIGNATURE_USER_ID); - mSignatureKeyId = returnData - .getLong(KeychainIntentService.RESULT_SIGNATURE_KEY_ID); + PgpDecryptVerifyResult decryptVerifyResult = + returnData.getParcelable(KeychainIntentService.RESULT_DECRYPT_VERIFY_RESULT); + + OpenPgpSignatureResult signatureResult = decryptVerifyResult.getSignatureResult(); + + if (signatureResult != null) { + + String userId = signatureResult.getUserId(); + mSignatureKeyId = signatureResult.getKeyId(); mUserIdRest.setText("id: " + PgpKeyHelper.convertKeyIdToHex(mSignatureKeyId)); if (userId == null) { @@ -707,19 +713,32 @@ public class DecryptActivity extends DrawerActivity { } mUserId.setText(userId); - if (returnData.getBoolean(KeychainIntentService.RESULT_SIGNATURE_SUCCESS)) { - mSignatureStatusImage.setImageResource(R.drawable.overlay_ok); - mLookupKey.setVisibility(View.GONE); - } else if (returnData - .getBoolean(KeychainIntentService.RESULT_SIGNATURE_UNKNOWN)) { - mSignatureStatusImage.setImageResource(R.drawable.overlay_error); - mLookupKey.setVisibility(View.VISIBLE); - AppMsg.makeText(DecryptActivity.this, - R.string.unknown_signature, - AppMsg.STYLE_ALERT).show(); - } else { - mSignatureStatusImage.setImageResource(R.drawable.overlay_error); - mLookupKey.setVisibility(View.GONE); + switch (signatureResult.getStatus()) { + case OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED: { + mSignatureStatusImage.setImageResource(R.drawable.overlay_ok); + mLookupKey.setVisibility(View.GONE); + break; + } + + // TODO! +// case OpenPgpSignatureResult.SIGNATURE_SUCCESS_CERTIFIED: { +// break; +// } + + case OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY: { + mSignatureStatusImage.setImageResource(R.drawable.overlay_error); + mLookupKey.setVisibility(View.VISIBLE); + AppMsg.makeText(DecryptActivity.this, + R.string.unknown_signature, + AppMsg.STYLE_ALERT).show(); + break; + } + + default: { + mSignatureStatusImage.setImageResource(R.drawable.overlay_error); + mLookupKey.setVisibility(View.GONE); + break; + } } mSignatureLayout.setVisibility(View.VISIBLE); } diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java index b38beebd1..a508e6b33 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/PreferencesActivity.java @@ -24,24 +24,28 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.helper.Preferences; import org.sufficientlysecure.keychain.ui.widget.IntegerListPreference; +import android.annotation.SuppressLint; +import android.content.Context; import android.content.Intent; +import android.os.Build; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceActivity; +import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; import android.support.v7.app.ActionBarActivity; +import java.util.List; + +@SuppressLint("NewApi") public class PreferencesActivity extends PreferenceActivity { - private IntegerListPreference mPassPhraseCacheTtl = null; - private IntegerListPreference mEncryptionAlgorithm = null; - private IntegerListPreference mHashAlgorithm = null; - private IntegerListPreference mMessageCompression = null; - private IntegerListPreference mFileCompression = null; - private CheckBoxPreference mAsciiArmour = null; - private CheckBoxPreference mForceV3Signatures = null; + + public final static String ACTION_PREFS_GEN = "org.sufficientlysecure.keychain.ui.PREFS_GEN"; + public final static String ACTION_PREFS_ADV = "org.sufficientlysecure.keychain.ui.PREFS_ADV"; + private PreferenceScreen mKeyServerPreference = null; - private Preferences mPreferences; + private static Preferences mPreferences; @Override protected void onCreate(Bundle savedInstanceState) { @@ -53,9 +57,205 @@ public class PreferencesActivity extends PreferenceActivity { // actionBar.setDisplayHomeAsUpEnabled(false); // actionBar.setHomeButtonEnabled(false); - addPreferencesFromResource(R.xml.preferences); + //addPreferencesFromResource(R.xml.preferences); + String action = getIntent().getAction(); + + if (action != null && action.equals(ACTION_PREFS_GEN)) { + addPreferencesFromResource(R.xml.gen_preferences); + + initializePassPassPhraceCacheTtl( + (IntegerListPreference) findPreference(Constants.pref.PASS_PHRASE_CACHE_TTL)); + + mKeyServerPreference = (PreferenceScreen) findPreference(Constants.pref.KEY_SERVERS); + String servers[] = mPreferences.getKeyServers(); + mKeyServerPreference.setSummary(getResources().getQuantityString(R.plurals.n_key_servers, + servers.length, servers.length)); + mKeyServerPreference + .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + public boolean onPreferenceClick(Preference preference) { + Intent intent = new Intent(PreferencesActivity.this, + PreferencesKeyServerActivity.class); + intent.putExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS, + mPreferences.getKeyServers()); + startActivityForResult(intent, Id.request.key_server_preference); + return false; + } + }); + + } else if (action != null && action.equals(ACTION_PREFS_ADV)) { + addPreferencesFromResource(R.xml.adv_preferences); + + initializeEncryptionAlgorithm( + (IntegerListPreference) findPreference(Constants.pref.DEFAULT_ENCRYPTION_ALGORITHM)); + + int[] valueIds = new int[] { Id.choice.compression.none, Id.choice.compression.zip, + Id.choice.compression.zlib, Id.choice.compression.bzip2, }; + String[] entries = new String[] { + getString(R.string.choice_none) + " (" + getString(R.string.compression_fast) + ")", + "ZIP (" + getString(R.string.compression_fast) + ")", + "ZLIB (" + getString(R.string.compression_fast) + ")", + "BZIP2 (" + getString(R.string.compression_very_slow) + ")", }; + String[] values = new String[valueIds.length]; + for (int i = 0; i < values.length; ++i) { + values[i] = "" + valueIds[i]; + } + + initializeHashAlgorithm( + (IntegerListPreference) findPreference(Constants.pref.DEFAULT_HASH_ALGORITHM), + valueIds, entries, values); + + initializeMessageCompression( + (IntegerListPreference) findPreference(Constants.pref.DEFAULT_MESSAGE_COMPRESSION), + valueIds, entries, values); + + initializeFileCompression( + (IntegerListPreference) findPreference(Constants.pref.DEFAULT_FILE_COMPRESSION), + entries, values); + + initializeAsciiArmour((CheckBoxPreference) findPreference(Constants.pref.DEFAULT_ASCII_ARMOUR)); + + initializeForceV3Signatures((CheckBoxPreference) findPreference(Constants.pref.FORCE_V3_SIGNATURES)); + + } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + // Load the legacy preferences headers + addPreferencesFromResource(R.xml.preference_headers_legacy); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + case Id.request.key_server_preference: { + if (resultCode == RESULT_CANCELED || data == null) { + return; + } + String servers[] = data + .getStringArrayExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS); + mPreferences.setKeyServers(servers); + mKeyServerPreference.setSummary(getResources().getQuantityString( + R.plurals.n_key_servers, servers.length, servers.length)); + break; + } + + default: { + super.onActivityResult(requestCode, resultCode, data); + break; + } + } + } + + /* Called only on Honeycomb and later */ + @Override + public void onBuildHeaders(List<Header> target) { + super.onBuildHeaders(target); + loadHeadersFromResource(R.xml.preference_headers, target); + } + + /** This fragment shows the general preferences in android 3.0+ */ + public static class GeneralPrefsFragment extends PreferenceFragment { + + private PreferenceScreen mKeyServerPreference = null; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.gen_preferences); + + initializePassPassPhraceCacheTtl( + (IntegerListPreference) findPreference(Constants.pref.PASS_PHRASE_CACHE_TTL)); + + mKeyServerPreference = (PreferenceScreen) findPreference(Constants.pref.KEY_SERVERS); + String servers[] = mPreferences.getKeyServers(); + mKeyServerPreference.setSummary(getResources().getQuantityString(R.plurals.n_key_servers, + servers.length, servers.length)); + mKeyServerPreference + .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + public boolean onPreferenceClick(Preference preference) { + Intent intent = new Intent(getActivity(), + PreferencesKeyServerActivity.class); + intent.putExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS, + mPreferences.getKeyServers()); + startActivityForResult(intent, Id.request.key_server_preference); + return false; + } + }); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + case Id.request.key_server_preference: { + if (resultCode == RESULT_CANCELED || data == null) { + return; + } + String servers[] = data + .getStringArrayExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS); + mPreferences.setKeyServers(servers); + mKeyServerPreference.setSummary(getResources().getQuantityString( + R.plurals.n_key_servers, servers.length, servers.length)); + break; + } + + default: { + super.onActivityResult(requestCode, resultCode, data); + break; + } + } + } + } + + /** This fragment shows the advanced preferences in android 3.0+ */ + public static class AdvancedPrefsFragment extends PreferenceFragment { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.adv_preferences); + + initializeEncryptionAlgorithm( + (IntegerListPreference) findPreference(Constants.pref.DEFAULT_ENCRYPTION_ALGORITHM)); + + int[] valueIds = new int[] { Id.choice.compression.none, Id.choice.compression.zip, + Id.choice.compression.zlib, Id.choice.compression.bzip2, }; + String[] entries = new String[] { + getString(R.string.choice_none) + " (" + getString(R.string.compression_fast) + ")", + "ZIP (" + getString(R.string.compression_fast) + ")", + "ZLIB (" + getString(R.string.compression_fast) + ")", + "BZIP2 (" + getString(R.string.compression_very_slow) + ")", }; + String[] values = new String[valueIds.length]; + for (int i = 0; i < values.length; ++i) { + values[i] = "" + valueIds[i]; + } + + initializeHashAlgorithm( + (IntegerListPreference) findPreference(Constants.pref.DEFAULT_HASH_ALGORITHM), + valueIds, entries, values); + + initializeMessageCompression( + (IntegerListPreference) findPreference(Constants.pref.DEFAULT_MESSAGE_COMPRESSION), + valueIds, entries, values); + + initializeFileCompression( + (IntegerListPreference) findPreference(Constants.pref.DEFAULT_FILE_COMPRESSION), + entries, values); - mPassPhraseCacheTtl = (IntegerListPreference) findPreference(Constants.pref.PASS_PHRASE_CACHE_TTL); + initializeAsciiArmour((CheckBoxPreference) findPreference(Constants.pref.DEFAULT_ASCII_ARMOUR)); + + initializeForceV3Signatures((CheckBoxPreference) findPreference(Constants.pref.FORCE_V3_SIGNATURES)); + } + } + + protected boolean isValidFragment (String fragmentName) { + return AdvancedPrefsFragment.class.getName().equals(fragmentName) + || GeneralPrefsFragment.class.getName().equals(fragmentName) + || super.isValidFragment(fragmentName); + } + + private static void initializePassPassPhraceCacheTtl(final IntegerListPreference mPassPhraseCacheTtl) { mPassPhraseCacheTtl.setValue("" + mPreferences.getPassPhraseCacheTtl()); mPassPhraseCacheTtl.setSummary(mPassPhraseCacheTtl.getEntry()); mPassPhraseCacheTtl @@ -67,8 +267,9 @@ public class PreferencesActivity extends PreferenceActivity { return false; } }); + } - mEncryptionAlgorithm = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_ENCRYPTION_ALGORITHM); + private static void initializeEncryptionAlgorithm(final IntegerListPreference mEncryptionAlgorithm) { int valueIds[] = { PGPEncryptedData.AES_128, PGPEncryptedData.AES_192, PGPEncryptedData.AES_256, PGPEncryptedData.BLOWFISH, PGPEncryptedData.TWOFISH, PGPEncryptedData.CAST5, PGPEncryptedData.DES, PGPEncryptedData.TRIPLE_DES, @@ -93,8 +294,10 @@ public class PreferencesActivity extends PreferenceActivity { return false; } }); + } - mHashAlgorithm = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_HASH_ALGORITHM); + private static void initializeHashAlgorithm + (final IntegerListPreference mHashAlgorithm, int[] valueIds, String[] entries, String[] values) { valueIds = new int[] { HashAlgorithmTags.MD5, HashAlgorithmTags.RIPEMD160, HashAlgorithmTags.SHA1, HashAlgorithmTags.SHA224, HashAlgorithmTags.SHA256, HashAlgorithmTags.SHA384, HashAlgorithmTags.SHA512, }; @@ -116,19 +319,10 @@ public class PreferencesActivity extends PreferenceActivity { return false; } }); + } - mMessageCompression = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_MESSAGE_COMPRESSION); - valueIds = new int[] { Id.choice.compression.none, Id.choice.compression.zip, - Id.choice.compression.zlib, Id.choice.compression.bzip2, }; - entries = new String[] { - getString(R.string.choice_none) + " (" + getString(R.string.compression_fast) + ")", - "ZIP (" + getString(R.string.compression_fast) + ")", - "ZLIB (" + getString(R.string.compression_fast) + ")", - "BZIP2 (" + getString(R.string.compression_very_slow) + ")", }; - values = new String[valueIds.length]; - for (int i = 0; i < values.length; ++i) { - values[i] = "" + valueIds[i]; - } + private static void initializeMessageCompression + (final IntegerListPreference mMessageCompression, int[] valueIds, String[] entries, String[] values) { mMessageCompression.setEntries(entries); mMessageCompression.setEntryValues(values); mMessageCompression.setValue("" + mPreferences.getDefaultMessageCompression()); @@ -143,8 +337,10 @@ public class PreferencesActivity extends PreferenceActivity { return false; } }); + } - mFileCompression = (IntegerListPreference) findPreference(Constants.pref.DEFAULT_FILE_COMPRESSION); + private static void initializeFileCompression + (final IntegerListPreference mFileCompression, String[] entries, String[] values) { mFileCompression.setEntries(entries); mFileCompression.setEntryValues(values); mFileCompression.setValue("" + mPreferences.getDefaultFileCompression()); @@ -157,8 +353,9 @@ public class PreferencesActivity extends PreferenceActivity { return false; } }); + } - mAsciiArmour = (CheckBoxPreference) findPreference(Constants.pref.DEFAULT_ASCII_ARMOUR); + private static void initializeAsciiArmour(final CheckBoxPreference mAsciiArmour) { mAsciiArmour.setChecked(mPreferences.getDefaultAsciiArmour()); mAsciiArmour.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference preference, Object newValue) { @@ -167,8 +364,9 @@ public class PreferencesActivity extends PreferenceActivity { return false; } }); + } - mForceV3Signatures = (CheckBoxPreference) findPreference(Constants.pref.FORCE_V3_SIGNATURES); + private static void initializeForceV3Signatures(final CheckBoxPreference mForceV3Signatures) { mForceV3Signatures.setChecked(mPreferences.getForceV3Signatures()); mForceV3Signatures .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @@ -178,43 +376,5 @@ public class PreferencesActivity extends PreferenceActivity { return false; } }); - - mKeyServerPreference = (PreferenceScreen) findPreference(Constants.pref.KEY_SERVERS); - String servers[] = mPreferences.getKeyServers(); - mKeyServerPreference.setSummary(getResources().getQuantityString(R.plurals.n_key_servers, - servers.length, servers.length)); - mKeyServerPreference - .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - public boolean onPreferenceClick(Preference preference) { - Intent intent = new Intent(PreferencesActivity.this, - PreferencesKeyServerActivity.class); - intent.putExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS, - mPreferences.getKeyServers()); - startActivityForResult(intent, Id.request.key_server_preference); - return false; - } - }); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (requestCode) { - case Id.request.key_server_preference: { - if (resultCode == RESULT_CANCELED || data == null) { - return; - } - String servers[] = data - .getStringArrayExtra(PreferencesKeyServerActivity.EXTRA_KEY_SERVERS); - mPreferences.setKeyServers(servers); - mKeyServerPreference.setSummary(getResources().getQuantityString( - R.plurals.n_key_servers, servers.length, servers.length)); - break; - } - - default: { - super.onActivityResult(requestCode, resultCode, data); - break; - } - } } -} +}
\ No newline at end of file diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java index 4598b54b1..75a885bdd 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeyEditor.java @@ -34,6 +34,7 @@ import android.app.DatePickerDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.text.format.DateUtils; import android.util.AttributeSet; import android.view.View; import android.view.View.OnClickListener; @@ -58,6 +59,7 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener { Spinner mUsage; TextView mCreationDate; BootstrapButton mExpiryDateButton; + GregorianCalendar mCreatedDate; GregorianCalendar mExpiryDate; private int mDatePickerResultCount = 0; @@ -133,10 +135,21 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener { } } }); + // setCalendarViewShown() is supported from API 11 onwards. - if (android.os.Build.VERSION.SDK_INT >= 11) + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) // Hide calendarView in tablets because of the unix warparound bug. dialog.getDatePicker().setCalendarViewShown(false); + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { + if ( dialog != null && mCreatedDate != null ) { + dialog.getDatePicker().setMinDate(mCreatedDate.getTime().getTime()+ DateUtils.DAY_IN_MILLIS); + } else { + //When created date isn't available + dialog.getDatePicker().setMinDate(date.getTime().getTime()+ DateUtils.DAY_IN_MILLIS); + } + } + dialog.show(); } }); @@ -213,7 +226,7 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener { GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); cal.setTime(PgpKeyHelper.getCreationDate(key)); - mCreationDate.setText(DateFormat.getDateInstance().format(cal.getTime())); + setCreatedDate(cal); cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); Date expiryDate = PgpKeyHelper.getExpiryDate(key); if (expiryDate == null) { @@ -243,6 +256,15 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener { mEditorListener = listener; } + private void setCreatedDate(GregorianCalendar date) { + mCreatedDate = date; + if (date == null) { + mCreationDate.setText(getContext().getString(R.string.none)); + } else { + mCreationDate.setText(DateFormat.getDateInstance().format(date.getTime())); + } + } + private void setExpiryDate(GregorianCalendar date) { mExpiryDate = date; if (date == null) { diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/util/HkpKeyServer.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/util/HkpKeyServer.java index b94c42e90..921d22f21 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/util/HkpKeyServer.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/util/HkpKeyServer.java @@ -1,6 +1,8 @@ /* + * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de> + * Copyright (C) 2011 Thialfihar <thi@thialfihar.org> * Copyright (C) 2011 Senecaso - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/util/KeyServer.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/util/KeyServer.java index 072affb1f..b1e6b3c71 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/util/KeyServer.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/util/KeyServer.java @@ -1,6 +1,8 @@ /* + * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de> + * Copyright (C) 2011 Thialfihar <thi@thialfihar.org> * Copyright (C) 2011 Senecaso - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -16,14 +18,8 @@ package org.sufficientlysecure.keychain.util; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Date; import java.util.List; -import android.os.Parcel; -import android.os.Parcelable; - import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry; public abstract class KeyServer { diff --git a/OpenPGP-Keychain/src/main/res/raw-de/help_about.html b/OpenPGP-Keychain/src/main/res/raw-de/help_about.html index 50220bd0b..37d4193f7 100644 --- a/OpenPGP-Keychain/src/main/res/raw-de/help_about.html +++ b/OpenPGP-Keychain/src/main/res/raw-de/help_about.html @@ -2,7 +2,7 @@ <head></head> <body> <p><a href="http://www.openkeychain.org">http://www.openkeychain.org</a></p> -<p><a href="http://www.openkeychain.org">OpenKeychain</a> is an OpenPGP implementation for Android.</p> +<p><a href="http://www.openkeychain.org">OpenKeychain</a> ist eine OpenPGP implementation für Android.</p> <p>Lizenz: GPLv3+</p> <h2>Entwickler OpenKeychain</h2> diff --git a/OpenPGP-Keychain/src/main/res/raw-de/help_changelog.html b/OpenPGP-Keychain/src/main/res/raw-de/help_changelog.html index ea31d1f3d..1197869b5 100644 --- a/OpenPGP-Keychain/src/main/res/raw-de/help_changelog.html +++ b/OpenPGP-Keychain/src/main/res/raw-de/help_changelog.html @@ -86,7 +86,7 @@ </ul> <h2>1.0.2</h2> <ul> -<li>filterable key lists</li> +<li>Filterbare Schlüsselliste</li> <li>smarter pre-selection of encryption keys</li> <li>new Intent handling for VIEW and SEND, allows files to be encrypted/decrypted out of file managers</li> <li>fixes and additional features (key preselection) for K-9 Mail, new beta build available</li> diff --git a/OpenPGP-Keychain/src/main/res/values-de/strings.xml b/OpenPGP-Keychain/src/main/res/values-de/strings.xml index 09b4fdb23..493a3a9bb 100644 --- a/OpenPGP-Keychain/src/main/res/values-de/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-de/strings.xml @@ -15,7 +15,7 @@ <string name="title_key_server_preference">Schlüsselserver</string> <string name="title_change_pass_phrase">Passwort ändern</string> <string name="title_set_passphrase">Passwort setzen</string> - <string name="title_send_email">E-Mail senden...</string> + <string name="title_send_email">E-Mail senden…</string> <string name="title_encrypt_to_file">In eine Datei verschlüsseln</string> <string name="title_decrypt_to_file">In eine Datei entschlüsseln</string> <string name="title_import_keys">Schlüssel importieren</string> @@ -163,7 +163,7 @@ <string name="dsa">DSA</string> <string name="elgamal">ElGamal</string> <string name="rsa">RSA</string> - <string name="filemanager_title_open">Öffnen...</string> + <string name="filemanager_title_open">Öffnen…</string> <string name="warning">Warnung</string> <string name="error">Fehler</string> <string name="error_message">Fehler: %s</string> @@ -266,46 +266,47 @@ <string name="error_expiry_must_come_after_creation">Ablaufdatum muss später sein als das Erstellungsdatum</string> <string name="error_can_not_delete_contact">Sie können diesen Kontakt nicht löschen, denn es ist ihr eigener.</string> <string name="error_can_not_delete_contacts">Sie können folgende Kontakte nicht löschen, denn sie gehören Ihnen selbst:\n%s</string> + <string name="error_keyserver_query">Keyserveranfrage fehlgeschlagen</string> <plurals name="error_can_not_delete_info"> <item quantity="one">Bitte lösche ihn unter \'Meine Schlüssel\'!</item> <item quantity="other">Bitte lösche sie unter \'Meine Schlüssel\'!</item> </plurals> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">fertig.</string> - <string name="progress_saving">speichern...</string> - <string name="progress_importing">importieren...</string> - <string name="progress_exporting">exportieren...</string> - <string name="progress_generating">erstelle Schlüssel, dies kann bis zu 3 Minuten dauern...</string> - <string name="progress_building_key">erstelle Schlüssel...</string> - <string name="progress_preparing_master_key">Hauptschlüssel wird vorbereitet...</string> - <string name="progress_certifying_master_key">Hauptschlüssel wird beglaubigt...</string> - <string name="progress_building_master_key">erstelle Hauptring...</string> - <string name="progress_adding_sub_keys">füge Unterschlüssel hinzu...</string> - <string name="progress_saving_key_ring">Schlüssel wird gespeichert...</string> + <string name="progress_saving">speichern…</string> + <string name="progress_importing">importieren…</string> + <string name="progress_exporting">exportieren…</string> + <string name="progress_generating">erstelle Schlüssel, dies kann bis zu 3 Minuten dauern…</string> + <string name="progress_building_key">erstelle Schlüssel…</string> + <string name="progress_preparing_master_key">Hauptschlüssel wird vorbereitet…</string> + <string name="progress_certifying_master_key">Hauptschlüssel wird beglaubigt…</string> + <string name="progress_building_master_key">erstelle Hauptring…</string> + <string name="progress_adding_sub_keys">füge Unterschlüssel hinzu…</string> + <string name="progress_saving_key_ring">Schlüssel wird gespeichert…</string> <plurals name="progress_exporting_key"> <item quantity="one">Schlüssel wird exportiert…</item> <item quantity="other">Schlüssel werden exportiert…</item> </plurals> - <string name="progress_extracting_signature_key">extrahiere Signaturschlüssel...</string> - <string name="progress_extracting_key">extrahiere Schlüssel...</string> - <string name="progress_preparing_streams">Datenstrom wird vorbereitet...</string> - <string name="progress_encrypting">Daten werden verschlüsselt...</string> - <string name="progress_decrypting">Daten werden entschlüsselt...</string> - <string name="progress_preparing_signature">Signatur wird vorbereitet...</string> - <string name="progress_generating_signature">Signatur wird erstellt...</string> - <string name="progress_processing_signature">Signatur wird verarbeitet...</string> - <string name="progress_verifying_signature">Signatur wird verifiziert...</string> - <string name="progress_signing">signiere...</string> - <string name="progress_reading_data">Daten werden gelesen...</string> - <string name="progress_finding_key">Schlüssel wird gesucht...</string> - <string name="progress_decompressing_data">Daten werden entpackt...</string> - <string name="progress_verifying_integrity">Integrität wird überprüft...</string> - <string name="progress_deleting_securely">\'%s\' wird sicher gelöscht...</string> - <string name="progress_querying">Anfrage wird gestellt...</string> + <string name="progress_extracting_signature_key">extrahiere Signaturschlüssel…</string> + <string name="progress_extracting_key">extrahiere Schlüssel…</string> + <string name="progress_preparing_streams">Datenstrom wird vorbereitet…</string> + <string name="progress_encrypting">Daten werden verschlüsselt…</string> + <string name="progress_decrypting">Daten werden entschlüsselt…</string> + <string name="progress_preparing_signature">Signatur wird vorbereitet…</string> + <string name="progress_generating_signature">Signatur wird erstellt…</string> + <string name="progress_processing_signature">Signatur wird verarbeitet…</string> + <string name="progress_verifying_signature">Signatur wird verifiziert…</string> + <string name="progress_signing">signiere…</string> + <string name="progress_reading_data">Daten werden gelesen…</string> + <string name="progress_finding_key">Schlüssel wird gesucht…</string> + <string name="progress_decompressing_data">Daten werden entpackt…</string> + <string name="progress_verifying_integrity">Integrität wird überprüft…</string> + <string name="progress_deleting_securely">\'%s\' wird sicher gelöscht…</string> + <string name="progress_querying">Anfrage wird gestellt…</string> <!--action strings--> <string name="hint_public_keys">Öffentliche Schlüssel suchen</string> <string name="hint_secret_keys">Private Schlüssel suchen</string> - <string name="action_share_key_with">Teile Schlüssel über...</string> + <string name="action_share_key_with">Teile Schlüssel über…</string> <!--key bit length selections--> <string name="key_size_512">512</string> <string name="key_size_1024">1024</string> @@ -337,10 +338,6 @@ <string name="import_nfc_help_button">Hilfe</string> <string name="import_clipboard_button">Füge den Schlüssel aus der Zwischenablage ein</string> <!--Intent labels--> - <string name="intent_decrypt_file">OpenKeychain: Datei entschlüsseln</string> - <string name="intent_import_key">OpenKeychain: Schlüssel importieren</string> - <string name="intent_send_encrypt">OpenKeychain: Verschlüsseln</string> - <string name="intent_send_decrypt">OpenKeychain: Entschlüsseln</string> <!--Remote API--> <string name="api_no_apps">Keine registrierten Anwendungen vorhanden!\n\nAnwendungen von Dritten können Zugriff auf OpenKeychain erbitten. Nachdem Zugriff gewährt wurde, werden diese hier aufgelistet.</string> <string name="api_settings_show_advanced">Erweiterte Einstellungen anzeigen</string> diff --git a/OpenPGP-Keychain/src/main/res/values-es-rCO/strings.xml b/OpenPGP-Keychain/src/main/res/values-es-rCO/strings.xml index 6efe9548d..e43cecc2c 100644 --- a/OpenPGP-Keychain/src/main/res/values-es-rCO/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-es-rCO/strings.xml @@ -12,7 +12,7 @@ <string name="title_api_registered_apps">Aplicaciones registradas</string> <string name="title_change_pass_phrase">Cambiar contraseña</string> <string name="title_set_passphrase">Establecer contraseña</string> - <string name="title_send_email">Enviar correo electrónico...</string> + <string name="title_send_email">Enviar correo electrónico…</string> <string name="title_encrypt_to_file">Cifrar a archivo</string> <string name="title_decrypt_to_file">Descifrar a archivo</string> <string name="title_import_keys">Importar claves</string> diff --git a/OpenPGP-Keychain/src/main/res/values-es/strings.xml b/OpenPGP-Keychain/src/main/res/values-es/strings.xml index 48ea6cc69..edf190184 100644 --- a/OpenPGP-Keychain/src/main/res/values-es/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-es/strings.xml @@ -15,7 +15,7 @@ <string name="title_key_server_preference">Prioridad del servidor de claves</string> <string name="title_change_pass_phrase">Cambiar la frase de contraseña</string> <string name="title_set_passphrase">Establecer frase de contraseña</string> - <string name="title_send_email">Enviar email...</string> + <string name="title_send_email">Enviar email…</string> <string name="title_encrypt_to_file">Cifrar hacia archivo</string> <string name="title_decrypt_to_file">Descifrar hacia archivo</string> <string name="title_import_keys">Importar claves</string> @@ -61,7 +61,7 @@ <string name="btn_next">Siguiente</string> <string name="btn_back">Volver</string> <string name="btn_clipboard">Portapapeles</string> - <string name="btn_share">Compartir con...</string> + <string name="btn_share">Compartir con…</string> <string name="btn_lookup_key">Buscar clave</string> <!--menu--> <string name="menu_preferences">Ajustes</string> @@ -80,10 +80,10 @@ <string name="menu_update_key">Actualizar desde servidor de claves</string> <string name="menu_export_key_to_server">Cargar al servidor de claves</string> <string name="menu_share">Compartir</string> - <string name="menu_share_title_fingerprint">Compartir la huella digital...</string> - <string name="menu_share_title">Compartir la clave completa...</string> - <string name="menu_share_default_fingerprint">con...</string> - <string name="menu_share_default">con...</string> + <string name="menu_share_title_fingerprint">Compartir la huella digital…</string> + <string name="menu_share_title">Compartir la clave completa…</string> + <string name="menu_share_default_fingerprint">con…</string> + <string name="menu_share_default">con…</string> <string name="menu_share_qr_code">con código QR</string> <string name="menu_share_qr_code_fingerprint">con código QR</string> <string name="menu_share_nfc">con NFC</string> @@ -91,7 +91,7 @@ <string name="menu_sign_key"> Clave de firma</string> <string name="menu_beam_preferences">Ajustes de Beam</string> <string name="menu_key_edit_cancel">Cancelar</string> - <string name="menu_encrypt_to">Cifrar hacia...</string> + <string name="menu_encrypt_to">Cifrar hacia…</string> <!--label--> <string name="label_sign">Firmar</string> <string name="label_message">Mensaje</string> @@ -163,7 +163,7 @@ <string name="dsa">DSA</string> <string name="elgamal">ElGamal</string> <string name="rsa">RSA</string> - <string name="filemanager_title_open">Abrir...</string> + <string name="filemanager_title_open">Abrir…</string> <string name="warning">Advertencia</string> <string name="error">Error</string> <string name="error_message">Error: %s</string> @@ -266,46 +266,49 @@ <string name="error_expiry_must_come_after_creation">la fecha de caducidad debe ser posterior a la fecha de creación</string> <string name="error_can_not_delete_contact">no puedes eliminar este contacto porque eres tú mismo.</string> <string name="error_can_not_delete_contacts">no puedes eliminar los siguientes contactos porque son tú mismo:\n%s</string> + <string name="error_keyserver_insufficient_query">Consulta al servidor insuficiente</string> + <string name="error_keyserver_query">La consulta al servidor de claves ha fallado</string> + <string name="error_keyserver_too_many_responses">Demasiadas respuestas</string> <plurals name="error_can_not_delete_info"> <item quantity="one">Por favor, bórralo desde la pantalla \'Mis claves\'!</item> <item quantity="other">Por favor, bórralos desde la pantalla \'Mis claves\'!</item> </plurals> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">hecho.</string> - <string name="progress_saving">guardando...</string> - <string name="progress_importing">importando...</string> - <string name="progress_exporting">exportando...</string> - <string name="progress_generating">generando la clave, esto puede tardar más de 3 minutos...</string> - <string name="progress_building_key">construyendo la clave...</string> - <string name="progress_preparing_master_key">preparando la clave maestra...</string> - <string name="progress_certifying_master_key">certificando la clave maestra...</string> - <string name="progress_building_master_key">construyendo el anillo maestro...</string> - <string name="progress_adding_sub_keys">añadiendo las subclaves...</string> - <string name="progress_saving_key_ring">guardando claves...</string> + <string name="progress_saving">guardando…</string> + <string name="progress_importing">importando…</string> + <string name="progress_exporting">exportando…</string> + <string name="progress_generating">generando la clave, esto puede tardar más de 3 minutos…</string> + <string name="progress_building_key">construyendo la clave…</string> + <string name="progress_preparing_master_key">preparando la clave maestra…</string> + <string name="progress_certifying_master_key">certificando la clave maestra…</string> + <string name="progress_building_master_key">construyendo el anillo maestro…</string> + <string name="progress_adding_sub_keys">añadiendo las subclaves…</string> + <string name="progress_saving_key_ring">guardando claves…</string> <plurals name="progress_exporting_key"> - <item quantity="one">exportando clave...</item> - <item quantity="other">exportando claves...</item> + <item quantity="one">exportando clave…</item> + <item quantity="other">exportando claves…</item> </plurals> - <string name="progress_extracting_signature_key">extrayendo la clave de firma...</string> - <string name="progress_extracting_key">extrayendo la clave...</string> - <string name="progress_preparing_streams">preparando las transmisiones...</string> - <string name="progress_encrypting">cifrando los datos...</string> - <string name="progress_decrypting">descifrando los datos...</string> - <string name="progress_preparing_signature">preparando la firma...</string> - <string name="progress_generating_signature">generando la firma...</string> - <string name="progress_processing_signature">procesando la firma...</string> - <string name="progress_verifying_signature">verificando la firma...</string> - <string name="progress_signing">firmando...</string> - <string name="progress_reading_data">leyendo los datos...</string> - <string name="progress_finding_key">localizando la clave...</string> - <string name="progress_decompressing_data">descomprimiendo los datos...</string> - <string name="progress_verifying_integrity">verificando la integridad...</string> + <string name="progress_extracting_signature_key">extrayendo la clave de firma…</string> + <string name="progress_extracting_key">extrayendo la clave…</string> + <string name="progress_preparing_streams">preparando las transmisiones…</string> + <string name="progress_encrypting">cifrando los datos…</string> + <string name="progress_decrypting">descifrando los datos…</string> + <string name="progress_preparing_signature">preparando la firma…</string> + <string name="progress_generating_signature">generando la firma…</string> + <string name="progress_processing_signature">procesando la firma…</string> + <string name="progress_verifying_signature">verificando la firma…</string> + <string name="progress_signing">firmando…</string> + <string name="progress_reading_data">leyendo los datos…</string> + <string name="progress_finding_key">localizando la clave…</string> + <string name="progress_decompressing_data">descomprimiendo los datos…</string> + <string name="progress_verifying_integrity">verificando la integridad…</string> <string name="progress_deleting_securely">borrando \'%s\' de forma segura…</string> - <string name="progress_querying">consultando...</string> + <string name="progress_querying">consultando…</string> <!--action strings--> <string name="hint_public_keys">Buscar claves públicas</string> <string name="hint_secret_keys">Buscar claves secretas</string> - <string name="action_share_key_with">Compartir la clave con...</string> + <string name="action_share_key_with">Compartir la clave con…</string> <!--key bit length selections--> <string name="key_size_512">512</string> <string name="key_size_1024">1024</string> @@ -337,10 +340,10 @@ <string name="import_nfc_help_button">Ayuda</string> <string name="import_clipboard_button">Tomar la clave desde el portapapeles</string> <!--Intent labels--> - <string name="intent_decrypt_file">OpenKeychain: Descifrar archivo</string> - <string name="intent_import_key">OpenKeychain: Importar clave</string> - <string name="intent_send_encrypt">OpenKeychain: Cifrar</string> - <string name="intent_send_decrypt">OpenKeychain: Descifrar</string> + <string name="intent_decrypt_file">Descifrar archivo con OpenKeychain</string> + <string name="intent_import_key">Importar clave con OpenKeychain</string> + <string name="intent_send_encrypt">Cifrar con OpenKeychain</string> + <string name="intent_send_decrypt">Descifrar con OpenKeychain</string> <!--Remote API--> <string name="api_no_apps">¡No hay aplicaciones registradas!\n\nLas aplicaciones de terceros pueden pedir permiso de acceso a OpenKeychain. Después de obtener acceso, serán enumeradas aquí.</string> <string name="api_settings_show_advanced">Mostrar la configuración avanzada</string> @@ -371,7 +374,7 @@ <item quantity="one">1 clave seleccionada.</item> <item quantity="other">%d claves seleccionadas.</item> </plurals> - <string name="key_list_empty_text1">Aún no hay claves disponibles...</string> + <string name="key_list_empty_text1">Aún no hay claves disponibles…</string> <string name="key_list_empty_text2">Puedes empezar por</string> <string name="key_list_empty_text3">o</string> <string name="key_list_empty_button_create">crear tu propia clave</string> diff --git a/OpenPGP-Keychain/src/main/res/values-fr/strings.xml b/OpenPGP-Keychain/src/main/res/values-fr/strings.xml index bf66756cf..171ce1fa5 100644 --- a/OpenPGP-Keychain/src/main/res/values-fr/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-fr/strings.xml @@ -15,7 +15,7 @@ <string name="title_key_server_preference">Préférences du serveur de clefs</string> <string name="title_change_pass_phrase">Changer la phrase de passe</string> <string name="title_set_passphrase">Définir la phrase de passe</string> - <string name="title_send_email">Envoyer un courriel...</string> + <string name="title_send_email">Envoyer un courriel…</string> <string name="title_encrypt_to_file">Chiffrer vers un fichier</string> <string name="title_decrypt_to_file">Déchiffrer vers un fichier</string> <string name="title_import_keys">importer des clefs</string> @@ -61,7 +61,7 @@ <string name="btn_next">Suivant</string> <string name="btn_back">Retour</string> <string name="btn_clipboard">Presse-papiers</string> - <string name="btn_share">Partager avec...</string> + <string name="btn_share">Partager avec…</string> <string name="btn_lookup_key">Rechercher la clef</string> <!--menu--> <string name="menu_preferences">Paramètres</string> @@ -80,10 +80,10 @@ <string name="menu_update_key">Mettre à jour depuis le serveur de clefs</string> <string name="menu_export_key_to_server">Téléverser vers le serveur de clefs</string> <string name="menu_share">Partager</string> - <string name="menu_share_title_fingerprint">Partager l\'empreinte...</string> - <string name="menu_share_title">Partager la clef entière...</string> - <string name="menu_share_default_fingerprint">avec...</string> - <string name="menu_share_default">avec...</string> + <string name="menu_share_title_fingerprint">Partager l\'empreinte…</string> + <string name="menu_share_title">Partager la clef entière…</string> + <string name="menu_share_default_fingerprint">avec…</string> + <string name="menu_share_default">avec…</string> <string name="menu_share_qr_code">par un code QR</string> <string name="menu_share_qr_code_fingerprint">par un code QR</string> <string name="menu_share_nfc">par la NFC</string> @@ -91,7 +91,7 @@ <string name="menu_sign_key">Signer la clef</string> <string name="menu_beam_preferences">Paramètres Beam</string> <string name="menu_key_edit_cancel">Annuler</string> - <string name="menu_encrypt_to">Chiffrer vers...</string> + <string name="menu_encrypt_to">Chiffrer vers…</string> <!--label--> <string name="label_sign">Signer</string> <string name="label_message">Message</string> @@ -163,7 +163,7 @@ <string name="dsa">DSA</string> <string name="elgamal">ElGamal</string> <string name="rsa">RSA</string> - <string name="filemanager_title_open">Ouvrir...</string> + <string name="filemanager_title_open">Ouvrir…</string> <string name="warning">Avertissement</string> <string name="error">Erreur</string> <string name="error_message">Erreur : %s</string> @@ -275,40 +275,40 @@ </plurals> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">fait.</string> - <string name="progress_saving">sauvegarde...</string> - <string name="progress_importing">importation...</string> - <string name="progress_exporting">exportation...</string> - <string name="progress_generating">génération de la clef, ceci peut prendre jusqu\'à 3 minutes...</string> - <string name="progress_building_key">assemblage de la clef...</string> - <string name="progress_preparing_master_key">préparation de la clef maîtresse...</string> - <string name="progress_certifying_master_key">certification de la clef maîtresse...</string> - <string name="progress_building_master_key">assemblage du trousseau maître...</string> - <string name="progress_adding_sub_keys">ajout des sous-clefs...</string> - <string name="progress_saving_key_ring">sauvegarde de la clef...</string> + <string name="progress_saving">sauvegarde…</string> + <string name="progress_importing">importation…</string> + <string name="progress_exporting">exportation…</string> + <string name="progress_generating">génération de la clef, ceci peut prendre jusqu\'à 3 minutes…</string> + <string name="progress_building_key">assemblage de la clef…</string> + <string name="progress_preparing_master_key">préparation de la clef maîtresse…</string> + <string name="progress_certifying_master_key">certification de la clef maîtresse…</string> + <string name="progress_building_master_key">assemblage du trousseau maître…</string> + <string name="progress_adding_sub_keys">ajout des sous-clefs…</string> + <string name="progress_saving_key_ring">sauvegarde de la clef…</string> <plurals name="progress_exporting_key"> - <item quantity="one">exportation de la clef...</item> - <item quantity="other">exportation des clefs...</item> + <item quantity="one">exportation de la clef…</item> + <item quantity="other">exportation des clefs…</item> </plurals> - <string name="progress_extracting_signature_key">extraction de la clef de signature...</string> - <string name="progress_extracting_key">extraction de la clef...</string> - <string name="progress_preparing_streams">préparation des flux...</string> - <string name="progress_encrypting">chiffrement des données...</string> - <string name="progress_decrypting">déchiffrement des données...</string> - <string name="progress_preparing_signature">préparation de la signature...</string> - <string name="progress_generating_signature">génération de la signature...</string> - <string name="progress_processing_signature">traitement de la signature...</string> - <string name="progress_verifying_signature">vérification de la signature...</string> - <string name="progress_signing">signature...</string> - <string name="progress_reading_data">lecture des données...</string> - <string name="progress_finding_key">recherche de la clef...</string> - <string name="progress_decompressing_data">décompression des données...</string> - <string name="progress_verifying_integrity">vérification de l\'intégrité...</string> - <string name="progress_deleting_securely">suppression sûre de « %s »...</string> - <string name="progress_querying">interrogation...</string> + <string name="progress_extracting_signature_key">extraction de la clef de signature…</string> + <string name="progress_extracting_key">extraction de la clef…</string> + <string name="progress_preparing_streams">préparation des flux…</string> + <string name="progress_encrypting">chiffrement des données…</string> + <string name="progress_decrypting">déchiffrement des données…</string> + <string name="progress_preparing_signature">préparation de la signature…</string> + <string name="progress_generating_signature">génération de la signature…</string> + <string name="progress_processing_signature">traitement de la signature…</string> + <string name="progress_verifying_signature">vérification de la signature…</string> + <string name="progress_signing">signature…</string> + <string name="progress_reading_data">lecture des données…</string> + <string name="progress_finding_key">recherche de la clef…</string> + <string name="progress_decompressing_data">décompression des données…</string> + <string name="progress_verifying_integrity">vérification de l\'intégrité…</string> + <string name="progress_deleting_securely">suppression sûre de « %s »…</string> + <string name="progress_querying">interrogation…</string> <!--action strings--> <string name="hint_public_keys">Rechercher des clefs publiques</string> <string name="hint_secret_keys">Rechercher des clefs secrètes</string> - <string name="action_share_key_with">Partager la clef avec...</string> + <string name="action_share_key_with">Partager la clef avec…</string> <!--key bit length selections--> <string name="key_size_512">512</string> <string name="key_size_1024">1024</string> @@ -340,10 +340,10 @@ <string name="import_nfc_help_button">Aide</string> <string name="import_clipboard_button">Obtenir la clef depuis le presse-papiers</string> <!--Intent labels--> - <string name="intent_decrypt_file">OpenKeychain : déchiffrer le ficher</string> - <string name="intent_import_key">OpenKeychain : importer la clef</string> - <string name="intent_send_encrypt">OpenKeychain : chiffrer</string> - <string name="intent_send_decrypt">OpenKeychain : déchiffrer</string> + <string name="intent_decrypt_file">Déchiffrer le fichier avec OpenKeychain</string> + <string name="intent_import_key">Importer la clef avec OpenKeychain</string> + <string name="intent_send_encrypt">Chiffrer avec OpenKeychain</string> + <string name="intent_send_decrypt">Déchiffrer avec OpenKeychain</string> <!--Remote API--> <string name="api_no_apps">Aucune application enregistrée !\n\nLes applications tierces peuvent demander l\'accès à OpenKeychain. Après avoir autorisé l\'accès, elles seront listées ici.</string> <string name="api_settings_show_advanced">Afficher les paramètres avancés</string> @@ -374,7 +374,7 @@ <item quantity="one">1 clef choisie</item> <item quantity="other">%d clefs choisies</item> </plurals> - <string name="key_list_empty_text1">Aucune clef encore disponible...</string> + <string name="key_list_empty_text1">Aucune clef encore disponible…</string> <string name="key_list_empty_text2">Vous pouvez commencer par</string> <string name="key_list_empty_text3">ou</string> <string name="key_list_empty_button_create">créer votre propre clef</string> diff --git a/OpenPGP-Keychain/src/main/res/values-it-rIT/strings.xml b/OpenPGP-Keychain/src/main/res/values-it-rIT/strings.xml index 86a094c41..5ceb4f45b 100644 --- a/OpenPGP-Keychain/src/main/res/values-it-rIT/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-it-rIT/strings.xml @@ -15,7 +15,7 @@ <string name="title_key_server_preference">Preferenze Server delle Chiavi</string> <string name="title_change_pass_phrase">Cambia Frase di Accesso</string> <string name="title_set_passphrase">Imposta Frase di Accesso</string> - <string name="title_send_email">Invia Mail...</string> + <string name="title_send_email">Invia Mail…</string> <string name="title_encrypt_to_file">Codifica File</string> <string name="title_decrypt_to_file">Decodifica File</string> <string name="title_import_keys">Importa Chiavi</string> @@ -61,7 +61,7 @@ <string name="btn_next">Prossimo</string> <string name="btn_back">Precedente</string> <string name="btn_clipboard">Appunti</string> - <string name="btn_share">Condividi con...</string> + <string name="btn_share">Condividi con…</string> <string name="btn_lookup_key">Chiave di ricerca</string> <!--menu--> <string name="menu_preferences">Impostazioni</string> @@ -80,10 +80,10 @@ <string name="menu_update_key">Aggiorna dal server delle chiavi</string> <string name="menu_export_key_to_server">Carica chiave nel server</string> <string name="menu_share">Condividi</string> - <string name="menu_share_title_fingerprint">Condivi impronta...</string> - <string name="menu_share_title">Condividi intera chiave...</string> + <string name="menu_share_title_fingerprint">Condivi impronta…</string> + <string name="menu_share_title">Condividi intera chiave…</string> <string name="menu_share_default_fingerprint">con..</string> - <string name="menu_share_default">con...</string> + <string name="menu_share_default">con…</string> <string name="menu_share_qr_code">con Codice QR</string> <string name="menu_share_qr_code_fingerprint">con Codice QR</string> <string name="menu_share_nfc">con NFC</string> @@ -91,7 +91,7 @@ <string name="menu_sign_key">Firma chiave</string> <string name="menu_beam_preferences">Impostazioni Beam</string> <string name="menu_key_edit_cancel">Annulla</string> - <string name="menu_encrypt_to">Codifica su...</string> + <string name="menu_encrypt_to">Codifica su…</string> <!--label--> <string name="label_sign">Firma</string> <string name="label_message">Messaggio</string> @@ -163,7 +163,7 @@ <string name="dsa">DSA</string> <string name="elgamal">ElGamal</string> <string name="rsa">RSA</string> - <string name="filemanager_title_open">Apri...</string> + <string name="filemanager_title_open">Apri…</string> <string name="warning">Attenzione</string> <string name="error">Errore</string> <string name="error_message">Errore: %s</string> @@ -275,40 +275,40 @@ </plurals> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">fatto.</string> - <string name="progress_saving">salvataggio...</string> - <string name="progress_importing">importazione...</string> - <string name="progress_exporting">esportazione...</string> - <string name="progress_generating">generazione chiave, richiede fino a 3 minuti...</string> - <string name="progress_building_key">fabbricazione chiave...</string> - <string name="progress_preparing_master_key">preparazione chiave principale...</string> - <string name="progress_certifying_master_key">certificazione chiave principale...</string> - <string name="progress_building_master_key">fabbricazione portachiavi principale...</string> - <string name="progress_adding_sub_keys">aggiunta sottochiavi...</string> - <string name="progress_saving_key_ring">salvataggio chiavi...</string> + <string name="progress_saving">salvataggio…</string> + <string name="progress_importing">importazione…</string> + <string name="progress_exporting">esportazione…</string> + <string name="progress_generating">generazione chiave, richiede fino a 3 minuti…</string> + <string name="progress_building_key">fabbricazione chiave…</string> + <string name="progress_preparing_master_key">preparazione chiave principale…</string> + <string name="progress_certifying_master_key">certificazione chiave principale…</string> + <string name="progress_building_master_key">fabbricazione portachiavi principale…</string> + <string name="progress_adding_sub_keys">aggiunta sottochiavi…</string> + <string name="progress_saving_key_ring">salvataggio chiavi…</string> <plurals name="progress_exporting_key"> - <item quantity="one">esportazione chiave...</item> - <item quantity="other">esportazione chiavi...</item> + <item quantity="one">esportazione chiave…</item> + <item quantity="other">esportazione chiavi…</item> </plurals> - <string name="progress_extracting_signature_key">estrazione chiavi di firma...</string> - <string name="progress_extracting_key">estrazione chiave...</string> - <string name="progress_preparing_streams">preparazione flussi...</string> - <string name="progress_encrypting">codifica dati...</string> - <string name="progress_decrypting">decodifica dati...</string> - <string name="progress_preparing_signature">preparazione firma...</string> - <string name="progress_generating_signature">generazione firma...</string> - <string name="progress_processing_signature">elaborazione firma...</string> - <string name="progress_verifying_signature">verifica firma...</string> - <string name="progress_signing">firma...</string> - <string name="progress_reading_data">lettura dati...</string> - <string name="progress_finding_key">ricerca chiave...</string> - <string name="progress_decompressing_data">decompressione dati...</string> - <string name="progress_verifying_integrity">verifica integrita\'...</string> - <string name="progress_deleting_securely">eliminazione sicura di \'%s\'...</string> - <string name="progress_querying">interrogazione...</string> + <string name="progress_extracting_signature_key">estrazione chiavi di firma…</string> + <string name="progress_extracting_key">estrazione chiave…</string> + <string name="progress_preparing_streams">preparazione flussi…</string> + <string name="progress_encrypting">codifica dati…</string> + <string name="progress_decrypting">decodifica dati…</string> + <string name="progress_preparing_signature">preparazione firma…</string> + <string name="progress_generating_signature">generazione firma…</string> + <string name="progress_processing_signature">elaborazione firma…</string> + <string name="progress_verifying_signature">verifica firma…</string> + <string name="progress_signing">firma…</string> + <string name="progress_reading_data">lettura dati…</string> + <string name="progress_finding_key">ricerca chiave…</string> + <string name="progress_decompressing_data">decompressione dati…</string> + <string name="progress_verifying_integrity">verifica integrita\'…</string> + <string name="progress_deleting_securely">eliminazione sicura di \'%s\'…</string> + <string name="progress_querying">interrogazione…</string> <!--action strings--> <string name="hint_public_keys">Ricerca Chiavi Pubbliche</string> <string name="hint_secret_keys">Cerca Chiave Privata</string> - <string name="action_share_key_with">Condividi chiave con...</string> + <string name="action_share_key_with">Condividi chiave con…</string> <!--key bit length selections--> <string name="key_size_512">512</string> <string name="key_size_1024">1024</string> @@ -340,10 +340,10 @@ <string name="import_nfc_help_button">Aiuto</string> <string name="import_clipboard_button">Ottieni chiave dagli appunti</string> <!--Intent labels--> - <string name="intent_decrypt_file">OpenKeyChain: Decodifica File</string> - <string name="intent_import_key">OpenKeyChain: Importa Chiave</string> - <string name="intent_send_encrypt">OpenKeychain: Codifica</string> - <string name="intent_send_decrypt">OpenKeychain: Decodifica</string> + <string name="intent_decrypt_file">Decodifica File con OpenKeychain</string> + <string name="intent_import_key">Importa Chiave con OpenKeychain</string> + <string name="intent_send_encrypt">Codifica con OpenKeychain</string> + <string name="intent_send_decrypt">Decodifica con OpenKeychain</string> <!--Remote API--> <string name="api_no_apps">Nessuna app registrata!\n\nApp di terza parti possono richiedere accesso a OpenKeychain. Dopo aver concesso l\'accesso, saranno elencate qui.</string> <string name="api_settings_show_advanced">Mostra impostazioni avanzate</string> @@ -374,7 +374,7 @@ <item quantity="one">1 chiave selezionata.</item> <item quantity="other">%d chiavi selezionate.</item> </plurals> - <string name="key_list_empty_text1">Nessuna chiave disponibile...</string> + <string name="key_list_empty_text1">Nessuna chiave disponibile…</string> <string name="key_list_empty_text2">Puoi iniziare da</string> <string name="key_list_empty_text3">o</string> <string name="key_list_empty_button_create">creazione della tua chiave</string> diff --git a/OpenPGP-Keychain/src/main/res/values-ja/strings.xml b/OpenPGP-Keychain/src/main/res/values-ja/strings.xml index c99f8b31c..0ba511c1e 100644 --- a/OpenPGP-Keychain/src/main/res/values-ja/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-ja/strings.xml @@ -15,7 +15,7 @@ <string name="title_key_server_preference">鍵サーバ設定</string> <string name="title_change_pass_phrase">パスフレーズの変更</string> <string name="title_set_passphrase">パスフレーズの設定</string> - <string name="title_send_email">メールの送信...</string> + <string name="title_send_email">メールの送信…</string> <string name="title_encrypt_to_file">暗号化してファイルに</string> <string name="title_decrypt_to_file">復号化してファイルに</string> <string name="title_import_keys">鍵のインポート</string> @@ -61,7 +61,7 @@ <string name="btn_next">次</string> <string name="btn_back">戻る</string> <string name="btn_clipboard">クリップボード</string> - <string name="btn_share">共有...</string> + <string name="btn_share">共有…</string> <string name="btn_lookup_key">鍵検出</string> <!--menu--> <string name="menu_preferences">設定</string> @@ -80,10 +80,10 @@ <string name="menu_update_key">鍵サーバからの更新</string> <string name="menu_export_key_to_server">鍵サーバへのアップロード</string> <string name="menu_share">共有</string> - <string name="menu_share_title_fingerprint">指紋の共有...</string> - <string name="menu_share_title">すべての鍵の共有...</string> - <string name="menu_share_default_fingerprint">...(指紋)</string> - <string name="menu_share_default">...(鍵)</string> + <string name="menu_share_title_fingerprint">指紋の共有…</string> + <string name="menu_share_title">すべての鍵の共有…</string> + <string name="menu_share_default_fingerprint">…(指紋)</string> + <string name="menu_share_default">…(鍵)</string> <string name="menu_share_qr_code">QRコードで共有(鍵)</string> <string name="menu_share_qr_code_fingerprint">QRコードで共有(指紋)</string> <string name="menu_share_nfc">NFCで共有</string> @@ -91,7 +91,7 @@ <string name="menu_sign_key">鍵を署名</string> <string name="menu_beam_preferences">Beamの設定</string> <string name="menu_key_edit_cancel">キャンセル</string> - <string name="menu_encrypt_to">暗号化...</string> + <string name="menu_encrypt_to">暗号化…</string> <!--label--> <string name="label_sign">署名</string> <string name="label_message">メッセージ</string> @@ -161,7 +161,7 @@ <string name="dsa">DSA</string> <string name="elgamal">ElGamal</string> <string name="rsa">RSA</string> - <string name="filemanager_title_open">開く...</string> + <string name="filemanager_title_open">開く…</string> <string name="warning">注意</string> <string name="error">エラー</string> <string name="error_message">エラー: %s</string> @@ -266,39 +266,39 @@ </plurals> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">完了。</string> - <string name="progress_saving">保存...</string> - <string name="progress_importing">インポート...</string> - <string name="progress_exporting">エクスポート...</string> - <string name="progress_generating">鍵の生成、3分ほどかかります...</string> - <string name="progress_building_key">鍵の構築中...</string> - <string name="progress_preparing_master_key">主鍵の準備中...</string> - <string name="progress_certifying_master_key">主鍵の検証中...</string> - <string name="progress_building_master_key">主鍵輪の構築中...</string> - <string name="progress_adding_sub_keys">副鍵の追加中...</string> - <string name="progress_saving_key_ring">鍵の保存...</string> + <string name="progress_saving">保存…</string> + <string name="progress_importing">インポート…</string> + <string name="progress_exporting">エクスポート…</string> + <string name="progress_generating">鍵の生成、3分ほどかかります…</string> + <string name="progress_building_key">鍵の構築中…</string> + <string name="progress_preparing_master_key">主鍵の準備中…</string> + <string name="progress_certifying_master_key">主鍵の検証中…</string> + <string name="progress_building_master_key">主鍵輪の構築中…</string> + <string name="progress_adding_sub_keys">副鍵の追加中…</string> + <string name="progress_saving_key_ring">鍵の保存…</string> <plurals name="progress_exporting_key"> - <item quantity="other">鍵のエクスポート...</item> + <item quantity="other">鍵のエクスポート…</item> </plurals> - <string name="progress_extracting_signature_key">署名鍵の取り出し中...</string> - <string name="progress_extracting_key">鍵の取り出し中...</string> - <string name="progress_preparing_streams">ストリームの準備中...</string> - <string name="progress_encrypting">データの暗号化中...</string> - <string name="progress_decrypting">データの復号化中...</string> - <string name="progress_preparing_signature">署名の準備中...</string> - <string name="progress_generating_signature">署名の生成中...</string> - <string name="progress_processing_signature">署名処理中...</string> - <string name="progress_verifying_signature">署名の検証中...</string> - <string name="progress_signing">署名中...</string> - <string name="progress_reading_data">データ読み込み中...</string> - <string name="progress_finding_key">鍵検索中...</string> - <string name="progress_decompressing_data">データの展開中...</string> - <string name="progress_verifying_integrity">完全性の検証中...</string> + <string name="progress_extracting_signature_key">署名鍵の取り出し中…</string> + <string name="progress_extracting_key">鍵の取り出し中…</string> + <string name="progress_preparing_streams">ストリームの準備中…</string> + <string name="progress_encrypting">データの暗号化中…</string> + <string name="progress_decrypting">データの復号化中…</string> + <string name="progress_preparing_signature">署名の準備中…</string> + <string name="progress_generating_signature">署名の生成中…</string> + <string name="progress_processing_signature">署名処理中…</string> + <string name="progress_verifying_signature">署名の検証中…</string> + <string name="progress_signing">署名中…</string> + <string name="progress_reading_data">データ読み込み中…</string> + <string name="progress_finding_key">鍵検索中…</string> + <string name="progress_decompressing_data">データの展開中…</string> + <string name="progress_verifying_integrity">完全性の検証中…</string> <string name="progress_deleting_securely">\'%s\' を完全に削除中…</string> - <string name="progress_querying">要求中...</string> + <string name="progress_querying">要求中…</string> <!--action strings--> <string name="hint_public_keys">公開鍵の検索</string> <string name="hint_secret_keys">秘密鍵の検索</string> - <string name="action_share_key_with">鍵の共有...</string> + <string name="action_share_key_with">鍵の共有…</string> <!--key bit length selections--> <string name="key_size_512">512</string> <string name="key_size_1024">1024</string> @@ -329,10 +329,10 @@ <string name="import_nfc_help_button">ヘルプ</string> <string name="import_clipboard_button">クリップボードから鍵を取得</string> <!--Intent labels--> - <string name="intent_decrypt_file">OpenKeychain: ファイル復号化</string> - <string name="intent_import_key">OpenKeychain: 鍵のインポート</string> - <string name="intent_send_encrypt">OpenKeychain: 暗号化</string> - <string name="intent_send_decrypt">OpenKeychain: 復号化</string> + <string name="intent_decrypt_file">OpenKeychainでファイルを復号化</string> + <string name="intent_import_key">OpenKeychainに鍵をインポート</string> + <string name="intent_send_encrypt">OpenKeychainで暗号化</string> + <string name="intent_send_decrypt">OpenKeychainで復号化</string> <!--Remote API--> <string name="api_no_apps">登録されていないアプリケーション!\n\nサードパーティアプリケーションはOpenKeychainにアクセスを要求できます。アクセスを与えた後、それらはここにリストされます。</string> <string name="api_settings_show_advanced">拡張設定を表示</string> @@ -362,7 +362,7 @@ <plurals name="key_list_selected_keys"> <item quantity="other">%d の鍵を選択。</item> </plurals> - <string name="key_list_empty_text1">すでにその鍵は存在しません...</string> + <string name="key_list_empty_text1">すでにその鍵は存在しません…</string> <string name="key_list_empty_text2">で始める</string> <string name="key_list_empty_text3">もしくは</string> <string name="key_list_empty_button_create">あなた所有の鍵を作る</string> diff --git a/OpenPGP-Keychain/src/main/res/values-nl-rNL/strings.xml b/OpenPGP-Keychain/src/main/res/values-nl-rNL/strings.xml index 7d7efa616..35a0b5a03 100644 --- a/OpenPGP-Keychain/src/main/res/values-nl-rNL/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-nl-rNL/strings.xml @@ -12,7 +12,7 @@ <string name="title_api_registered_apps">Geregistreerde apps</string> <string name="title_change_pass_phrase">Wachtwoord wijzigen</string> <string name="title_set_passphrase">Wachtwoord instellen</string> - <string name="title_send_email">E-mail verzenden...</string> + <string name="title_send_email">E-mail verzenden…</string> <string name="title_encrypt_to_file">Versleutelen naar bestand</string> <string name="title_decrypt_to_file">Ontsleutelen naar bestand</string> <string name="title_import_keys">Sleutels importeren</string> @@ -109,7 +109,7 @@ <string name="dsa">DSA</string> <string name="elgamal">ElGamal</string> <string name="rsa">RSA</string> - <string name="filemanager_title_open">Openen...</string> + <string name="filemanager_title_open">Openen…</string> <string name="warning">Waarschuwing</string> <string name="error">Fout</string> <string name="error_message">Fout: %s</string> @@ -172,34 +172,34 @@ <string name="error_nothing_import">Niets te importeren</string> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">gereed.</string> - <string name="progress_saving">opslaan...</string> - <string name="progress_importing">importeren...</string> - <string name="progress_exporting">exporteren...</string> - <string name="progress_building_key">sleutel maken...</string> - <string name="progress_preparing_master_key">hoofdsleutel voorbereiden...</string> - <string name="progress_certifying_master_key">hoofdsleutel certificeren...</string> - <string name="progress_building_master_key">hoofdsleutelbos maken...</string> - <string name="progress_adding_sub_keys">sub-sleutels toevoegen...</string> - <string name="progress_extracting_signature_key">ondertekeningssleutel uitpakken...</string> - <string name="progress_extracting_key">sleutel uitpakken...</string> - <string name="progress_preparing_streams">streams voorbereiden...</string> - <string name="progress_encrypting">gegevens versleutelen...</string> - <string name="progress_decrypting">gegevens ontsleutelen...</string> - <string name="progress_preparing_signature">handtekening voorbereiden...</string> - <string name="progress_generating_signature">handtekening genereren...</string> - <string name="progress_processing_signature">handtekening verwerken...</string> - <string name="progress_verifying_signature">handtekening verifiëren...</string> - <string name="progress_signing">ondertekenen...</string> - <string name="progress_reading_data">gegevens lezen...</string> - <string name="progress_finding_key">sleutel opzoeken...</string> - <string name="progress_decompressing_data">gegevens decomprimeren...</string> - <string name="progress_verifying_integrity">integriteit verifiëren...</string> - <string name="progress_deleting_securely">\'%s\' veilig verwijderen...</string> - <string name="progress_querying">opvragen...</string> + <string name="progress_saving">opslaan…</string> + <string name="progress_importing">importeren…</string> + <string name="progress_exporting">exporteren…</string> + <string name="progress_building_key">sleutel maken…</string> + <string name="progress_preparing_master_key">hoofdsleutel voorbereiden…</string> + <string name="progress_certifying_master_key">hoofdsleutel certificeren…</string> + <string name="progress_building_master_key">hoofdsleutelbos maken…</string> + <string name="progress_adding_sub_keys">sub-sleutels toevoegen…</string> + <string name="progress_extracting_signature_key">ondertekeningssleutel uitpakken…</string> + <string name="progress_extracting_key">sleutel uitpakken…</string> + <string name="progress_preparing_streams">streams voorbereiden…</string> + <string name="progress_encrypting">gegevens versleutelen…</string> + <string name="progress_decrypting">gegevens ontsleutelen…</string> + <string name="progress_preparing_signature">handtekening voorbereiden…</string> + <string name="progress_generating_signature">handtekening genereren…</string> + <string name="progress_processing_signature">handtekening verwerken…</string> + <string name="progress_verifying_signature">handtekening verifiëren…</string> + <string name="progress_signing">ondertekenen…</string> + <string name="progress_reading_data">gegevens lezen…</string> + <string name="progress_finding_key">sleutel opzoeken…</string> + <string name="progress_decompressing_data">gegevens decomprimeren…</string> + <string name="progress_verifying_integrity">integriteit verifiëren…</string> + <string name="progress_deleting_securely">\'%s\' veilig verwijderen…</string> + <string name="progress_querying">opvragen…</string> <!--action strings--> <string name="hint_public_keys">Publieke sleutels zoeken</string> <string name="hint_secret_keys">Privésleutels zoeken</string> - <string name="action_share_key_with">Sleutel delen met...</string> + <string name="action_share_key_with">Sleutel delen met…</string> <!--key bit length selections--> <string name="key_size_512">512</string> <string name="key_size_1024">1024</string> diff --git a/OpenPGP-Keychain/src/main/res/values-ru/strings.xml b/OpenPGP-Keychain/src/main/res/values-ru/strings.xml index 7d865cc23..c8aff125b 100644 --- a/OpenPGP-Keychain/src/main/res/values-ru/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-ru/strings.xml @@ -15,7 +15,7 @@ <string name="title_key_server_preference">Настройки сервера ключей</string> <string name="title_change_pass_phrase">Изменить пароль</string> <string name="title_set_passphrase">Задать пароль</string> - <string name="title_send_email">Отправить...</string> + <string name="title_send_email">Отправить…</string> <string name="title_encrypt_to_file">Зашифровать в файл</string> <string name="title_decrypt_to_file">Расшифровать в файл</string> <string name="title_import_keys">Импорт ключей</string> @@ -61,7 +61,7 @@ <string name="btn_next">Далее</string> <string name="btn_back">Назад</string> <string name="btn_clipboard">Буфер обмена</string> - <string name="btn_share">Поделиться...</string> + <string name="btn_share">Поделиться…</string> <string name="btn_lookup_key">Найти ключ</string> <!--menu--> <string name="menu_preferences">Настройки</string> @@ -79,9 +79,9 @@ <string name="menu_key_server">Импорт с сервера ключей</string> <string name="menu_update_key">Обновить с сервера ключей</string> <string name="menu_export_key_to_server">Загрузить на сервер ключей</string> - <string name="menu_share">Отправить...</string> - <string name="menu_share_title_fingerprint">Отправить отпечаток...</string> - <string name="menu_share_title">Отправить ключ...</string> + <string name="menu_share">Отправить…</string> + <string name="menu_share_title_fingerprint">Отправить отпечаток…</string> + <string name="menu_share_title">Отправить ключ…</string> <string name="menu_share_default_fingerprint">Отправить</string> <string name="menu_share_default">Отправить</string> <string name="menu_share_qr_code">QR код</string> @@ -91,7 +91,7 @@ <string name="menu_sign_key">Подписать ключ</string> <string name="menu_beam_preferences">Настройки Beam</string> <string name="menu_key_edit_cancel">Отмена</string> - <string name="menu_encrypt_to">Зашифровать....</string> + <string name="menu_encrypt_to">Зашифровать….</string> <!--label--> <string name="label_sign">Подписать</string> <string name="label_message">Сообщение</string> @@ -115,7 +115,7 @@ <string name="label_key_servers">Серверы ключей</string> <string name="label_key_id">ID ключа</string> <string name="label_creation">Создан</string> - <string name="label_expiry">Годен до...</string> + <string name="label_expiry">Годен до…</string> <string name="label_usage">Применение</string> <string name="label_key_size">Размер ключа</string> <string name="label_main_user_id">Основной ID пользователя</string> @@ -165,7 +165,7 @@ <string name="dsa">DSA</string> <string name="elgamal">ElGamal</string> <string name="rsa">RSA</string> - <string name="filemanager_title_open">Открыть...</string> + <string name="filemanager_title_open">Открыть…</string> <string name="warning">Внимание</string> <string name="error">Ошибка</string> <string name="error_message">Ошибка: %s</string> @@ -284,41 +284,41 @@ </plurals> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">готово.</string> - <string name="progress_saving">сохранение...</string> - <string name="progress_importing">импорт...</string> - <string name="progress_exporting">экспорт...</string> - <string name="progress_generating">создание ключа. это может занять до 3 минут...</string> - <string name="progress_building_key">создание ключа...</string> - <string name="progress_preparing_master_key">подготовка основного ключа...</string> - <string name="progress_certifying_master_key">сертификация основного ключа...</string> - <string name="progress_building_master_key">создание основной связки...</string> - <string name="progress_adding_sub_keys">добавление доп. ключей...</string> - <string name="progress_saving_key_ring">сохранение ключа...</string> + <string name="progress_saving">сохранение…</string> + <string name="progress_importing">импорт…</string> + <string name="progress_exporting">экспорт…</string> + <string name="progress_generating">создание ключа. это может занять до 3 минут…</string> + <string name="progress_building_key">создание ключа…</string> + <string name="progress_preparing_master_key">подготовка основного ключа…</string> + <string name="progress_certifying_master_key">сертификация основного ключа…</string> + <string name="progress_building_master_key">создание основной связки…</string> + <string name="progress_adding_sub_keys">добавление доп. ключей…</string> + <string name="progress_saving_key_ring">сохранение ключа…</string> <plurals name="progress_exporting_key"> - <item quantity="one">экспорт ключа...</item> - <item quantity="few">экспорт ключей...</item> - <item quantity="other">экспорт ключей...</item> + <item quantity="one">экспорт ключа…</item> + <item quantity="few">экспорт ключей…</item> + <item quantity="other">экспорт ключей…</item> </plurals> - <string name="progress_extracting_signature_key">извлечение подписи ключа...</string> - <string name="progress_extracting_key">извлечение ключа...</string> - <string name="progress_preparing_streams">подготовка к передаче...</string> - <string name="progress_encrypting">шифрование данных...</string> - <string name="progress_decrypting">расшифровка данных...</string> - <string name="progress_preparing_signature">подготовка подписи...</string> - <string name="progress_generating_signature">формирование подписи...</string> - <string name="progress_processing_signature">обработка подписи...</string> - <string name="progress_verifying_signature">проверка подписи...</string> - <string name="progress_signing">подписание...</string> - <string name="progress_reading_data">чтение данных...</string> - <string name="progress_finding_key">поиск ключа...</string> - <string name="progress_decompressing_data">распаковка данных...</string> - <string name="progress_verifying_integrity">проверка целостности...</string> - <string name="progress_deleting_securely">безопасное удаление \'%s\'...</string> - <string name="progress_querying">запрос...</string> + <string name="progress_extracting_signature_key">извлечение подписи ключа…</string> + <string name="progress_extracting_key">извлечение ключа…</string> + <string name="progress_preparing_streams">подготовка к передаче…</string> + <string name="progress_encrypting">шифрование данных…</string> + <string name="progress_decrypting">расшифровка данных…</string> + <string name="progress_preparing_signature">подготовка подписи…</string> + <string name="progress_generating_signature">формирование подписи…</string> + <string name="progress_processing_signature">обработка подписи…</string> + <string name="progress_verifying_signature">проверка подписи…</string> + <string name="progress_signing">подписание…</string> + <string name="progress_reading_data">чтение данных…</string> + <string name="progress_finding_key">поиск ключа…</string> + <string name="progress_decompressing_data">распаковка данных…</string> + <string name="progress_verifying_integrity">проверка целостности…</string> + <string name="progress_deleting_securely">безопасное удаление \'%s\'…</string> + <string name="progress_querying">запрос…</string> <!--action strings--> <string name="hint_public_keys">Найти публичные ключи</string> <string name="hint_secret_keys">Найти секретные ключи</string> - <string name="action_share_key_with">Отправить...</string> + <string name="action_share_key_with">Отправить…</string> <!--key bit length selections--> <string name="key_size_512">512</string> <string name="key_size_1024">1024</string> @@ -386,7 +386,7 @@ <item quantity="few">%d ключей выбрано.</item> <item quantity="other">%d ключей выбрано.</item> </plurals> - <string name="key_list_empty_text1">У вас пока нет ключей...</string> + <string name="key_list_empty_text1">У вас пока нет ключей…</string> <string name="key_list_empty_text2">Но Вы можете</string> <string name="key_list_empty_text3">или</string> <string name="key_list_empty_button_create">создать свой ключ</string> diff --git a/OpenPGP-Keychain/src/main/res/values-tr/strings.xml b/OpenPGP-Keychain/src/main/res/values-tr/strings.xml index 5bb5225b5..4f1becaa1 100644 --- a/OpenPGP-Keychain/src/main/res/values-tr/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-tr/strings.xml @@ -76,7 +76,7 @@ <string name="dsa">DSA</string> <string name="elgamal">ElGamal</string> <string name="rsa">RSA</string> - <string name="filemanager_title_open">Aç...</string> + <string name="filemanager_title_open">Aç…</string> <string name="warning">Uyarı</string> <string name="error">Hata</string> <string name="error_message">Hata: %s</string> @@ -96,17 +96,17 @@ <string name="error_corrupt_data">bozuk veri</string> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">bitti.</string> - <string name="progress_saving">kaydediliyor...</string> - <string name="progress_importing">alıyor...</string> - <string name="progress_exporting">veriyor...</string> - <string name="progress_building_key">anahtar oluşturuluyor...</string> - <string name="progress_preparing_signature">imza hazırlanıyor...</string> - <string name="progress_generating_signature">imza oluşturuluyor...</string> - <string name="progress_processing_signature">imza işleniyor...</string> - <string name="progress_verifying_signature">imza doğrulanıyor...</string> - <string name="progress_signing">imzalanıyor...</string> - <string name="progress_reading_data">veri okunuyor...</string> - <string name="progress_finding_key">anahtar bulunuyor...</string> + <string name="progress_saving">kaydediliyor…</string> + <string name="progress_importing">alıyor…</string> + <string name="progress_exporting">veriyor…</string> + <string name="progress_building_key">anahtar oluşturuluyor…</string> + <string name="progress_preparing_signature">imza hazırlanıyor…</string> + <string name="progress_generating_signature">imza oluşturuluyor…</string> + <string name="progress_processing_signature">imza işleniyor…</string> + <string name="progress_verifying_signature">imza doğrulanıyor…</string> + <string name="progress_signing">imzalanıyor…</string> + <string name="progress_reading_data">veri okunuyor…</string> + <string name="progress_finding_key">anahtar bulunuyor…</string> <!--action strings--> <!--key bit length selections--> <string name="key_size_512">512</string> diff --git a/OpenPGP-Keychain/src/main/res/values-uk/strings.xml b/OpenPGP-Keychain/src/main/res/values-uk/strings.xml index 7f1766a5c..c883ea583 100644 --- a/OpenPGP-Keychain/src/main/res/values-uk/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-uk/strings.xml @@ -351,10 +351,10 @@ <string name="import_nfc_help_button">Довідка</string> <string name="import_clipboard_button">Отримати ключ з буфера обміну</string> <!--Intent labels--> - <string name="intent_decrypt_file">OpenPGP: розшифрувати файл</string> - <string name="intent_import_key">OpenPGP: імпортувати ключ</string> - <string name="intent_send_encrypt">OpenPGP: зашифрувати</string> - <string name="intent_send_decrypt">OpenPGP: розшифрувати</string> + <string name="intent_decrypt_file">Розшифрувати файл з OpenKeychain</string> + <string name="intent_import_key">Імпортувати ключ з OpenKeychain</string> + <string name="intent_send_encrypt">Зашифрувати з OpenKeychain</string> + <string name="intent_send_decrypt">Розшифрувати з OpenKeychain</string> <!--Remote API--> <string name="api_no_apps">Нема зареєстрованих програм!\n\nСтороні програми можуть вимагати доступ до OpenPGP Keychain. Після надання доступу вони будуть наведені тут.</string> <string name="api_settings_show_advanced">Показати додаткові налаштування</string> diff --git a/OpenPGP-Keychain/src/main/res/values-zh/strings.xml b/OpenPGP-Keychain/src/main/res/values-zh/strings.xml index f9422b64b..5848fb8db 100644 --- a/OpenPGP-Keychain/src/main/res/values-zh/strings.xml +++ b/OpenPGP-Keychain/src/main/res/values-zh/strings.xml @@ -24,7 +24,7 @@ <string name="menu_copy_to_clipboard">复制到剪贴板</string> <string name="menu_sign_key">签署密钥</string> <string name="menu_key_edit_cancel">取消</string> - <string name="menu_encrypt_to">加密到...</string> + <string name="menu_encrypt_to">加密到…</string> <!--label--> <string name="label_sign">签署</string> <string name="label_message">讯息</string> @@ -64,7 +64,7 @@ <string name="choice_4hours">4小时</string> <string name="choice_8hours">8小时</string> <string name="choice_forever">永远</string> - <string name="filemanager_title_open">打开...</string> + <string name="filemanager_title_open">打开…</string> <string name="warning">警告</string> <string name="error">错误</string> <!--sentences--> @@ -106,13 +106,13 @@ <string name="error_wrong_passphrase">错误的密语</string> <!--progress dialogs, usually ending in '…'--> <string name="progress_done">完成。</string> - <string name="progress_saving">保存...</string> - <string name="progress_importing">导入中...</string> - <string name="progress_exporting">导出中...</string> + <string name="progress_saving">保存…</string> + <string name="progress_importing">导入中…</string> + <string name="progress_exporting">导出中…</string> <string name="progress_building_key">建立密钥</string> <string name="progress_preparing_master_key">正在准备主密钥</string> - <string name="progress_verifying_signature">正在验证签名...</string> - <string name="progress_signing">正在签名...</string> + <string name="progress_verifying_signature">正在验证签名…</string> + <string name="progress_signing">正在签名…</string> <string name="progress_reading_data">正在读取数据</string> <string name="progress_finding_key">正在查找密钥</string> <string name="progress_querying">正在查询</string> diff --git a/OpenPGP-Keychain/src/main/res/xml/preferences.xml b/OpenPGP-Keychain/src/main/res/xml/adv_preferences.xml index f5b46c232..2705bd22f 100644 --- a/OpenPGP-Keychain/src/main/res/xml/preferences.xml +++ b/OpenPGP-Keychain/src/main/res/xml/adv_preferences.xml @@ -15,21 +15,7 @@ limitations under the License. --> -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > - - <PreferenceCategory android:title="@string/section_general" > - <org.sufficientlysecure.keychain.ui.widget.IntegerListPreference - android:entries="@array/pass_phrase_cache_ttl_entries" - android:entryValues="@array/pass_phrase_cache_ttl_values" - android:key="passPhraseCacheTtl" - android:persistent="false" - android:title="@string/label_passphrase_cache_ttl" /> - - <PreferenceScreen - android:key="keyServers" - android:persistent="false" - android:title="@string/label_key_servers" /> - </PreferenceCategory> +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/section_defaults" > <org.sufficientlysecure.keychain.ui.widget.IntegerListPreference android:key="defaultEncryptionAlgorithm" @@ -59,5 +45,4 @@ android:persistent="false" android:title="@string/label_force_v3_signature" /> </PreferenceCategory> - </PreferenceScreen>
\ No newline at end of file diff --git a/OpenPGP-Keychain/src/main/res/xml/gen_preferences.xml b/OpenPGP-Keychain/src/main/res/xml/gen_preferences.xml new file mode 100644 index 000000000..f83fcb0f6 --- /dev/null +++ b/OpenPGP-Keychain/src/main/res/xml/gen_preferences.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2010 Thialfihar <thi@thialfihar.org> + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> + <PreferenceCategory android:title="@string/section_general" > + <org.sufficientlysecure.keychain.ui.widget.IntegerListPreference + android:entries="@array/pass_phrase_cache_ttl_entries" + android:entryValues="@array/pass_phrase_cache_ttl_values" + android:key="passPhraseCacheTtl" + android:persistent="false" + android:title="@string/label_passphrase_cache_ttl" /> + + <PreferenceScreen + android:key="keyServers" + android:persistent="false" + android:title="@string/label_key_servers" /> + </PreferenceCategory> +</PreferenceScreen>
\ No newline at end of file diff --git a/OpenPGP-Keychain/src/main/res/xml/preference_headers.xml b/OpenPGP-Keychain/src/main/res/xml/preference_headers.xml new file mode 100644 index 000000000..3506ba322 --- /dev/null +++ b/OpenPGP-Keychain/src/main/res/xml/preference_headers.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2010 Thialfihar <thi@thialfihar.org> + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> + <header + android:fragment="org.sufficientlysecure.keychain.ui.PreferencesActivity$GeneralPrefsFragment" + android:title="@string/section_general" /> + <header + android:fragment="org.sufficientlysecure.keychain.ui.PreferencesActivity$AdvancedPrefsFragment" + android:title="@string/section_advanced" /> +</preference-headers>
\ No newline at end of file diff --git a/OpenPGP-Keychain/src/main/res/xml/preference_headers_legacy.xml b/OpenPGP-Keychain/src/main/res/xml/preference_headers_legacy.xml new file mode 100644 index 000000000..141bf93e5 --- /dev/null +++ b/OpenPGP-Keychain/src/main/res/xml/preference_headers_legacy.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2010 Thialfihar <thi@thialfihar.org> + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> + <Preference + android:title="@string/section_general" > + <intent + android:action="org.sufficientlysecure.keychain.ui.PREFS_GEN" /> + </Preference> + <Preference + android:title="@string/section_advanced" > + <intent + android:action="org.sufficientlysecure.keychain.ui.PREFS_ADV" /> + </Preference> +</PreferenceScreen>
\ No newline at end of file @@ -32,9 +32,9 @@ Development mailinglist at http://groups.google.com/d/forum/openpgp-keychain-dev 1. Have Android SDK "tools", "platform-tools", and "build-tools" directories in your PATH (http://developer.android.com/sdk/index.html) 2. Open the Android SDK Manager (shell command: ``android``). -Expand the Tools directory and select "Android SDK Build-tools" newest version. +Expand the Tools directory and select "Android SDK Build-tools (Version 19.0.3)". Expand the Extras directory and install "Android Support Repository" -Select everything for the newest SDK +Select everything for the newest SDK (API-Level 19) 3. Export ANDROID_HOME pointing to your Android SDK 4. Execute ``./gradlew build`` 5. You can install the app with ``adb install -r OpenPGP-Keychain/build/apk/OpenPGP-Keychain-debug-unaligned.apk`` diff --git a/libraries/Android-AppMsg/library/build.gradle b/libraries/Android-AppMsg/library/build.gradle index 934cf1cb1..f77f1a098 100644 --- a/libraries/Android-AppMsg/library/build.gradle +++ b/libraries/Android-AppMsg/library/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'android-library' android { compileSdkVersion 19 - buildToolsVersion '19.0.1' + buildToolsVersion '19.0.3' defaultConfig { minSdkVersion 4 diff --git a/libraries/AndroidBootstrap/build.gradle b/libraries/AndroidBootstrap/build.gradle index 7724c6d9c..220613132 100644 --- a/libraries/AndroidBootstrap/build.gradle +++ b/libraries/AndroidBootstrap/build.gradle @@ -2,10 +2,10 @@ apply plugin: 'android-library' android { compileSdkVersion 19 - buildToolsVersion "19.0.1" + buildToolsVersion "19.0.3" defaultConfig { minSdkVersion 7 - targetSdkVersion 17 + targetSdkVersion 19 } sourceSets { main { diff --git a/libraries/HtmlTextView/build.gradle b/libraries/HtmlTextView/build.gradle index a0b9b1bc6..d1b26d2bd 100644 --- a/libraries/HtmlTextView/build.gradle +++ b/libraries/HtmlTextView/build.gradle @@ -2,8 +2,8 @@ apply plugin: 'android-library' android { - compileSdkVersion 17 - buildToolsVersion '19.0.1' + compileSdkVersion 19 + buildToolsVersion '19.0.3' sourceSets { main { diff --git a/libraries/HtmlTextView/project.properties b/libraries/HtmlTextView/project.properties index 484dab075..91d2b0246 100644 --- a/libraries/HtmlTextView/project.properties +++ b/libraries/HtmlTextView/project.properties @@ -11,5 +11,5 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-17 +target=android-19 android.library=true diff --git a/libraries/StickyListHeaders/library/build.gradle b/libraries/StickyListHeaders/library/build.gradle index a92c4d80e..b67172c12 100644 --- a/libraries/StickyListHeaders/library/build.gradle +++ b/libraries/StickyListHeaders/library/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'android-library' android { compileSdkVersion 19 - buildToolsVersion '19.0.1' + buildToolsVersion '19.0.3' sourceSets { main { diff --git a/libraries/keychain-api-library/build.gradle b/libraries/keychain-api-library/build.gradle new file mode 100644 index 000000000..7c923e7f6 --- /dev/null +++ b/libraries/keychain-api-library/build.gradle @@ -0,0 +1,35 @@ +// please leave this here, so this library builds on its own +buildscript { + repositories { + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:0.8.3' + } +} + +apply plugin: 'android-library' + +android { + compileSdkVersion 19 + buildToolsVersion '19.0.3' + + // NOTE: We are using the old folder structure to also support Eclipse + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + } + } + + // Do not abort build if lint finds errors + lintOptions { + abortOnError false + } +} diff --git a/libraries/zxing-android-integration/build.gradle b/libraries/zxing-android-integration/build.gradle index a92c4d80e..b67172c12 100644 --- a/libraries/zxing-android-integration/build.gradle +++ b/libraries/zxing-android-integration/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'android-library' android { compileSdkVersion 19 - buildToolsVersion '19.0.1' + buildToolsVersion '19.0.3' sourceSets { main { diff --git a/libraries/zxing/build.gradle b/libraries/zxing/build.gradle index a92c4d80e..b67172c12 100644 --- a/libraries/zxing/build.gradle +++ b/libraries/zxing/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'android-library' android { compileSdkVersion 19 - buildToolsVersion '19.0.1' + buildToolsVersion '19.0.3' sourceSets { main { |