. * */ namespace OCA\Passman\Service; use OCA\Passman\Db\CredentialRevision; use OCA\Passman\Db\CredentialRevisionMapper; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\IConfig; class CredentialRevisionService { private $server_key; public function __construct( private CredentialRevisionMapper $credentialRevisionMapper, private EncryptService $encryptService, IConfig $config, ) { $this->server_key = $config->getSystemValue('passwordsalt', ''); } /** * Create a new revision for a credential * * @param $credential * @param $userId * @param $credential_id * @param $edited_by * @return CredentialRevision * @throws \Exception */ public function createRevision($credential, $userId, $credential_id, $edited_by) { $credential = $this->encryptService->encryptCredential($credential); return $this->credentialRevisionMapper->create($credential, $userId, $credential_id, $edited_by); } /** * Get revisions of a credential * * @param int $credential_id * @param string|null $user_id * @return Entity[] * @throws \Exception */ 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); $result[$index] = $revision->jsonSerialize(); $result[$index]['credential_data'] = $this->encryptService->decryptCredential($c); } return $result; } /** * @param int $credential_id * @param string|null $user_id * @return Entity * @throws DoesNotExistException * @throws MultipleObjectsReturnedException * @throws \Exception */ 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)); return $revision; } /** * Delete a revision * * @param int $revision_id * @param string $user_id * @return CredentialRevision */ public function deleteRevision(int $revision_id, string $user_id) { return $this->credentialRevisionMapper->deleteRevision($revision_id, $user_id); } /** * Update revision * * @param CredentialRevision $credentialRevision * @return CredentialRevision|Entity * @throws \Exception */ public function updateRevision(CredentialRevision $credentialRevision) { $credential_data = $credentialRevision->getCredentialData(); $credential_data = json_decode(base64_decode($credential_data), true); $credential_data = base64_encode(json_encode($this->encryptService->encryptCredential($credential_data))); $credentialRevision->setCredentialData($credential_data); return $this->credentialRevisionMapper->update($credentialRevision); } }