diff options
Diffstat (limited to 'OpenPGP-Keychain/src/main/java')
6 files changed, 92 insertions, 53 deletions
| diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java index 6aa28fec8..90e1f8cba 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/helper/ExportHelper.java @@ -63,7 +63,7 @@ public class ExportHelper {      /**       * Show dialog where to export keys       */ -    public void showExportKeysDialog(final Uri dataUri, final int keyType, +    public void showExportKeysDialog(final long[] rowIds, final int keyType,              final String exportFilename) {          mExportFilename = exportFilename; @@ -75,7 +75,7 @@ public class ExportHelper {                      Bundle data = message.getData();                      mExportFilename = data.getString(FileDialogFragment.MESSAGE_DATA_FILENAME); -                    exportKeys(dataUri, keyType); +                    exportKeys(rowIds, keyType);                  }              }          }; @@ -86,7 +86,7 @@ public class ExportHelper {          DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {              public void run() {                  String title = null; -                if (dataUri == null) { +                if (rowIds == null) {                      // export all keys                      title = activity.getString(R.string.title_export_keys);                  } else { @@ -112,7 +112,7 @@ public class ExportHelper {      /**       * Export keys       */ -    public void exportKeys(Uri dataUri, int keyType) { +    public void exportKeys(long[] rowIds, int keyType) {          Log.d(Constants.TAG, "exportKeys started");          // Send all information needed to service to export key in other thread @@ -126,13 +126,10 @@ public class ExportHelper {          data.putString(KeychainIntentService.EXPORT_FILENAME, mExportFilename);          data.putInt(KeychainIntentService.EXPORT_KEY_TYPE, keyType); -        if (dataUri == null) { +        if (rowIds == null) {              data.putBoolean(KeychainIntentService.EXPORT_ALL, true);          } else { -            // TODO: put data uri into service??? -            long keyRingMasterKeyId = ProviderHelper.getMasterKeyId(activity, dataUri); - -            data.putLong(KeychainIntentService.EXPORT_KEY_RING_MASTER_KEY_ID, keyRingMasterKeyId); +            data.putLongArray(KeychainIntentService.EXPORT_KEY_RING_ROW_ID, rowIds);          }          intent.putExtra(KeychainIntentService.EXTRA_DATA, data); diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java index 7c635a00b..0a17a2be4 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/pgp/PgpImportExport.java @@ -155,59 +155,53 @@ public class PgpImportExport {          return returnData;      } -    public Bundle exportKeyRings(ArrayList<Long> keyRingMasterKeyIds, int keyType, +    public Bundle exportKeyRings(ArrayList<Long> keyRingRowIds, int keyType,                                   OutputStream outStream) throws PgpGeneralException, FileNotFoundException,              PGPException, IOException {          Bundle returnData = new Bundle(); +        int rowIdsSize = keyRingRowIds.size(); +          updateProgress(                  mContext.getResources().getQuantityString(R.plurals.progress_exporting_key, -                        keyRingMasterKeyIds.size()), 0, 100); +                        rowIdsSize), 0, 100);          if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {              throw new PgpGeneralException(                      mContext.getString(R.string.error_external_storage_not_ready));          } - -        if (keyType == Id.type.secret_key) { -            ArmoredOutputStream outSec = new ArmoredOutputStream(outStream); -            outSec.setHeader("Version", PgpHelper.getFullVersion(mContext)); - -            for (int i = 0; i < keyRingMasterKeyIds.size(); ++i) { -                updateProgress(i * 100 / keyRingMasterKeyIds.size() / 2, 100); - -                PGPSecretKeyRing secretKeyRing = ProviderHelper.getPGPSecretKeyRingByMasterKeyId( -                        mContext, keyRingMasterKeyIds.get(i)); +        // For each row id +        for (int i = 0; i < rowIdsSize; ++i) { +            // Create an output stream +            ArmoredOutputStream arOutStream = new ArmoredOutputStream(outStream); +            arOutStream.setHeader("Version", PgpHelper.getFullVersion(mContext)); + +            // If the keyType is secret get the PGPSecretKeyRing +            // based on the row id and encode it to the output +            if (keyType == Id.type.secret_key) { +                updateProgress(i * 100 / rowIdsSize / 2, 100); +                PGPSecretKeyRing secretKeyRing = +                        ProviderHelper.getPGPSecretKeyRingByRowId(mContext, keyRingRowIds.get(i));                  if (secretKeyRing != null) { -                    secretKeyRing.encode(outSec); -                } -            } -            outSec.close(); -        } else { -            // export public keyrings... -            ArmoredOutputStream outPub = new ArmoredOutputStream(outStream); -            outPub.setHeader("Version", PgpHelper.getFullVersion(mContext)); - -            for (int i = 0; i < keyRingMasterKeyIds.size(); ++i) { -                // double the needed time if exporting both public and secret parts -                if (keyType == Id.type.secret_key) { -                    updateProgress(i * 100 / keyRingMasterKeyIds.size() / 2, 100); -                } else { -                    updateProgress(i * 100 / keyRingMasterKeyIds.size(), 100); +                    secretKeyRing.encode(arOutStream);                  } - -                PGPPublicKeyRing publicKeyRing = ProviderHelper.getPGPPublicKeyRingByMasterKeyId( -                        mContext, keyRingMasterKeyIds.get(i)); +                // Else if it's a public key get the PGPPublicKeyRing +                // and encode that to the output +            } else { +                updateProgress(i * 100 / rowIdsSize, 100); +                PGPPublicKeyRing publicKeyRing = +                        ProviderHelper.getPGPPublicKeyRingByRowId(mContext, keyRingRowIds.get(i));                  if (publicKeyRing != null) { -                    publicKeyRing.encode(outPub); +                    publicKeyRing.encode(arOutStream);                  }              } -            outPub.close(); + +            arOutStream.close();          } -        returnData.putInt(KeychainIntentService.RESULT_EXPORT, keyRingMasterKeyIds.size()); +        returnData.putInt(KeychainIntentService.RESULT_EXPORT, rowIdsSize);          updateProgress(R.string.progress_done, 100, 100); diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java index ac0692213..dd538fbf4 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/ProviderHelper.java @@ -405,6 +405,30 @@ public class ProviderHelper {      }      /** +     * Private helper method +     */ +    private static ArrayList<Long> getKeyRingsRowIds(Context context, Uri queryUri) { +        Cursor cursor = context.getContentResolver().query(queryUri, +                new String[]{KeyRings._ID}, null, null, null); + +        ArrayList<Long> rowIds = new ArrayList<Long>(); +        if (cursor != null) { +            int IdCol = cursor.getColumnIndex(KeyRings._ID); +            if (cursor.moveToFirst()) { +                do { +                    rowIds.add(cursor.getLong(IdCol)); +                } while (cursor.moveToNext()); +            } +        } + +        if (cursor != null) { +            cursor.close(); +        } + +        return rowIds; +    } + +    /**       * Retrieves ids of all SecretKeyRings       */      public static ArrayList<Long> getSecretKeyRingsMasterKeyIds(Context context) { @@ -420,6 +444,22 @@ public class ProviderHelper {          return getKeyRingsMasterKeyIds(context, queryUri);      } +    /** +     * Retrieves ids of all SecretKeyRings +     */ +    public static ArrayList<Long> getSecretKeyRingsRowIds(Context context) { +        Uri queryUri = KeyRings.buildSecretKeyRingsUri(); +        return getKeyRingsRowIds(context, queryUri); +    } + +    /** +     * Retrieves ids of all PublicKeyRings +     */ +    public static ArrayList<Long> getPublicKeyRingsRowIds(Context context) { +        Uri queryUri = KeyRings.buildPublicKeyRingsUri(); +        return getKeyRingsRowIds(context, queryUri); +    } +      public static void deletePublicKeyRing(Context context, long rowId) {          ContentResolver cr = context.getContentResolver();          cr.delete(KeyRings.buildPublicKeyRingsUri(Long.toString(rowId)), null, null); diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java index 902c66fe9..93238349d 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java @@ -50,6 +50,7 @@ import org.sufficientlysecure.keychain.pgp.PgpImportExport;  import org.sufficientlysecure.keychain.pgp.PgpKeyOperation;  import org.sufficientlysecure.keychain.pgp.PgpSignEncrypt;  import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; +import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.KeychainContract.DataStream;  import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry; @@ -153,6 +154,7 @@ public class KeychainIntentService extends IntentService implements ProgressDial      public static final String EXPORT_KEY_TYPE = "export_key_type";      public static final String EXPORT_ALL = "export_all";      public static final String EXPORT_KEY_RING_MASTER_KEY_ID = "export_key_ring_id"; +    public static final String EXPORT_KEY_RING_ROW_ID = "export_key_rind_row_id";      // upload key      public static final String UPLOAD_KEY_SERVER = "upload_key_server"; @@ -675,10 +677,12 @@ public class KeychainIntentService extends IntentService implements ProgressDial                  String outputFile = data.getString(EXPORT_FILENAME); +                long[] rowIds = new long[0]; + +                // If not exporting all keys get the rowIds of the keys to export from the intent                  boolean exportAll = data.getBoolean(EXPORT_ALL); -                long keyRingMasterKeyId = -1;                  if (!exportAll) { -                    keyRingMasterKeyId = data.getLong(EXPORT_KEY_RING_MASTER_KEY_ID); +                    rowIds = data.getLongArray(EXPORT_KEY_RING_ROW_ID);                  }                  /* Operation */ @@ -691,24 +695,26 @@ public class KeychainIntentService extends IntentService implements ProgressDial                  // OutputStream                  FileOutputStream outStream = new FileOutputStream(outputFile); -                ArrayList<Long> keyRingMasterKeyIds = new ArrayList<Long>(); +                ArrayList<Long> keyRingRowIds = new ArrayList<Long>();                  if (exportAll) { -                    // get all key ring row ids based on export type +                    // get all key ring row ids based on export type                      if (keyType == Id.type.public_key) { -                        keyRingMasterKeyIds = ProviderHelper.getPublicKeyRingsMasterKeyIds(this); +                        keyRingRowIds = ProviderHelper.getPublicKeyRingsRowIds(this);                      } else { -                        keyRingMasterKeyIds = ProviderHelper.getSecretKeyRingsMasterKeyIds(this); +                        keyRingRowIds = ProviderHelper.getSecretKeyRingsRowIds(this);                      }                  } else { -                    keyRingMasterKeyIds.add(keyRingMasterKeyId); +                    for(long rowId : rowIds) { +                        keyRingRowIds.add(rowId); +                    }                  } -                Bundle resultData = new Bundle(); +                Bundle resultData;                  PgpImportExport pgpImportExport = new PgpImportExport(this, this);                  resultData = pgpImportExport -                        .exportKeyRings(keyRingMasterKeyIds, keyType, outStream); +                        .exportKeyRings(keyRingRowIds, keyType, outStream);                  sendMessageToHandler(KeychainIntentServiceHandler.MESSAGE_OKAY, resultData);              } catch (Exception e) { diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java index 19f991640..6e16afef1 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyActivity.java @@ -329,7 +329,8 @@ public class EditKeyActivity extends ActionBarActivity {              cancelClicked();              return true;          case R.id.menu_key_edit_export_file: -            mExportHelper.showExportKeysDialog(mDataUri, Id.type.secret_key, Constants.path.APP_DIR +            long[] ids = new long[]{Long.valueOf(mDataUri.getLastPathSegment())}; +            mExportHelper.showExportKeysDialog(ids, Id.type.secret_key, Constants.path.APP_DIR                      + "/secexport.asc");              return true;          case R.id.menu_key_edit_delete: { diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java index 390de9ab9..3641f4d96 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -118,7 +118,8 @@ public class ViewKeyActivity extends ActionBarActivity {                  uploadToKeyserver(mDataUri);                  return true;              case R.id.menu_key_view_export_file: -                mExportHelper.showExportKeysDialog(mDataUri, Id.type.public_key, Constants.path.APP_DIR +                long[] ids = new long[]{Long.valueOf(mDataUri.getLastPathSegment())}; +                mExportHelper.showExportKeysDialog(ids, Id.type.public_key, Constants.path.APP_DIR                          + "/pubexport.asc");                  return true;              case R.id.menu_key_view_share_default_fingerprint: | 
