From 664b2bb7af2c8253aa0bbade42531ad4a3ef6bab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas.mueller@tmit.eu>
Date: Wed, 1 Apr 2015 16:36:08 +0200
Subject: [PATCH] cleaning up exception mess

---
 apps/encryption/lib/crypto/crypt.php          |  2 +-
 .../exceptions/multikeydecryptexception.php   |  4 ++-
 .../exceptions/multikeyencryptexception.php   |  4 ++-
 .../exceptions/privatekeymissingexception.php | 14 ++++++++--
 .../exceptions/publickeymissingexception.php  | 20 +++++++++++++
 apps/encryption/lib/keymanager.php            |  8 +++---
 apps/encryption/lib/session.php               |  2 +-
 lib/private/connector/sabre/file.php          |  4 +--
 .../exceptions/decryptionfailedexception.php  |  1 +
 .../emptyencryptiondataexception.php          |  1 +
 .../exceptions/encryptionfailedexception.php  |  1 +
 .../encryptionheaderkeyexistsexception.php    | 13 +++++----
 .../encryptionheadertolargeexception.php      |  5 ++++
 .../modulealreadyexistsexception.php          | 12 +++++++-
 .../moduledoesnotexistsexception.php          |  4 ++-
 .../exceptions/publickeymissingexception.php  | 28 -------------------
 .../unexpectedblocksizeexception.php          | 28 -------------------
 ...expectedendofencryptionheaderexception.php | 28 -------------------
 .../exceptions/unknowncipherexception.php     |  3 +-
 lib/private/encryption/keys/storage.php       |  4 +--
 lib/private/encryption/manager.php            |  3 +-
 lib/private/encryption/util.php               |  4 +--
 .../exceptions/genericencryptionexception.php |  9 +++++-
 23 files changed, 91 insertions(+), 111 deletions(-)
 create mode 100644 apps/encryption/lib/exceptions/publickeymissingexception.php
 delete mode 100644 lib/private/encryption/exceptions/publickeymissingexception.php
 delete mode 100644 lib/private/encryption/exceptions/unexpectedblocksizeexception.php
 delete mode 100644 lib/private/encryption/exceptions/unexpectedendofencryptionheaderexception.php
 rename lib/{private => public}/encryption/exceptions/genericencryptionexception.php (76%)

diff --git a/apps/encryption/lib/crypto/crypt.php b/apps/encryption/lib/crypto/crypt.php
index 6b79057fe7e..80878b3ddb2 100644
--- a/apps/encryption/lib/crypto/crypt.php
+++ b/apps/encryption/lib/crypto/crypt.php
@@ -24,9 +24,9 @@ namespace OCA\Encryption\Crypto;
 
 use OC\Encryption\Exceptions\DecryptionFailedException;
 use OC\Encryption\Exceptions\EncryptionFailedException;
-use OC\Encryption\Exceptions\GenericEncryptionException;
 use OCA\Encryption\Exceptions\MultiKeyDecryptException;
 use OCA\Encryption\Exceptions\MultiKeyEncryptException;
+use OCP\Encryption\Exceptions\GenericEncryptionException;
 use OCP\IConfig;
 use OCP\ILogger;
 use OCP\IUser;
diff --git a/apps/encryption/lib/exceptions/multikeydecryptexception.php b/apps/encryption/lib/exceptions/multikeydecryptexception.php
index 36a95544e61..1466d35eda3 100644
--- a/apps/encryption/lib/exceptions/multikeydecryptexception.php
+++ b/apps/encryption/lib/exceptions/multikeydecryptexception.php
@@ -2,6 +2,8 @@
 
 namespace OCA\Encryption\Exceptions;
 
-class MultiKeyDecryptException extends \Exception {
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class MultiKeyDecryptException extends GenericEncryptionException {
 
 }
diff --git a/apps/encryption/lib/exceptions/multikeyencryptexception.php b/apps/encryption/lib/exceptions/multikeyencryptexception.php
index e518a09d1cc..daf528e2cf7 100644
--- a/apps/encryption/lib/exceptions/multikeyencryptexception.php
+++ b/apps/encryption/lib/exceptions/multikeyencryptexception.php
@@ -2,6 +2,8 @@
 
 namespace OCA\Encryption\Exceptions;
 
-class MultiKeyEncryptException extends \Exception {
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class MultiKeyEncryptException extends GenericEncryptionException {
 
 }
diff --git a/apps/encryption/lib/exceptions/privatekeymissingexception.php b/apps/encryption/lib/exceptions/privatekeymissingexception.php
index ddc3d11cdbc..50d75870b20 100644
--- a/apps/encryption/lib/exceptions/privatekeymissingexception.php
+++ b/apps/encryption/lib/exceptions/privatekeymissingexception.php
@@ -19,10 +19,20 @@
  *
  */
 
-
 namespace OCA\Encryption\Exceptions;
 
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class PrivateKeyMissingException extends GenericEncryptionException {
 
-class PrivateKeyMissingException extends \Exception{
+	/**
+	 * @param string $userId
+	 */
+	public function __construct($userId) {
+		if(empty($userId)) {
+			$userId = "<no-user-id-given>";
+		}
+		parent::__construct("Private Key missing for user: $userId");
+	}
 
 }
diff --git a/apps/encryption/lib/exceptions/publickeymissingexception.php b/apps/encryption/lib/exceptions/publickeymissingexception.php
new file mode 100644
index 00000000000..9638c28e427
--- /dev/null
+++ b/apps/encryption/lib/exceptions/publickeymissingexception.php
@@ -0,0 +1,20 @@
+<?php
+
+
+namespace OCA\Encryption\Exceptions;
+
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class PublicKeyMissingException extends GenericEncryptionException {
+
+	/**
+	 * @param string $userId
+	 */
+	public function __construct($userId) {
+		if(empty($userId)) {
+			$userId = "<no-user-id-given>";
+		}
+		parent::__construct("Public Key missing for user: $userId");
+	}
+
+}
diff --git a/apps/encryption/lib/keymanager.php b/apps/encryption/lib/keymanager.php
index c7e0f2617f5..d2659f55a77 100644
--- a/apps/encryption/lib/keymanager.php
+++ b/apps/encryption/lib/keymanager.php
@@ -4,7 +4,7 @@ namespace OCA\Encryption;
 
 use OC\Encryption\Exceptions\DecryptionFailedException;
 use OCA\Encryption\Exceptions\PrivateKeyMissingException;
-use OC\Encryption\Exceptions\PublicKeyMissingException;
+use OCA\Encryption\Exceptions\PublicKeyMissingException;
 use OCA\Encryption\Crypto\Crypt;
 use OCP\Encryption\Keys\IStorage;
 use OCP\IConfig;
@@ -301,7 +301,7 @@ class KeyManager {
 		if (strlen($privateKey) !== 0) {
 			return $privateKey;
 		}
-		throw new PrivateKeyMissingException();
+		throw new PrivateKeyMissingException($userId);
 	}
 
 	/**
@@ -393,7 +393,7 @@ class KeyManager {
 		if (strlen($publicKey) !== 0) {
 			return $publicKey;
 		}
-		throw new PublicKeyMissingException();
+		throw new PublicKeyMissingException($userId);
 	}
 
 	public function getPublicShareKeyId() {
@@ -496,7 +496,7 @@ class KeyManager {
 		if (!empty($accessList['public'])) {
 			$publicShareKey = $this->getPublicShareKey();
 			if (empty($publicShareKey)) {
-				throw new PublicKeyMissingException();
+				throw new PublicKeyMissingException($this->getPublicShareKeyId());
 			}
 			$publicKeys[$this->getPublicShareKeyId()] = $publicShareKey;
 		}
diff --git a/apps/encryption/lib/session.php b/apps/encryption/lib/session.php
index 5e973913769..82c7829ecbd 100644
--- a/apps/encryption/lib/session.php
+++ b/apps/encryption/lib/session.php
@@ -70,7 +70,7 @@ class Session {
 	public function getPrivateKey() {
 		$key = $this->session->get('privateKey');
 		if (is_null($key)) {
-			throw new Exceptions\PrivateKeyMissingException('no private key stored in session');
+			throw new Exceptions\PrivateKeyMissingException('no private key stored in session', 0);
 		}
 		return $key;
 	}
diff --git a/lib/private/connector/sabre/file.php b/lib/private/connector/sabre/file.php
index a436973ba91..f6f5daf2074 100644
--- a/lib/private/connector/sabre/file.php
+++ b/lib/private/connector/sabre/file.php
@@ -35,7 +35,7 @@
 
 namespace OC\Connector\Sabre;
 
-use OC\Encryption\Exceptions\GenericEncryptionException;
+use OCP\Encryption\Exceptions\GenericEncryptionException;
 
 class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
 
@@ -184,7 +184,7 @@ class File extends \OC\Connector\Sabre\Node implements \Sabre\DAV\IFile {
 		//throw exception if encryption is disabled but files are still encrypted
 		try {
 			return $this->fileView->fopen(ltrim($this->path, '/'), 'rb');
-		} catch (\OCP\Encryption\Exception\EncryptionException $e) {
+		} catch (\OCP\Encryption\Exceptions\GenericEncryptionException $e) {
 			throw new \Sabre\DAV\Exception\Forbidden($e->getMessage());
 		} catch (\OCP\Files\StorageNotAvailableException $e) {
 			throw new \Sabre\DAV\Exception\ServiceUnavailable("Failed to open file: ".$e->getMessage());
diff --git a/lib/private/encryption/exceptions/decryptionfailedexception.php b/lib/private/encryption/exceptions/decryptionfailedexception.php
index 43fea90fed8..f8b4fdf07fa 100644
--- a/lib/private/encryption/exceptions/decryptionfailedexception.php
+++ b/lib/private/encryption/exceptions/decryptionfailedexception.php
@@ -22,6 +22,7 @@
 
 namespace OC\Encryption\Exceptions;
 
+use OCP\Encryption\Exceptions\GenericEncryptionException;
 
 class DecryptionFailedException extends GenericEncryptionException {
 
diff --git a/lib/private/encryption/exceptions/emptyencryptiondataexception.php b/lib/private/encryption/exceptions/emptyencryptiondataexception.php
index ea181809856..d3dc9230047 100644
--- a/lib/private/encryption/exceptions/emptyencryptiondataexception.php
+++ b/lib/private/encryption/exceptions/emptyencryptiondataexception.php
@@ -22,6 +22,7 @@
 
 namespace OC\Encryption\Exceptions;
 
+use OCP\Encryption\Exceptions\GenericEncryptionException;
 
 class EmptyEncryptionDataException extends GenericEncryptionException{
 
diff --git a/lib/private/encryption/exceptions/encryptionfailedexception.php b/lib/private/encryption/exceptions/encryptionfailedexception.php
index 9e6648f7bf5..ac489c73254 100644
--- a/lib/private/encryption/exceptions/encryptionfailedexception.php
+++ b/lib/private/encryption/exceptions/encryptionfailedexception.php
@@ -22,6 +22,7 @@
 
 namespace OC\Encryption\Exceptions;
 
+use OCP\Encryption\Exceptions\GenericEncryptionException;
 
 class EncryptionFailedException extends GenericEncryptionException{
 
diff --git a/lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php b/lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php
index 23103b90c4f..5e8e48efd78 100644
--- a/lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php
+++ b/lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php
@@ -23,11 +23,14 @@
 
 namespace OC\Encryption\Exceptions;
 
+use OCP\Encryption\Exceptions\GenericEncryptionException;
 
-class EncryptionHeaderKeyExistsException extends \Exception {
-
-}
-
-class EncryptionHeaderToLargeException extends \Exception {
+class EncryptionHeaderKeyExistsException extends GenericEncryptionException {
 
+	/**
+	 * @param string $key
+	 */
+	public function __construct($key) {
+		parent::__construct('header key "'. $key . '" already reserved by ownCloud');
+	}
 }
diff --git a/lib/private/encryption/exceptions/encryptionheadertolargeexception.php b/lib/private/encryption/exceptions/encryptionheadertolargeexception.php
index cc980aa4beb..94a130d792d 100644
--- a/lib/private/encryption/exceptions/encryptionheadertolargeexception.php
+++ b/lib/private/encryption/exceptions/encryptionheadertolargeexception.php
@@ -22,7 +22,12 @@
 
 namespace OC\Encryption\Exceptions;
 
+use OCP\Encryption\Exceptions\GenericEncryptionException;
 
 class EncryptionHeaderToLargeException extends GenericEncryptionException {
 
+	public function __construct($key) {
+		parent::__construct('max header size exceeded');
+	}
+
 }
diff --git a/lib/private/encryption/exceptions/modulealreadyexistsexception.php b/lib/private/encryption/exceptions/modulealreadyexistsexception.php
index 41fc0188e24..fa1e70a5c36 100644
--- a/lib/private/encryption/exceptions/modulealreadyexistsexception.php
+++ b/lib/private/encryption/exceptions/modulealreadyexistsexception.php
@@ -23,6 +23,16 @@
 
 namespace OC\Encryption\Exceptions;
 
-class ModuleAlreadyExistsException extends \Exception {
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class ModuleAlreadyExistsException extends GenericEncryptionException {
+
+	/**
+	 * @param string $id
+	 * @param string $name
+	 */
+	public function __construct($id, $name) {
+		parent::__construct('Id "' . $id . '" already used by encryption module "' . $name . '"');
+	}
 
 }
diff --git a/lib/private/encryption/exceptions/moduledoesnotexistsexception.php b/lib/private/encryption/exceptions/moduledoesnotexistsexception.php
index 5507bd03dab..2c699e8dc2d 100644
--- a/lib/private/encryption/exceptions/moduledoesnotexistsexception.php
+++ b/lib/private/encryption/exceptions/moduledoesnotexistsexception.php
@@ -23,6 +23,8 @@
 
 namespace OC\Encryption\Exceptions;
 
-class ModuleDoesNotExistsException extends \Exception {
+use OCP\Encryption\Exceptions\GenericEncryptionException;
+
+class ModuleDoesNotExistsException extends GenericEncryptionException {
 
 }
diff --git a/lib/private/encryption/exceptions/publickeymissingexception.php b/lib/private/encryption/exceptions/publickeymissingexception.php
deleted file mode 100644
index d5f2aae42cc..00000000000
--- a/lib/private/encryption/exceptions/publickeymissingexception.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-/**
- * @author Clark Tomlinson  <clark@owncloud.com>
- * @since 2/25/15, 9:39 AM
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program.  If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-
-namespace OC\Encryption\Exceptions;
-
-
-class PublicKeyMissingException extends GenericEncryptionException {
-
-}
diff --git a/lib/private/encryption/exceptions/unexpectedblocksizeexception.php b/lib/private/encryption/exceptions/unexpectedblocksizeexception.php
deleted file mode 100644
index 799d08e6bab..00000000000
--- a/lib/private/encryption/exceptions/unexpectedblocksizeexception.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-  /**
- * @author Clark Tomlinson  <clark@owncloud.com>
- * @since 2/25/15, 9:35 AM
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program.  If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-
-namespace OC\Encryption\Exceptions;
-
-
-interface UnexpectedBlockSize {
-
-}
diff --git a/lib/private/encryption/exceptions/unexpectedendofencryptionheaderexception.php b/lib/private/encryption/exceptions/unexpectedendofencryptionheaderexception.php
deleted file mode 100644
index 04f65cf7626..00000000000
--- a/lib/private/encryption/exceptions/unexpectedendofencryptionheaderexception.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-  /**
- * @author Clark Tomlinson  <clark@owncloud.com>
- * @since 2/25/15, 9:34 AM
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program.  If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-
-namespace OC\Encryption\Exceptions;
-
-
-class UnexpectedEndOfEncryptionHeaderException extends GenericEncryptionException {
-
-}
diff --git a/lib/private/encryption/exceptions/unknowncipherexception.php b/lib/private/encryption/exceptions/unknowncipherexception.php
index 5177af6106b..188f7403848 100644
--- a/lib/private/encryption/exceptions/unknowncipherexception.php
+++ b/lib/private/encryption/exceptions/unknowncipherexception.php
@@ -22,7 +22,8 @@
 
 namespace OC\Encryption\Exceptions;
 
+use OCP\Encryption\Exceptions\GenericEncryptionException;
 
-class UnknownCipherException extends GenericEncryptionException{
+class UnknownCipherException extends GenericEncryptionException {
 
 }
diff --git a/lib/private/encryption/keys/storage.php b/lib/private/encryption/keys/storage.php
index 82753df1dc7..e4e3fb084f3 100644
--- a/lib/private/encryption/keys/storage.php
+++ b/lib/private/encryption/keys/storage.php
@@ -23,9 +23,9 @@
 
 namespace OC\Encryption\Keys;
 
-use OC\Encryption\Exceptions\GenericEncryptionException;
 use OC\Encryption\Util;
 use OC\Files\View;
+use OCP\Encryption\Exceptions\GenericEncryptionException;
 
 class Storage implements \OCP\Encryption\Keys\IStorage {
 
@@ -259,7 +259,7 @@ class Storage implements \OCP\Encryption\Keys\IStorage {
 	private function getFileKeyDir($path) {
 
 		if ($this->view->is_dir($path)) {
-			throw new GenericEncryptionException('file was expected but directory was given');
+			throw new GenericEncryptionException("file was expected but directory was given: $path");
 		}
 
 		list($owner, $filename) = $this->util->getUidAndFilename($path);
diff --git a/lib/private/encryption/manager.php b/lib/private/encryption/manager.php
index 77f02b0c489..f8ac174479e 100644
--- a/lib/private/encryption/manager.php
+++ b/lib/private/encryption/manager.php
@@ -70,8 +70,7 @@ class Manager implements \OCP\Encryption\IManager {
 		$name = $module->getDisplayName();
 
 		if (isset($this->encryptionModules[$id])) {
-			$message = 'Id "' . $id . '" already used by encryption module "' . $name . '"';
-			throw new Exceptions\ModuleAlreadyExistsException($message);
+			throw new Exceptions\ModuleAlreadyExistsException($id, $name);
 		}
 
 		$defaultEncryptionModuleId = $this->getDefaultEncryptionModuleId();
diff --git a/lib/private/encryption/util.php b/lib/private/encryption/util.php
index 1183e6622bb..e2c7fa26e66 100644
--- a/lib/private/encryption/util.php
+++ b/lib/private/encryption/util.php
@@ -147,14 +147,14 @@ class Util {
 		$header = self::HEADER_START . ':' . self::HEADER_ENCRYPTION_MODULE_KEY . ':' . $encryptionModule->getId() . ':';
 		foreach ($headerData as $key => $value) {
 			if (in_array($key, $this->ocHeaderKeys)) {
-				throw new EncryptionHeaderKeyExistsException('header key "'. $key . '" already reserved by ownCloud');
+				throw new EncryptionHeaderKeyExistsException($key);
 			}
 			$header .= $key . ':' . $value . ':';
 		}
 		$header .= self::HEADER_END;
 
 		if (strlen($header) > $this->getHeaderSize()) {
-			throw new EncryptionHeaderToLargeException('max header size exceeded');
+			throw new EncryptionHeaderToLargeException();
 		}
 
 		$paddedHeader = str_pad($header, $this->headerSize, self::HEADER_PADDING_CHAR, STR_PAD_RIGHT);
diff --git a/lib/private/encryption/exceptions/genericencryptionexception.php b/lib/public/encryption/exceptions/genericencryptionexception.php
similarity index 76%
rename from lib/private/encryption/exceptions/genericencryptionexception.php
rename to lib/public/encryption/exceptions/genericencryptionexception.php
index 608e5e6010a..b7addd3b0c1 100644
--- a/lib/private/encryption/exceptions/genericencryptionexception.php
+++ b/lib/public/encryption/exceptions/genericencryptionexception.php
@@ -19,9 +19,16 @@
  *
  */
 
-namespace OC\Encryption\Exceptions;
+namespace OCP\Encryption\Exceptions;
 
 
 class GenericEncryptionException extends \Exception {
 
+	public function __construct($message = "", $code = 0, \Exception $previous = null) {
+		if (empty($message)) {
+			$message = 'Unspecified encryption exception';
+		}
+		parent::__construct($message, $code, $previous);
+	}
+
 }
-- 
GitLab