Completed
Push — master ( 641a91...fc9f6a )
by
unknown
10:16
created

AdminController::acceptRequestDeletion()   B

Complexity

Conditions 7
Paths 8

Size

Total Lines 27

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 56

Importance

Changes 0
Metric Value
cc 7
dl 0
loc 27
rs 8.5546
c 0
b 0
f 0
nc 8
nop 2
ccs 0
cts 16
cp 0
crap 56
1
<?php
2
/**
3
 * Nextcloud - passman
4
 *
5
 * This file is licensed under the Affero General Public License version 3 or
6
 * later. See the COPYING file.
7
 *
8
 * @author Sander Brand <[email protected]>
9
 * @copyright Sander Brand 2016
10
 */
11
12
namespace OCA\Passman\Controller;
13
14
use OCA\Passman\Db\Credential;
15
use OCA\Passman\Db\CredentialRevision;
16
use OCA\Passman\Db\DeleteVaultRequest;
17
use OCA\Passman\Service\CredentialRevisionService;
18
use OCA\Passman\Service\DeleteVaultRequestService;
19
use OCA\Passman\Service\FileService;
20
use OCA\Passman\Service\VaultService;
21
use OCA\Passman\Utility\Utils;
22
use OCP\IConfig;
23
use OCP\IRequest;
24
use OCP\AppFramework\Http\JSONResponse;
25
use OCP\AppFramework\ApiController;
26
use OCA\Passman\Service\CredentialService;
27
28
29
class AdminController extends ApiController {
30
	private $userId;
31
	private $vaultService;
32
	private $credentialService;
33
	private $fileService;
34
	private $revisionService;
35
	private $deleteVaultRequestService;
36
	private $config;
37
38
	public function __construct($AppName,
39
								IRequest $request,
40
								$UserId,
41
								VaultService $vaultService,
42
								CredentialService $credentialService,
43
								FileService $fileService,
44
								CredentialRevisionService $revisionService,
45
								DeleteVaultRequestService $deleteVaultRequestService,
46
								IConfig $config
47
	) {
48
		parent::__construct(
49
			$AppName,
50
			$request,
51
			'GET, POST, DELETE, PUT, PATCH, OPTIONS',
52
			'Authorization, Content-Type, Accept',
53
			86400);
54
		$this->userId = $UserId;
55
		$this->vaultService = $vaultService;
56
		$this->credentialService = $credentialService;
57
		$this->fileService = $fileService;
58
		$this->revisionService = $revisionService;
59
		$this->deleteVaultRequestService = $deleteVaultRequestService;
60
61
		$this->config = $config;
62
	}
63
64
65
	public function searchUser($term) {
66
		$um = \OC::$server->getUserManager();
67
		$results = array();
68
		$searchResult = $um->search($term);
69
		foreach ($searchResult as $user) {
70
			array_push($results, array(
71
				"value" => $user->getUID(),
72
				"label" => $user->getDisplayName() . ' (' . $user->getBackendClassName() . ')',
73
			));
74
		}
75
		return new JSONResponse($results);
76
	}
77
78
	public function moveCredentials($source_account, $destination_account) {
79
		$vaults = $this->vaultService->getByUser($source_account);
80
		foreach ($vaults as $vault) {
81
			$credentials = $this->credentialService->getCredentialsByVaultId($vault->getId(), $source_account);
82
			foreach ($credentials as $credential) {
83
				$revisions = $this->revisionService->getRevisions($credential->getId());
84
				foreach ($revisions as $revision) {
85
					$r = new CredentialRevision();
86
					$r->setId($revision['revision_id']);
87
					$r->setGuid($revision['guid']);
88
					$r->setCredentialId($credential->getId());
89
					$r->setUserId($destination_account);
90
					$r->setCreated($revision['created']);
91
					$r->setCredentialData(base64_encode(json_encode($revision['credential_data'])));
92
					$r->setEditedBy($revision['edited_by']);
93
					$this->revisionService->updateRevision($r);
94
				}
95
96
				$c = $credential->jsonSerialize();
97
				$c['user_id'] = $destination_account;
98
				$this->credentialService->updateCredential($c, true);
99
			}
100
			$vault->setUserId($destination_account);
101
			$this->vaultService->updateVault($vault);
102
		}
103
104
		$files = $this->fileService->getFilesFromUser($source_account);
105
		foreach ($files as $file) {
106
			$file->setUserId($destination_account);
107
			$this->fileService->updateFile($file);
108
		}
109
		return new JSONResponse(array('success' => true));
110
	}
111
112
	public function listRequests(){
113
		$requests = $this->deleteVaultRequestService->getDeleteRequests();
114
		$results = array();
115
		foreach($requests as $request){
116
			$r = $request->jsonSerialize();
117
			$r['displayName'] = Utils::getNameByUid($request->getRequestedBy());
118
			array_push($results, $r);
119
		}
120
		return new JSONResponse($results);
121
	}
122
123
	public function acceptRequestDeletion($vault_guid, $requested_by){
124
		$req = $this->deleteVaultRequestService->getDeleteRequestForVault($vault_guid);
125
		try{
126
			$vault = $this->vaultService->getByGuid($vault_guid, $requested_by);
127
		} catch (\Exception $e){
128
			//Ignore
129
		}
130
131
		if(isset($vault)){
132
			$credentials = $this->credentialService->getCredentialsByVaultId($vault->getId(), $requested_by);
133
			foreach($credentials as $credential){
134
				$revisions = $this->revisionService->getRevisions($credential->getId());
135
				foreach($revisions as $revision){
136
					$this->revisionService->deleteRevision($revision['revision_id'], $requested_by);
137
				}
138
				if($credential instanceof Credential){
139
					$this->credentialService->deleteCredential($credential);
140
				}
141
			}
142
			$this->vaultService->deleteVault($vault_guid, $requested_by);
143
		}
144
		if($req instanceof DeleteVaultRequest) {
145
			$this->deleteVaultRequestService->removeDeleteRequestForVault($req);
146
		}
147
148
		return new JSONResponse(array('result' => true));
149
	}
150
151
	/**
152
	 * @NoAdminRequired
153
	 */
154
	public function requestDeletion($vault_guid, $reason) {
155
		$req = $this->deleteVaultRequestService->getDeleteRequestForVault($vault_guid);
156
		if($req){
157
			return new JSONResponse('Already exists');
158
		}
159
		$vault = $this->vaultService->getByGuid($vault_guid, $this->userId);
160
		$result = false;
161
		if ($vault) {
162
			$delete_request = new DeleteVaultRequest();
163
			$delete_request->setRequestedBy($this->userId);
164
			$delete_request->setVaultGuid($vault->getGuid());
165
			$delete_request->setReason($reason);
166
			$delete_request->setCreated(time());
167
			$result = $this->deleteVaultRequestService->createRequest($delete_request);
168
169
		}
170
		return new JSONResponse(array('result' => $result));
171
	}
172
173
	/**
174
	 * @NoAdminRequired
175
	 */
176
	public function deleteRequestDeletion($vault_guid) {
177
		$delete_request = false;
178
		$result = false;
179
		try {
180
			$delete_request = $this->deleteVaultRequestService->getDeleteRequestForVault($vault_guid);
181
		} catch (\Exception $exception){
182
			// Ignore it
183
		}
184
185
		if ($delete_request instanceof DeleteVaultRequest) {
186
			$this->deleteVaultRequestService->removeDeleteRequestForVault($delete_request);
187
			$result = true;
188
		}
189
		return new JSONResponse(array('result' => $result));
190
	}
191
}