Merge remote-tracking branch 'origin/master' into db-overhaul

This commit is contained in:
Vincent Breitmoser 2014-04-04 13:18:43 +02:00
commit 1b38a5b2e3
42 changed files with 446 additions and 171 deletions

View File

@ -1,3 +1,9 @@
2.5
* fix decryption of symmetric pgp messages/files
* refactored edit key screen (thanks to Ash Hughes)
* new modern design for encrypt/decrypt screens
* OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)
2.4
Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.sufficientlysecure.keychain.demo"
android:versionCode="3"
android:versionName="2">
android:versionCode="4"
android:versionName="3">
<uses-sdk
android:minSdkVersion="9"

View File

@ -25,34 +25,64 @@ import android.content.ServiceConnection;
import android.os.IBinder;
public class OpenPgpServiceConnection {
// interface to create callbacks for onServiceConnected
public interface OnBound {
public void onBound(IOpenPgpService service);
}
private Context mApplicationContext;
private boolean mBound;
private IOpenPgpService mService;
private String mProviderPackageName;
private OnBound mOnBoundListener;
/**
* Create new OpenPgpServiceConnection
*
* @param context
* @param providerPackageName specify package name of OpenPGP provider,
* e.g., "org.sufficientlysecure.keychain"
*/
public OpenPgpServiceConnection(Context context, String providerPackageName) {
this.mApplicationContext = context.getApplicationContext();
this.mProviderPackageName = providerPackageName;
}
/**
* Create new OpenPgpServiceConnection
*
* @param context
* @param providerPackageName specify package name of OpenPGP provider,
* e.g., "org.sufficientlysecure.keychain"
* @param onBoundListener callback, executed when connection to service has been established
*/
public OpenPgpServiceConnection(Context context, String providerPackageName,
OnBound onBoundListener) {
this.mApplicationContext = context.getApplicationContext();
this.mProviderPackageName = providerPackageName;
this.mOnBoundListener = onBoundListener;
}
public IOpenPgpService getService() {
return mService;
}
public boolean isBound() {
return mBound;
return (mService != null);
}
private ServiceConnection mServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IOpenPgpService.Stub.asInterface(service);
mBound = true;
if (mOnBoundListener != null) {
mOnBoundListener.onBound(mService);
}
}
public void onServiceDisconnected(ComponentName name) {
mService = null;
mBound = false;
}
};
@ -63,7 +93,7 @@ public class OpenPgpServiceConnection {
*/
public boolean bindToService() {
// if not already bound...
if (mService == null && !mBound) {
if (mService == null) {
try {
Intent serviceIntent = new Intent();
serviceIntent.setAction(IOpenPgpService.class.getName());

View File

@ -102,4 +102,4 @@ task localTest(type: Test, dependsOn: assemble) {
classpath = sourceSets.testLocal.runtimeClasspath
}
check.dependsOn localTest
//check.dependsOn localTest

View File

@ -2,8 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.sufficientlysecure.keychain"
android:installLocation="auto"
android:versionCode="24000"
android:versionName="2.4">
android:versionCode="25000"
android:versionName="2.5">
<!--
General remarks

View File

@ -40,6 +40,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract.ApiAccounts;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.remote.ui.RemoteServiceActivity;
import org.sufficientlysecure.keychain.service.PassphraseCacheService;
import org.sufficientlysecure.keychain.ui.ImportKeysActivity;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
@ -316,11 +317,10 @@ public class OpenPgpService extends RemoteService {
if (signatureResult.getStatus() == OpenPgpSignatureResult.SIGNATURE_UNKNOWN_PUB_KEY) {
// If signature is unknown we return an _additional_ PendingIntent
// to retrieve the missing key
// TODO!!!
Intent intent = new Intent(getBaseContext(), RemoteServiceActivity.class);
intent.setAction(RemoteServiceActivity.ACTION_ERROR_MESSAGE);
intent.putExtra(RemoteServiceActivity.EXTRA_ERROR_MESSAGE, "todo");
intent.putExtra(RemoteServiceActivity.EXTRA_DATA, data);
Intent intent = new Intent(getBaseContext(), ImportKeysActivity.class);
intent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN);
intent.putExtra(ImportKeysActivity.EXTRA_KEY_ID, signatureResult.getKeyId());
intent.putExtra(ImportKeysActivity.EXTRA_PENDING_INTENT_DATA, data);
PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0,
intent,
@ -357,11 +357,10 @@ public class OpenPgpService extends RemoteService {
// If keys are not in db we return an additional PendingIntent
// to retrieve the missing key
// TODO!!!
Intent intent = new Intent(getBaseContext(), RemoteServiceActivity.class);
intent.setAction(RemoteServiceActivity.ACTION_ERROR_MESSAGE);
intent.putExtra(RemoteServiceActivity.EXTRA_ERROR_MESSAGE, "todo");
intent.putExtra(RemoteServiceActivity.EXTRA_DATA, data);
Intent intent = new Intent(getBaseContext(), ImportKeysActivity.class);
intent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN);
intent.putExtra(ImportKeysActivity.EXTRA_KEY_ID, keyId);
intent.putExtra(ImportKeysActivity.EXTRA_PENDING_INTENT_DATA, data);
PendingIntent pi = PendingIntent.getActivity(getBaseContext(), 0,
intent,
@ -373,6 +372,9 @@ public class OpenPgpService extends RemoteService {
} else {
Intent result = new Intent();
result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
// TODO: also return PendingIntent that opens the key view activity
return result;
}
} catch (Exception e) {

View File

@ -112,7 +112,6 @@ public class KeychainIntentService extends IntentService
// possible targets:
public static final int TARGET_BYTES = 1;
public static final int TARGET_URI = 2;
public static final int TARGET_STREAM = 3;
// encrypt
public static final String ENCRYPT_SIGNATURE_KEY_ID = "secret_key_id";
@ -122,7 +121,6 @@ public class KeychainIntentService extends IntentService
public static final String ENCRYPT_MESSAGE_BYTES = "message_bytes";
public static final String ENCRYPT_INPUT_FILE = "input_file";
public static final String ENCRYPT_OUTPUT_FILE = "output_file";
public static final String ENCRYPT_PROVIDER_URI = "provider_uri";
public static final String ENCRYPT_SYMMETRIC_PASSPHRASE = "passphrase";
// decrypt/verify
@ -173,11 +171,7 @@ public class KeychainIntentService extends IntentService
public static final String RESULT_KEY_USAGES = "new_key_usages";
// encrypt
public static final String RESULT_SIGNATURE_BYTES = "signature_data";
public static final String RESULT_SIGNATURE_STRING = "signature_text";
public static final String RESULT_ENCRYPTED_STRING = "encrypted_message";
public static final String RESULT_BYTES = "encrypted_data";
public static final String RESULT_URI = "result_uri";
// decrypt/verify
public static final String RESULT_DECRYPTED_BYTES = "decrypted_data";
@ -191,10 +185,6 @@ public class KeychainIntentService extends IntentService
// export
public static final String RESULT_EXPORT = "exported";
// query
public static final String RESULT_QUERY_KEY_DATA = "query_key_data";
public static final String RESULT_QUERY_KEY_SEARCH_RESULT = "query_key_search_result";
Messenger mMessenger;
private boolean mIsCanceled;
@ -735,9 +725,6 @@ public class KeychainIntentService extends IntentService
ArrayList<ImportKeysListEntry> entries = data.getParcelableArrayList(DOWNLOAD_KEY_LIST);
String keyServer = data.getString(DOWNLOAD_KEY_SERVER);
// TODO: add extra which requires fingerprint suport and force verification!
// only supported by newer sks keyserver versions
// this downloads the keys and places them into the ImportKeysListEntry entries
HkpKeyServer server = new HkpKeyServer(keyServer);

View File

@ -38,6 +38,8 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.ui.dialog.PassphraseDialogFragment;
import org.sufficientlysecure.keychain.util.Log;
@ -88,13 +90,9 @@ public class DecryptFragment extends Fragment {
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
// this request is returned after LookupUnknownKeyDialogFragment started
// ImportKeysActivity and user looked uo key
case RESULT_CODE_LOOKUP_KEY: {
Log.d(Constants.TAG, "Returning from Lookup Key...");
if (resultCode == Activity.RESULT_OK) {
// decrypt again
// decryptStart();
// TODO: generate new OpenPgpSignatureResult and display it
}
return;
}
@ -189,6 +187,7 @@ public class DecryptFragment extends Fragment {
/**
* Should be overridden by MessageFragment and FileFragment to start actual decryption
*
* @param passphrase
*/
protected void decryptStart(String passphrase) {

View File

@ -151,6 +151,10 @@ public class DrawerActivity extends ActionBarActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (mDrawerToggle == null) {
return super.onCreateOptionsMenu(menu);
}
menu.add(42, MENU_ID_PREFERENCE, 100, R.string.menu_preferences);
menu.add(42, MENU_ID_HELP, 101, R.string.menu_help);
@ -159,6 +163,10 @@ public class DrawerActivity extends ActionBarActivity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle == null) {
return super.onOptionsItemSelected(item);
}
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item)) {
@ -216,14 +224,18 @@ public class DrawerActivity extends ActionBarActivity {
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
if (mDrawerToggle != null) {
mDrawerToggle.syncState();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggles
mDrawerToggle.onConfigurationChanged(newConfig);
if (mDrawerToggle != null) {
mDrawerToggle.onConfigurationChanged(newConfig);
}
}
private class NavItem {

View File

@ -239,7 +239,6 @@ public class EncryptAsymmetricFragment extends Fragment {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case RESULT_CODE_PUBLIC_KEYS: {
if (resultCode == Activity.RESULT_OK) {
Bundle bundle = data.getExtras();
@ -260,11 +259,11 @@ public class EncryptAsymmetricFragment extends Fragment {
}
default: {
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}

View File

@ -18,6 +18,7 @@
package org.sufficientlysecure.keychain.ui;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
@ -34,8 +35,10 @@ import android.support.v7.app.ActionBar;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import com.beardedhen.androidbootstrap.BootstrapButton;
import com.devspark.appmsg.AppMsg;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.PgpKeyHelper;
@ -54,7 +57,6 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa
+ "IMPORT_KEY_FROM_QR_CODE";
public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER = Constants.INTENT_PREFIX
+ "IMPORT_KEY_FROM_KEYSERVER";
// TODO: implement:
public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN = Constants.INTENT_PREFIX
+ "IMPORT_KEY_FROM_KEY_SERVER_AND_RETURN";
@ -72,6 +74,10 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa
public static final String EXTRA_KEY_ID = "key_id";
public static final String EXTRA_FINGERPRINT = "fingerprint";
// only used by ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN when used from OpenPgpService
public static final String EXTRA_PENDING_INTENT_DATA = "data";
private Intent mPendingIntentData;
// view
private ImportKeysListFragment mListFragment;
private String[] mNavigationStrings;
@ -86,7 +92,7 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa
ImportKeysNFCFragment.class
};
private int mCurrentNavPostition = -1;
private int mCurrentNavPosition = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -102,17 +108,22 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa
}
});
getSupportActionBar().setDisplayShowTitleEnabled(false);
setupDrawerNavigation(savedInstanceState);
// set drop down navigation
mNavigationStrings = getResources().getStringArray(R.array.import_action_list);
Context context = getSupportActionBar().getThemedContext();
ArrayAdapter<CharSequence> navigationAdapter = ArrayAdapter.createFromResource(context,
R.array.import_action_list, android.R.layout.simple_spinner_dropdown_item);
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getSupportActionBar().setListNavigationCallbacks(navigationAdapter, this);
if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(getIntent().getAction())) {
setTitle(R.string.nav_import);
} else {
getSupportActionBar().setDisplayShowTitleEnabled(false);
setupDrawerNavigation(savedInstanceState);
// set drop down navigation
Context context = getSupportActionBar().getThemedContext();
ArrayAdapter<CharSequence> navigationAdapter = ArrayAdapter.createFromResource(context,
R.array.import_action_list, android.R.layout.simple_spinner_dropdown_item);
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getSupportActionBar().setListNavigationCallbacks(navigationAdapter, this);
}
handleActions(savedInstanceState, getIntent());
}
@ -152,34 +163,52 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa
// action: directly load data
startListFragment(savedInstanceState, importData, null, null);
}
} else if (ACTION_IMPORT_KEY_FROM_KEYSERVER.equals(action)) {
String query = null;
if (extras.containsKey(EXTRA_QUERY)) {
query = extras.getString(EXTRA_QUERY);
} else if (extras.containsKey(EXTRA_KEY_ID)) {
long keyId = intent.getLongExtra(EXTRA_KEY_ID, 0);
if (keyId != 0) {
query = PgpKeyHelper.convertKeyIdToHex(keyId);
} else if (ACTION_IMPORT_KEY_FROM_KEYSERVER.equals(action)
|| ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(action)) {
// only used for OpenPgpService
if (extras.containsKey(EXTRA_PENDING_INTENT_DATA)) {
mPendingIntentData = extras.getParcelable(EXTRA_PENDING_INTENT_DATA);
}
if (extras.containsKey(EXTRA_QUERY) || extras.containsKey(EXTRA_KEY_ID)) {
/* simple search based on query or key id */
String query = null;
if (extras.containsKey(EXTRA_QUERY)) {
query = extras.getString(EXTRA_QUERY);
} else if (extras.containsKey(EXTRA_KEY_ID)) {
long keyId = intent.getLongExtra(EXTRA_KEY_ID, 0);
if (keyId != 0) {
query = PgpKeyHelper.convertKeyIdToHex(keyId);
}
}
if (query != null && query.length() > 0) {
// display keyserver fragment with query
Bundle args = new Bundle();
args.putString(ImportKeysServerFragment.ARG_QUERY, query);
loadNavFragment(0, args);
// action: search immediately
startListFragment(savedInstanceState, null, null, query);
} else {
Log.e(Constants.TAG, "Query is empty!");
return;
}
} else if (extras.containsKey(EXTRA_FINGERPRINT)) {
/*
* search based on fingerprint, here we can enforce a check in the end
* if the right key has been downloaded
*/
String fingerprint = intent.getStringExtra(EXTRA_FINGERPRINT);
if (fingerprint != null) {
query = "0x" + fingerprint;
}
loadFromFingerprint(savedInstanceState, fingerprint);
} else {
Log.e(Constants.TAG,
"IMPORT_KEY_FROM_KEYSERVER action needs to contain the 'query', 'key_id', or " +
"'fingerprint' extra!");
"IMPORT_KEY_FROM_KEYSERVER action needs to contain the 'query', 'key_id', or " +
"'fingerprint' extra!");
return;
}
// display keyserver fragment with query
Bundle args = new Bundle();
args.putString(ImportKeysServerFragment.ARG_QUERY, query);
loadNavFragment(0, args);
// action: search immediately
startListFragment(savedInstanceState, null, null, query);
} else if (ACTION_IMPORT_KEY_FROM_FILE.equals(action)) {
// NOTE: this only displays the appropriate fragment, no actions are taken
@ -234,14 +263,14 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa
* onNavigationItemSelected() should check whether the Fragment is already in existence
* inside your Activity."
* <p/>
* from http://bit.ly/1dBYThO
* from http://stackoverflow.com/a/14295474
* <p/>
* In our case, if we start ImportKeysActivity with parameters to directly search using a fingerprint,
* the fragment would be loaded twice resulting in the query being empty after the second load.
* <p/>
* Our solution:
* To prevent that a fragment will be loaded again even if it was already loaded loadNavFragment
* checks against mCurrentNavPostition.
* checks against mCurrentNavPosition.
*
* @param itemPosition
* @param itemId
@ -257,10 +286,12 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa
}
private void loadNavFragment(int itemPosition, Bundle args) {
if (mCurrentNavPostition != itemPosition) {
getSupportActionBar().setSelectedNavigationItem(itemPosition);
if (mCurrentNavPosition != itemPosition) {
if (ActionBar.NAVIGATION_MODE_LIST == getSupportActionBar().getNavigationMode()) {
getSupportActionBar().setSelectedNavigationItem(itemPosition);
}
loadFragment(NAVIGATION_CLASSES[itemPosition], args, mNavigationStrings[itemPosition]);
mCurrentNavPostition = itemPosition;
mCurrentNavPosition = itemPosition;
}
}
@ -280,7 +311,11 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa
Log.d(Constants.TAG, "fingerprint: " + fingerprint);
if (fingerprint.length() < 16) {
loadFromFingerprint(savedInstanceState, fingerprint);
}
public void loadFromFingerprint(Bundle savedInstanceState, String fingerprint) {
if (fingerprint == null || fingerprint.length() < 40) {
AppMsg.makeText(this, R.string.import_qr_code_too_short_fingerprint,
AppMsg.STYLE_ALERT).show();
return;
@ -291,6 +326,7 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa
// display keyserver fragment with query
Bundle args = new Bundle();
args.putString(ImportKeysServerFragment.ARG_QUERY, query);
args.putBoolean(ImportKeysServerFragment.ARG_DISABLE_QUERY_EDIT, true);
loadNavFragment(0, args);
// action: search directly
@ -301,66 +337,6 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa
mListFragment.loadNew(importData, dataUri, serverQuery, keyServer);
}
// private void importAndSignOld(final long keyId, final String expectedFingerprint) {
// if (expectedFingerprint != null && expectedFingerprint.length() > 0) {
//
// Thread t = new Thread() {
// @Override
// public void run() {
// try {
// // TODO: display some sort of spinner here while the user waits
//
// // TODO: there should be only 1
// HkpKeyServer server = new HkpKeyServer(mPreferences.getKeyServers()[0]);
// String encodedKey = server.get(keyId);
//
// PGPKeyRing keyring = PGPHelper.decodeKeyRing(new ByteArrayInputStream(
// encodedKey.getBytes()));
// if (keyring != null && keyring instanceof PGPPublicKeyRing) {
// PGPPublicKeyRing publicKeyRing = (PGPPublicKeyRing) keyring;
//
// // make sure the fingerprints match before we cache this thing
// String actualFingerprint = PGPHelper.convertFingerprintToHex(publicKeyRing
// .getPublicKey().getFingerprint());
// if (expectedFingerprint.equals(actualFingerprint)) {
// // store the signed key in our local cache
// int retval = PGPMain.storeKeyRingInCache(publicKeyRing);
// if (retval != Id.return_value.ok
// && retval != Id.return_value.updated) {
// status.putString(EXTRA_ERROR,
// "Failed to store signed key in local cache");
// } else {
// Intent intent = new Intent(ImportFromQRCodeActivity.this,
// SignKeyActivity.class);
// intent.putExtra(EXTRA_KEY_ID, keyId);
// startActivityForResult(intent, Id.request.sign_key);
// }
// } else {
// status.putString(
// EXTRA_ERROR,
// "Scanned fingerprint does NOT match the fingerprint of the received key. " +
// "You shouldnt trust this key.");
// }
// }
// } catch (QueryException e) {
// Log.e(TAG, "Failed to query KeyServer", e);
// status.putString(EXTRA_ERROR, "Failed to query KeyServer");
// status.putInt(Constants.extras.STATUS, Id.message.done);
// } catch (IOException e) {
// Log.e(TAG, "Failed to query KeyServer", e);
// status.putString(EXTRA_ERROR, "Failed to query KeyServer");
// status.putInt(Constants.extras.STATUS, Id.message.done);
// }
// }
// };
//
// t.setName("KeyExchange Download Thread");
// t.setDaemon(true);
// t.start();
// }
// }
/**
* Import keys with mImportData
*/
@ -405,6 +381,11 @@ public class ImportKeysActivity extends DrawerActivity implements ActionBar.OnNa
BadImportKeyDialogFragment.newInstance(bad);
badImportKeyDialogFragment.show(getSupportFragmentManager(), "badKeyDialog");
}
if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN.equals(getIntent().getAction())) {
ImportKeysActivity.this.setResult(Activity.RESULT_OK, mPendingIntentData);
finish();
}
}
}
};

View File

@ -40,6 +40,7 @@ import org.sufficientlysecure.keychain.util.Log;
public class ImportKeysServerFragment extends Fragment {
public static final String ARG_QUERY = "query";
public static final String ARG_KEY_SERVER = "key_server";
public static final String ARG_DISABLE_QUERY_EDIT = "disable_query_edit";
private ImportKeysActivity mImportActivity;
@ -140,6 +141,10 @@ public class ImportKeysServerFragment extends Fragment {
Log.d(Constants.TAG, "keyServer: " + keyServer);
}
if (getArguments().getBoolean(ARG_DISABLE_QUERY_EDIT, false)) {
mQueryEditText.setEnabled(false);
}
}
}

View File

@ -18,6 +18,7 @@
package org.sufficientlysecure.keychain.ui;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
@ -157,18 +158,13 @@ public class ViewKeyActivity extends ActionBarActivity {
}
private void updateFromKeyserver(Uri dataUri) {
long updateKeyId = ProviderHelper.getMasterKeyId(ViewKeyActivity.this, dataUri);
if (updateKeyId == 0) {
Log.e(Constants.TAG, "this shouldn't happen. KeyId == 0!");
return;
}
byte[] fingerprintBlob = ProviderHelper.getFingerprint(this, dataUri);
String fingerprint = PgpKeyHelper.convertFingerprintToHex(fingerprintBlob);
Intent queryIntent = new Intent(this, ImportKeysActivity.class);
queryIntent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER);
queryIntent.putExtra(ImportKeysActivity.EXTRA_KEY_ID, updateKeyId);
queryIntent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN);
queryIntent.putExtra(ImportKeysActivity.EXTRA_FINGERPRINT, fingerprint);
// TODO: lookup with onactivityresult!
startActivityForResult(queryIntent, RESULT_CODE_LOOKUP_KEY);
}
@ -246,4 +242,21 @@ public class ViewKeyActivity extends ActionBarActivity {
mExportHelper.deleteKey(dataUri, returnHandler);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case RESULT_CODE_LOOKUP_KEY: {
if (resultCode == Activity.RESULT_OK) {
// TODO: reload key??? move this into fragment?
}
break;
}
default: {
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
}
}

View File

@ -19,6 +19,7 @@ package org.sufficientlysecure.keychain.ui.adapter;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.util.HkpKeyServer;
import org.sufficientlysecure.keychain.util.KeyServer;
@ -53,7 +54,12 @@ public class ImportKeysListServerLoader
return mEntryListWrapper;
}
queryServer(mServerQuery, mKeyServer);
if (mServerQuery.startsWith("0x") && mServerQuery.length() == 42) {
Log.d(Constants.TAG, "This search is based on a unique fingerprint. Enforce a fingerprint check!");
queryServer(mServerQuery, mKeyServer, true);
} else {
queryServer(mServerQuery, mKeyServer, false);
}
return mEntryListWrapper;
}
@ -84,14 +90,30 @@ public class ImportKeysListServerLoader
/**
* Query keyserver
*/
private void queryServer(String query, String keyServer) {
private void queryServer(String query, String keyServer, boolean enforceFingerprint) {
HkpKeyServer server = new HkpKeyServer(keyServer);
try {
ArrayList<ImportKeysListEntry> searchResult = server.search(query);
mEntryList.clear();
// add result to data
mEntryList.addAll(searchResult);
if (enforceFingerprint) {
String fingerprint = query.substring(2);
Log.d(Constants.TAG, "fingerprint: " + fingerprint);
// query must return only one result!
if (searchResult.size() > 0) {
ImportKeysListEntry uniqueEntry = searchResult.get(0);
/*
* set fingerprint explicitly after query
* to enforce a check when the key is imported by KeychainIntentService
*/
uniqueEntry.setFingerPrintHex(fingerprint);
uniqueEntry.setSelected(true);
mEntryList.add(uniqueEntry);
}
} else {
mEntryList.addAll(searchResult);
}
mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, null);
} catch (KeyServer.InsufficientQuery e) {
Log.e(Constants.TAG, "InsufficientQuery", e);

View File

@ -28,20 +28,6 @@
android:src="@drawable/overlay_error" />
</RelativeLayout>
<com.beardedhen.androidbootstrap.BootstrapButton
android:id="@+id/lookup_key"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:padding="4dp"
android:text="@string/btn_lookup_key"
bootstrapbutton:bb_icon_left="fa-download"
bootstrapbutton:bb_type="info"
bootstrapbutton:bb_size="small"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<TextView
android:id="@+id/mainUserId"
android:layout_width="wrap_content"
@ -60,4 +46,17 @@
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_below="@+id/mainUserId"
android:layout_toRightOf="@+id/relativeLayout" />
<com.beardedhen.androidbootstrap.BootstrapButton
android:id="@+id/lookup_key"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:padding="4dp"
android:text="@string/btn_lookup_key"
bootstrapbutton:bb_icon_left="fa-download"
bootstrapbutton:bb_type="info"
bootstrapbutton:bb_size="small"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>corregido descifrado de mensajes/ficheros con pgp simétrico</li>
<li>rediseñada la pantalla de edición de claves (gracias a Ash Hughes)</li>
<li>API OpenPGP versión 3 (multiples cuentas api, correcciones internas)</li>
<li>diseño más moderno para las pantallas de cifrado/descifrado</li>
</ul>
<h2>2.4</h2>
<p>¡Gracias a todos los solicitantes de Google Summer of Code 2014, por hacer esta aplicación productiva y libre de errores!
Además de varios parches pequeños, un notable número de correcciones fueron hechas por las siguientes personas (en orden alfabético):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Merci à tous les participants de « Google Summer of Code 2014 » qui ont rendu cette version riche en fonctions et sans bogue !
À part plusieurs petits correctifs, un nombre notable de correctifs ont été apportés par les personnes suivantes (par ordre alphabétique) :

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Grazie a tutti i partecipanti di Google Summer of Code 2014 che hanno reso questo rilascio ricco di caratteristiche e privo di bug!
Oltre a numerose piccole correzioni, un notevole numero di patch sono fatte dalle seguenti persone (in ordine alfabetico):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>このリリースにおいて適用したリッチでバグのない機能を作ってくれたGoogle Summer of Code 2014の参加者たちに感謝を!
また、以下の人達(アルファベット順)の作ってくれたいくつもののさなパッチや相当数のパッチにも:

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Podziękowania dla wszystkich kandydatów do Google Summer of Code 2014 którzy uczynili to wydanie bogatym w nowe funkcje i pozbawione błedów!
Poza kilkoma małymi poprawkami, znaczna ilość aktualizacji została wykonana przez poniższe osoby (w kolejności alfabetycznej):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Спасибо всем участникам Google Summer of Code 2014, которые помогли сделать этот выпуск, добавив функции и исправив ошибки!
Из общего числа патчей, особенный вклад внесли следующие люди (в алфавитном порядке):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>виправлено опис симетричних повідомлень/файлів pgp</li>
<li>перероблено екран редагування ключа (завдяки Ash Hughes)</li>
<li>OpenPGP API версія 3 (підтримка кількох профілів, внутрішні зміни)</li>
<li>новий сучасний дизайн для екранів шифрування/розшифрування</li>
</ul>
<h2>2.4</h2>
<p>Дякуємо усім заявникам Google Summer of Code 2014, які зробили цю версію багатшу на функції та вільну від помилок!
Крім окремих незначних латок, значне число латок зробили наступні люди (у алфавітному порядку):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -1,6 +1,13 @@
<html>
<head></head>
<body>
<h2>2.5</h2>
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
</ul>
<h2>2.4</h2>
<p>Thanks to all applicants of Google Summer of Code 2014 who made this release feature rich and bug free!
Besides several small patches, a notable number of patches are made by the following people (in alphabetical order):

View File

@ -9,8 +9,8 @@ And don't add newlines before or after p tags because of transifex -->
<ul>
<li>fix decryption of symmetric pgp messages/files</li>
<li>refactored edit key screen (thanks to Ash Hughes)</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes)</li>
<li>new modern design for encrypt/decrypt screens</li>
<li>OpenPGP API version 3 (multiple api accounts, internal fixes, key lookup)</li>
</ul>
<h2>2.4</h2>

View File

@ -74,6 +74,7 @@
<string name="menu_import_from_qr_code">Importar desde código QR</string>
<string name="menu_import">Importar</string>
<string name="menu_import_from_nfc">Importar desde NFC</string>
<string name="menu_export_public_keys">Exportar todas las claves públicas</string>
<string name="menu_export_secret_keys">Exportar todas las claves secretas</string>
<string name="menu_export_key">Exportar hacia archivo</string>
<string name="menu_delete_key">Borrar clave</string>
@ -98,6 +99,8 @@
<string name="menu_key_edit_cancel">Cancelar</string>
<string name="menu_encrypt_to">Cifrar hacia...</string>
<string name="menu_select_all">Seleccionar todo</string>
<string name="menu_add_keys">Añadir claves</string>
<string name="menu_export_keys">Exportar claves</string>
<!--label-->
<string name="label_sign">Firmar</string>
<string name="label_message">Mensaje</string>
@ -189,11 +192,15 @@
<string name="set_a_passphrase">Establece una frase de contraseña antes.</string>
<string name="no_filemanager_installed">No hay un gestor de archivos compatible instalado.</string>
<string name="passphrases_do_not_match">Las frases de contraseña no coinciden.</string>
<string name="passphrase_must_not_be_empty">Por favor, introduce una frase de contraseña.</string>
<string name="passphrase_for_symmetric_encryption">Cifrado simétrico.</string>
<string name="passphrase_for">Introducir la frase de contraseña para \'%s\'</string>
<string name="file_delete_confirmation">¿Estás seguro de que quieres borrar\n%s?</string>
<string name="file_delete_successful">Borrado satisfactoriamente.</string>
<string name="no_file_selected">Selecciona un archivo antes.</string>
<string name="decryption_successful">Descifrado y/o verificado satisfactoriamente.</string>
<string name="encryption_successful">Firmado y/o cifrado satisfactoriamente.</string>
<string name="encryption_to_clipboard_successful">Firmado y/o cifrado al portapapeles satisfactoriamente.</string>
<string name="enter_passphrase_twice">Introduce la frase de contraseña dos veces.</string>
<string name="select_encryption_key">Selecciona al menos una clave de cifrado.</string>
<string name="select_encryption_or_signature_key">Selecciona al menos una clave de cifrado o de firma.</string>
@ -205,6 +212,7 @@
<string name="key_deletion_confirmation_multi">¿Quieres realmente borrar todas las claves seleccionadas?\n¡No podrás deshacerlo!</string>
<string name="secret_key_deletion_confirmation">¿Quieres realmente borrar la clave SECRETA \'%s\'?\n¡No podrás deshacerlo!</string>
<string name="ask_save_changed_key">Has hecho cambios en el almacén de claves, ¿quieres guardarlos?</string>
<string name="ask_empty_id_ok">Has añadido una ID de usuario vacía, ¿Estás seguro que quieres continuar?</string>
<string name="public_key_deletetion_confirmation">¿Quieres realmente borrar la clave PÚBLICA \'%s\'?\n¡No podrás deshacerlo!</string>
<string name="secret_key_delete_text">¿Borrar claves secretas?</string>
<string name="also_export_secret_keys">¿Exportar también las claves secretas?</string>
@ -298,6 +306,7 @@
<item quantity="one">parte del archivo cargado es un objeto OpenPGP válido pero no una clave OpenPGP</item>
<item quantity="other">partes del archivo cargado son objetos OpenPGP válidos pero no claves OpenPGP</item>
</plurals>
<string name="error_change_something_first">Debes hacer cambios en el almacén de claves antes de que puedas guardarlo</string>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">Hecho.</string>
<string name="progress_cancel">Cancelar</string>
@ -423,6 +432,9 @@
<string name="key_view_tab_main">Información</string>
<string name="key_view_tab_certs">Certificaciones</string>
<!--Navigation Drawer-->
<string name="nav_contacts">Claves</string>
<string name="nav_encrypt">Firmar y cifrar</string>
<string name="nav_decrypt">Descifrar y verificar</string>
<string name="nav_import">Importar claves</string>
<string name="nav_secret_keys">Mis claves</string>
<string name="nav_apps">Aplicaciones registradas</string>
@ -436,4 +448,6 @@
<string name="section_uids_to_sign">IDs de usuario para firmar</string>
<string name="progress_re_adding_certs">Nueva aplicación de certificados</string>
<!--hints-->
<string name="encrypt_content_edit_text_hint">Escribe aquí el mensaje que quieras cifrar y/o firmar...</string>
<string name="decrypt_content_edit_text_hint">Introduce aquí el texto cifrado para descifrarlo y/o verificarlo...</string>
</resources>

View File

@ -74,6 +74,7 @@
<string name="menu_import_from_qr_code">Importer depuis un code QR</string>
<string name="menu_import">Importer</string>
<string name="menu_import_from_nfc">Importer avec NFC</string>
<string name="menu_export_public_keys">Exporter toutes les clefs publiques</string>
<string name="menu_export_secret_keys">Exporter toutes les clefs secrètes</string>
<string name="menu_export_key">Exporter vers un fichier</string>
<string name="menu_delete_key">Supprimer la clef</string>
@ -98,6 +99,8 @@
<string name="menu_key_edit_cancel">Annuler</string>
<string name="menu_encrypt_to">Chiffrer vers...</string>
<string name="menu_select_all">Tout sélectionner</string>
<string name="menu_add_keys">Ajouter des clefs</string>
<string name="menu_export_keys">Exporter des clefs</string>
<!--label-->
<string name="label_sign">Signer</string>
<string name="label_message">Message</string>
@ -189,11 +192,15 @@
<string name="set_a_passphrase">Définir d\'abord une phrase de passe.</string>
<string name="no_filemanager_installed">Aucun gestionnaire de fichiers compatible installé.</string>
<string name="passphrases_do_not_match">Les phrases de passe ne correspondent pas.</string>
<string name="passphrase_must_not_be_empty">Veuillez saisir une phrase de passe</string>
<string name="passphrase_for_symmetric_encryption">Chriffrement symétrique.</string>
<string name="passphrase_for">Saisir une phrase de passe pour « %s »</string>
<string name="file_delete_confirmation">Êtes-vous sûr de vouloir supprimer\n%s ?</string>
<string name="file_delete_successful">Supprimé avec succès.</string>
<string name="no_file_selected">Choisir d\'abord un fichier.</string>
<string name="decryption_successful">Déchiffré et/ou vérifié avec succès</string>
<string name="encryption_successful">Signé et/ou chiffré avec succès</string>
<string name="encryption_to_clipboard_successful">Signé et/ou chiffré vers le presse-papiers avec succès</string>
<string name="enter_passphrase_twice">Saisir la phrase de passe deux fois.</string>
<string name="select_encryption_key">Choisir au moins une clef de chiffrement.</string>
<string name="select_encryption_or_signature_key">Choisir au moins une clef de chiffrement ou de signature.</string>
@ -205,6 +212,7 @@
<string name="key_deletion_confirmation_multi">Voulez-vous vraiment supprimer toutes les clefs choisies ?\nCeci est irréversible !</string>
<string name="secret_key_deletion_confirmation">Voulez-vous vraiment supprimer la clef SECRÈTE %s ?\nVous ne pourrez pas la restituer !</string>
<string name="ask_save_changed_key">Vous avez apporté des changements au trousseau, voulez-vous l\'enregistrer ?</string>
<string name="ask_empty_id_ok">Vous avez ajouté un ID utilisateur vide, êtes-vous certain de vouloir continuer?</string>
<string name="public_key_deletetion_confirmation">Voulez-vous vraiment supprimer la clef PUBLIQUE « %s » ?\nVous ne pourrez pas la restituer !</string>
<string name="secret_key_delete_text">Supprimer les clefs privées ?</string>
<string name="also_export_secret_keys">Exporter aussi les clefs secrètes?</string>
@ -424,6 +432,9 @@
<string name="key_view_tab_main">Infos</string>
<string name="key_view_tab_certs">Certifications</string>
<!--Navigation Drawer-->
<string name="nav_contacts">Clefs</string>
<string name="nav_encrypt">Signer et chiffrer</string>
<string name="nav_decrypt">Déchiffrer et vérifier</string>
<string name="nav_import">Importer les clefs</string>
<string name="nav_secret_keys">Mes clefs</string>
<string name="nav_apps">Applis enregistrées</string>
@ -437,4 +448,6 @@
<string name="section_uids_to_sign">ID utilisateur pour signer</string>
<string name="progress_re_adding_certs">Nouvel application des certificats</string>
<!--hints-->
<string name="encrypt_content_edit_text_hint">Écrire ici le message à chiffrer et/ou signer...</string>
<string name="decrypt_content_edit_text_hint">Saisir le cryptogramme à déchiffrer et/ou à vérifier ici...</string>
</resources>

View File

@ -41,7 +41,7 @@
<string name="section_certification_key">あなたの鍵を証明に利用します</string>
<string name="section_upload_key">鍵のアップロード</string>
<string name="section_key_server">鍵サーバ</string>
<string name="section_encrypt_and_or_sign">暗号化/もしくは署名</string>
<string name="section_encrypt_and_or_sign">暗号化/署名</string>
<string name="section_decrypt_verify">復号化と検証</string>
<!--button-->
<string name="btn_sign">署名</string>
@ -74,6 +74,7 @@
<string name="menu_import_from_qr_code">QRコードからインポート</string>
<string name="menu_import">インポート</string>
<string name="menu_import_from_nfc">NFCからインポート</string>
<string name="menu_export_public_keys">すべての公開鍵のエクスポート</string>
<string name="menu_export_secret_keys">すべての秘密鍵のエクスポート</string>
<string name="menu_export_key">ファイルへのエクスポート</string>
<string name="menu_delete_key">鍵の削除</string>
@ -98,6 +99,8 @@
<string name="menu_key_edit_cancel">キャンセル</string>
<string name="menu_encrypt_to">暗号化...</string>
<string name="menu_select_all">すべて選択</string>
<string name="menu_add_keys">鍵の追加</string>
<string name="menu_export_keys">複数鍵のエクスポート</string>
<!--label-->
<string name="label_sign">署名</string>
<string name="label_message">メッセージ</string>
@ -186,11 +189,15 @@
<string name="set_a_passphrase">最初にパスフレーズを設定してください。</string>
<string name="no_filemanager_installed">互換性のないファイルマネージャがインストールされています。</string>
<string name="passphrases_do_not_match">パスフレーズが一致しません。</string>
<string name="passphrase_must_not_be_empty">パスフレーズを入れてください。</string>
<string name="passphrase_for_symmetric_encryption">対称暗号。</string>
<string name="passphrase_for">\'%s\' にパスフレーズを入れてください。</string>
<string name="file_delete_confirmation">%s を削除してもかまいませんか?</string>
<string name="file_delete_successful">削除に成功しました。</string>
<string name="no_file_selected">最初にファイルを選択してください。</string>
<string name="decryption_successful">復号化/検証に成功しました。</string>
<string name="encryption_successful">署名/暗号化に成功しました。</string>
<string name="encryption_to_clipboard_successful">クリップボードの中身の署名/暗号化に成功しました。</string>
<string name="enter_passphrase_twice">もう一度パスフレーズを入れてください。</string>
<string name="select_encryption_key">少なくとも1つの暗号化鍵を選択して下さい。</string>
<string name="select_encryption_or_signature_key">少なくとも1つの暗号化鍵か署名鍵を選択して下さい。</string>
@ -202,6 +209,7 @@
<string name="key_deletion_confirmation_multi">選択したすべての鍵を本当に削除してよいですか?\nこれは元に戻せません。</string>
<string name="secret_key_deletion_confirmation">秘密鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません!</string>
<string name="ask_save_changed_key">あなたは鍵輪に変更を加えました、これを保存しますか?</string>
<string name="ask_empty_id_ok">あなたは空のユーザーIDを追加しました、このまま続けますか?</string>
<string name="public_key_deletetion_confirmation">公開鍵\'%s\'を本当に削除してもよいですか?\nこれは元に戻せません!</string>
<string name="secret_key_delete_text">秘密鍵を削除しますか?</string>
<string name="also_export_secret_keys">秘密鍵もエクスポートしますか?</string>
@ -409,6 +417,9 @@
<string name="key_view_tab_main">情報</string>
<string name="key_view_tab_certs">証明</string>
<!--Navigation Drawer-->
<string name="nav_contacts"></string>
<string name="nav_encrypt">署名と暗号化</string>
<string name="nav_decrypt">復号化と検証</string>
<string name="nav_import">鍵のインポート</string>
<string name="nav_secret_keys">自分の鍵</string>
<string name="nav_apps">登録済みのアプリ</string>
@ -422,4 +433,6 @@
<string name="section_uids_to_sign">署名に使うユーザーID</string>
<string name="progress_re_adding_certs">検証を再適用する</string>
<!--hints-->
<string name="encrypt_content_edit_text_hint">ここに書いたメッセージを暗号化/署名..</string>
<string name="decrypt_content_edit_text_hint">ここに入力された暗号化テキストを復号化/検証...</string>
</resources>

View File

@ -48,6 +48,7 @@
<string name="btn_certify">Certyfikuj</string>
<string name="btn_decrypt">Odszyfruj</string>
<string name="btn_decrypt_verify">Deszyfruj i weryfikuj</string>
<string name="btn_decrypt_verify_clipboard">Ze schowka</string>
<string name="btn_select_encrypt_keys">Wybierz odbiorców</string>
<string name="btn_encrypt_file">Zaszyfruj plik</string>
<string name="btn_save">Zapisz</string>
@ -55,6 +56,8 @@
<string name="btn_delete">Usuń</string>
<string name="btn_no_date">Żaden</string>
<string name="btn_okay">Ok</string>
<string name="btn_change_passphrase">Zmień nowe hasło</string>
<string name="btn_set_passphrase">Ustaw nowe hasło</string>
<string name="btn_search">Wyszukaj</string>
<string name="btn_export_to_server">Wyślij do serwera kluczy</string>
<string name="btn_next">Dalej</string>
@ -71,6 +74,7 @@
<string name="menu_import_from_qr_code">Zaimportuj z kodu QR</string>
<string name="menu_import">Import</string>
<string name="menu_import_from_nfc">Zaimportuj przy użyciu NFC</string>
<string name="menu_export_public_keys">Eksportuj wszystkie klucze publiczne</string>
<string name="menu_export_secret_keys">Eksportuj wszystkie prywatne klucze</string>
<string name="menu_export_key">Eksportuj do pliku</string>
<string name="menu_delete_key">Usuń klucz</string>
@ -95,6 +99,8 @@
<string name="menu_key_edit_cancel">Anuluj</string>
<string name="menu_encrypt_to">Zaszyfruj do...</string>
<string name="menu_select_all">Wybierz wszystko</string>
<string name="menu_add_keys">Dodaj klucze</string>
<string name="menu_export_keys">Eksportuj klucze</string>
<!--label-->
<string name="label_sign">Podpis</string>
<string name="label_message">Wiadomość</string>
@ -179,17 +185,25 @@
<string name="error">Błąd</string>
<string name="error_message">Błąd: %s</string>
<!--key flags-->
<string name="flag_certify">Certyfikuj</string>
<string name="flag_sign">Podpisz</string>
<string name="flag_encrypt">Zaszyfruj</string>
<string name="flag_authenticate">Autentykuj</string>
<!--sentences-->
<string name="wrong_passphrase">Nieprawidłowe hasło.</string>
<string name="using_clipboard_content">Użycie zawartości schowka.</string>
<string name="set_a_passphrase">Najpierw ustaw hasło.</string>
<string name="no_filemanager_installed">Nie zainstalowano żadnego kompatybilnego menadżera plików.</string>
<string name="passphrases_do_not_match">Hasła nie pasują do siebie</string>
<string name="passphrase_must_not_be_empty">Podaj hasło.</string>
<string name="passphrase_for_symmetric_encryption">Szyfrowanie symetryczne.</string>
<string name="passphrase_for">Podaj hasło dla \'%s\'</string>
<string name="file_delete_confirmation">Czy jesteś pewien że chcesz usunąć\n%s?</string>
<string name="file_delete_successful">Usunięto pomyślnie.</string>
<string name="no_file_selected">Najpierw wskaż plik.</string>
<string name="decryption_successful">Pomyślnie deszyfrowano i/lub zweryfikowano.</string>
<string name="encryption_successful">Pomyślnie podpisano i/lub zaszyfrowano.</string>
<string name="encryption_to_clipboard_successful">Pomyslnie podpisano i/lub zaszyfrowano do schowka.</string>
<string name="enter_passphrase_twice">Podaj hasło dwukrotnie.</string>
<string name="select_encryption_key">Wybierz co najmniej jeden klucz szyfrujący.</string>
<string name="select_encryption_or_signature_key">Wybierz co najmniej jeden klucz szyfrujący lub klucz podpisujący.</string>
@ -200,6 +214,8 @@
<string name="key_deletion_confirmation">Czy na pewno chcesz usunąć klucz \'%s\'?\nNie można cofnąć tej operacji!</string>
<string name="key_deletion_confirmation_multi">Czy na pewno chcesz usunąć wszystkie zaznaczone klucze?\nTej operacji nie można cofnąć!</string>
<string name="secret_key_deletion_confirmation">Czy na pewno chcesz usunąć klucz prywatny \'%s\'?\nNie można cofnąć tej operacji!</string>
<string name="ask_save_changed_key">Zostały dokonane zmiany w pęku kluczy, czy chcesz je zachować?</string>
<string name="ask_empty_id_ok">Dodałeś pusty identyfikator użytkownika, czy na pewno chcesz kontynuować?</string>
<string name="public_key_deletetion_confirmation">Czy na pewno chcesz usunąć klucz publiczny \'%s\'?\nNie można cofnąć tej operacji!</string>
<string name="secret_key_delete_text">Usunąć klucze prywatne?</string>
<string name="also_export_secret_keys">Czy wyeksportować również klucze prywatne?</string>
@ -283,6 +299,7 @@
<string name="error_nfc_needed">NCF jest niedostępne na twoim urządzeniu</string>
<string name="error_nothing_import">Nie ma nic do zaimportowania!</string>
<string name="error_expiry_must_come_after_creation">data wygaśnięcia musi być późniejsza niż data stworzenia</string>
<string name="error_save_first">zapisz najpierw pęk kluczy</string>
<string name="error_can_not_delete_contact">nie możesz usunąć tego kontaktu, ponieważ należy do ciebie.</string>
<string name="error_can_not_delete_contacts">nie możesz usunąć tych kontaktów, ponieważ należą do ciebie:\n%s</string>
<string name="error_keyserver_insufficient_query">Niewystarczające zapytanie do serwera</string>
@ -300,6 +317,7 @@
<item quantity="few">Część wczytanego pliku to poprawne obiekty OpenPGP, ale nie są kluczami OpenPGP</item>
<item quantity="other">Część wczytanego pliku to poprawne obiekty OpenPGP, ale nie są kluczami OpenPGP</item>
</plurals>
<string name="error_change_something_first">Musisz dokonać zmian w pęku kluczy zanim będziesz mógł go zachować</string>
<!--progress dialogs, usually ending in '…'-->
<string name="progress_done">Gotowe.</string>
<string name="progress_cancel">Anuluj</string>
@ -429,6 +447,9 @@
<string name="key_view_tab_main">Informacje</string>
<string name="key_view_tab_certs">Certyfikaty</string>
<!--Navigation Drawer-->
<string name="nav_contacts">Klucze</string>
<string name="nav_encrypt">Podpisz i zaszyfruj</string>
<string name="nav_decrypt">Deszyfruj i weryfikuj</string>
<string name="nav_import">Importuj klucze</string>
<string name="nav_secret_keys">Moje klucze</string>
<string name="nav_apps">Zarejestrowane aplikacje</string>
@ -442,4 +463,6 @@
<string name="section_uids_to_sign">Identyfikator użytkownika do podpisu</string>
<string name="progress_re_adding_certs">Ponowne stosowanie certyfikatów</string>
<!--hints-->
<string name="encrypt_content_edit_text_hint">Wpisz tutaj wiadomość do zaszyfrowania i/lub podpisania...</string>
<string name="decrypt_content_edit_text_hint">Wpisz tutaj tekst do zaszyfrowania i/lub zweryfikowania...</string>
</resources>

View File

@ -74,6 +74,7 @@
<string name="menu_import_from_qr_code">Импорт из QR кода</string>
<string name="menu_import">Импорт</string>
<string name="menu_import_from_nfc">Импорт из NFC</string>
<string name="menu_export_public_keys">Экспорт всех открытых ключей</string>
<string name="menu_export_secret_keys">Экспорт всех секретных ключей</string>
<string name="menu_export_key">Экспорт в файл</string>
<string name="menu_delete_key">Удалить ключ</string>
@ -98,6 +99,8 @@
<string name="menu_key_edit_cancel">Отмена</string>
<string name="menu_encrypt_to">Зашифровать....</string>
<string name="menu_select_all">Выбрать все</string>
<string name="menu_add_keys">Добавить ключи</string>
<string name="menu_export_keys">Экспорт ключей</string>
<!--label-->
<string name="label_sign">Подписать</string>
<string name="label_message">Сообщение</string>
@ -191,11 +194,15 @@
<string name="set_a_passphrase">Сначала задайте пароль</string>
<string name="no_filemanager_installed">Нет совместимого менеджера файлов.</string>
<string name="passphrases_do_not_match">Пароли не совпадают.</string>
<string name="passphrase_must_not_be_empty">Пожалуйста, введите пароль.</string>
<string name="passphrase_for_symmetric_encryption">Симметричное шифрование.</string>
<string name="passphrase_for">Введите пароль для\n\'%s\'</string>
<string name="file_delete_confirmation">Вы уверены, что хотите удалить\n%s ?</string>
<string name="file_delete_successful">Удалено.</string>
<string name="no_file_selected">Сначала выберите файл.</string>
<string name="decryption_successful">Расшифровано и/или проверено.</string>
<string name="encryption_successful">Подписано и/или зашифровано.</string>
<string name="encryption_to_clipboard_successful">Подписано и/или зашифровано в буфер обмена.</string>
<string name="enter_passphrase_twice">Дважды введите пароль.</string>
<string name="select_encryption_key">Укажите хотя бы один ключ.</string>
<string name="select_encryption_or_signature_key">Выберите хотя бы один ключ для шифрования или подписи.</string>
@ -430,6 +437,9 @@
<string name="key_view_tab_main">Информация</string>
<string name="key_view_tab_certs">Сертификация</string>
<!--Navigation Drawer-->
<string name="nav_contacts">Ключи</string>
<string name="nav_encrypt">Подписать и зашифровать</string>
<string name="nav_decrypt">Расшифровать и проверить</string>
<string name="nav_import">Импорт ключей</string>
<string name="nav_secret_keys">Мои ключи</string>
<string name="nav_apps">Связанные приложения</string>
@ -442,4 +452,5 @@
<string name="secret_key_no">не доступен</string>
<string name="section_uids_to_sign">Подписываемые ID пользователя</string>
<!--hints-->
<string name="encrypt_content_edit_text_hint">Напишите сообщение здесь, что бы зашифровать и/или подписать...</string>
</resources>

View File

@ -74,6 +74,7 @@
<string name="menu_import_from_qr_code">Імпорт з штрих-коду</string>
<string name="menu_import">Імпорт</string>
<string name="menu_import_from_nfc">Імпорт з NFC</string>
<string name="menu_export_public_keys">Експортувати усі публічні ключі</string>
<string name="menu_export_secret_keys">Експортувати усі секретні ключі</string>
<string name="menu_export_key">Експорт до файлу</string>
<string name="menu_delete_key">Вилучити ключ</string>
@ -98,6 +99,8 @@
<string name="menu_key_edit_cancel">Скасувати</string>
<string name="menu_encrypt_to">Зашифрувати…</string>
<string name="menu_select_all">Вибрати усе</string>
<string name="menu_add_keys">Додати ключі</string>
<string name="menu_export_keys">Експортувати ключі</string>
<!--label-->
<string name="label_sign">Підпис</string>
<string name="label_message">Повідомлення</string>
@ -192,11 +195,15 @@
<string name="set_a_passphrase">Спершу задайте парольну фразу.</string>
<string name="no_filemanager_installed">Нема встановленого сумісного менеджера файлів.</string>
<string name="passphrases_do_not_match">Парольні фрази не збігаються.</string>
<string name="passphrase_must_not_be_empty">Будь ласка, введіть парольну фразу.</string>
<string name="passphrase_for_symmetric_encryption">Симетричне шифрування.</string>
<string name="passphrase_for">Введіть парольну фразу для \'%s\'</string>
<string name="file_delete_confirmation">Ви справді хочете вилучити\n%s?</string>
<string name="file_delete_successful">Успішно вилучено.</string>
<string name="no_file_selected">Виберіть спершу файл.</string>
<string name="decryption_successful">Успішно розшифровано та/або перевірено.</string>
<string name="encryption_successful">Успішно підписано та/або перевірено.</string>
<string name="encryption_to_clipboard_successful">Успішно підписано та/або зашифровано до буфера обміну.</string>
<string name="enter_passphrase_twice">Введіть двічі парольну фразу.</string>
<string name="select_encryption_key">Виберіть принаймні один ключ шифрування.</string>
<string name="select_encryption_or_signature_key">Виберіть принаймні один ключ шифрування або ключ підпису.</string>
@ -208,6 +215,7 @@
<string name="key_deletion_confirmation_multi">Ви справді хочете вилучити усі вибрані ключі?\nВи не зможете це відмінити!</string>
<string name="secret_key_deletion_confirmation">Ви справді хочете вилучити секретний ключ \'%s\'?\nВи не зможете це відмінити!</string>
<string name="ask_save_changed_key">Ви внесли зміни до в\'язки ключів, ви б хотіли. Волієте їх зберегти?</string>
<string name="ask_empty_id_ok">Ви вже додали порожній ідентифікатор користувача. Справді хочете продовжити?</string>
<string name="public_key_deletetion_confirmation">Справді волієте вилучити ВІДКРИТИЙ ключ \'%s\'?\nВи е зможете відмінити цю дію!</string>
<string name="secret_key_delete_text">Видалити секретні ключі?</string>
<string name="also_export_secret_keys">Також експортувати секретні ключі?</string>
@ -439,6 +447,9 @@
<string name="key_view_tab_main">Інформація</string>
<string name="key_view_tab_certs">Сертифікати</string>
<!--Navigation Drawer-->
<string name="nav_contacts">Ключі</string>
<string name="nav_encrypt">Підписати і зашифрувати</string>
<string name="nav_decrypt">Розшифрувати і Перевірити</string>
<string name="nav_import">Імпортувати ключі</string>
<string name="nav_secret_keys">Мої ключі</string>
<string name="nav_apps">Зареєстровані програми</string>
@ -452,4 +463,6 @@
<string name="section_uids_to_sign">ІД користувача для реєстрації</string>
<string name="progress_re_adding_certs">Перезастосування сертифікатів</string>
<!--hints-->
<string name="encrypt_content_edit_text_hint">Напишіть повідомлення для шифрування та/або підпису…</string>
<string name="decrypt_content_edit_text_hint">Уведіть зашифрований текст тут для його розшифрування та/або перевірки…</string>
</resources>

View File

@ -406,7 +406,7 @@
<string name="import_qr_code_start_with_one">Please start with QR Code with ID 1</string>
<string name="import_qr_code_wrong">QR Code malformed! Please try again!</string>
<string name="import_qr_code_finished">QR Code scanning finished!</string>
<string name="import_qr_code_too_short_fingerprint">Fingerprint contained in this QR Code is too short (&lt; 16 characters)</string>
<string name="import_qr_code_too_short_fingerprint">Fingerprint is too short (&lt; 16 characters)</string>
<string name="import_qr_scan_button">Scan QR Code with \'Barcode Scanner\'</string>
<string name="import_nfc_text">To receive keys via NFC, the device needs to be unlocked.</string>
<string name="import_nfc_help_button">Help</string>