summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorBjörn Schießle <schiessle@owncloud.com>2013-06-11 12:03:50 +0200
committerBjörn Schießle <schiessle@owncloud.com>2013-06-11 12:03:50 +0200
commit5fafd55108d1ecd13befaa589902a84a23276af8 (patch)
treef7b99b7189b952cff032eee9dc0faa468b4cb271 /apps
parent4f0f537b422015fb5573d3b50c3d0a7137a1384d (diff)
downloadnextcloud-server-5fafd55108d1ecd13befaa589902a84a23276af8.tar.gz
nextcloud-server-5fafd55108d1ecd13befaa589902a84a23276af8.zip
make sure that only one process can enter the migration mode
Diffstat (limited to 'apps')
-rw-r--r--apps/files_encryption/hooks/hooks.php6
-rw-r--r--apps/files_encryption/lib/util.php83
2 files changed, 77 insertions, 12 deletions
diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php
index c4b247da1ed..9f36393d591 100644
--- a/apps/files_encryption/hooks/hooks.php
+++ b/apps/files_encryption/hooks/hooks.php
@@ -67,10 +67,10 @@ class Hooks {
$session->setPrivateKey($privateKey, $params['uid']);
// Check if first-run file migration has already been performed
- $migrationCompleted = $util->getMigrationStatus();
+ $ready = $util->beginMigration();
// If migration not yet done
- if (!$migrationCompleted) {
+ if ($ready) {
$userView = new \OC_FilesystemView('/' . $params['uid']);
@@ -102,7 +102,7 @@ class Hooks {
}
// Register successful migration in DB
- $util->setMigrationStatus(1);
+ $util->finishMigration();
}
diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php
index a6711880c20..82b6ca2f321 100644
--- a/apps/files_encryption/lib/util.php
+++ b/apps/files_encryption/lib/util.php
@@ -1058,7 +1058,7 @@ class Util {
* @param $status
* @return bool
*/
- public function setMigrationStatus($status) {
+ private function setMigrationStatus($status) {
$sql = 'UPDATE `*PREFIX*encryption` SET `migration_status` = ? WHERE `uid` = ?';
@@ -1074,7 +1074,7 @@ class Util {
return true;
} else {
-
+ \OCP\Util::writeLog('Encryption library', "Could not set migration status for " . $this->userId, \OCP\Util::ERROR);
return false;
}
@@ -1082,12 +1082,80 @@ class Util {
}
/**
- * @brief Check whether pwd recovery is enabled for a given user
- * @return bool 1 = yes, 0 = no, false = no record
+ * @brief start migration mode to initially encrypt users data
+ * @return boolean
+ */
+ public function beginMigration() {
+
+ $return = false;
+
+ $transaction = \OC_DB::beginTransaction();
+
+ if ($transaction === false) {
+ \OCP\Util::writeLog('Encryption library', "Your database migration doesn't support transactions", \OCP\Util::WARN);
+ }
+
+ $migrationStatus = $this->getMigrationStatus();
+
+ if ($migrationStatus === '0') {
+
+ $return = $this->setMigrationStatus(-1);
+
+ if ($return === true) {
+ \OCP\Util::writeLog('Encryption library', "Enter migration mode for initial encryption for user " . $this->userId, \OCP\Util::INFO);
+ } else {
+ \OCP\Util::writeLog('Encryption library', "Could not activate migration mode for " . $this->userId . ", encryption aborted", \OCP\Util::ERROR);
+ }
+ } else {
+ \OCP\Util::writeLog('Encryption library', "Another process already performs the migration for user " . $this->userId, \OCP\Util::INFO);
+ }
+
+ \OC_DB::commit();
+
+ return $return;
+ }
+
+ /**
+ * @brief close migration mode after users data has been encrypted successfully
+ * @return boolean
+ */
+ public function finishMigration() {
+
+ $return = false;
+
+ $transaction = \OC_DB::beginTransaction();
+
+ if ($transaction === false) {
+ \OCP\Util::writeLog('Encryption library', "Your database migration doesn't support transactions", \OCP\Util::WARN);
+ }
+
+ $migrationStatus = $this->getMigrationStatus();
+
+ if ($migrationStatus === '-1') {
+
+ $return = $this->setMigrationStatus(1);
+
+ if ($return === true) {
+ \OCP\Util::writeLog('Encryption library', "Leave migration mode for: " . $this->userId . " successfully.", \OCP\Util::INFO);
+ } else {
+ \OCP\Util::writeLog('Encryption library', "Could not deactivate migration mode for " . $this->userId, \OCP\Util::ERROR);
+ }
+ } else {
+ \OCP\Util::writeLog('Encryption library', "Someone else finished the migration mode to early for user " . $this->userId, \OCP\Util::ERROR);
+ }
+
+ \OC_DB::commit();
+
+ return $return;
+ }
+
+ /**
+ * @brief check if files are already migrated to the encryption system
+ * @return '1' = yes, '0' = no, '-1' = migration in progress, false = no record
* @note If records are not being returned, check for a hidden space
* at the start of the uid in db
*/
- public function getMigrationStatus() {
+ private function getMigrationStatus() {
$sql = 'SELECT `migration_status` FROM `*PREFIX*encryption` WHERE `uid` = ?';
@@ -1112,14 +1180,11 @@ class Util {
// If no record is found
if (empty($migrationStatus)) {
-
+ \OCP\Util::writeLog('Encryption library', "Could not get migration status for " . $this->userId . ", no record found", \OCP\Util::ERROR);
return false;
-
// If a record is found
} else {
-
return $migrationStatus[0];
-
}
}