Completed
Pull Request — master (#6577)
by Lukas
64:20 queued 46:55
created
apps/theming/templates/settings-admin.php 1 patch
Indentation   -1 removed lines patch added patch discarded remove patch
@@ -1,6 +1,5 @@
 block discarded – undo
1 1
 <?php
2 2
 /**
3
-
4 3
  *
5 4
  * @author Bjoern Schiessle <[email protected]>
6 5
  * @author Jan-Christoph Borchardt <[email protected]>
Please login to merge, or discard this patch.
apps/theming/lib/Settings/Section.php 1 patch
Indentation   +46 added lines, -46 removed lines patch added patch discarded remove patch
@@ -28,55 +28,55 @@
 block discarded – undo
28 28
 use OCP\Settings\IIconSection;
29 29
 
30 30
 class Section implements IIconSection {
31
-	/** @var IL10N */
32
-	private $l;
33
-	/** @var IURLGenerator */
34
-	private $url;
31
+    /** @var IL10N */
32
+    private $l;
33
+    /** @var IURLGenerator */
34
+    private $url;
35 35
 
36
-	/**
37
-	 * @param IURLGenerator $url
38
-	 * @param IL10N $l
39
-	 */
40
-	public function __construct(IURLGenerator $url, IL10N $l) {
41
-		$this->url = $url;
42
-		$this->l = $l;
43
-	}
36
+    /**
37
+     * @param IURLGenerator $url
38
+     * @param IL10N $l
39
+     */
40
+    public function __construct(IURLGenerator $url, IL10N $l) {
41
+        $this->url = $url;
42
+        $this->l = $l;
43
+    }
44 44
 
45
-	/**
46
-	 * returns the ID of the section. It is supposed to be a lower case string,
47
-	 * e.g. 'ldap'
48
-	 *
49
-	 * @returns string
50
-	 */
51
-	public function getID() {
52
-		return 'theming';
53
-	}
45
+    /**
46
+     * returns the ID of the section. It is supposed to be a lower case string,
47
+     * e.g. 'ldap'
48
+     *
49
+     * @returns string
50
+     */
51
+    public function getID() {
52
+        return 'theming';
53
+    }
54 54
 
55
-	/**
56
-	 * returns the translated name as it should be displayed, e.g. 'LDAP / AD
57
-	 * integration'. Use the L10N service to translate it.
58
-	 *
59
-	 * @return string
60
-	 */
61
-	public function getName() {
62
-		return $this->l->t('Theming');
63
-	}
55
+    /**
56
+     * returns the translated name as it should be displayed, e.g. 'LDAP / AD
57
+     * integration'. Use the L10N service to translate it.
58
+     *
59
+     * @return string
60
+     */
61
+    public function getName() {
62
+        return $this->l->t('Theming');
63
+    }
64 64
 
65
-	/**
66
-	 * @return int whether the form should be rather on the top or bottom of
67
-	 * the settings navigation. The sections are arranged in ascending order of
68
-	 * the priority values. It is required to return a value between 0 and 99.
69
-	 *
70
-	 * E.g.: 70
71
-	 */
72
-	public function getPriority() {
73
-		return 30;
74
-	}
65
+    /**
66
+     * @return int whether the form should be rather on the top or bottom of
67
+     * the settings navigation. The sections are arranged in ascending order of
68
+     * the priority values. It is required to return a value between 0 and 99.
69
+     *
70
+     * E.g.: 70
71
+     */
72
+    public function getPriority() {
73
+        return 30;
74
+    }
75 75
 
76
-	/**
77
-	 * {@inheritdoc}
78
-	 */
79
-	public function getIcon() {
80
-		return $this->url->imagePath('theming', 'app-dark.svg');
81
-	}
76
+    /**
77
+     * {@inheritdoc}
78
+     */
79
+    public function getIcon() {
80
+        return $this->url->imagePath('theming', 'app-dark.svg');
81
+    }
82 82
 }
Please login to merge, or discard this patch.
apps/twofactor_backupcodes/lib/Controller/SettingsController.php 1 patch
Indentation   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -30,46 +30,46 @@
 block discarded – undo
30 30
 
31 31
 class SettingsController extends Controller {
32 32
 
33
-	/** @var BackupCodeStorage */
34
-	private $storage;
33
+    /** @var BackupCodeStorage */
34
+    private $storage;
35 35
 
36
-	/** @var IUserSession */
37
-	private $userSession;
36
+    /** @var IUserSession */
37
+    private $userSession;
38 38
 
39
-	/**
40
-	 * @param string $appName
41
-	 * @param IRequest $request
42
-	 * @param BackupCodeStorage $storage
43
-	 * @param IUserSession $userSession
44
-	 */
45
-	public function __construct($appName, IRequest $request, BackupCodeStorage $storage, IUserSession $userSession) {
46
-		parent::__construct($appName, $request);
47
-		$this->userSession = $userSession;
48
-		$this->storage = $storage;
49
-	}
39
+    /**
40
+     * @param string $appName
41
+     * @param IRequest $request
42
+     * @param BackupCodeStorage $storage
43
+     * @param IUserSession $userSession
44
+     */
45
+    public function __construct($appName, IRequest $request, BackupCodeStorage $storage, IUserSession $userSession) {
46
+        parent::__construct($appName, $request);
47
+        $this->userSession = $userSession;
48
+        $this->storage = $storage;
49
+    }
50 50
 
51
-	/**
52
-	 * @NoAdminRequired
53
-	 * @return JSONResponse
54
-	 */
55
-	public function state() {
56
-		$user = $this->userSession->getUser();
57
-		return $this->storage->getBackupCodesState($user);
58
-	}
51
+    /**
52
+     * @NoAdminRequired
53
+     * @return JSONResponse
54
+     */
55
+    public function state() {
56
+        $user = $this->userSession->getUser();
57
+        return $this->storage->getBackupCodesState($user);
58
+    }
59 59
 
60
-	/**
61
-	 * @NoAdminRequired
62
-	 * @PasswordConfirmationRequired
63
-	 *
64
-	 * @return JSONResponse
65
-	 */
66
-	public function createCodes() {
67
-		$user = $this->userSession->getUser();
68
-		$codes = $this->storage->createCodes($user);
69
-		return new JSONResponse([
70
-			'codes' => $codes,
71
-			'state' => $this->storage->getBackupCodesState($user),
72
-		]);
73
-	}
60
+    /**
61
+     * @NoAdminRequired
62
+     * @PasswordConfirmationRequired
63
+     *
64
+     * @return JSONResponse
65
+     */
66
+    public function createCodes() {
67
+        $user = $this->userSession->getUser();
68
+        $codes = $this->storage->createCodes($user);
69
+        return new JSONResponse([
70
+            'codes' => $codes,
71
+            'state' => $this->storage->getBackupCodesState($user),
72
+        ]);
73
+    }
74 74
 
75 75
 }
Please login to merge, or discard this patch.
apps/twofactor_backupcodes/lib/Db/BackupCode.php 1 patch
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -34,13 +34,13 @@
 block discarded – undo
34 34
  */
35 35
 class BackupCode extends Entity {
36 36
 
37
-	/** @var string */
38
-	protected $userId;
37
+    /** @var string */
38
+    protected $userId;
39 39
 
40
-	/** @var string */
41
-	protected $code;
40
+    /** @var string */
41
+    protected $code;
42 42
 
43
-	/** @var int */
44
-	protected $used;
43
+    /** @var int */
44
+    protected $used;
45 45
 
46 46
 }
Please login to merge, or discard this patch.
apps/twofactor_backupcodes/appinfo/routes.php 1 patch
Indentation   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -21,17 +21,17 @@
 block discarded – undo
21 21
  */
22 22
 // @codeCoverageIgnoreStart
23 23
 return [
24
-	'routes' => [
25
-		[
26
-			'name' => 'settings#state',
27
-			'url' => '/settings/state',
28
-			'verb' => 'GET'
29
-		],
30
-		[
31
-			'name' => 'settings#createCodes',
32
-			'url' => '/settings/create',
33
-			'verb' => 'POST'
34
-		],
35
-	]
24
+    'routes' => [
25
+        [
26
+            'name' => 'settings#state',
27
+            'url' => '/settings/state',
28
+            'verb' => 'GET'
29
+        ],
30
+        [
31
+            'name' => 'settings#createCodes',
32
+            'url' => '/settings/create',
33
+            'verb' => 'POST'
34
+        ],
35
+    ]
36 36
 ];
37 37
 // @codeCoverageIgnoreEnd
Please login to merge, or discard this patch.
apps/encryption/templates/altmail.php 1 patch
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -4,8 +4,8 @@
 block discarded – undo
4 4
 
5 5
 print_unescaped($l->t("Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n", array($_['password'])));
6 6
 if ( isset($_['expiration']) ) {
7
-	print_unescaped($l->t("The share will expire on %s.", array($_['expiration'])));
8
-	print_unescaped("\n\n");
7
+    print_unescaped($l->t("The share will expire on %s.", array($_['expiration'])));
8
+    print_unescaped("\n\n");
9 9
 }
10 10
 // TRANSLATORS term at the end of a mail
11 11
 p($l->t("Cheers!"));
Please login to merge, or discard this patch.
apps/encryption/templates/settings-personal.php 1 patch
Indentation   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2
-	/** @var array $_ */
3
-	/** @var \OCP\IL10N $l */
2
+    /** @var array $_ */
3
+    /** @var \OCP\IL10N $l */
4 4
 script('encryption', 'settings-personal');
5 5
 script('core', 'multiselect');
6 6
 ?>
@@ -20,8 +20,8 @@  discard block
 block discarded – undo
20 20
 			<br />
21 21
 			<?php p( $l->t( "Set your old private key password to your current log-in password:" ) ); ?>
22 22
 			<?php if (  $_["recoveryEnabledForUser"] ):
23
-					p( $l->t( " If you don't remember your old password you can ask your administrator to recover your files." ) );
24
-			endif; ?>
23
+                    p( $l->t( " If you don't remember your old password you can ask your administrator to recover your files." ) );
24
+            endif; ?>
25 25
 			<br />
26 26
 			<input
27 27
 				type="password"
Please login to merge, or discard this patch.
apps/encryption/templates/mail.php 1 patch
Indentation   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -15,10 +15,10 @@
 block discarded – undo
15 15
 					<td width="20px">&nbsp;</td>
16 16
 					<td style="font-weight:normal; font-size:0.8em; line-height:1.2em; font-family:verdana,'arial',sans;">
17 17
 						<?php
18
-						print_unescaped($l->t('Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section "basic encryption module" of your personal settings and update your encryption password by entering this password into the "old log-in password" field and your current login-password.<br><br>', array($_['password'])));
19
-						// TRANSLATORS term at the end of a mail
20
-						p($l->t('Cheers!'));
21
-						?>
18
+                        print_unescaped($l->t('Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section "basic encryption module" of your personal settings and update your encryption password by entering this password into the "old log-in password" field and your current login-password.<br><br>', array($_['password'])));
19
+                        // TRANSLATORS term at the end of a mail
20
+                        p($l->t('Cheers!'));
21
+                        ?>
22 22
 					</td>
23 23
 				</tr>
24 24
 				<tr><td colspan="2">&nbsp;</td></tr>
Please login to merge, or discard this patch.
apps/encryption/lib/Migration.php 1 patch
Indentation   +355 added lines, -355 removed lines patch added patch discarded remove patch
@@ -32,359 +32,359 @@
 block discarded – undo
32 32
 
33 33
 class Migration {
34 34
 
35
-	private $moduleId;
36
-	/** @var \OC\Files\View */
37
-	private $view;
38
-	/** @var \OCP\IDBConnection */
39
-	private $connection;
40
-	/** @var IConfig */
41
-	private $config;
42
-	/** @var  ILogger */
43
-	private $logger;
44
-	/** @var string*/
45
-	protected $installedVersion;
46
-
47
-	/**
48
-	 * @param IConfig $config
49
-	 * @param View $view
50
-	 * @param IDBConnection $connection
51
-	 * @param ILogger $logger
52
-	 */
53
-	public function __construct(IConfig $config, View $view, IDBConnection $connection, ILogger $logger) {
54
-		$this->view = $view;
55
-		$this->view->disableCacheUpdate();
56
-		$this->connection = $connection;
57
-		$this->moduleId = \OCA\Encryption\Crypto\Encryption::ID;
58
-		$this->config = $config;
59
-		$this->logger = $logger;
60
-		$this->installedVersion = $this->config->getAppValue('files_encryption', 'installed_version', '-1');
61
-	}
62
-
63
-	public function finalCleanUp() {
64
-		$this->view->deleteAll('files_encryption/public_keys');
65
-		$this->updateFileCache();
66
-		$this->config->deleteAppValue('files_encryption', 'installed_version');
67
-	}
68
-
69
-	/**
70
-	 * update file cache, copy unencrypted_size to the 'size' column
71
-	 */
72
-	private function updateFileCache() {
73
-		// make sure that we don't update the file cache multiple times
74
-		// only update during the first run
75
-		if ($this->installedVersion !== '-1') {
76
-			$query = $this->connection->getQueryBuilder();
77
-			$query->update('filecache')
78
-				->set('size', 'unencrypted_size')
79
-				->where($query->expr()->eq('encrypted', $query->createParameter('encrypted')))
80
-				->setParameter('encrypted', 1);
81
-			$query->execute();
82
-		}
83
-	}
84
-
85
-	/**
86
-	 * iterate through users and reorganize the folder structure
87
-	 */
88
-	public function reorganizeFolderStructure() {
89
-		$this->reorganizeSystemFolderStructure();
90
-
91
-		$limit = 500;
92
-		$offset = 0;
93
-		do {
94
-			$users = \OCP\User::getUsers('', $limit, $offset);
95
-			foreach ($users as $user) {
96
-				$this->reorganizeFolderStructureForUser($user);
97
-			}
98
-			$offset += $limit;
99
-		} while (count($users) >= $limit);
100
-	}
101
-
102
-	/**
103
-	 * reorganize system wide folder structure
104
-	 */
105
-	public function reorganizeSystemFolderStructure() {
106
-
107
-		$this->createPathForKeys('/files_encryption');
108
-
109
-		// backup system wide folders
110
-		$this->backupSystemWideKeys();
111
-
112
-		// rename system wide mount point
113
-		$this->renameFileKeys('', '/files_encryption/keys');
114
-
115
-		// rename system private keys
116
-		$this->renameSystemPrivateKeys();
117
-
118
-		$storage = $this->view->getMount('')->getStorage();
119
-		$storage->getScanner()->scan('files_encryption');
120
-	}
121
-
122
-
123
-	/**
124
-	 * reorganize folder structure for user
125
-	 *
126
-	 * @param string $user
127
-	 */
128
-	public function reorganizeFolderStructureForUser($user) {
129
-		// backup all keys
130
-		\OC_Util::tearDownFS();
131
-		\OC_Util::setupFS($user);
132
-		if ($this->backupUserKeys($user)) {
133
-			// rename users private key
134
-			$this->renameUsersPrivateKey($user);
135
-			$this->renameUsersPublicKey($user);
136
-			// rename file keys
137
-			$path = '/files_encryption/keys';
138
-			$this->renameFileKeys($user, $path);
139
-			$trashPath = '/files_trashbin/keys';
140
-			if (\OC_App::isEnabled('files_trashbin') && $this->view->is_dir($user . '/' . $trashPath)) {
141
-				$this->renameFileKeys($user, $trashPath, true);
142
-				$this->view->deleteAll($trashPath);
143
-			}
144
-			// delete old folders
145
-			$this->deleteOldKeys($user);
146
-			$this->view->getMount('/' . $user)->getStorage()->getScanner()->scan('files_encryption');
147
-		}
148
-	}
149
-
150
-	/**
151
-	 * update database
152
-	 */
153
-	public function updateDB() {
154
-
155
-		// make sure that we don't update the file cache multiple times
156
-		// only update during the first run
157
-		if ($this->installedVersion === '-1') {
158
-			return;
159
-		}
160
-
161
-		// delete left-over from old encryption which is no longer needed
162
-		$this->config->deleteAppValue('files_encryption', 'ocsid');
163
-		$this->config->deleteAppValue('files_encryption', 'types');
164
-		$this->config->deleteAppValue('files_encryption', 'enabled');
165
-
166
-		$oldAppValues = $this->connection->getQueryBuilder();
167
-		$oldAppValues->select('*')
168
-			->from('appconfig')
169
-			->where($oldAppValues->expr()->eq('appid', $oldAppValues->createParameter('appid')))
170
-			->setParameter('appid', 'files_encryption');
171
-		$appSettings = $oldAppValues->execute();
172
-
173
-		while ($row = $appSettings->fetch()) {
174
-			// 'installed_version' gets deleted at the end of the migration process
175
-			if ($row['configkey'] !== 'installed_version' ) {
176
-				$this->config->setAppValue('encryption', $row['configkey'], $row['configvalue']);
177
-				$this->config->deleteAppValue('files_encryption', $row['configkey']);
178
-			}
179
-		}
180
-
181
-		$oldPreferences = $this->connection->getQueryBuilder();
182
-		$oldPreferences->select('*')
183
-			->from('preferences')
184
-			->where($oldPreferences->expr()->eq('appid', $oldPreferences->createParameter('appid')))
185
-			->setParameter('appid', 'files_encryption');
186
-		$preferenceSettings = $oldPreferences->execute();
187
-
188
-		while ($row = $preferenceSettings->fetch()) {
189
-			$this->config->setUserValue($row['userid'], 'encryption', $row['configkey'], $row['configvalue']);
190
-			$this->config->deleteUserValue($row['userid'], 'files_encryption', $row['configkey']);
191
-		}
192
-	}
193
-
194
-	/**
195
-	 * create backup of system-wide keys
196
-	 */
197
-	private function backupSystemWideKeys() {
198
-		$backupDir = 'encryption_migration_backup_' . date("Y-m-d_H-i-s");
199
-		$this->view->mkdir($backupDir);
200
-		$this->view->copy('files_encryption', $backupDir . '/files_encryption');
201
-	}
202
-
203
-	/**
204
-	 * create backup of user specific keys
205
-	 *
206
-	 * @param string $user
207
-	 * @return bool
208
-	 */
209
-	private function backupUserKeys($user) {
210
-		$encryptionDir = $user . '/files_encryption';
211
-		if ($this->view->is_dir($encryptionDir)) {
212
-			$backupDir = $user . '/encryption_migration_backup_' . date("Y-m-d_H-i-s");
213
-			$this->view->mkdir($backupDir);
214
-			$this->view->copy($encryptionDir, $backupDir);
215
-			return true;
216
-		}
217
-		return false;
218
-	}
219
-
220
-	/**
221
-	 * rename system-wide private keys
222
-	 */
223
-	private function renameSystemPrivateKeys() {
224
-		$dh = $this->view->opendir('files_encryption');
225
-		$this->createPathForKeys('/files_encryption/' . $this->moduleId );
226
-		if (is_resource($dh)) {
227
-			while (($privateKey = readdir($dh)) !== false) {
228
-				if (!\OC\Files\Filesystem::isIgnoredDir($privateKey) ) {
229
-					if (!$this->view->is_dir('/files_encryption/' . $privateKey)) {
230
-						$this->view->rename('files_encryption/' . $privateKey, 'files_encryption/' . $this->moduleId . '/' . $privateKey);
231
-						$this->renameSystemPublicKey($privateKey);
232
-					}
233
-				}
234
-			}
235
-			closedir($dh);
236
-		}
237
-	}
238
-
239
-	/**
240
-	 * rename system wide public key
241
-	 *
242
-	 * @param string $privateKey private key for which we want to rename the corresponding public key
243
-	 */
244
-	private function renameSystemPublicKey($privateKey) {
245
-		$publicKey = substr($privateKey,0 , strrpos($privateKey, '.privateKey')) . '.publicKey';
246
-		$this->view->rename('files_encryption/public_keys/' . $publicKey, 'files_encryption/' . $this->moduleId . '/' . $publicKey);
247
-	}
248
-
249
-	/**
250
-	 * rename user-specific private keys
251
-	 *
252
-	 * @param string $user
253
-	 */
254
-	private function renameUsersPrivateKey($user) {
255
-		$oldPrivateKey = $user . '/files_encryption/' . $user . '.privateKey';
256
-		$newPrivateKey = $user . '/files_encryption/' . $this->moduleId . '/' . $user . '.privateKey';
257
-		if ($this->view->file_exists($oldPrivateKey)) {
258
-			$this->createPathForKeys(dirname($newPrivateKey));
259
-			$this->view->rename($oldPrivateKey, $newPrivateKey);
260
-		}
261
-	}
262
-
263
-	/**
264
-	 * rename user-specific public keys
265
-	 *
266
-	 * @param string $user
267
-	 */
268
-	private function renameUsersPublicKey($user) {
269
-		$oldPublicKey = '/files_encryption/public_keys/' . $user . '.publicKey';
270
-		$newPublicKey = $user . '/files_encryption/' . $this->moduleId . '/' . $user . '.publicKey';
271
-		if ($this->view->file_exists($oldPublicKey)) {
272
-			$this->createPathForKeys(dirname($newPublicKey));
273
-			$this->view->rename($oldPublicKey, $newPublicKey);
274
-		}
275
-	}
276
-
277
-	/**
278
-	 * rename file keys
279
-	 *
280
-	 * @param string $user
281
-	 * @param string $path
282
-	 * @param bool $trash
283
-	 */
284
-	private function renameFileKeys($user, $path, $trash = false) {
285
-
286
-		if ($this->view->is_dir($user . '/' . $path) === false) {
287
-			$this->logger->info('Skip dir /' . $user . '/' . $path . ': does not exist');
288
-			return;
289
-		}
290
-
291
-		$dh = $this->view->opendir($user . '/' . $path);
292
-
293
-		if (is_resource($dh)) {
294
-			while (($file = readdir($dh)) !== false) {
295
-				if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
296
-					if ($this->view->is_dir($user . '/' . $path . '/' . $file)) {
297
-						$this->renameFileKeys($user, $path . '/' . $file, $trash);
298
-					} else {
299
-						$target = $this->getTargetDir($user, $path, $file, $trash);
300
-						if ($target !== false) {
301
-							$this->createPathForKeys(dirname($target));
302
-							$this->view->rename($user . '/' . $path . '/' . $file, $target);
303
-						} else {
304
-							$this->logger->warning(
305
-								'did not move key "' . $file
306
-								. '" could not find the corresponding file in /data/' . $user . '/files.'
307
-							. 'Most likely the key was already moved in a previous migration run and is already on the right place.');
308
-						}
309
-					}
310
-				}
311
-			}
312
-			closedir($dh);
313
-		}
314
-	}
315
-
316
-	/**
317
-	 * get system mount points
318
-	 * wrap static method so that it can be mocked for testing
319
-	 *
320
-	 * @internal
321
-	 * @return array
322
-	 */
323
-	protected function getSystemMountPoints() {
324
-		return \OC_Mount_Config::getSystemMountPoints();
325
-	}
326
-
327
-	/**
328
-	 * generate target directory
329
-	 *
330
-	 * @param string $user
331
-	 * @param string $keyPath
332
-	 * @param string $filename
333
-	 * @param bool $trash
334
-	 * @return string
335
-	 */
336
-	private function getTargetDir($user, $keyPath, $filename, $trash) {
337
-		if ($trash) {
338
-			$filePath = substr($keyPath, strlen('/files_trashbin/keys/'));
339
-			$targetDir = $user . '/files_encryption/keys/files_trashbin/' . $filePath . '/' . $this->moduleId . '/' . $filename;
340
-		} else {
341
-			$filePath = substr($keyPath, strlen('/files_encryption/keys/'));
342
-			$targetDir = $user . '/files_encryption/keys/files/' . $filePath . '/' . $this->moduleId . '/' . $filename;
343
-		}
344
-
345
-		if ($user === '') {
346
-			// for system wide mounts we need to check if the mount point really exists
347
-			$normalized = \OC\Files\Filesystem::normalizePath($filePath);
348
-			$systemMountPoints = $this->getSystemMountPoints();
349
-			foreach ($systemMountPoints as $mountPoint) {
350
-				$normalizedMountPoint = \OC\Files\Filesystem::normalizePath($mountPoint['mountpoint']) . '/';
351
-				if (strpos($normalized, $normalizedMountPoint) === 0)
352
-					return $targetDir;
353
-			}
354
-		} else if ($trash === false && $this->view->file_exists('/' . $user. '/files/' . $filePath)) {
355
-			return $targetDir;
356
-		} else if ($trash === true && $this->view->file_exists('/' . $user. '/files_trashbin/' . $filePath)) {
357
-				return $targetDir;
358
-			}
359
-
360
-		return false;
361
-	}
362
-
363
-	/**
364
-	 * delete old keys
365
-	 *
366
-	 * @param string $user
367
-	 */
368
-	private function deleteOldKeys($user) {
369
-		$this->view->deleteAll($user . '/files_encryption/keyfiles');
370
-		$this->view->deleteAll($user . '/files_encryption/share-keys');
371
-	}
372
-
373
-	/**
374
-	 * create directories for the keys recursively
375
-	 *
376
-	 * @param string $path
377
-	 */
378
-	private function createPathForKeys($path) {
379
-		if (!$this->view->file_exists($path)) {
380
-			$sub_dirs = explode('/', $path);
381
-			$dir = '';
382
-			foreach ($sub_dirs as $sub_dir) {
383
-				$dir .= '/' . $sub_dir;
384
-				if (!$this->view->is_dir($dir)) {
385
-					$this->view->mkdir($dir);
386
-				}
387
-			}
388
-		}
389
-	}
35
+    private $moduleId;
36
+    /** @var \OC\Files\View */
37
+    private $view;
38
+    /** @var \OCP\IDBConnection */
39
+    private $connection;
40
+    /** @var IConfig */
41
+    private $config;
42
+    /** @var  ILogger */
43
+    private $logger;
44
+    /** @var string*/
45
+    protected $installedVersion;
46
+
47
+    /**
48
+     * @param IConfig $config
49
+     * @param View $view
50
+     * @param IDBConnection $connection
51
+     * @param ILogger $logger
52
+     */
53
+    public function __construct(IConfig $config, View $view, IDBConnection $connection, ILogger $logger) {
54
+        $this->view = $view;
55
+        $this->view->disableCacheUpdate();
56
+        $this->connection = $connection;
57
+        $this->moduleId = \OCA\Encryption\Crypto\Encryption::ID;
58
+        $this->config = $config;
59
+        $this->logger = $logger;
60
+        $this->installedVersion = $this->config->getAppValue('files_encryption', 'installed_version', '-1');
61
+    }
62
+
63
+    public function finalCleanUp() {
64
+        $this->view->deleteAll('files_encryption/public_keys');
65
+        $this->updateFileCache();
66
+        $this->config->deleteAppValue('files_encryption', 'installed_version');
67
+    }
68
+
69
+    /**
70
+     * update file cache, copy unencrypted_size to the 'size' column
71
+     */
72
+    private function updateFileCache() {
73
+        // make sure that we don't update the file cache multiple times
74
+        // only update during the first run
75
+        if ($this->installedVersion !== '-1') {
76
+            $query = $this->connection->getQueryBuilder();
77
+            $query->update('filecache')
78
+                ->set('size', 'unencrypted_size')
79
+                ->where($query->expr()->eq('encrypted', $query->createParameter('encrypted')))
80
+                ->setParameter('encrypted', 1);
81
+            $query->execute();
82
+        }
83
+    }
84
+
85
+    /**
86
+     * iterate through users and reorganize the folder structure
87
+     */
88
+    public function reorganizeFolderStructure() {
89
+        $this->reorganizeSystemFolderStructure();
90
+
91
+        $limit = 500;
92
+        $offset = 0;
93
+        do {
94
+            $users = \OCP\User::getUsers('', $limit, $offset);
95
+            foreach ($users as $user) {
96
+                $this->reorganizeFolderStructureForUser($user);
97
+            }
98
+            $offset += $limit;
99
+        } while (count($users) >= $limit);
100
+    }
101
+
102
+    /**
103
+     * reorganize system wide folder structure
104
+     */
105
+    public function reorganizeSystemFolderStructure() {
106
+
107
+        $this->createPathForKeys('/files_encryption');
108
+
109
+        // backup system wide folders
110
+        $this->backupSystemWideKeys();
111
+
112
+        // rename system wide mount point
113
+        $this->renameFileKeys('', '/files_encryption/keys');
114
+
115
+        // rename system private keys
116
+        $this->renameSystemPrivateKeys();
117
+
118
+        $storage = $this->view->getMount('')->getStorage();
119
+        $storage->getScanner()->scan('files_encryption');
120
+    }
121
+
122
+
123
+    /**
124
+     * reorganize folder structure for user
125
+     *
126
+     * @param string $user
127
+     */
128
+    public function reorganizeFolderStructureForUser($user) {
129
+        // backup all keys
130
+        \OC_Util::tearDownFS();
131
+        \OC_Util::setupFS($user);
132
+        if ($this->backupUserKeys($user)) {
133
+            // rename users private key
134
+            $this->renameUsersPrivateKey($user);
135
+            $this->renameUsersPublicKey($user);
136
+            // rename file keys
137
+            $path = '/files_encryption/keys';
138
+            $this->renameFileKeys($user, $path);
139
+            $trashPath = '/files_trashbin/keys';
140
+            if (\OC_App::isEnabled('files_trashbin') && $this->view->is_dir($user . '/' . $trashPath)) {
141
+                $this->renameFileKeys($user, $trashPath, true);
142
+                $this->view->deleteAll($trashPath);
143
+            }
144
+            // delete old folders
145
+            $this->deleteOldKeys($user);
146
+            $this->view->getMount('/' . $user)->getStorage()->getScanner()->scan('files_encryption');
147
+        }
148
+    }
149
+
150
+    /**
151
+     * update database
152
+     */
153
+    public function updateDB() {
154
+
155
+        // make sure that we don't update the file cache multiple times
156
+        // only update during the first run
157
+        if ($this->installedVersion === '-1') {
158
+            return;
159
+        }
160
+
161
+        // delete left-over from old encryption which is no longer needed
162
+        $this->config->deleteAppValue('files_encryption', 'ocsid');
163
+        $this->config->deleteAppValue('files_encryption', 'types');
164
+        $this->config->deleteAppValue('files_encryption', 'enabled');
165
+
166
+        $oldAppValues = $this->connection->getQueryBuilder();
167
+        $oldAppValues->select('*')
168
+            ->from('appconfig')
169
+            ->where($oldAppValues->expr()->eq('appid', $oldAppValues->createParameter('appid')))
170
+            ->setParameter('appid', 'files_encryption');
171
+        $appSettings = $oldAppValues->execute();
172
+
173
+        while ($row = $appSettings->fetch()) {
174
+            // 'installed_version' gets deleted at the end of the migration process
175
+            if ($row['configkey'] !== 'installed_version' ) {
176
+                $this->config->setAppValue('encryption', $row['configkey'], $row['configvalue']);
177
+                $this->config->deleteAppValue('files_encryption', $row['configkey']);
178
+            }
179
+        }
180
+
181
+        $oldPreferences = $this->connection->getQueryBuilder();
182
+        $oldPreferences->select('*')
183
+            ->from('preferences')
184
+            ->where($oldPreferences->expr()->eq('appid', $oldPreferences->createParameter('appid')))
185
+            ->setParameter('appid', 'files_encryption');
186
+        $preferenceSettings = $oldPreferences->execute();
187
+
188
+        while ($row = $preferenceSettings->fetch()) {
189
+            $this->config->setUserValue($row['userid'], 'encryption', $row['configkey'], $row['configvalue']);
190
+            $this->config->deleteUserValue($row['userid'], 'files_encryption', $row['configkey']);
191
+        }
192
+    }
193
+
194
+    /**
195
+     * create backup of system-wide keys
196
+     */
197
+    private function backupSystemWideKeys() {
198
+        $backupDir = 'encryption_migration_backup_' . date("Y-m-d_H-i-s");
199
+        $this->view->mkdir($backupDir);
200
+        $this->view->copy('files_encryption', $backupDir . '/files_encryption');
201
+    }
202
+
203
+    /**
204
+     * create backup of user specific keys
205
+     *
206
+     * @param string $user
207
+     * @return bool
208
+     */
209
+    private function backupUserKeys($user) {
210
+        $encryptionDir = $user . '/files_encryption';
211
+        if ($this->view->is_dir($encryptionDir)) {
212
+            $backupDir = $user . '/encryption_migration_backup_' . date("Y-m-d_H-i-s");
213
+            $this->view->mkdir($backupDir);
214
+            $this->view->copy($encryptionDir, $backupDir);
215
+            return true;
216
+        }
217
+        return false;
218
+    }
219
+
220
+    /**
221
+     * rename system-wide private keys
222
+     */
223
+    private function renameSystemPrivateKeys() {
224
+        $dh = $this->view->opendir('files_encryption');
225
+        $this->createPathForKeys('/files_encryption/' . $this->moduleId );
226
+        if (is_resource($dh)) {
227
+            while (($privateKey = readdir($dh)) !== false) {
228
+                if (!\OC\Files\Filesystem::isIgnoredDir($privateKey) ) {
229
+                    if (!$this->view->is_dir('/files_encryption/' . $privateKey)) {
230
+                        $this->view->rename('files_encryption/' . $privateKey, 'files_encryption/' . $this->moduleId . '/' . $privateKey);
231
+                        $this->renameSystemPublicKey($privateKey);
232
+                    }
233
+                }
234
+            }
235
+            closedir($dh);
236
+        }
237
+    }
238
+
239
+    /**
240
+     * rename system wide public key
241
+     *
242
+     * @param string $privateKey private key for which we want to rename the corresponding public key
243
+     */
244
+    private function renameSystemPublicKey($privateKey) {
245
+        $publicKey = substr($privateKey,0 , strrpos($privateKey, '.privateKey')) . '.publicKey';
246
+        $this->view->rename('files_encryption/public_keys/' . $publicKey, 'files_encryption/' . $this->moduleId . '/' . $publicKey);
247
+    }
248
+
249
+    /**
250
+     * rename user-specific private keys
251
+     *
252
+     * @param string $user
253
+     */
254
+    private function renameUsersPrivateKey($user) {
255
+        $oldPrivateKey = $user . '/files_encryption/' . $user . '.privateKey';
256
+        $newPrivateKey = $user . '/files_encryption/' . $this->moduleId . '/' . $user . '.privateKey';
257
+        if ($this->view->file_exists($oldPrivateKey)) {
258
+            $this->createPathForKeys(dirname($newPrivateKey));
259
+            $this->view->rename($oldPrivateKey, $newPrivateKey);
260
+        }
261
+    }
262
+
263
+    /**
264
+     * rename user-specific public keys
265
+     *
266
+     * @param string $user
267
+     */
268
+    private function renameUsersPublicKey($user) {
269
+        $oldPublicKey = '/files_encryption/public_keys/' . $user . '.publicKey';
270
+        $newPublicKey = $user . '/files_encryption/' . $this->moduleId . '/' . $user . '.publicKey';
271
+        if ($this->view->file_exists($oldPublicKey)) {
272
+            $this->createPathForKeys(dirname($newPublicKey));
273
+            $this->view->rename($oldPublicKey, $newPublicKey);
274
+        }
275
+    }
276
+
277
+    /**
278
+     * rename file keys
279
+     *
280
+     * @param string $user
281
+     * @param string $path
282
+     * @param bool $trash
283
+     */
284
+    private function renameFileKeys($user, $path, $trash = false) {
285
+
286
+        if ($this->view->is_dir($user . '/' . $path) === false) {
287
+            $this->logger->info('Skip dir /' . $user . '/' . $path . ': does not exist');
288
+            return;
289
+        }
290
+
291
+        $dh = $this->view->opendir($user . '/' . $path);
292
+
293
+        if (is_resource($dh)) {
294
+            while (($file = readdir($dh)) !== false) {
295
+                if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
296
+                    if ($this->view->is_dir($user . '/' . $path . '/' . $file)) {
297
+                        $this->renameFileKeys($user, $path . '/' . $file, $trash);
298
+                    } else {
299
+                        $target = $this->getTargetDir($user, $path, $file, $trash);
300
+                        if ($target !== false) {
301
+                            $this->createPathForKeys(dirname($target));
302
+                            $this->view->rename($user . '/' . $path . '/' . $file, $target);
303
+                        } else {
304
+                            $this->logger->warning(
305
+                                'did not move key "' . $file
306
+                                . '" could not find the corresponding file in /data/' . $user . '/files.'
307
+                            . 'Most likely the key was already moved in a previous migration run and is already on the right place.');
308
+                        }
309
+                    }
310
+                }
311
+            }
312
+            closedir($dh);
313
+        }
314
+    }
315
+
316
+    /**
317
+     * get system mount points
318
+     * wrap static method so that it can be mocked for testing
319
+     *
320
+     * @internal
321
+     * @return array
322
+     */
323
+    protected function getSystemMountPoints() {
324
+        return \OC_Mount_Config::getSystemMountPoints();
325
+    }
326
+
327
+    /**
328
+     * generate target directory
329
+     *
330
+     * @param string $user
331
+     * @param string $keyPath
332
+     * @param string $filename
333
+     * @param bool $trash
334
+     * @return string
335
+     */
336
+    private function getTargetDir($user, $keyPath, $filename, $trash) {
337
+        if ($trash) {
338
+            $filePath = substr($keyPath, strlen('/files_trashbin/keys/'));
339
+            $targetDir = $user . '/files_encryption/keys/files_trashbin/' . $filePath . '/' . $this->moduleId . '/' . $filename;
340
+        } else {
341
+            $filePath = substr($keyPath, strlen('/files_encryption/keys/'));
342
+            $targetDir = $user . '/files_encryption/keys/files/' . $filePath . '/' . $this->moduleId . '/' . $filename;
343
+        }
344
+
345
+        if ($user === '') {
346
+            // for system wide mounts we need to check if the mount point really exists
347
+            $normalized = \OC\Files\Filesystem::normalizePath($filePath);
348
+            $systemMountPoints = $this->getSystemMountPoints();
349
+            foreach ($systemMountPoints as $mountPoint) {
350
+                $normalizedMountPoint = \OC\Files\Filesystem::normalizePath($mountPoint['mountpoint']) . '/';
351
+                if (strpos($normalized, $normalizedMountPoint) === 0)
352
+                    return $targetDir;
353
+            }
354
+        } else if ($trash === false && $this->view->file_exists('/' . $user. '/files/' . $filePath)) {
355
+            return $targetDir;
356
+        } else if ($trash === true && $this->view->file_exists('/' . $user. '/files_trashbin/' . $filePath)) {
357
+                return $targetDir;
358
+            }
359
+
360
+        return false;
361
+    }
362
+
363
+    /**
364
+     * delete old keys
365
+     *
366
+     * @param string $user
367
+     */
368
+    private function deleteOldKeys($user) {
369
+        $this->view->deleteAll($user . '/files_encryption/keyfiles');
370
+        $this->view->deleteAll($user . '/files_encryption/share-keys');
371
+    }
372
+
373
+    /**
374
+     * create directories for the keys recursively
375
+     *
376
+     * @param string $path
377
+     */
378
+    private function createPathForKeys($path) {
379
+        if (!$this->view->file_exists($path)) {
380
+            $sub_dirs = explode('/', $path);
381
+            $dir = '';
382
+            foreach ($sub_dirs as $sub_dir) {
383
+                $dir .= '/' . $sub_dir;
384
+                if (!$this->view->is_dir($dir)) {
385
+                    $this->view->mkdir($dir);
386
+                }
387
+            }
388
+        }
389
+    }
390 390
 }
Please login to merge, or discard this patch.