diff --git a/controller/internalcontroller.php b/controller/internalcontroller.php index 6b92c698..79c9cf26 100644 --- a/controller/internalcontroller.php +++ b/controller/internalcontroller.php @@ -11,23 +11,28 @@ namespace OCA\Passman\Controller; +use OCA\Passman\Service\CredentialService; +use OCP\App\IAppManager; +use OCP\AppFramework\ApiController; +use OCP\AppFramework\Http\JSONResponse; use OCP\IConfig; use OCP\IRequest; -use OCP\AppFramework\Http\JSONResponse; -use OCP\AppFramework\ApiController; -use OCA\Passman\Service\CredentialService; -use \OCP\App; +use OCP\Notification\IManager; class InternalController extends ApiController { private $userId; private $credentialService; private $config; + private $manager; + private $appManager; public function __construct($AppName, - IRequest $request, - $UserId, - CredentialService $credentialService, - IConfig $config + IRequest $request, + $UserId, + CredentialService $credentialService, + IConfig $config, + IManager $IManager, + IAppManager $appManager ) { parent::__construct( $AppName, @@ -38,6 +43,8 @@ class InternalController extends ApiController { $this->userId = $UserId; $this->credentialService = $credentialService; $this->config = $config; + $this->manager = $IManager; + $this->appManager = $appManager; } /** @@ -45,16 +52,15 @@ class InternalController extends ApiController { */ public function remind($credential_id) { $credential = $this->credentialService->getCredentialById($credential_id, $this->userId); - if($credential) { + if ($credential) { $credential->setExpireTime(time() + (24 * 60 * 60)); $this->credentialService->upd($credential); - $manager = \OC::$server->getNotificationManager(); - $notification = $manager->createNotification(); + $notification = $this->manager->createNotification(); $notification->setApp('passman') ->setObject('credential', $credential_id) ->setUser($this->userId); - $manager->markProcessed($notification); + $this->manager->markProcessed($notification); } } @@ -62,18 +68,16 @@ class InternalController extends ApiController { * @NoAdminRequired */ public function read($credential_id) { - $credential = $this->credentialService->getCredentialById($credential_id, $this->userId); - if($credential) { + if ($credential) { $credential->setExpireTime(0); $this->credentialService->upd($credential); - $manager = \OC::$server->getNotificationManager(); - $notification = $manager->createNotification(); + $notification = $this->manager->createNotification(); $notification->setApp('passman') ->setObject('credential', $credential_id) ->setUser($this->userId); - $manager->markProcessed($notification); + $this->manager->markProcessed($notification); } } @@ -82,15 +86,14 @@ class InternalController extends ApiController { * @NoCSRFRequired */ public function getAppVersion() { - $AppInstance = new App(); - return new JSONResponse(array('version' => $AppInstance->getAppInfo("passman")["version"])); + return new JSONResponse(array('version' => $this->appManager->getAppInfo('passman')["version"])); } /** * @NoAdminRequired */ public function generatePerson() { - $context = [ 'http' => [ 'method' => 'GET' ], 'ssl' => [ 'verify_peer' => false, 'allow_self_signed'=> true ] ]; + $context = ['http' => ['method' => 'GET'], 'ssl' => ['verify_peer' => false, 'allow_self_signed' => true]]; $context = stream_context_create($context); $random_person = json_decode(file_get_contents('http://api.namefake.com/', false, $context)); return new JSONResponse($random_person); @@ -122,4 +125,4 @@ class InternalController extends ApiController { $this->config->setAppValue('passman', $key, $value); } -} \ No newline at end of file +} diff --git a/controller/sharecontroller.php b/controller/sharecontroller.php index d27c185f..ed88eef3 100644 --- a/controller/sharecontroller.php +++ b/controller/sharecontroller.php @@ -31,6 +31,7 @@ use OCP\IUserManager; use OCA\Passman\Service\VaultService; use OCA\Passman\Service\ActivityService; use OCA\Passman\Activity; +use OCP\Notification\IManager; class ShareController extends ApiController { @@ -44,6 +45,7 @@ class ShareController extends ApiController { private $notificationService; private $fileService; private $settings; + private $manager; private $limit = 50; private $offset = 0; @@ -59,7 +61,8 @@ class ShareController extends ApiController { CredentialService $credentialService, NotificationService $notificationService, FileService $fileService, - SettingsService $config + SettingsService $config, + IManager $IManager ) { parent::__construct( $AppName, @@ -78,6 +81,7 @@ class ShareController extends ApiController { $this->notificationService = $notificationService; $this->fileService = $fileService; $this->settings = $config; + $this->manager = $IManager; } @@ -232,19 +236,19 @@ class ShareController extends ApiController { } try { - $sr = array_pop($this->shareService->getPendingShareRequestsForCredential($item_guid, $user_id)); + $shareRequests = $this->shareService->getPendingShareRequestsForCredential($item_guid, $user_id); + $sr = array_pop($shareRequests); } catch (\Exception $e) { // no need to catch this } if ($sr) { $this->shareService->cleanItemRequestsForUser($sr); - $manager = \OC::$server->getNotificationManager(); - $notification = $manager->createNotification(); + $notification = $this->manager->createNotification(); $notification->setApp('passman') ->setObject('passman_share_request', $sr->getId()) ->setUser($user_id); - $manager->markProcessed($notification); + $this->manager->markProcessed($notification); } if ($acl) { $this->shareService->deleteShareACL($acl); @@ -292,12 +296,11 @@ class ShareController extends ApiController { return new NotFoundResponse(); } - $manager = \OC::$server->getNotificationManager(); - $notification = $manager->createNotification(); + $notification = $this->manager->createNotification(); $notification->setApp('passman') ->setObject('passman_share_request', $sr->getId()) ->setUser($this->userId->getUID()); - $manager->markProcessed($notification); + $this->manager->markProcessed($notification); $notification = array( 'from_user' => ucfirst($this->userId->getDisplayName()), @@ -383,12 +386,11 @@ class ShareController extends ApiController { ); - $manager = \OC::$server->getNotificationManager(); - $notification = $manager->createNotification(); + $notification = $this->manager->createNotification(); $notification->setApp('passman') ->setObject('passman_share_request', $share_request_id) ->setUser($this->userId->getUID()); - $manager->markProcessed($notification); + $this->manager->markProcessed($notification); $this->shareService->cleanItemRequestsForUser($sr); return new JSONResponse(array('result' => true)); @@ -508,4 +510,4 @@ class ShareController extends ApiController { } } -} \ No newline at end of file +} diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 5ce37d99..c9cc0819 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -93,7 +93,8 @@ class Application extends App implements IBootstrap { $c->get(CredentialService::class), $c->get(NotificationService::class), $c->get(FileService::class), - $c->get(SettingsService::class) + $c->get(SettingsService::class), + $c->get(IManager::class) ); }); diff --git a/lib/Db/CredentialMapper.php b/lib/Db/CredentialMapper.php index 2ae6e8e3..413d288d 100644 --- a/lib/Db/CredentialMapper.php +++ b/lib/Db/CredentialMapper.php @@ -24,14 +24,19 @@ namespace OCA\Passman\Db; use OCA\Passman\Utility\Utils; +use OCP\AppFramework\Db\DoesNotExistException; +use OCP\AppFramework\Db\Entity; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\AppFramework\Db\QBMapper; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; -use OCP\AppFramework\Db\Mapper; -class CredentialMapper extends Mapper { - private $utils; +class CredentialMapper extends QBMapper { + const TABLE_NAME = 'passman_credentials'; + private Utils $utils; public function __construct(IDBConnection $db, Utils $utils) { - parent::__construct($db, 'passman_credentials'); + parent::__construct($db, self::TABLE_NAME); $this->utils = $utils; } @@ -39,74 +44,106 @@ class CredentialMapper extends Mapper { /** * Obtains the credentials by vault id (not guid) * - * @throws \OCP\AppFramework\Db\DoesNotExistException if not found - * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result + * @param string $vault_id + * @param string $user_id * @return Credential[] */ - public function getCredentialsByVaultId($vault_id, $user_id) { - $sql = 'SELECT * FROM `*PREFIX*passman_credentials` ' . - 'WHERE `user_id` = ? and vault_id = ?'; - return $this->findEntities($sql, [$user_id, $vault_id]); + public function getCredentialsByVaultId(string $vault_id, string $user_id) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))) + ->andWhere($qb->expr()->eq('vault_id', $qb->createNamedParameter($vault_id, IQueryBuilder::PARAM_STR))); + + /** @var Credential[] $credentials */ + $credentials = $this->findEntities($qb); + return $credentials; } /** - * Get a random credentail from a vault + * Get a random credential from a vault * - * @param $vault_id - * @param $user_id - * @return Credential + * @param string $vault_id + * @param string $user_id + * @return Credential[] */ - public function getRandomCredentialByVaultId($vault_id, $user_id) { - $sql = 'SELECT * FROM `*PREFIX*passman_credentials` ' . - 'WHERE `user_id` = ? and vault_id = ? AND shared_key is NULL LIMIT 20'; - $entities = $this->findEntities($sql, [$user_id, $vault_id]); + public function getRandomCredentialByVaultId(string $vault_id, string $user_id) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))) + ->andWhere($qb->expr()->eq('vault_id', $qb->createNamedParameter($vault_id, IQueryBuilder::PARAM_STR))) + ->andWhere($qb->expr()->isNull('shared_key')) + ->setMaxResults(20); + + $entities = $this->findEntities($qb); $count = count($entities) - 1; - $entities = array_splice($entities, rand(0, $count), 1); - return $entities; + + /** @var Credential[] $entity */ + $entity = array_splice($entities, rand(0, $count), 1); + return $entity; } /** * Get expired credentials * - * @param $timestamp + * @param int $timestamp * @return Credential[] */ - public function getExpiredCredentials($timestamp) { - $sql = 'SELECT * FROM `*PREFIX*passman_credentials` ' . - 'WHERE `expire_time` > 0 AND `expire_time` < ?'; - return $this->findEntities($sql, [$timestamp]); + public function getExpiredCredentials(int $timestamp) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->gt('expire_time', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))) + ->andWhere($qb->expr()->lt('expire_time', $qb->createNamedParameter($timestamp, IQueryBuilder::PARAM_INT))); + + /** @var Credential[] $credentials */ + $credentials = $this->findEntities($qb); + return $credentials; } /** * Get an credential by id. * Optional user id * - * @param $credential_id - * @param null $user_id + * @param int $credential_id + * @param string|null $user_id * @return Credential + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getCredentialById($credential_id, $user_id = null) { - $sql = 'SELECT * FROM `*PREFIX*passman_credentials` ' . - 'WHERE `id` = ?'; - // If we want to check the owner, add it to the query - $params = [$credential_id]; + public function getCredentialById(int $credential_id, string $user_id = null) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('id', $qb->createNamedParameter($credential_id, IQueryBuilder::PARAM_INT))); + if ($user_id !== null) { - $sql .= ' and `user_id` = ? '; - array_push($params, $user_id); + $qb->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); } - return $this->findEntity($sql, $params); + + /** @var Credential $credential */ + $credential = $this->findEntity($qb); + return $credential; } /** * Get credential label by id * - * @param $credential_id + * @param int $credential_id * @return Credential + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getCredentialLabelById($credential_id) { - $sql = 'SELECT id, label FROM `*PREFIX*passman_credentials` ' . - 'WHERE `id` = ? '; - return $this->findEntity($sql, [$credential_id]); + public function getCredentialLabelById(int $credential_id) { + $qb = $this->db->getQueryBuilder(); + $qb->select(['id', 'label']) + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('id', $qb->createNamedParameter($credential_id, IQueryBuilder::PARAM_INT))); + + /** @var Credential $credential */ + $credential = $this->findEntity($qb); + return $credential; } /** @@ -146,13 +183,13 @@ class CredentialMapper extends Mapper { } /** - * Update a credential - * * @param $raw_credential array An array containing all the credential fields * @param $useRawUser bool - * @return Credential The updated credential + * @return Credential|Entity The updated credential + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function updateCredential($raw_credential, $useRawUser) { + public function updateCredential($raw_credential, bool $useRawUser) { $original = $this->getCredentialByGUID($raw_credential['guid']); $uid = ($useRawUser) ? $raw_credential['user_id'] : $original->getUserId(); @@ -197,16 +234,24 @@ class CredentialMapper extends Mapper { /** * Finds a credential by the given guid * - * @param $credential_guid + * @param string $credential_guid + * @param string|null $user_id * @return Credential + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getCredentialByGUID($credential_guid, $user_id = null) { - $q = 'SELECT * FROM `*PREFIX*passman_credentials` WHERE guid = ? '; - $params = [$credential_guid]; + public function getCredentialByGUID(string $credential_guid, string $user_id = null) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('guid', $qb->createNamedParameter($credential_guid, IQueryBuilder::PARAM_STR))); + if ($user_id !== null) { - $q .= ' and `user_id` = ? '; - array_push($params, $user_id); + $qb->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); } - return $this->findEntity($q, $params); + + /** @var Credential $credential */ + $credential = $this->findEntity($qb); + return $credential; } -} \ No newline at end of file +} diff --git a/lib/Db/CredentialRevisionMapper.php b/lib/Db/CredentialRevisionMapper.php index a22f5d1b..590434d2 100644 --- a/lib/Db/CredentialRevisionMapper.php +++ b/lib/Db/CredentialRevisionMapper.php @@ -24,49 +24,64 @@ namespace OCA\Passman\Db; use OCA\Passman\Utility\Utils; +use OCP\AppFramework\Db\DoesNotExistException; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\AppFramework\Db\QBMapper; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; -use OCP\AppFramework\Db\Mapper; -class CredentialRevisionMapper extends Mapper { - private $utils; +class CredentialRevisionMapper extends QBMapper { + const TABLE_NAME = 'passman_revisions'; + private Utils $utils; public function __construct(IDBConnection $db, Utils $utils) { - parent::__construct($db, 'passman_revisions'); + parent::__construct($db, self::TABLE_NAME); $this->utils = $utils; } /** * Get revisions from a credential - * @throws \OCP\AppFramework\Db\DoesNotExistException if not found - * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result + * + * @param int $credential_id + * @param string|null $user_id * @return CredentialRevision[] */ - public function getRevisions($credential_id, $user_id = null) { - $sql = 'SELECT * FROM `*PREFIX*passman_revisions` ' . - 'WHERE `credential_id` = ?'; - $params = [$credential_id]; - if ($user_id !== null) { - $sql.= ' and `user_id` = ? '; - $params[] = $user_id; - } - return $this->findEntities($sql, $params); + public function getRevisions(int $credential_id, string $user_id = null) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('credential_id', $qb->createNamedParameter($credential_id, IQueryBuilder::PARAM_INT))); + + if ($user_id !== null) { + $qb->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); + } + + /** @var CredentialRevision[] $credentialRevisions */ + $credentialRevisions = $this->findEntities($qb); + return $credentialRevisions; } /** - * @throws \OCP\AppFramework\Db\DoesNotExistException if not found - * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result + * @param int $revision_id + * @param string|null $user_id * @return CredentialRevision + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getRevision($revision_id, $user_id = null) { - $sql = 'SELECT * FROM `*PREFIX*passman_revisions` ' . - 'WHERE `id` = ?'; - $params = [$revision_id]; - if ($user_id !== null) { - $sql.= ' and `user_id` = ? '; - $params[] = $user_id; - } - return $this->findEntity($sql, $params); + public function getRevision(int $revision_id, string $user_id = null) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('id', $qb->createNamedParameter($revision_id, IQueryBuilder::PARAM_INT))); + + if ($user_id !== null) { + $qb->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); + } + + /** @var CredentialRevision $credentialRevision */ + $credentialRevision = $this->findEntity($qb); + return $credentialRevision; } /** @@ -101,4 +116,4 @@ class CredentialRevisionMapper extends Mapper { $revision->setUserId($user_id); return $this->delete($revision); } -} \ No newline at end of file +} diff --git a/lib/Db/DeleteVaultRequestMapper.php b/lib/Db/DeleteVaultRequestMapper.php index a43fe78f..585780d4 100644 --- a/lib/Db/DeleteVaultRequestMapper.php +++ b/lib/Db/DeleteVaultRequestMapper.php @@ -24,13 +24,14 @@ namespace OCA\Passman\Db; -use Icewind\SMB\Share; -use OCA\Passman\Utility\Utils; use OCP\AppFramework\Db\DoesNotExistException; -use OCP\AppFramework\Db\Mapper; +use OCP\AppFramework\Db\Entity; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\AppFramework\Db\QBMapper; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; -class DeleteVaultRequestMapper extends Mapper { +class DeleteVaultRequestMapper extends QBMapper { const TABLE_NAME = 'passman_delete_vault_request'; public function __construct(IDBConnection $db) { @@ -40,38 +41,47 @@ class DeleteVaultRequestMapper extends Mapper { /** * Create a new enty in the db * @param DeleteVaultRequest $request - * @return \OCP\AppFramework\Db\Entity + * @return Entity */ - public function createRequest(DeleteVaultRequest $request){ + public function createRequest(DeleteVaultRequest $request) { return $this->insert($request); } /** * Get all delete requests - * @return \OCP\AppFramework\Db\Entity + * @return Entity[] */ - public function getDeleteRequests(){ - $q = "SELECT * FROM *PREFIX*" . self::TABLE_NAME; - return $this->findEntities($q); + public function getDeleteRequests() { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME); + + return $this->findEntities($qb); } /** - * Get request for an vault id - * @param $vault_id integer The vault id - * @return \OCP\AppFramework\Db\Entity + * Get request for a vault guid + * @param string $vault_guid + * @return Entity + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getDeleteRequestsForVault($vault_guid){ - $q = "SELECT * FROM *PREFIX*" . self::TABLE_NAME .' WHERE `vault_guid` = ?'; - return $this->findEntity($q, [$vault_guid]); + public function getDeleteRequestsForVault(string $vault_guid) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('vault_guid', $qb->createNamedParameter($vault_guid, IQueryBuilder::PARAM_STR))); + + return $this->findEntity($qb); } /** * Deletes the given delete request - * @param DeleteVaultRequest $request Request to delete - * @return DeleteVaultRequest The deleted request + * @param DeleteVaultRequest $request Request to delete + * @return DeleteVaultRequest The deleted request */ - public function removeDeleteVaultRequest(DeleteVaultRequest $request){ + public function removeDeleteVaultRequest(DeleteVaultRequest $request) { return $this->delete($request); } -} \ No newline at end of file +} diff --git a/lib/Db/FileMapper.php b/lib/Db/FileMapper.php index b1e044d3..b197c45f 100644 --- a/lib/Db/FileMapper.php +++ b/lib/Db/FileMapper.php @@ -25,51 +25,65 @@ namespace OCA\Passman\Db; use OCA\Passman\Utility\Utils; +use OCP\AppFramework\Db\DoesNotExistException; +use OCP\AppFramework\Db\Entity; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\AppFramework\Db\QBMapper; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; -use OCP\AppFramework\Db\Mapper; -class FileMapper extends Mapper { - private $utils; +class FileMapper extends QBMapper { + const TABLE_NAME = 'passman_files'; + private Utils $utils; public function __construct(IDBConnection $db, Utils $utils) { - parent::__construct($db, 'passman_files'); + parent::__construct($db, self::TABLE_NAME); $this->utils = $utils; } /** - * @param $file_id - * @param null $user_id + * @param int $file_id + * @param string|null $user_id * @return File - * @throws \OCP\AppFramework\Db\DoesNotExistException if not found - * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getFile($file_id, $user_id = null) { - $sql = 'SELECT * FROM `*PREFIX*passman_files` ' . - 'WHERE `id` = ?'; - $params = [$file_id]; + public function getFile(int $file_id, string $user_id = null) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('id', $qb->createNamedParameter($file_id, IQueryBuilder::PARAM_INT))); + if ($user_id !== null) { - $sql .= ' and `user_id` = ? '; - array_push($params, $user_id); + $qb->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); } - return $this->findEntity($sql, $params); + + /** @var File $file */ + $file = $this->findEntity($qb); + return $file; } + /** - * @param $file_id - * @param null $user_id + * @param string $file_guid + * @param string|null $user_id * @return File - * @throws \OCP\AppFramework\Db\DoesNotExistException if not found - * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getFileByGuid($file_guid, $user_id = null) { - $sql = 'SELECT * FROM `*PREFIX*passman_files` ' . - 'WHERE `guid` = ?'; - $params = [$file_guid]; + public function getFileByGuid(string $file_guid, string $user_id = null) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('guid', $qb->createNamedParameter($file_guid, IQueryBuilder::PARAM_STR))); + if ($user_id !== null) { - $sql .= ' and `user_id` = ? '; - array_push($params, $user_id); + $qb->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); } - return $this->findEntity($sql, $params); + + /** @var File $file */ + $file = $this->findEntity($qb); + return $file; } /** @@ -87,21 +101,21 @@ class FileMapper extends Mapper { $file->setFileData($file_raw['file_data']); $file->setMimetype($file_raw['mimetype']); - return $this->insert($file); } /** * Delete a file by file_id and user id - * @param $file_id - * @param $userId - * @return File + * + * @param int $file_id + * @param string $userId + * @return File|Entity */ - public function deleteFile($file_id, $userId) { + public function deleteFile(int $file_id, string $userId) { $file = new File(); $file->setId($file_id); $file->setUserId($userId); - $this->delete($file); + return $this->delete($file); } /** @@ -115,16 +129,17 @@ class FileMapper extends Mapper { /** - * @param $user_id + * @param string $user_id * @return File[] - * @throws \OCP\AppFramework\Db\DoesNotExistException if not found - * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result */ - public function getFilesFromUser($user_id) { - $sql = 'SELECT * FROM `*PREFIX*passman_files` ' . - 'WHERE `user_id` = ?'; - $params = [$user_id]; + public function getFilesFromUser(string $user_id) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); - return $this->findEntities($sql, $params); + /** @var File[] $files */ + $files = $this->findEntities($qb); + return $files; } -} \ No newline at end of file +} diff --git a/lib/Db/ShareRequestMapper.php b/lib/Db/ShareRequestMapper.php index 0660be0f..830a93cf 100644 --- a/lib/Db/ShareRequestMapper.php +++ b/lib/Db/ShareRequestMapper.php @@ -24,129 +24,194 @@ namespace OCA\Passman\Db; -use Icewind\SMB\Share; -use OCA\Passman\Utility\Utils; use OCP\AppFramework\Db\DoesNotExistException; -use OCP\AppFramework\Db\Mapper; +use OCP\AppFramework\Db\Entity; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\AppFramework\Db\QBMapper; +use OCP\DB\Exception; +use OCP\DB\IResult; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; -class ShareRequestMapper extends Mapper { - const TABLE_NAME = 'passman_share_request'; +class ShareRequestMapper extends QBMapper { + const TABLE_NAME = 'passman_share_request'; - public function __construct(IDBConnection $db) { - parent::__construct($db, self::TABLE_NAME); - } - - public function createRequest(ShareRequest $request){ - return $this->insert($request); - } - - /** - * Obtains a request by the given item and vault GUID pair - * @param $item_guid - * @param $target_vault_guid - * @return ShareRequest - */ - public function getRequestByItemAndVaultGuid($item_guid, $target_vault_guid){ - $q = "SELECT * FROM *PREFIX*" . self::TABLE_NAME . " WHERE item_guid = ? AND target_vault_guid = ?"; - return $this->findEntity($q, [$item_guid, $target_vault_guid]); - } - - /** - * Get shared items for the given item_guid - * @param $item_guid - * @return ShareRequest[] - */ - public function getRequestsByItemGuidGroupedByUser($item_guid){ - if (strtolower($this->db->getDatabasePlatform()->getName()) === 'mysql'){ - $this->db->executeQuery("SET sql_mode = '';"); - } - $q = "SELECT *, target_user_id FROM *PREFIX*" . self::TABLE_NAME . " WHERE item_guid = ? GROUP BY target_user_id;"; - return $this->findEntities($q, [$item_guid]); - } - - /** - * Deletes all pending requests for the given user to the given item - * @param $item_id The item ID - * @param $target_user_id The target user - * @return \PDOStatement The result of running the db query - */ - public function cleanItemRequestsForUser($item_id, $target_user_id){ - $q = "DELETE FROM *PREFIX*" . self::TABLE_NAME . " WHERE item_id = ? AND target_user_id = ?"; - $this->execute($q, [$item_id, $target_user_id]); - return $this->execute($q, [$item_id, $target_user_id]); - } - - /** - * Obtains all pending share requests for the given user ID - * @param $user_id - * @return ShareRequest[] - */ - public function getUserPendingRequests($user_id){ - $q = "SELECT * FROM *PREFIX*". self::TABLE_NAME ." WHERE target_user_id = ?"; - return $this->findEntities($q, [$user_id]); - } - - /** - * Deletes the given share request - * @param ShareRequest $shareRequest Request to delete - * @return ShareRequest The deleted request - */ - public function deleteShareRequest(ShareRequest $shareRequest){ - return $this->delete($shareRequest); + public function __construct(IDBConnection $db) { + parent::__construct($db, self::TABLE_NAME); } - /** - * Gets a share request by it's unique incremental id - * @param $id - * @return ShareRequest + /** + * @param ShareRequest $request + * @return ShareRequest|Entity + */ + public function createRequest(ShareRequest $request) { + return $this->insert($request); + } + + /** + * Obtains a request by the given item and vault GUID pair + * + * @param string $item_guid + * @param string $target_vault_guid + * @return ShareRequest * @throws DoesNotExistException - */ - public function getShareRequestById($id){ - $q = "SELECT * FROM *PREFIX*" . self::TABLE_NAME . " WHERE id = ?"; - return $this->findEntity($q, [$id]); + * @throws MultipleObjectsReturnedException + */ + public function getRequestByItemAndVaultGuid(string $item_guid, string $target_vault_guid) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('item_guid', $qb->createNamedParameter($item_guid, IQueryBuilder::PARAM_STR))) + ->andWhere($qb->expr()->eq('target_vault_guid', $qb->createNamedParameter($target_vault_guid, IQueryBuilder::PARAM_STR))); + + /** @var ShareRequest $shareRequest */ + $shareRequest = $this->findEntity($qb); + return $shareRequest; } - /** - * Gets all share requests by a given item GUID - * @param $item_guid - * @return ShareRequest[] - */ - public function getShareRequestsByItemGuid($item_guid){ - $q = "SELECT * FROM *PREFIX*" . self::TABLE_NAME . " WHERE item_guid = ?"; - return $this->findEntities($q, [$item_guid]); + /** + * Get shared items for the given item_guid + * + * @param string $item_guid + * @return ShareRequest[] + * @throws Exception + */ + public function getRequestsByItemGuidGroupedByUser(string $item_guid) { + if (strtolower($this->db->getDatabasePlatform()->getName()) === 'mysql') { + $this->db->executeQuery("SET sql_mode = '';"); + } + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('item_guid', $qb->createNamedParameter($item_guid, IQueryBuilder::PARAM_STR))) + ->groupBy('target_user_id'); + + /** @var ShareRequest[] $sharedRequests */ + $sharedRequests = $this->findEntities($qb); + return $sharedRequests; } - /** - * Updates the given share request, - * @param ShareRequest $shareRequest - * @return ShareRequest - */ - public function updateShareRequest(ShareRequest $shareRequest){ + /** + * Deletes all pending requests for the given user to the given item + * + * @param int $item_id + * @param string $target_user_id + * @return int|IResult + * @throws Exception + */ + public function cleanItemRequestsForUser(int $item_id, string $target_user_id) { + $qb = $this->db->getQueryBuilder(); + return $qb->delete(self::TABLE_NAME) + ->where($qb->expr()->eq('item_id', $qb->createNamedParameter($item_id, IQueryBuilder::PARAM_INT))) + ->andWhere($qb->expr()->eq('target_user_id', $qb->createNamedParameter($target_user_id, IQueryBuilder::PARAM_STR))) + ->execute(); + } + + /** + * Obtains all pending share requests for the given user ID + * + * @param string $user_id + * @return ShareRequest[] + */ + public function getUserPendingRequests(string $user_id) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('target_user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); + + /** @var ShareRequest[] $shareRequests */ + $shareRequests = $this->findEntities($qb); + return $shareRequests; + } + + /** + * Deletes the given share request + * @param ShareRequest $shareRequest Request to delete + * @return ShareRequest The deleted request + */ + public function deleteShareRequest(ShareRequest $shareRequest) { + return $this->delete($shareRequest); + } + + /** + * Gets a share request by it's unique incremental id + * + * @param int $id + * @return ShareRequest + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException + */ + public function getShareRequestById(int $id) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT))); + + /** @var ShareRequest $shareRequest */ + $shareRequest = $this->findEntity($qb); + return $shareRequest; + } + + /** + * Gets all share requests by a given item GUID + * + * @param string $item_guid + * @return ShareRequest[] + */ + public function getShareRequestsByItemGuid(string $item_guid) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('item_guid', $qb->createNamedParameter($item_guid, IQueryBuilder::PARAM_STR))); + + /** @var ShareRequest[] $shareRequests */ + $shareRequests = $this->findEntities($qb); + return $shareRequests; + } + + /** + * Updates the given share request, + * @param ShareRequest $shareRequest + * @return ShareRequest + */ + public function updateShareRequest(ShareRequest $shareRequest) { return $this->update($shareRequest); } - /** - * Finds pending requests sent to the given user to the given item. - * @param $item_guid - * @param $user_id - * @return ShareRequest[] - */ - public function getPendingShareRequests($item_guid, $user_id){ - $q = "SELECT * FROM *PREFIX*" . self::TABLE_NAME . " WHERE item_guid = ? and target_user_id= ?"; - return $this->findEntities($q, [$item_guid, $user_id]); + /** + * Finds pending requests sent to the given user to the given item. + * + * @param string $item_guid + * @param string $user_id + * @return ShareRequest[] + */ + public function getPendingShareRequests(string $item_guid, string $user_id) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('item_guid', $qb->createNamedParameter($item_guid, IQueryBuilder::PARAM_STR))) + ->andWhere($qb->expr()->eq('target_user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); + + /** @var ShareRequest[] $shareRequests */ + $shareRequests = $this->findEntities($qb); + return $shareRequests; } - /** - * Updates all pending requests with the given permissions - * @param $item_guid The item for which to update the requests - * @param $user_id The user for which to update the requests - * @param $permissions The new permissions to apply - * @return \PDOStatement The result of the operation - */ - public function updatePendingRequestPermissions($item_guid, $user_id, $permissions){ - $q = "UPDATE *PREFIX*" . self::TABLE_NAME . " SET permissions = ? WHERE item_guid = ? AND target_user_id = ?"; - return $this->execute($q, [$permissions, $item_guid, $user_id]); - } - -} \ No newline at end of file + /** + * Updates all pending requests with the given permissions + * + * @param string $item_guid The item for which to update the requests + * @param string $user_id The user for which to update the requests + * @param int $permissions The new permissions to apply + * @return int|IResult + * @throws Exception + */ + public function updatePendingRequestPermissions(string $item_guid, string $user_id, int $permissions) { + $qb = $this->db->getQueryBuilder(); + return $qb->update(self::TABLE_NAME) + ->set('permissions', $qb->createNamedParameter($permissions, IQueryBuilder::PARAM_INT)) + ->where($qb->expr()->eq('item_guid', $qb->createNamedParameter($item_guid, IQueryBuilder::PARAM_STR))) + ->andWhere($qb->expr()->eq('target_user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))) + ->execute(); + } +} diff --git a/lib/Db/SharingACLMapper.php b/lib/Db/SharingACLMapper.php index e251a0c4..d6ce4fc1 100644 --- a/lib/Db/SharingACLMapper.php +++ b/lib/Db/SharingACLMapper.php @@ -24,72 +24,104 @@ namespace OCA\Passman\Db; -use OCP\AppFramework\Db\Mapper; +use OCP\AppFramework\Db\DoesNotExistException; +use OCP\AppFramework\Db\Entity; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\AppFramework\Db\QBMapper; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; -use OCP\IUser; -use OCA\Passman\Utility\Utils; -class SharingACLMapper extends Mapper { - const TABLE_NAME = '*PREFIX*passman_sharing_acl'; +class SharingACLMapper extends QBMapper { + const TABLE_NAME = 'passman_sharing_acl'; - public function __construct(IDBConnection $db) { - parent::__construct($db, 'passman_sharing_acl'); - } - - public function createACLEntry(SharingACL $acl){ - return $this->insert($acl); - } - - /** - * Gets the currently accepted share requests from the given user for the given vault guid - * @param $user_id - * @param $vault_guid - * @return SharingACL[] - */ - public function getVaultEntries($user_id, $vault_guid) { - $q = "SELECT * FROM ". self::TABLE_NAME ." WHERE user_id = ? AND vault_guid = ?"; - return $this->findEntities($q, [$user_id, $vault_guid]); - } - - /** - * Gets the acl for a given item guid - * @param $user_id - * @param $item_guid - * @return SharingACL - */ - public function getItemACL($user_id, $item_guid) { - $q = "SELECT * FROM " . self::TABLE_NAME . " WHERE item_guid = ? AND "; - $filter = [$item_guid]; - $q .= ($user_id === null) ? 'user_id is null' : 'user_id = ? '; - if ($user_id !== null){ - $filter[] = $user_id; - } - - return $this->findEntity($q, $filter); - } - - /** - * Update the acl for a given item guid - * @param $user_id - * @param $item_guid - * @return SharingACL - */ - public function updateCredentialACL(SharingACL $sharingACL) { - return $this->update($sharingACL); - } - - /** - * Gets the currently accepted share requests from the given user for the given vault guid - * @param $user_id - * @param $vault_id - * @return SharingACL[] - */ - public function getCredentialAclList($item_guid) { - $q = "SELECT * FROM ". self::TABLE_NAME ." WHERE item_guid = ?"; - return $this->findEntities($q, [$item_guid]); - } - - public function deleteShareACL(SharingACL $ACL){ - return $this->delete($ACL); + public function __construct(IDBConnection $db) { + parent::__construct($db, 'passman_sharing_acl'); } -} \ No newline at end of file + + /** + * @param SharingACL $acl + * @return SharingACL|Entity + */ + public function createACLEntry(SharingACL $acl) { + return $this->insert($acl); + } + + /** + * Gets the currently accepted share requests from the given user for the given vault guid + * @param $user_id + * @param $vault_guid + * @return SharingACL[] + */ + public function getVaultEntries(string $user_id, string $vault_guid) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))) + ->andWhere($qb->expr()->eq('vault_guid', $qb->createNamedParameter($vault_guid, IQueryBuilder::PARAM_STR))); + + /** @var SharingACL[] $entities */ + $entities = $this->findEntities($qb); + return $entities; + } + + /** + * Gets the acl for a given item guid + * + * @param string $user_id + * @param string $item_guid + * @return SharingACL + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException + */ + public function getItemACL(string $user_id, string $item_guid) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('item_guid', $qb->createNamedParameter($item_guid, IQueryBuilder::PARAM_STR))); + + if ($user_id === null) { + $qb->andWhere($qb->expr()->isNull('user_id')); + } else { + $qb->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); + } + + /** @var SharingACL $entity */ + $entity = $this->findEntity($qb); + return $entity; + } + + /** + * Update an acl + * + * @param SharingACL $sharingACL + * @return SharingACL|Entity + */ + public function updateCredentialACL(SharingACL $sharingACL) { + return $this->update($sharingACL); + } + + /** + * Gets the currently accepted share requests from the given user for the given vault guid + * + * @param string $item_guid + * @return SharingACL[] + */ + public function getCredentialAclList(string $item_guid) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('item_guid', $qb->createNamedParameter($item_guid, IQueryBuilder::PARAM_STR))); + + /** @var SharingACL[] $entities */ + $entities = $this->findEntities($qb); + return $entities; + } + + /** + * @param SharingACL $ACL + * @return SharingACL|Entity + */ + public function deleteShareACL(SharingACL $ACL) { + return $this->delete($ACL); + } +} diff --git a/lib/Db/VaultMapper.php b/lib/Db/VaultMapper.php index 6844458c..81bedffc 100644 --- a/lib/Db/VaultMapper.php +++ b/lib/Db/VaultMapper.php @@ -24,61 +24,86 @@ namespace OCA\Passman\Db; use OCA\Passman\Utility\Utils; +use OCP\AppFramework\Db\DoesNotExistException; +use OCP\AppFramework\Db\Entity; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\AppFramework\Db\QBMapper; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; -use OCP\AppFramework\Db\Mapper; -class VaultMapper extends Mapper { - private $utils; +class VaultMapper extends QBMapper { + const TABLE_NAME = 'passman_vaults'; + private Utils $utils; + public function __construct(IDBConnection $db, Utils $utils) { - parent::__construct($db, 'passman_vaults'); + parent::__construct($db, self::TABLE_NAME); $this->utils = $utils; } /** - * @throws \OCP\AppFramework\Db\DoesNotExistException if not found - * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result + * @param int $vault_id + * @param string $user_id * @return Vault[] */ - public function find($vault_id, $user_id) { - $sql = 'SELECT * FROM `*PREFIX*passman_vaults` ' . - 'WHERE `id`= ? and `user_id` = ?'; - return $this->findEntities($sql, [$vault_id, $user_id]); + public function find(int $vault_id, string $user_id) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('id', $qb->createNamedParameter($vault_id, IQueryBuilder::PARAM_INT))) + ->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); + + /** @var Vault[] $vaults */ + $vaults = $this->findEntities($qb); + return $vaults; } + /** - * @throws \OCP\AppFramework\Db\DoesNotExistException if not found - * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result + * @param string $vault_guid + * @param string $user_id * @return Vault + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function findByGuid($vault_guid, $user_id) { - $sql = 'SELECT * FROM `*PREFIX*passman_vaults` ' . - 'WHERE `guid`= ? and `user_id` = ?'; - return $this->findEntity($sql, [$vault_guid, $user_id]); + public function findByGuid(string $vault_guid, string $user_id) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('guid', $qb->createNamedParameter($vault_guid, IQueryBuilder::PARAM_STR))) + ->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); + + /** @var Vault $vault */ + $vault = $this->findEntity($qb); + return $vault; } /** - * @throws \OCP\AppFramework\Db\DoesNotExistException if not found - * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException if more than one result + * @param string $user_id * @return Vault[] */ - public function findVaultsFromUser($userId){ - $sql = 'SELECT * FROM `*PREFIX*passman_vaults` ' . - 'WHERE `user_id` = ? '; - $params = [$userId]; - return $this->findEntities($sql, $params); + public function findVaultsFromUser(string $user_id) { + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('user_id', $qb->createNamedParameter($user_id, IQueryBuilder::PARAM_STR))); + + /** @var Vault[] $vaults */ + $vaults = $this->findEntities($qb); + return $vaults; } /** * Creates a vault - * @param $vault_name - * @param $userId - * @return Vault + * + * @param string $vault_name + * @param string $user_id + * @return Vault|Entity */ - public function create($vault_name, $userId){ + public function create(string $vault_name, string $user_id) { $vault = new Vault(); $vault->setName($vault_name); - $vault->setUserId($userId); + $vault->setUserId($user_id); $vault->setGuid($this->utils->GUID()); $vault->setCreated($this->utils->getTime()); $vault->setLastAccess(0); @@ -87,45 +112,52 @@ class VaultMapper extends Mapper { /** * Update last access time of a vault - * @param $vault_id - * @param $user_id + * + * @param int $vault_id + * @param string $user_id + * @return Vault|Entity */ - public function setLastAccess($vault_id, $user_id){ + public function setLastAccess(int $vault_id, string $user_id) { $vault = new Vault(); $vault->setId($vault_id); $vault->setUserId($user_id); $vault->setLastAccess(Utils::getTime()); - $this->update($vault); + return $this->update($vault); } /** * Update vault + * * @param Vault $vault + * @return Vault|Entity */ - public function updateVault(Vault $vault){ - $this->update($vault); + public function updateVault(Vault $vault) { + return $this->update($vault); } /** * Update the sharing key's - * @param $vault_id - * @param $privateKey - * @param $publicKey + * + * @param int $vault_id + * @param string $privateKey + * @param string $publicKey + * @return Vault|Entity */ - public function updateSharingKeys($vault_id, $privateKey, $publicKey){ + public function updateSharingKeys(int $vault_id, string $privateKey, string $publicKey) { $vault = new Vault(); $vault->setId($vault_id); $vault->setPrivateSharingKey($privateKey); $vault->setPublicSharingKey($publicKey); $vault->setSharingKeysGenerated($this->utils->getTime()); - $this->update($vault); + return $this->update($vault); } /** * Delete a vault + * * @param Vault $vault */ - public function deleteVault(Vault $vault){ + public function deleteVault(Vault $vault) { $this->delete($vault); } -} \ No newline at end of file +} diff --git a/lib/Service/CredentialRevisionService.php b/lib/Service/CredentialRevisionService.php index 284fff74..283c3657 100644 --- a/lib/Service/CredentialRevisionService.php +++ b/lib/Service/CredentialRevisionService.php @@ -24,22 +24,21 @@ namespace OCA\Passman\Service; use OCA\Passman\Db\CredentialRevision; -use OCP\IConfig; -use OCP\AppFramework\Db\DoesNotExistException; - use OCA\Passman\Db\CredentialRevisionMapper; +use OCP\AppFramework\Db\Entity; +use OCP\IConfig; class CredentialRevisionService { - private $credentialRevisionMapper; - private $encryptService; + private CredentialRevisionMapper $credentialRevisionMapper; + private EncryptService $encryptService; private $server_key; - public function __construct(CredentialRevisionMapper $credentialRevisionMapper, EncryptService $encryptService) { + public function __construct(CredentialRevisionMapper $credentialRevisionMapper, EncryptService $encryptService, IConfig $config) { $this->credentialRevisionMapper = $credentialRevisionMapper; $this->encryptService = $encryptService; - $this->server_key = \OC::$server->getConfig()->getSystemValue('passwordsalt', ''); + $this->server_key = $config->getSystemValue('passwordsalt', ''); } /** @@ -50,6 +49,7 @@ class CredentialRevisionService { * @param $credential_id * @param $edited_by * @return CredentialRevision + * @throws \Exception */ public function createRevision($credential, $userId, $credential_id, $edited_by) { $credential = $this->encryptService->encryptCredential($credential); @@ -59,11 +59,11 @@ class CredentialRevisionService { /** * Get revisions of a credential * - * @param $credential_id - * @param null $user_id + * @param int $credential_id + * @param string|null $user_id * @return CredentialRevision[] */ - public function getRevisions($credential_id, $user_id = null) { + public function getRevisions(int $credential_id, string $user_id = null) { $result = $this->credentialRevisionMapper->getRevisions($credential_id, $user_id); foreach ($result as $index => $revision) { $c = json_decode(base64_decode($revision->getCredentialData()), true); @@ -74,12 +74,11 @@ class CredentialRevisionService { } /** - * - * @param $credential_id - * @param null $user_id + * @param int $credential_id + * @param string|null $user_id * @return CredentialRevision */ - public function getRevision($credential_id, $user_id = null) { + public function getRevision(int $credential_id, string $user_id = null) { $revision = $this->credentialRevisionMapper->getRevision($credential_id, $user_id); $c = json_decode(base64_decode($revision->getCredentialData()), true); $revision->setCredentialData($this->encryptService->decryptCredential($c)); @@ -89,11 +88,11 @@ class CredentialRevisionService { /** * Delete a revision * - * @param $revision_id - * @param $user_id + * @param int $revision_id + * @param string $user_id * @return CredentialRevision */ - public function deleteRevision($revision_id, $user_id) { + public function deleteRevision(int $revision_id, string $user_id) { return $this->credentialRevisionMapper->deleteRevision($revision_id, $user_id); } @@ -101,7 +100,8 @@ class CredentialRevisionService { * Update revision * * @param CredentialRevision $credentialRevision - * @return CredentialRevision + * @return CredentialRevision|Entity + * @throws \Exception */ public function updateRevision(CredentialRevision $credentialRevision) { $credential_data = $credentialRevision->getCredentialData(); @@ -110,4 +110,4 @@ class CredentialRevisionService { $credentialRevision->setCredentialData($credential_data); return $this->credentialRevisionMapper->update($credentialRevision); } -} \ No newline at end of file +} diff --git a/lib/Service/CredentialService.php b/lib/Service/CredentialService.php index f819b106..49b403ec 100644 --- a/lib/Service/CredentialService.php +++ b/lib/Service/CredentialService.php @@ -24,27 +24,27 @@ namespace OCA\Passman\Service; use OCA\Passman\Db\Credential; -use OCA\Passman\Db\CredentialRevision; +use OCA\Passman\Db\CredentialMapper; use OCA\Passman\Db\SharingACL; use OCA\Passman\Db\SharingACLMapper; -use OCP\IConfig; use OCP\AppFramework\Db\DoesNotExistException; - -use OCA\Passman\Db\CredentialMapper; +use OCP\AppFramework\Db\Entity; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\IConfig; class CredentialService { - private $credentialMapper; - private $sharingACL; - private $encryptService; + private CredentialMapper $credentialMapper; + private SharingACLMapper $sharingACL; + private EncryptService $encryptService; private $server_key; - public function __construct(CredentialMapper $credentialMapper, SharingACLMapper $sharingACL, EncryptService $encryptService) { + public function __construct(CredentialMapper $credentialMapper, SharingACLMapper $sharingACL, EncryptService $encryptService, IConfig $config) { $this->credentialMapper = $credentialMapper; $this->sharingACL = $sharingACL; $this->encryptService = $encryptService; - $this->server_key = \OC::$server->getConfig()->getSystemValue('passwordsalt', ''); + $this->server_key = $config->getSystemValue('passwordsalt', ''); } /** @@ -52,8 +52,9 @@ class CredentialService { * * @param array $credential * @return Credential + * @throws \Exception */ - public function createCredential($credential) { + public function createCredential(array $credential) { $credential = $this->encryptService->encryptCredential($credential); return $this->credentialMapper->create($credential); } @@ -61,11 +62,13 @@ class CredentialService { /** * Update credential * - * @param $credential array | Credential - * @param $useRawUser bool - * @return Credential + * @param array $credential + * @param false $useRawUser + * @return Credential|Entity + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function updateCredential($credential, $useRawUser = false) { + public function updateCredential(array $credential, $useRawUser = false) { $credential = $this->encryptService->encryptCredential($credential); return $this->credentialMapper->updateCredential($credential, $useRawUser); } @@ -73,8 +76,10 @@ class CredentialService { /** * Update credential * - * @param $credential Credential - * @return Credential + * @param Credential $credential + * @return Credential|Entity + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ public function upd(Credential $credential) { $credential = $this->encryptService->encryptCredential($credential); @@ -85,7 +90,7 @@ class CredentialService { * Delete credential * * @param Credential $credential - * @return \OCP\AppFramework\Db\Entity + * @return Entity */ public function deleteCredential(Credential $credential) { return $this->credentialMapper->deleteCredential($credential); @@ -94,11 +99,11 @@ class CredentialService { /** * Get credentials by vault id * - * @param $vault_id - * @param $user_id - * @return \OCA\Passman\Db\Credential[] + * @param int $vault_id + * @param string $user_id + * @return Credential[] */ - public function getCredentialsByVaultId($vault_id, $user_id) { + public function getCredentialsByVaultId(int $vault_id, string $user_id) { $credentials = $this->credentialMapper->getCredentialsByVaultId($vault_id, $user_id); foreach ($credentials as $index => $credential) { $credentials[$index] = $this->encryptService->decryptCredential($credential); @@ -109,11 +114,11 @@ class CredentialService { /** * Get a random credential from given vault * - * @param $vault_id - * @param $user_id + * @param int $vault_id + * @param string $user_id * @return mixed */ - public function getRandomCredentialByVaultId($vault_id, $user_id) { + public function getRandomCredentialByVaultId(int $vault_id, string $user_id) { $credentials = $this->credentialMapper->getRandomCredentialByVaultId($vault_id, $user_id); foreach ($credentials as $index => $credential) { $credentials[$index] = $this->encryptService->decryptCredential($credential); @@ -124,10 +129,10 @@ class CredentialService { /** * Get expired credentials. * - * @param $timestamp - * @return \OCA\Passman\Db\Credential[] + * @param int $timestamp + * @return Credential[] */ - public function getExpiredCredentials($timestamp) { + public function getExpiredCredentials(int $timestamp) { $credentials = $this->credentialMapper->getExpiredCredentials($timestamp); foreach ($credentials as $index => $credential) { $credentials[$index] = $this->encryptService->decryptCredential($credential); @@ -138,12 +143,13 @@ class CredentialService { /** * Get a single credential. * - * @param $credential_id - * @param $user_id - * @return Credential + * @param int $credential_id + * @param string $user_id + * @return array|Credential * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getCredentialById($credential_id, $user_id) { + public function getCredentialById(int $credential_id, string $user_id) { $credential = $this->credentialMapper->getCredentialById($credential_id); if ($credential->getUserId() === $user_id) { return $this->encryptService->decryptCredential($credential); @@ -160,10 +166,12 @@ class CredentialService { /** * Get credential label by credential id. * - * @param $credential_id - * @return Credential + * @param int $credential_id + * @return array|Credential + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getCredentialLabelById($credential_id) { + public function getCredentialLabelById(int $credential_id) { $credential = $this->credentialMapper->getCredentialLabelById($credential_id); return $this->encryptService->decryptCredential($credential); } @@ -171,11 +179,13 @@ class CredentialService { /** * Get credential by guid * - * @param $credential_guid - * @param null $user_id - * @return Credential + * @param string $credential_guid + * @param string|null $user_id + * @return array|Credential + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getCredentialByGUID($credential_guid, $user_id = null) { + public function getCredentialByGUID(string $credential_guid, string $user_id = null) { $credential = $this->credentialMapper->getCredentialByGUID($credential_guid, $user_id); return $this->encryptService->decryptCredential($credential); } diff --git a/lib/Service/CronService.php b/lib/Service/CronService.php index ccbcd8b1..84ff65f5 100644 --- a/lib/Service/CronService.php +++ b/lib/Service/CronService.php @@ -26,6 +26,7 @@ namespace OCA\Passman\Service; use OCA\Passman\Activity; use OCA\Passman\Utility\Utils; use OCP\DB\Exception; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; use Psr\Log\LoggerInterface; @@ -47,19 +48,20 @@ class CronService { $this->db = $db; } - public function expireCredentials() { $expired_credentials = $this->credentialService->getExpiredCredentials($this->utils->getTime()); foreach ($expired_credentials as $credential) { $link = ''; // @TODO create direct link to credential - $sql = 'SELECT count(*) as `rows` from `*PREFIX*notifications` WHERE `subject`= \'credential_expired\' AND object_id=?'; - $id = $credential->getId(); + $qb = $this->db->getQueryBuilder(); + $qb->select('*') + ->from('notifications') + ->where($qb->expr()->eq('object_id', $qb->createNamedParameter($credential->getId(), IQueryBuilder::PARAM_INT))) + ->andWhere($qb->expr()->eq('subject', $qb->createNamedParameter('credential_expired', IQueryBuilder::PARAM_STR))); try { - $result = $this->db->executeQuery($sql, array($id)); $this->logger->debug($credential->getLabel() . ' is expired, checking notifications!', array('app' => 'passman')); - $notifications = intval($result->fetch()['rows']); - if ($notifications === 0) { + $notificationCount = $qb->execute()->rowCount(); + if ($notificationCount === 0) { $this->logger->debug($credential->getLabel() . ' is expired, adding notification!', array('app' => 'passman')); $this->activityService->add( Activity::SUBJECT_ITEM_EXPIRED, array($credential->getLabel(), $credential->getUserId()), diff --git a/lib/Service/DeleteVaultRequestService.php b/lib/Service/DeleteVaultRequestService.php index 82820722..04949d9b 100644 --- a/lib/Service/DeleteVaultRequestService.php +++ b/lib/Service/DeleteVaultRequestService.php @@ -26,12 +26,10 @@ namespace OCA\Passman\Service; use OCA\Passman\Db\DeleteVaultRequest; use OCA\Passman\Db\DeleteVaultRequestMapper; -use OCP\AppFramework\Db\DoesNotExistException; - class DeleteVaultRequestService { - private $deleteVaultRequestMapper; + private DeleteVaultRequestMapper $deleteVaultRequestMapper; public function __construct(DeleteVaultRequestMapper $deleteVaultRequestMapper) { $this->deleteVaultRequestMapper = $deleteVaultRequestMapper; @@ -41,7 +39,7 @@ class DeleteVaultRequestService { * Create a new DeleteVaultRequest * * @param $request DeleteVaultRequest - * @return \OCA\Passman\Db\DeleteVaultRequest + * @return DeleteVaultRequest */ public function createRequest(DeleteVaultRequest $request) { return $this->deleteVaultRequestMapper->insert($request); @@ -50,20 +48,23 @@ class DeleteVaultRequestService { /** * Create a new DeleteVaultRequest * - * @return \OCA\Passman\Db\DeleteVaultRequest[] + * @return DeleteVaultRequest[] */ public function getDeleteRequests() { - return $this->deleteVaultRequestMapper->getDeleteRequests(); + /** @var DeleteVaultRequest[] $result */ + $result = $this->deleteVaultRequestMapper->getDeleteRequests(); + return $result; } /** * Create a new DeleteVaultRequest * - * @param $vault_id integer The vault id + * @param $vault_guid string The vault guid * @return bool | DeleteVaultRequest */ - public function getDeleteRequestForVault($vault_guid) { + public function getDeleteRequestForVault(string $vault_guid) { try { + /** @var DeleteVaultRequest $result */ $result = $this->deleteVaultRequestMapper->getDeleteRequestsForVault($vault_guid); return $result; } catch (\Exception $e) { @@ -75,11 +76,9 @@ class DeleteVaultRequestService { * Create a new DeleteVaultRequest * * @param $req DeleteVaultRequest - * @return bool | DeleteVaultRequest */ public function removeDeleteRequestForVault(DeleteVaultRequest $req) { $this->deleteVaultRequestMapper->removeDeleteVaultRequest($req); } - -} \ No newline at end of file +} diff --git a/lib/Service/EncryptService.php b/lib/Service/EncryptService.php index 64284c4f..a741cb28 100644 --- a/lib/Service/EncryptService.php +++ b/lib/Service/EncryptService.php @@ -29,6 +29,7 @@ namespace OCA\Passman\Service; use Icewind\SMB\Exception\Exception; use OCA\Passman\Db\Credential; use OCA\Passman\Db\File; +use OCP\IConfig; /** * A class to handle secure encryption and decryption of arbitrary data @@ -84,14 +85,14 @@ class EncryptService { protected $rounds = 100; /** - * Constructor! - * + * EncryptService constructor. * @param SettingsService $settings + * @param IConfig $config */ - public function __construct(SettingsService $settings) { + public function __construct(SettingsService $settings, IConfig $config) { $this->cipher = $settings->getAppSetting('server_side_encryption', 'aes-256-cbc'); - $password_salt = \OC::$server->getConfig()->getSystemValue('passwordsalt', ''); - $secret = \OC::$server->getConfig()->getSystemValue('secret', ''); + $password_salt = $config->getSystemValue('passwordsalt', ''); + $secret = $config->getSystemValue('secret', ''); $this->server_key = $password_salt . $secret; $this->rounds = $settings->getAppSetting('rounds_pbkdf2_stretching', 100); } @@ -396,4 +397,4 @@ class EncryptService { return $file; } -} \ No newline at end of file +} diff --git a/lib/Service/FileService.php b/lib/Service/FileService.php index 829b7927..9ff32279 100644 --- a/lib/Service/FileService.php +++ b/lib/Service/FileService.php @@ -24,32 +24,35 @@ namespace OCA\Passman\Service; use OCA\Passman\Db\File; -use OCP\IConfig; -use OCP\AppFramework\Db\DoesNotExistException; - use OCA\Passman\Db\FileMapper; +use OCP\AppFramework\Db\DoesNotExistException; +use OCP\AppFramework\Db\Entity; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\IConfig; class FileService { - private $fileMapper; - private $encryptService; + private FileMapper $fileMapper; + private EncryptService $encryptService; private $server_key; - public function __construct(FileMapper $fileMapper, EncryptService $encryptService) { + public function __construct(FileMapper $fileMapper, EncryptService $encryptService, IConfig $config) { $this->fileMapper = $fileMapper; $this->encryptService = $encryptService; - $this->server_key = \OC::$server->getConfig()->getSystemValue('passwordsalt', ''); + $this->server_key = $config->getSystemValue('passwordsalt', ''); } /** * Get a single file. This function also returns the file content. * - * @param $fileId - * @param null $userId - * @return \OCA\Passman\Db\File + * @param int $fileId + * @param string|null $userId + * @return array|File + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getFile($fileId, $userId = null) { + public function getFile(int $fileId, string $userId = null) { $file = $this->fileMapper->getFile($fileId, $userId); return $this->encryptService->decryptFile($file); } @@ -57,11 +60,13 @@ class FileService { /** * Get a single file. This function also returns the file content. * - * @param $file_guid - * @param null $userId - * @return \OCA\Passman\Db\File + * @param string $file_guid + * @param string|null $userId + * @return array|File + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getFileByGuid($file_guid, $userId = null) { + public function getFileByGuid(string $file_guid, string $userId = null) { $file = $this->fileMapper->getFileByGuid($file_guid, $userId); return $this->encryptService->decryptFile($file); } @@ -69,11 +74,13 @@ class FileService { /** * Upload a new file, * - * @param $file array - * @param $userId - * @return \OCA\Passman\Db\File + * @param array $file + * @param string $userId + * @return array|File + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function createFile($file, $userId) { + public function createFile(array $file, string $userId) { $file = $this->encryptService->encryptFile($file); $file = $this->fileMapper->create($file, $userId); return $this->getFile($file->getId()); @@ -82,11 +89,11 @@ class FileService { /** * Delete file * - * @param $file_id - * @param $userId - * @return \OCA\Passman\Db\File + * @param int $file_id + * @param string $userId + * @return File|Entity */ - public function deleteFile($file_id, $userId) { + public function deleteFile(int $file_id, string $userId) { return $this->fileMapper->deleteFile($file_id, $userId); } @@ -94,9 +101,9 @@ class FileService { * Update file * * @param File $file - * @return \OCA\Passman\Db\File + * @return File */ - public function updateFile($file) { + public function updateFile(File $file) { $file = $this->encryptService->encryptFile($file); return $this->fileMapper->updateFile($file); } @@ -107,12 +114,12 @@ class FileService { * @param string $userId * @return File[] */ - public function getFilesFromUser($userId){ + public function getFilesFromUser(string $userId) { $files = $this->fileMapper->getFilesFromUser($userId); $results = array(); - foreach ($files as $file){ + foreach ($files as $file) { array_push($results, $this->encryptService->decryptFile($file)); } return $results; } -} \ No newline at end of file +} diff --git a/lib/Service/NotificationService.php b/lib/Service/NotificationService.php index 9d27a766..5b0d2d8d 100644 --- a/lib/Service/NotificationService.php +++ b/lib/Service/NotificationService.php @@ -24,20 +24,22 @@ namespace OCA\Passman\Service; +use OCP\IURLGenerator; use OCP\Notification\IManager; class NotificationService { private IManager $manager; + private IURLGenerator $urlGenerator; - public function __construct() { - $this->manager = \OC::$server->getNotificationManager(); + public function __construct(IManager $IManager, IURLGenerator $urlGenerator) { + $this->manager = $IManager; + $this->urlGenerator = $urlGenerator; } function credentialExpiredNotification($credential) { - $urlGenerator = \OC::$server->getURLGenerator(); - $link = $urlGenerator->getAbsoluteURL($urlGenerator->linkTo('', 'index.php/apps/passman/#/vault/' . $credential->getVaultId() . '/edit/' . $credential->getId())); - $api = $urlGenerator->getAbsoluteURL($urlGenerator->linkTo('', 'index.php/apps/passman')); + $link = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->linkTo('', 'index.php/apps/passman/#/vault/' . $credential->getVaultId() . '/edit/' . $credential->getId())); + $api = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->linkTo('', 'index.php/apps/passman')); $notification = $this->manager->createNotification(); $remindAction = $notification->createAction(); $remindAction->setLabel('remind') @@ -61,9 +63,8 @@ class NotificationService { function credentialSharedNotification($data) { - $urlGenerator = \OC::$server->getURLGenerator(); - $link = $urlGenerator->getAbsoluteURL($urlGenerator->linkTo('', 'index.php/apps/passman/#/')); - $api = $urlGenerator->getAbsoluteURL($urlGenerator->linkTo('', 'index.php/apps/passman')); + $link = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->linkTo('', 'index.php/apps/passman/#/')); + $api = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->linkTo('', 'index.php/apps/passman')); $notification = $this->manager->createNotification(); $declineAction = $notification->createAction(); diff --git a/lib/Service/ShareService.php b/lib/Service/ShareService.php index 8dec01db..a9ed2d37 100644 --- a/lib/Service/ShareService.php +++ b/lib/Service/ShareService.php @@ -24,7 +24,6 @@ namespace OCA\Passman\Service; -use Icewind\SMB\Share; use OCA\Passman\Db\CredentialMapper; use OCA\Passman\Db\CredentialRevision; use OCA\Passman\Db\ShareRequest; @@ -33,13 +32,19 @@ use OCA\Passman\Db\SharingACL; use OCA\Passman\Db\SharingACLMapper; use OCA\Passman\Utility\Utils; use OCP\AppFramework\Db\DoesNotExistException; +use OCP\AppFramework\Db\Entity; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\DB\Exception; +use OCP\DB\IResult; +use OCP\Notification\IManager; class ShareService { - private $sharingACL; - private $shareRequest; - private $credential; - private $revisions; - private $encryptService; + private SharingACLMapper $sharingACL; + private ShareRequestMapper $shareRequest; + private CredentialMapper $credential; + private CredentialRevisionService $revisions; + private EncryptService $encryptService; + private IManager $IManager; public function __construct( @@ -47,13 +52,15 @@ class ShareService { ShareRequestMapper $shareRequest, CredentialMapper $credentials, CredentialRevisionService $revisions, - EncryptService $encryptService + EncryptService $encryptService, + IManager $IManager ) { $this->sharingACL = $sharingACL; $this->shareRequest = $shareRequest; $this->credential = $credentials; $this->revisions = $revisions; $this->encryptService = $encryptService; + $this->IManager = $IManager; } /** @@ -89,6 +96,10 @@ class ShareService { return $requests; } + /** + * @param SharingACL $acl + * @return Entity + */ public function createACLEntry(SharingACL $acl) { if ($acl->getCreated() === null) $acl->setCreated((new \DateTime())->getTimestamp()); return $this->sharingACL->createACLEntry($acl); @@ -97,11 +108,14 @@ class ShareService { /** * Applies the given share, defaults to no expire * - * @param $item_guid - * @param $target_vault_guid - * @param $final_shared_key + * @param string $item_guid + * @param string $target_vault_guid + * @param string $final_shared_key + * @throws DoesNotExistException + * @throws Exception + * @throws MultipleObjectsReturnedException */ - public function applyShare($item_guid, $target_vault_guid, $final_shared_key) { + public function applyShare(string $item_guid, string $target_vault_guid, string $final_shared_key) { $request = $this->shareRequest->getRequestByItemAndVaultGuid($item_guid, $target_vault_guid); $permissions = $request->getPermissions(); @@ -123,21 +137,23 @@ class ShareService { /** * Obtains pending requests for the given user ID * - * @param $user_id - * @return \OCA\Passman\Db\ShareRequest[] + * @param string $user_id + * @return ShareRequest[] */ - public function getUserPendingRequests($user_id) { + public function getUserPendingRequests(string $user_id) { return $this->shareRequest->getUserPendingRequests($user_id); } /** * Get shared credentials from a user * - * @param $user_id - * @param $vault_guid - * @return \OCA\Passman\Db\SharingACL[] + * @param string $user_id + * @param string $vault_guid + * @return array + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getSharedItems($user_id, $vault_guid) { + public function getSharedItems(string $user_id, string $vault_guid) { $entries = $this->sharingACL->getVaultEntries($user_id, $vault_guid); $return = []; @@ -159,15 +175,22 @@ class ShareService { /** * Gets the acl for a given item guid * - * @param $user_id - * @param $item_guid + * @param string $user_id + * @param string $item_guid * @return SharingACL */ - public function getACL($user_id, $item_guid) { + public function getACL(string $user_id, string $item_guid) { return $this->sharingACL->getItemACL($user_id, $item_guid); } - public function getSharedItem($user_id, $item_guid) { + /** + * @param string $user_id + * @param string $item_guid + * @return array|mixed + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException + */ + public function getSharedItem(string $user_id, string $item_guid) { $acl = $this->sharingACL->getItemACL($user_id, $item_guid); // Check if the user can read the credential, probably unnecesary, but just to be sure @@ -188,11 +211,11 @@ class ShareService { /** * Gets history from the given item checking the user's permissions to access it * - * @param $user_id - * @param $item_guid + * @param string $user_id + * @param string $item_guid * @return CredentialRevision[] */ - public function getItemHistory($user_id, $item_guid) { + public function getItemHistory(string $user_id, string $item_guid) { $acl = $this->sharingACL->getItemACL($user_id, $item_guid); if (!$acl->hasPermission(SharingACL::READ | SharingACL::HISTORY)) return []; @@ -204,7 +227,8 @@ class ShareService { * Deletes a share request by the item ID * * @param ShareRequest $request - * @return \PDOStatement + * @return int|IResult + * @throws Exception */ public function cleanItemRequestsForUser(ShareRequest $request) { return $this->shareRequest->cleanItemRequestsForUser($request->getItemId(), $request->getTargetUserId()); @@ -213,21 +237,25 @@ class ShareService { /** * Get an share request by id * - * @param $id + * @param int $id * @return ShareRequest + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getShareRequestById($id) { + public function getShareRequestById(int $id) { return $this->shareRequest->getShareRequestById($id); } /** * Get an share request by $item_guid and $target_vault_guid * - * @param $item_guid - * @param $target_vault_guid + * @param string $item_guid + * @param string $target_vault_guid * @return ShareRequest + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getRequestByGuid($item_guid, $target_vault_guid) { + public function getRequestByGuid(string $item_guid, string $target_vault_guid) { return $this->shareRequest->getRequestByItemAndVaultGuid($item_guid, $target_vault_guid); } @@ -235,41 +263,48 @@ class ShareService { * Get the access control list by item guid * * @param string $item_guid - * @return \OCA\Passman\Db\SharingACL[] + * @return SharingACL[] */ - public function getCredentialAclList($item_guid) { + public function getCredentialAclList(string $item_guid) { return $this->sharingACL->getCredentialAclList($item_guid); } - public function getCredentialPendingAclList($item_guid) { + /** + * @param string $item_guid + * @return ShareRequest[] + * @throws Exception + */ + public function getCredentialPendingAclList(string $item_guid) { return $this->shareRequest->getRequestsByItemGuidGroupedByUser($item_guid); } /** * Gets the ACL on the credential for the user * - * @param $user_id - * @param $item_guid + * @param string $user_id + * @param string $item_guid * @return SharingACL + * @throws DoesNotExistException + * @throws MultipleObjectsReturnedException */ - public function getCredentialAclForUser($user_id, $item_guid) { + public function getCredentialAclForUser(string $user_id, string $item_guid) { return $this->sharingACL->getItemACL($user_id, $item_guid); } /** * Get pending share requests by guid * - * @param string $item_guid - * @return \OCA\Passman\Db\ShareRequest[] + * @param string $item_guid + * @return ShareRequest[] */ - public function getShareRequestsByGuid($item_guid) { + public function getShareRequestsByGuid(string $item_guid) { return $this->shareRequest->getShareRequestsByItemGuid($item_guid); } /** * Get pending share requests by guid * - * @param ShareRequest $request + * @param ShareRequest $request * @return ShareRequest */ public function deleteShareRequest(ShareRequest $request) { @@ -279,8 +314,8 @@ class ShareService { /** * Delete ACL * - * @param ShareRequest $request - * @return \OCA\Passman\Db\ShareRequest[] + * @param SharingACL $ACL + * @return SharingACL|Entity */ public function deleteShareACL(SharingACL $ACL) { return $this->sharingACL->deleteShareACL($ACL); @@ -296,6 +331,10 @@ class ShareService { return $this->sharingACL->updateCredentialACL($sharingACL); } + /** + * @param ShareRequest $shareRequest + * @return ShareRequest + */ public function updateCredentialShareRequest(ShareRequest $shareRequest) { return $this->shareRequest->updateShareRequest($shareRequest); } @@ -304,15 +343,22 @@ class ShareService { /** * Get pending share requests by guid and uid * - * @param ShareRequest $request - * @return \OCA\Passman\Db\ShareRequest[] + * @param string $item_guid + * @param string $user_id + * @return ShareRequest[] */ - public function getPendingShareRequestsForCredential($item_guid, $user_id) { + public function getPendingShareRequestsForCredential(string $item_guid, string $user_id) { return $this->shareRequest->getPendingShareRequests($item_guid, $user_id); } - - public function updatePendingShareRequestsForCredential($item_guid, $user_id, $permissions) { + /** + * @param string $item_guid + * @param string $user_id + * @param int $permissions + * @return int|IResult + * @throws Exception + */ + public function updatePendingShareRequestsForCredential(string $item_guid, string $user_id, int $permissions) { return $this->shareRequest->updatePendingRequestPermissions($item_guid, $user_id, $permissions); } @@ -321,8 +367,7 @@ class ShareService { * This will delete all ACL's and share requests. * @param string $item_guid */ - - public function unshareCredential($item_guid) { + public function unshareCredential(string $item_guid) { $acl_list = $this->getCredentialAclList($item_guid); $request_list = $this->getShareRequestsByGuid($item_guid); foreach ($acl_list as $ACL) { @@ -330,12 +375,11 @@ class ShareService { } foreach ($request_list as $request) { $this->deleteShareRequest($request); - $manager = \OC::$server->getNotificationManager(); - $notification = $manager->createNotification(); + $notification = $this->IManager->createNotification(); $notification->setApp('passman') ->setObject('passman_share_request', $request->getId()) ->setUser($request->getTargetUserId()); - $manager->markProcessed($notification); + $this->IManager->markProcessed($notification); } } -} \ No newline at end of file +} diff --git a/lib/Service/VaultService.php b/lib/Service/VaultService.php index 43e3a519..c7e2a636 100644 --- a/lib/Service/VaultService.php +++ b/lib/Service/VaultService.php @@ -24,6 +24,7 @@ namespace OCA\Passman\Service; use OCA\Passman\Db\Vault; +use OCP\AppFramework\Db\Entity; use OCP\IConfig; use OCP\AppFramework\Db\DoesNotExistException; @@ -82,6 +83,7 @@ class VaultService { /** * Update vault * @param $vault + * @return Vault|Entity */ public function updateVault($vault) { return $this->vaultMapper->updateVault($vault); @@ -91,16 +93,18 @@ class VaultService { * Update last access time of a vault. * @param $vault_id * @param $user_id + * @return Vault|Entity */ public function setLastAccess($vault_id, $user_id){ return $this->vaultMapper->setLastAccess($vault_id, $user_id); } /** - * Uodate sharing keys of a vault. + * Update sharing keys of a vault. * @param $vault_id * @param $privateKey * @param $publicKey + * @return Vault|Entity */ public function updateSharingKeys($vault_id, $privateKey, $publicKey){ return $this->vaultMapper->updateSharingKeys($vault_id, $privateKey, $publicKey); @@ -117,4 +121,4 @@ class VaultService { $this->vaultMapper->deleteVault($vault); } } -} \ No newline at end of file +} diff --git a/lib/Settings/Admin.php b/lib/Settings/Admin.php index 8ed3ccba..8acfe0f7 100644 --- a/lib/Settings/Admin.php +++ b/lib/Settings/Admin.php @@ -25,7 +25,7 @@ namespace OCA\Passman\Settings; use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; -use OCP\App; +use OCP\App\IAppManager; use OCP\AppFramework\Http\TemplateResponse; use OCP\IConfig; use OCP\IL10N; @@ -35,15 +35,18 @@ class Admin implements ISettings { protected IConfig $config; private IL10N $l; + private IAppManager $appManager; /** * Admin constructor. * @param IConfig $config * @param IL10N $l + * @param IAppManager $appManager */ - public function __construct(IConfig $config, IL10N $l) { + public function __construct(IConfig $config, IL10N $l, IAppManager $appManager) { $this->config = $config; $this->l = $l; + $this->appManager = $appManager; } /** @@ -51,8 +54,7 @@ class Admin implements ISettings { */ public function getForm(): TemplateResponse { $checkVersion = $this->config->getAppValue('passman', 'check_version', '1') === '1'; - $AppInstance = new App(); - $localVersion = $AppInstance->getAppInfo("passman")["version"]; + $localVersion = $this->appManager->getAppInfo('passman')["version"]; $githubVersion = $this->l->t('Unable to get version info'); if ($checkVersion) { // get latest master version diff --git a/migration/serversideencryption.php b/migration/serversideencryption.php index b2639523..01a49a8d 100644 --- a/migration/serversideencryption.php +++ b/migration/serversideencryption.php @@ -29,6 +29,7 @@ use OCA\Passman\Service\CredentialRevisionService; use OCA\Passman\Service\CredentialService; use OCA\Passman\Service\EncryptService; use OCA\Passman\Service\FileService; +use OCP\IConfig; use OCP\IDBConnection; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; @@ -59,14 +60,14 @@ class ServerSideEncryption implements IRepairStep { private $fileService; public function __construct(EncryptService $encryptService, IDBConnection $db, LoggerInterface $logger, CredentialService $credentialService, CredentialRevisionService $revisionService, - FileService $fileService) { + FileService $fileService, IConfig $config) { $this->encryptService = $encryptService; $this->db = $db; $this->logger = $logger; $this->credentialService = $credentialService; $this->revisionService = $revisionService; $this->fileService = $fileService; - $this->installedVersion = \OC::$server->getConfig()->getAppValue('passman', 'installed_version'); + $this->installedVersion = $config->getAppValue('passman', 'installed_version'); } public function getName() { @@ -83,19 +84,27 @@ class ServerSideEncryption implements IRepairStep { } } - private function fetchAll($sql) { - return $this->db->executeQuery($sql)->fetchAll(); + private function fetchAll(string $table) { + // restrict access to passman tables + if (substr($table, 0, strlen('passman_')) === 'passman_') { + $qb = $this->db->getQueryBuilder(); + $result = $qb->select('*') + ->from($table) + ->execute(); + return $result->fetchAll(); + } + return []; } private function encryptCredentials() { - $credentials = $this->fetchAll('SELECT * FROM `*PREFIX*passman_credentials`'); + $credentials = $this->fetchAll('passman_credentials'); foreach ($credentials as $credential) { $this->credentialService->updateCredential($credential); } } private function encryptRevisions() { - $revisions = $this->fetchAll('SELECT * FROM `*PREFIX*passman_revisions`'); + $revisions = $this->fetchAll('passman_revisions'); foreach ($revisions as $_revision) { $revision = new CredentialRevision(); $revision->setId($_revision['id']); @@ -110,7 +119,7 @@ class ServerSideEncryption implements IRepairStep { } private function encryptFiles() { - $files = $this->fetchAll('SELECT * FROM `*PREFIX*passman_files`'); + $files = $this->fetchAll('passman_files'); foreach ($files as $_file) { $file = new File(); $file->setId($_file['id']);