mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-23 17:22:16 -05:00
Merge branch 'master' of https://github.com/openpgp-keychain/openpgp-keychain into datefix
This commit is contained in:
commit
f99b7585fc
@ -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
|
||||
|
||||
|
@ -18,7 +18,7 @@ dependencies {
|
||||
|
||||
android {
|
||||
compileSdkVersion 19
|
||||
buildToolsVersion "19.0.1"
|
||||
buildToolsVersion "19.0.3"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 9
|
||||
|
@ -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 {
|
||||
|
@ -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>
|
@ -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 *;
|
||||
#}
|
@ -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;
|
||||
|
@ -18,7 +18,7 @@ dependencies {
|
||||
|
||||
android {
|
||||
compileSdkVersion 19
|
||||
buildToolsVersion "19.0.1"
|
||||
buildToolsVersion "19.0.3"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 9
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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];
|
||||
}
|
||||
};
|
||||
}
|
@ -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();
|
||||
|
@ -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: currently does not support binary signed-only content
|
||||
PgpDecryptVerifyResult decryptVerifyResult = 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;
|
||||
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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
mPassPhraseCacheTtl = (IntegerListPreference) findPreference(Constants.pref.PASS_PHRASE_CACHE_TTL);
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
32
OpenPGP-Keychain/src/main/res/xml/gen_preferences.xml
Normal file
32
OpenPGP-Keychain/src/main/res/xml/gen_preferences.xml
Normal file
@ -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>
|
25
OpenPGP-Keychain/src/main/res/xml/preference_headers.xml
Normal file
25
OpenPGP-Keychain/src/main/res/xml/preference_headers.xml
Normal file
@ -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>
|
@ -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>
|
@ -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``
|
||||
|
@ -2,7 +2,7 @@ apply plugin: 'android-library'
|
||||
|
||||
android {
|
||||
compileSdkVersion 19
|
||||
buildToolsVersion '19.0.1'
|
||||
buildToolsVersion '19.0.3'
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 4
|
||||
|
@ -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 {
|
||||
|
@ -2,8 +2,8 @@ apply plugin: 'android-library'
|
||||
|
||||
|
||||
android {
|
||||
compileSdkVersion 17
|
||||
buildToolsVersion '19.0.1'
|
||||
compileSdkVersion 19
|
||||
buildToolsVersion '19.0.3'
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
@ -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
|
||||
|
@ -2,7 +2,7 @@ apply plugin: 'android-library'
|
||||
|
||||
android {
|
||||
compileSdkVersion 19
|
||||
buildToolsVersion '19.0.1'
|
||||
buildToolsVersion '19.0.3'
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
35
libraries/keychain-api-library/build.gradle
Normal file
35
libraries/keychain-api-library/build.gradle
Normal file
@ -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
|
||||
}
|
||||
}
|
@ -2,7 +2,7 @@ apply plugin: 'android-library'
|
||||
|
||||
android {
|
||||
compileSdkVersion 19
|
||||
buildToolsVersion '19.0.1'
|
||||
buildToolsVersion '19.0.3'
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
@ -2,7 +2,7 @@ apply plugin: 'android-library'
|
||||
|
||||
android {
|
||||
compileSdkVersion 19
|
||||
buildToolsVersion '19.0.1'
|
||||
buildToolsVersion '19.0.3'
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
|
Loading…
Reference in New Issue
Block a user