From 9475285013accafd24d5bc14da9ba01ca218cbe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 31 Jul 2014 17:11:06 +0200 Subject: Better exception handling for import of keys --- .../keychain/pgp/UncachedKeyRing.java | 10 ++--- .../keychain/ui/ImportKeysListFragment.java | 4 +- .../keychain/ui/adapter/ImportKeysListLoader.java | 48 +++++++--------------- OpenKeychain/src/main/res/values-es/strings.xml | 2 +- OpenKeychain/src/main/res/values-fr/strings.xml | 2 +- OpenKeychain/src/main/res/values-it/strings.xml | 2 +- OpenKeychain/src/main/res/values-ja/strings.xml | 2 +- OpenKeychain/src/main/res/values-ru/strings.xml | 2 +- OpenKeychain/src/main/res/values/strings.xml | 2 +- 9 files changed, 27 insertions(+), 47 deletions(-) (limited to 'OpenKeychain/src/main') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java index de8c683ff..0e59b7fdb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/UncachedKeyRing.java @@ -134,9 +134,7 @@ public class UncachedKeyRing { } - public static List fromStream(InputStream stream) - throws PgpGeneralException, IOException { - + public static List fromStream(InputStream stream) throws IOException { List result = new Vector(); while(stream.available() > 0) { @@ -147,8 +145,10 @@ public class UncachedKeyRing { while ((obj = objectFactory.nextObject()) != null) { Log.d(Constants.TAG, "Found class: " + obj.getClass()); if (!(obj instanceof PGPKeyRing)) { - throw new PgpGeneralException( - "Bad object of type " + obj.getClass().getName() + " in stream!"); + Log.d(Constants.TAG, + "Bad object of type " + obj.getClass().getName() + " in stream, proceed with next object..."); + // skip object + continue; } result.add(new UncachedKeyRing((PGPKeyRing) obj)); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java index 469601a54..1617a84e4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java @@ -287,8 +287,8 @@ public class ImportKeysListFragment extends ListFragment implements if (error == null) { // No error mCachedKeyData = ((ImportKeysListLoader) loader).getParcelableRings(); - } else if (error instanceof ImportKeysListLoader.FileHasNoContentException) { - Notify.showNotify(getActivity(), R.string.error_import_file_no_content, Notify.Style.ERROR); + } else if (error instanceof ImportKeysListLoader.NoValidKeysException) { + Notify.showNotify(getActivity(), R.string.error_import_no_valid_keys, Notify.Style.ERROR); } else if (error instanceof ImportKeysListLoader.NonPgpPartException) { Notify.showNotify(getActivity(), ((ImportKeysListLoader.NonPgpPartException) error).getCount() + " " + getResources(). diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java index 4a8eb0cb1..9996e0381 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java @@ -37,7 +37,7 @@ import java.util.List; public class ImportKeysListLoader extends AsyncTaskLoader>> { - public static class FileHasNoContentException extends Exception { + public static class NoValidKeysException extends Exception { } public static class NonPgpPartException extends Exception { @@ -118,8 +118,6 @@ public class ImportKeysListLoader * @return */ private void generateListOfKeyrings(InputData inputData) { - boolean isEmpty = true; - PositionAwareInputStream progressIn = new PositionAwareInputStream( inputData.getInputStream()); @@ -127,42 +125,24 @@ public class ImportKeysListLoader // PGPObject chunks after the first one, e.g. files with several consecutive ASCII // armor blocks BufferedInputStream bufferedInput = new BufferedInputStream(progressIn); - bufferedInput.mark(1024); try { - - // read all available blocks... (asc files can contain many blocks with BEGIN END) - while (bufferedInput.available() > 0) { - // TODO: deal with non-keyring objects? - List rings = UncachedKeyRing.fromStream(bufferedInput); - for (UncachedKeyRing key : rings) { - ImportKeysListEntry item = new ImportKeysListEntry(getContext(), key); - mData.add(item); - mParcelableRings.put(item.hashCode(), new ParcelableKeyRing(key.getEncoded())); - isEmpty = false; - } + // parse all keyrings + List rings = UncachedKeyRing.fromStream(bufferedInput); + for (UncachedKeyRing key : rings) { + ImportKeysListEntry item = new ImportKeysListEntry(getContext(), key); + mData.add(item); + mParcelableRings.put(item.hashCode(), new ParcelableKeyRing(key.getEncoded())); } - } catch (Exception e) { - Log.e(Constants.TAG, "Exception on parsing key file!", e); + } catch (IOException e) { + Log.e(Constants.TAG, "IOException on parsing key file! Return NoValidKeysException!", e); - try { - bufferedInput.reset(); - } catch (IOException e1) { - } - Log.d(Constants.TAG, "Last 1024 byte input data: " + convertStreamToString(bufferedInput)); - mEntryListWrapper = new AsyncTaskResultWrapper>(mData, e); - } - - if (isEmpty) { - FileHasNoContentException e = new FileHasNoContentException(); - Log.e(Constants.TAG, "File has no content!", e); + NoValidKeysException e1 = new NoValidKeysException(); mEntryListWrapper = new AsyncTaskResultWrapper> - (mData, e); + (mData, e1); + } catch (Exception e) { + Log.e(Constants.TAG, "Other Exception on parsing key file!", e); + mEntryListWrapper = new AsyncTaskResultWrapper>(mData, e); } } - static String convertStreamToString(java.io.InputStream is) { - java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); - return s.hasNext() ? s.next() : ""; - } - } diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml index 002243482..72af24255 100644 --- a/OpenKeychain/src/main/res/values-es/strings.xml +++ b/OpenKeychain/src/main/res/values-es/strings.xml @@ -253,7 +253,7 @@ Petición de búsqueda de clave demasiado corta Error irrecuperable buscando claves en el servidor La petición de búsqueda de clave devolvió demasiados candidatos; por favor refine su petición - El Fichero/Portapapeles está vacío + El Fichero/Portapapeles está vacío Ha ocurrido un error genérico, por favor, informa de este bug a OpenKeychain parte del archivo cargado es un objeto OpenPGP válido pero no una clave OpenPGP diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml index a3030a65e..a4eb177e8 100644 --- a/OpenKeychain/src/main/res/values-fr/strings.xml +++ b/OpenKeychain/src/main/res/values-fr/strings.xml @@ -253,7 +253,7 @@ La requête de recherche de clef est trop courte Erreur irrécupérable lors de la recherche de clef sur le serveur La requête de recherche de clef a retourné trop de candidats. Veuillez raffiner la requête - Le fichier/le presse-papiers est vide + Le fichier/le presse-papiers est vide Une erreur générique est survenue, veuillez créer un nouveau rapport de bogue pour OpenKeychain. une partie du fichier chargé est un objet OpenPGP valide mais pas une clef OpenPGP diff --git a/OpenKeychain/src/main/res/values-it/strings.xml b/OpenKeychain/src/main/res/values-it/strings.xml index 476b7fb31..6debc0418 100644 --- a/OpenKeychain/src/main/res/values-it/strings.xml +++ b/OpenKeychain/src/main/res/values-it/strings.xml @@ -253,7 +253,7 @@ Chiave della query di ricerca troppo corta Errore irreversibile nella ricerca di chiavi sul server Chiave della query di ricerca ha generato troppi candidati; Si prega di perfezionare la ricerca - File/Appunti vuoti + File/Appunti vuoti Si è verificato un errore generico, si prega di creare una nuova segnalazione di errore per OpenKeychain. parte del file caricato e\' un oggetto OpenPGP valido, ma non una chave OpenPGP diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml index db1150102..7d12af22e 100644 --- a/OpenKeychain/src/main/res/values-ja/strings.xml +++ b/OpenKeychain/src/main/res/values-ja/strings.xml @@ -249,7 +249,7 @@ 鍵検索のクエリが短かすぎます サーバでの鍵の検索が回復不可能なエラーになりました 鍵検索のクエリが沢山の候補を返しました; クエリを精密化してください - ファイル/クリップボードが空です + ファイル/クリップボードが空です 一般エラーが発生しました、この新しいバグの情報をOpenKeychainプロジェクトに送ってください 読み込んだファイルのOpenPGPオブジェクト部分は正しいですが、OpenPGPの鍵ではありません diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml index d15e35f50..465e9bb8c 100644 --- a/OpenKeychain/src/main/res/values-ru/strings.xml +++ b/OpenKeychain/src/main/res/values-ru/strings.xml @@ -257,7 +257,7 @@ Запрос слишком короткий Ошибка поиска ключей на сервере Поиск ключа вернул слишком много вариантов; Пожалуйста, уточните запрос - Файл/Буфер пуст + Файл/Буфер пуст Выявлена ошибка. Пожалуйста, сообщите о ней разработчику. часть загруженного файла содержит данные OpenPGP, но это не ключ diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index 6fa90b31a..37132237a 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -273,7 +273,7 @@ Key search query too short Unrecoverable error searching for keys at server Key search query returned too many candidates; Please refine query - File/Clipboard is empty + No valid keys found in File/Clipboard! A generic error occurred, please create a new bug report for OpenKeychain. part of the loaded file is a valid OpenPGP object but not a OpenPGP key -- cgit v1.2.3