Failed Conditions
Push — master ( e8410d...a45585 )
by Marcos
09:36 queued 11s
created

AdminController::moveCredentials()   B

Complexity

Conditions 6
Paths 2

Size

Total Lines 39

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 42

Importance

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