Passed
Push — master ( 6ce3c5...504e18 )
by John
14:34 queued 13s
created
apps/dav/lib/Migration/RemoveOrphanEventsAndContacts.php 2 patches
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -48,23 +48,23 @@  discard block
 block discarded – undo
48 48
 	 * @inheritdoc
49 49
 	 */
50 50
 	public function run(IOutput $output) {
51
-		$orphanItems = $this->removeOrphanChildren('calendarobjects', 'calendars',  'calendarid');
51
+		$orphanItems = $this->removeOrphanChildren('calendarobjects', 'calendars', 'calendarid');
52 52
 		$output->info(sprintf('%d events without a calendar have been cleaned up', $orphanItems));
53
-		$orphanItems = $this->removeOrphanChildren('calendarobjects_props', 'calendarobjects',  'objectid');
53
+		$orphanItems = $this->removeOrphanChildren('calendarobjects_props', 'calendarobjects', 'objectid');
54 54
 		$output->info(sprintf('%d properties without an events have been cleaned up', $orphanItems));
55
-		$orphanItems = $this->removeOrphanChildren('calendarchanges', 'calendars',  'calendarid');
55
+		$orphanItems = $this->removeOrphanChildren('calendarchanges', 'calendars', 'calendarid');
56 56
 		$output->info(sprintf('%d changes without a calendar have been cleaned up', $orphanItems));
57 57
 
58
-		$orphanItems = $this->removeOrphanChildren('calendarobjects', 'calendarsubscriptions',  'calendarid');
58
+		$orphanItems = $this->removeOrphanChildren('calendarobjects', 'calendarsubscriptions', 'calendarid');
59 59
 		$output->info(sprintf('%d cached events without a calendar subscription have been cleaned up', $orphanItems));
60
-		$orphanItems = $this->removeOrphanChildren('calendarchanges', 'calendarsubscriptions',  'calendarid');
60
+		$orphanItems = $this->removeOrphanChildren('calendarchanges', 'calendarsubscriptions', 'calendarid');
61 61
 		$output->info(sprintf('%d changes without a calendar subscription have been cleaned up', $orphanItems));
62 62
 
63
-		$orphanItems = $this->removeOrphanChildren('cards', 'addressbooks',  'addressbookid');
63
+		$orphanItems = $this->removeOrphanChildren('cards', 'addressbooks', 'addressbookid');
64 64
 		$output->info(sprintf('%d contacts without an addressbook have been cleaned up', $orphanItems));
65
-		$orphanItems = $this->removeOrphanChildren('cards_properties', 'cards',  'cardid');
65
+		$orphanItems = $this->removeOrphanChildren('cards_properties', 'cards', 'cardid');
66 66
 		$output->info(sprintf('%d properties without a contact have been cleaned up', $orphanItems));
67
-		$orphanItems = $this->removeOrphanChildren('addressbookchanges', 'addressbooks',  'addressbookid');
67
+		$orphanItems = $this->removeOrphanChildren('addressbookchanges', 'addressbooks', 'addressbookid');
68 68
 		$output->info(sprintf('%d changes without an addressbook have been cleaned up', $orphanItems));
69 69
 	}
70 70
 
@@ -73,7 +73,7 @@  discard block
 block discarded – undo
73 73
 
74 74
 		$qb->select('c.id')
75 75
 			->from($childTable, 'c')
76
-			->leftJoin('c', $parentTable, 'p', $qb->expr()->eq('c.' . $parentId, 'p.id'))
76
+			->leftJoin('c', $parentTable, 'p', $qb->expr()->eq('c.'.$parentId, 'p.id'))
77 77
 			->where($qb->expr()->isNull('p.id'));
78 78
 
79 79
 		if (\in_array($parentTable, ['calendars', 'calendarsubscriptions'], true)) {
Please login to merge, or discard this patch.
Indentation   +72 added lines, -72 removed lines patch added patch discarded remove patch
@@ -35,76 +35,76 @@
 block discarded – undo
35 35
 
36 36
 class RemoveOrphanEventsAndContacts implements IRepairStep {
37 37
 
38
-	/** @var IDBConnection */
39
-	private $connection;
40
-
41
-	public function __construct(IDBConnection $connection) {
42
-		$this->connection = $connection;
43
-	}
44
-
45
-	/**
46
-	 * @inheritdoc
47
-	 */
48
-	public function getName(): string {
49
-		return 'Clean up orphan event and contact data';
50
-	}
51
-
52
-	/**
53
-	 * @inheritdoc
54
-	 */
55
-	public function run(IOutput $output) {
56
-		$orphanItems = $this->removeOrphanChildren('calendarobjects', 'calendars',  'calendarid');
57
-		$output->info(sprintf('%d events without a calendar have been cleaned up', $orphanItems));
58
-		$orphanItems = $this->removeOrphanChildren('calendarobjects_props', 'calendarobjects',  'objectid');
59
-		$output->info(sprintf('%d properties without an events have been cleaned up', $orphanItems));
60
-		$orphanItems = $this->removeOrphanChildren('calendarchanges', 'calendars',  'calendarid');
61
-		$output->info(sprintf('%d changes without a calendar have been cleaned up', $orphanItems));
62
-
63
-		$orphanItems = $this->removeOrphanChildren('calendarobjects', 'calendarsubscriptions',  'calendarid');
64
-		$output->info(sprintf('%d cached events without a calendar subscription have been cleaned up', $orphanItems));
65
-		$orphanItems = $this->removeOrphanChildren('calendarchanges', 'calendarsubscriptions',  'calendarid');
66
-		$output->info(sprintf('%d changes without a calendar subscription have been cleaned up', $orphanItems));
67
-
68
-		$orphanItems = $this->removeOrphanChildren('cards', 'addressbooks',  'addressbookid');
69
-		$output->info(sprintf('%d contacts without an addressbook have been cleaned up', $orphanItems));
70
-		$orphanItems = $this->removeOrphanChildren('cards_properties', 'cards',  'cardid');
71
-		$output->info(sprintf('%d properties without a contact have been cleaned up', $orphanItems));
72
-		$orphanItems = $this->removeOrphanChildren('addressbookchanges', 'addressbooks',  'addressbookid');
73
-		$output->info(sprintf('%d changes without an addressbook have been cleaned up', $orphanItems));
74
-	}
75
-
76
-	protected function removeOrphanChildren($childTable, $parentTable, $parentId): int {
77
-		$qb = $this->connection->getQueryBuilder();
78
-
79
-		$qb->select('c.id')
80
-			->from($childTable, 'c')
81
-			->leftJoin('c', $parentTable, 'p', $qb->expr()->eq('c.' . $parentId, 'p.id'))
82
-			->where($qb->expr()->isNull('p.id'));
83
-
84
-		if (\in_array($parentTable, ['calendars', 'calendarsubscriptions'], true)) {
85
-			$calendarType = $parentTable === 'calendarsubscriptions' ? CalDavBackend::CALENDAR_TYPE_SUBSCRIPTION : CalDavBackend::CALENDAR_TYPE_CALENDAR;
86
-			$qb->andWhere($qb->expr()->eq('c.calendartype', $qb->createNamedParameter($calendarType, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT));
87
-		}
88
-
89
-		$result = $qb->execute();
90
-
91
-		$orphanItems = [];
92
-		while ($row = $result->fetch()) {
93
-			$orphanItems[] = (int) $row['id'];
94
-		}
95
-		$result->closeCursor();
96
-
97
-		if (!empty($orphanItems)) {
98
-			$qb->delete($childTable)
99
-				->where($qb->expr()->in('id', $qb->createParameter('ids')));
100
-
101
-			$orphanItemsBatch = array_chunk($orphanItems, 200);
102
-			foreach ($orphanItemsBatch as $items) {
103
-				$qb->setParameter('ids', $items, IQueryBuilder::PARAM_INT_ARRAY);
104
-				$qb->execute();
105
-			}
106
-		}
107
-
108
-		return count($orphanItems);
109
-	}
38
+    /** @var IDBConnection */
39
+    private $connection;
40
+
41
+    public function __construct(IDBConnection $connection) {
42
+        $this->connection = $connection;
43
+    }
44
+
45
+    /**
46
+     * @inheritdoc
47
+     */
48
+    public function getName(): string {
49
+        return 'Clean up orphan event and contact data';
50
+    }
51
+
52
+    /**
53
+     * @inheritdoc
54
+     */
55
+    public function run(IOutput $output) {
56
+        $orphanItems = $this->removeOrphanChildren('calendarobjects', 'calendars',  'calendarid');
57
+        $output->info(sprintf('%d events without a calendar have been cleaned up', $orphanItems));
58
+        $orphanItems = $this->removeOrphanChildren('calendarobjects_props', 'calendarobjects',  'objectid');
59
+        $output->info(sprintf('%d properties without an events have been cleaned up', $orphanItems));
60
+        $orphanItems = $this->removeOrphanChildren('calendarchanges', 'calendars',  'calendarid');
61
+        $output->info(sprintf('%d changes without a calendar have been cleaned up', $orphanItems));
62
+
63
+        $orphanItems = $this->removeOrphanChildren('calendarobjects', 'calendarsubscriptions',  'calendarid');
64
+        $output->info(sprintf('%d cached events without a calendar subscription have been cleaned up', $orphanItems));
65
+        $orphanItems = $this->removeOrphanChildren('calendarchanges', 'calendarsubscriptions',  'calendarid');
66
+        $output->info(sprintf('%d changes without a calendar subscription have been cleaned up', $orphanItems));
67
+
68
+        $orphanItems = $this->removeOrphanChildren('cards', 'addressbooks',  'addressbookid');
69
+        $output->info(sprintf('%d contacts without an addressbook have been cleaned up', $orphanItems));
70
+        $orphanItems = $this->removeOrphanChildren('cards_properties', 'cards',  'cardid');
71
+        $output->info(sprintf('%d properties without a contact have been cleaned up', $orphanItems));
72
+        $orphanItems = $this->removeOrphanChildren('addressbookchanges', 'addressbooks',  'addressbookid');
73
+        $output->info(sprintf('%d changes without an addressbook have been cleaned up', $orphanItems));
74
+    }
75
+
76
+    protected function removeOrphanChildren($childTable, $parentTable, $parentId): int {
77
+        $qb = $this->connection->getQueryBuilder();
78
+
79
+        $qb->select('c.id')
80
+            ->from($childTable, 'c')
81
+            ->leftJoin('c', $parentTable, 'p', $qb->expr()->eq('c.' . $parentId, 'p.id'))
82
+            ->where($qb->expr()->isNull('p.id'));
83
+
84
+        if (\in_array($parentTable, ['calendars', 'calendarsubscriptions'], true)) {
85
+            $calendarType = $parentTable === 'calendarsubscriptions' ? CalDavBackend::CALENDAR_TYPE_SUBSCRIPTION : CalDavBackend::CALENDAR_TYPE_CALENDAR;
86
+            $qb->andWhere($qb->expr()->eq('c.calendartype', $qb->createNamedParameter($calendarType, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT));
87
+        }
88
+
89
+        $result = $qb->execute();
90
+
91
+        $orphanItems = [];
92
+        while ($row = $result->fetch()) {
93
+            $orphanItems[] = (int) $row['id'];
94
+        }
95
+        $result->closeCursor();
96
+
97
+        if (!empty($orphanItems)) {
98
+            $qb->delete($childTable)
99
+                ->where($qb->expr()->in('id', $qb->createParameter('ids')));
100
+
101
+            $orphanItemsBatch = array_chunk($orphanItems, 200);
102
+            foreach ($orphanItemsBatch as $items) {
103
+                $qb->setParameter('ids', $items, IQueryBuilder::PARAM_INT_ARRAY);
104
+                $qb->execute();
105
+            }
106
+        }
107
+
108
+        return count($orphanItems);
109
+    }
110 110
 }
Please login to merge, or discard this patch.
apps/workflowengine/lib/Check/FileSize.php 2 patches
Indentation   +87 added lines, -87 removed lines patch added patch discarded remove patch
@@ -31,91 +31,91 @@
 block discarded – undo
31 31
 
32 32
 class FileSize implements ICheck {
33 33
 
34
-	/** @var int */
35
-	protected $size;
36
-
37
-	/** @var IL10N */
38
-	protected $l;
39
-
40
-	/** @var IRequest */
41
-	protected $request;
42
-
43
-	/**
44
-	 * @param IL10N $l
45
-	 * @param IRequest $request
46
-	 */
47
-	public function __construct(IL10N $l, IRequest $request) {
48
-		$this->l = $l;
49
-		$this->request = $request;
50
-	}
51
-
52
-	/**
53
-	 * @param string $operator
54
-	 * @param string $value
55
-	 * @return bool
56
-	 */
57
-	public function executeCheck($operator, $value) {
58
-		$size = $this->getFileSizeFromHeader();
59
-
60
-		$value = Util::computerFileSize($value);
61
-		if ($size !== false) {
62
-			switch ($operator) {
63
-				case 'less':
64
-					return $size < $value;
65
-				case '!less':
66
-					return $size >= $value;
67
-				case 'greater':
68
-					return $size > $value;
69
-				case '!greater':
70
-					return $size <= $value;
71
-			}
72
-		}
73
-		return false;
74
-	}
75
-
76
-	/**
77
-	 * @param string $operator
78
-	 * @param string $value
79
-	 * @throws \UnexpectedValueException
80
-	 */
81
-	public function validateCheck($operator, $value) {
82
-		if (!in_array($operator, ['less', '!less', 'greater', '!greater'])) {
83
-			throw new \UnexpectedValueException($this->l->t('The given operator is invalid'), 1);
84
-		}
85
-
86
-		if (!preg_match('/^[0-9]+[ ]?[kmgt]?b$/i', $value)) {
87
-			throw new \UnexpectedValueException($this->l->t('The given file size is invalid'), 2);
88
-		}
89
-	}
90
-
91
-	/**
92
-	 * @return string
93
-	 */
94
-	protected function getFileSizeFromHeader() {
95
-		if ($this->size !== null) {
96
-			return $this->size;
97
-		}
98
-
99
-		$size = $this->request->getHeader('OC-Total-Length');
100
-		if ($size === '') {
101
-			if (in_array($this->request->getMethod(), ['POST', 'PUT'])) {
102
-				$size = $this->request->getHeader('Content-Length');
103
-			}
104
-		}
105
-
106
-		if ($size === '') {
107
-			$size = false;
108
-		}
109
-
110
-		$this->size = $size;
111
-		return $this->size;
112
-	}
113
-
114
-	public function supportedEntities(): array {
115
-		return [ File::class ];
116
-	}
117
-
118
-	public function isAvailableForScope(int $scope): bool {
119
-		return true;
120
-	}
34
+    /** @var int */
35
+    protected $size;
36
+
37
+    /** @var IL10N */
38
+    protected $l;
39
+
40
+    /** @var IRequest */
41
+    protected $request;
42
+
43
+    /**
44
+     * @param IL10N $l
45
+     * @param IRequest $request
46
+     */
47
+    public function __construct(IL10N $l, IRequest $request) {
48
+        $this->l = $l;
49
+        $this->request = $request;
50
+    }
51
+
52
+    /**
53
+     * @param string $operator
54
+     * @param string $value
55
+     * @return bool
56
+     */
57
+    public function executeCheck($operator, $value) {
58
+        $size = $this->getFileSizeFromHeader();
59
+
60
+        $value = Util::computerFileSize($value);
61
+        if ($size !== false) {
62
+            switch ($operator) {
63
+                case 'less':
64
+                    return $size < $value;
65
+                case '!less':
66
+                    return $size >= $value;
67
+                case 'greater':
68
+                    return $size > $value;
69
+                case '!greater':
70
+                    return $size <= $value;
71
+            }
72
+        }
73
+        return false;
74
+    }
75
+
76
+    /**
77
+     * @param string $operator
78
+     * @param string $value
79
+     * @throws \UnexpectedValueException
80
+     */
81
+    public function validateCheck($operator, $value) {
82
+        if (!in_array($operator, ['less', '!less', 'greater', '!greater'])) {
83
+            throw new \UnexpectedValueException($this->l->t('The given operator is invalid'), 1);
84
+        }
85
+
86
+        if (!preg_match('/^[0-9]+[ ]?[kmgt]?b$/i', $value)) {
87
+            throw new \UnexpectedValueException($this->l->t('The given file size is invalid'), 2);
88
+        }
89
+    }
90
+
91
+    /**
92
+     * @return string
93
+     */
94
+    protected function getFileSizeFromHeader() {
95
+        if ($this->size !== null) {
96
+            return $this->size;
97
+        }
98
+
99
+        $size = $this->request->getHeader('OC-Total-Length');
100
+        if ($size === '') {
101
+            if (in_array($this->request->getMethod(), ['POST', 'PUT'])) {
102
+                $size = $this->request->getHeader('Content-Length');
103
+            }
104
+        }
105
+
106
+        if ($size === '') {
107
+            $size = false;
108
+        }
109
+
110
+        $this->size = $size;
111
+        return $this->size;
112
+    }
113
+
114
+    public function supportedEntities(): array {
115
+        return [ File::class ];
116
+    }
117
+
118
+    public function isAvailableForScope(int $scope): bool {
119
+        return true;
120
+    }
121 121
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -155,7 +155,7 @@
 block discarded – undo
155 155
 	}
156 156
 
157 157
 	public function supportedEntities(): array {
158
-		return [ File::class ];
158
+		return [File::class];
159 159
 	}
160 160
 
161 161
 	public function isAvailableForScope(int $scope): bool {
Please login to merge, or discard this patch.
apps/workflowengine/lib/Check/UserGroupMembership.php 1 patch
Indentation   +82 added lines, -82 removed lines patch added patch discarded remove patch
@@ -31,86 +31,86 @@
 block discarded – undo
31 31
 
32 32
 class UserGroupMembership implements ICheck {
33 33
 
34
-	/** @var string */
35
-	protected $cachedUser;
36
-
37
-	/** @var string[] */
38
-	protected $cachedGroupMemberships;
39
-
40
-	/** @var IUserSession */
41
-	protected $userSession;
42
-
43
-	/** @var IGroupManager */
44
-	protected $groupManager;
45
-
46
-	/** @var IL10N */
47
-	protected $l;
48
-
49
-	/**
50
-	 * @param IUserSession $userSession
51
-	 * @param IGroupManager $groupManager
52
-	 * @param IL10N $l
53
-	 */
54
-	public function __construct(IUserSession $userSession, IGroupManager $groupManager, IL10N $l) {
55
-		$this->userSession = $userSession;
56
-		$this->groupManager = $groupManager;
57
-		$this->l = $l;
58
-	}
59
-
60
-	/**
61
-	 * @param string $operator
62
-	 * @param string $value
63
-	 * @return bool
64
-	 */
65
-	public function executeCheck($operator, $value) {
66
-		$user = $this->userSession->getUser();
67
-
68
-		if ($user instanceof IUser) {
69
-			$groupIds = $this->getUserGroups($user);
70
-			return ($operator === 'is') === in_array($value, $groupIds);
71
-		} else {
72
-			return $operator !== 'is';
73
-		}
74
-	}
75
-
76
-
77
-	/**
78
-	 * @param string $operator
79
-	 * @param string $value
80
-	 * @throws \UnexpectedValueException
81
-	 */
82
-	public function validateCheck($operator, $value) {
83
-		if (!in_array($operator, ['is', '!is'])) {
84
-			throw new \UnexpectedValueException($this->l->t('The given operator is invalid'), 1);
85
-		}
86
-
87
-		if (!$this->groupManager->groupExists($value)) {
88
-			throw new \UnexpectedValueException($this->l->t('The given group does not exist'), 2);
89
-		}
90
-	}
91
-
92
-	/**
93
-	 * @param IUser $user
94
-	 * @return string[]
95
-	 */
96
-	protected function getUserGroups(IUser $user) {
97
-		$uid = $user->getUID();
98
-
99
-		if ($this->cachedUser !== $uid) {
100
-			$this->cachedUser = $uid;
101
-			$this->cachedGroupMemberships = $this->groupManager->getUserGroupIds($user);
102
-		}
103
-
104
-		return $this->cachedGroupMemberships;
105
-	}
106
-
107
-	public function supportedEntities(): array {
108
-		// universal by default
109
-		return [];
110
-	}
111
-
112
-	public function isAvailableForScope(int $scope): bool {
113
-		// admin only by default
114
-		return $scope === IManager::SCOPE_ADMIN;
115
-	}
34
+    /** @var string */
35
+    protected $cachedUser;
36
+
37
+    /** @var string[] */
38
+    protected $cachedGroupMemberships;
39
+
40
+    /** @var IUserSession */
41
+    protected $userSession;
42
+
43
+    /** @var IGroupManager */
44
+    protected $groupManager;
45
+
46
+    /** @var IL10N */
47
+    protected $l;
48
+
49
+    /**
50
+     * @param IUserSession $userSession
51
+     * @param IGroupManager $groupManager
52
+     * @param IL10N $l
53
+     */
54
+    public function __construct(IUserSession $userSession, IGroupManager $groupManager, IL10N $l) {
55
+        $this->userSession = $userSession;
56
+        $this->groupManager = $groupManager;
57
+        $this->l = $l;
58
+    }
59
+
60
+    /**
61
+     * @param string $operator
62
+     * @param string $value
63
+     * @return bool
64
+     */
65
+    public function executeCheck($operator, $value) {
66
+        $user = $this->userSession->getUser();
67
+
68
+        if ($user instanceof IUser) {
69
+            $groupIds = $this->getUserGroups($user);
70
+            return ($operator === 'is') === in_array($value, $groupIds);
71
+        } else {
72
+            return $operator !== 'is';
73
+        }
74
+    }
75
+
76
+
77
+    /**
78
+     * @param string $operator
79
+     * @param string $value
80
+     * @throws \UnexpectedValueException
81
+     */
82
+    public function validateCheck($operator, $value) {
83
+        if (!in_array($operator, ['is', '!is'])) {
84
+            throw new \UnexpectedValueException($this->l->t('The given operator is invalid'), 1);
85
+        }
86
+
87
+        if (!$this->groupManager->groupExists($value)) {
88
+            throw new \UnexpectedValueException($this->l->t('The given group does not exist'), 2);
89
+        }
90
+    }
91
+
92
+    /**
93
+     * @param IUser $user
94
+     * @return string[]
95
+     */
96
+    protected function getUserGroups(IUser $user) {
97
+        $uid = $user->getUID();
98
+
99
+        if ($this->cachedUser !== $uid) {
100
+            $this->cachedUser = $uid;
101
+            $this->cachedGroupMemberships = $this->groupManager->getUserGroupIds($user);
102
+        }
103
+
104
+        return $this->cachedGroupMemberships;
105
+    }
106
+
107
+    public function supportedEntities(): array {
108
+        // universal by default
109
+        return [];
110
+    }
111
+
112
+    public function isAvailableForScope(int $scope): bool {
113
+        // admin only by default
114
+        return $scope === IManager::SCOPE_ADMIN;
115
+    }
116 116
 }
Please login to merge, or discard this patch.
lib/public/WorkflowEngine/IEntityCheck.php 1 patch
Indentation   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -34,21 +34,21 @@
 block discarded – undo
34 34
  * @since 18.0.0
35 35
  */
36 36
 interface IEntityCheck {
37
-	/**
38
-	 * Equips the check with a subject fitting the Entity. For instance, an
39
-	 * entity of File will receive an instance of OCP\Files\Node, or a comment
40
-	 * entity might get an IComment.
41
-	 *
42
-	 * The implementing check must be aware of the incoming type.
43
-	 *
44
-	 * If an unsupported subject is passed the implementation MAY throw an
45
-	 * \UnexpectedValueException.
46
-	 *
47
-	 * @param IEntity $entity
48
-	 * @param mixed $subject
49
-	 * @throws \UnexpectedValueException
50
-	 * @since 18.0.0
51
-	 */
52
-	public function setEntitySubject(IEntity $entity, $subject): void;
37
+    /**
38
+     * Equips the check with a subject fitting the Entity. For instance, an
39
+     * entity of File will receive an instance of OCP\Files\Node, or a comment
40
+     * entity might get an IComment.
41
+     *
42
+     * The implementing check must be aware of the incoming type.
43
+     *
44
+     * If an unsupported subject is passed the implementation MAY throw an
45
+     * \UnexpectedValueException.
46
+     *
47
+     * @param IEntity $entity
48
+     * @param mixed $subject
49
+     * @throws \UnexpectedValueException
50
+     * @since 18.0.0
51
+     */
52
+    public function setEntitySubject(IEntity $entity, $subject): void;
53 53
 
54 54
 }
Please login to merge, or discard this patch.
lib/public/WorkflowEngine/ICheck.php 1 patch
Indentation   +36 added lines, -36 removed lines patch added patch discarded remove patch
@@ -31,43 +31,43 @@
 block discarded – undo
31 31
  * @since 9.1
32 32
  */
33 33
 interface ICheck {
34
-	/**
35
-	 * @param string $operator
36
-	 * @param string $value
37
-	 * @return bool
38
-	 * @since 9.1
39
-	 */
40
-	public function executeCheck($operator, $value);
34
+    /**
35
+     * @param string $operator
36
+     * @param string $value
37
+     * @return bool
38
+     * @since 9.1
39
+     */
40
+    public function executeCheck($operator, $value);
41 41
 
42
-	/**
43
-	 * @param string $operator
44
-	 * @param string $value
45
-	 * @throws \UnexpectedValueException
46
-	 * @since 9.1
47
-	 */
48
-	public function validateCheck($operator, $value);
42
+    /**
43
+     * @param string $operator
44
+     * @param string $value
45
+     * @throws \UnexpectedValueException
46
+     * @since 9.1
47
+     */
48
+    public function validateCheck($operator, $value);
49 49
 
50
-	/**
51
-	 * returns a list of Entities the checker supports. The values must match
52
-	 * the class name of the entity.
53
-	 *
54
-	 * An empty result means the check is universally available.
55
-	 *
56
-	 * @since 18.0.0
57
-	 */
58
-	public function supportedEntities(): array;
50
+    /**
51
+     * returns a list of Entities the checker supports. The values must match
52
+     * the class name of the entity.
53
+     *
54
+     * An empty result means the check is universally available.
55
+     *
56
+     * @since 18.0.0
57
+     */
58
+    public function supportedEntities(): array;
59 59
 
60
-	/**
61
-	 * returns whether the operation can be used in the requested scope.
62
-	 *
63
-	 * Scope IDs are defined as constants in OCP\WorkflowEngine\IManager. At
64
-	 * time of writing these are SCOPE_ADMIN and SCOPE_USER.
65
-	 *
66
-	 * For possibly unknown future scopes the recommended behaviour is: if
67
-	 * user scope is permitted, the default behaviour should return `true`,
68
-	 * otherwise `false`.
69
-	 *
70
-	 * @since 18.0.0
71
-	 */
72
-	public function isAvailableForScope(int $scope): bool;
60
+    /**
61
+     * returns whether the operation can be used in the requested scope.
62
+     *
63
+     * Scope IDs are defined as constants in OCP\WorkflowEngine\IManager. At
64
+     * time of writing these are SCOPE_ADMIN and SCOPE_USER.
65
+     *
66
+     * For possibly unknown future scopes the recommended behaviour is: if
67
+     * user scope is permitted, the default behaviour should return `true`,
68
+     * otherwise `false`.
69
+     *
70
+     * @since 18.0.0
71
+     */
72
+    public function isAvailableForScope(int $scope): bool;
73 73
 }
Please login to merge, or discard this patch.
lib/public/WorkflowEngine/IEntityEvent.php 1 patch
Indentation   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -34,21 +34,21 @@
 block discarded – undo
34 34
  * @since 18.0.0
35 35
  */
36 36
 interface IEntityEvent {
37
-	/**
38
-	 * returns a translated name to be presented in the web interface.
39
-	 *
40
-	 * Example: "created" (en), "kreita" (eo)
41
-	 *
42
-	 * @since 18.0.0
43
-	 */
44
-	public function getDisplayName(): string;
37
+    /**
38
+     * returns a translated name to be presented in the web interface.
39
+     *
40
+     * Example: "created" (en), "kreita" (eo)
41
+     *
42
+     * @since 18.0.0
43
+     */
44
+    public function getDisplayName(): string;
45 45
 
46
-	/**
47
-	 * returns the event name that is emitted by the EventDispatcher, e.g.:
48
-	 *
49
-	 * Example: "OCA\MyApp\Factory\Cats::postCreated"
50
-	 *
51
-	 * @since 18.0.0
52
-	 */
53
-	public function getEventName(): string;
46
+    /**
47
+     * returns the event name that is emitted by the EventDispatcher, e.g.:
48
+     *
49
+     * Example: "OCA\MyApp\Factory\Cats::postCreated"
50
+     *
51
+     * @since 18.0.0
52
+     */
53
+    public function getEventName(): string;
54 54
 }
Please login to merge, or discard this patch.
apps/twofactor_backupcodes/appinfo/routes.php 1 patch
Indentation   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -21,12 +21,12 @@
 block discarded – undo
21 21
  */
22 22
 // @codeCoverageIgnoreStart
23 23
 return [
24
-	'routes' => [
25
-		[
26
-			'name' => 'settings#createCodes',
27
-			'url' => '/settings/create',
28
-			'verb' => 'POST'
29
-		],
30
-	]
24
+    'routes' => [
25
+        [
26
+            'name' => 'settings#createCodes',
27
+            'url' => '/settings/create',
28
+            'verb' => 'POST'
29
+        ],
30
+    ]
31 31
 ];
32 32
 // @codeCoverageIgnoreEnd
Please login to merge, or discard this patch.
apps/workflowengine/lib/Check/FileName.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -155,7 +155,7 @@
 block discarded – undo
155 155
 	}
156 156
 
157 157
 	public function supportedEntities(): array {
158
-		return [ File::class ];
158
+		return [File::class];
159 159
 	}
160 160
 
161 161
 	public function isAvailableForScope(int $scope): bool {
Please login to merge, or discard this patch.
Indentation   +53 added lines, -53 removed lines patch added patch discarded remove patch
@@ -31,63 +31,63 @@
 block discarded – undo
31 31
 use OCP\WorkflowEngine\IFileCheck;
32 32
 
33 33
 class FileName extends AbstractStringCheck implements IFileCheck {
34
-	use TFileCheck;
34
+    use TFileCheck;
35 35
 
36
-	/** @var IRequest */
37
-	protected $request;
38
-	/** @var IMountManager */
39
-	private $mountManager;
36
+    /** @var IRequest */
37
+    protected $request;
38
+    /** @var IMountManager */
39
+    private $mountManager;
40 40
 
41
-	/**
42
-	 * @param IL10N $l
43
-	 * @param IRequest $request
44
-	 */
45
-	public function __construct(IL10N $l, IRequest $request, IMountManager $mountManager) {
46
-		parent::__construct($l);
47
-		$this->request = $request;
48
-		$this->mountManager = $mountManager;
49
-	}
41
+    /**
42
+     * @param IL10N $l
43
+     * @param IRequest $request
44
+     */
45
+    public function __construct(IL10N $l, IRequest $request, IMountManager $mountManager) {
46
+        parent::__construct($l);
47
+        $this->request = $request;
48
+        $this->mountManager = $mountManager;
49
+    }
50 50
 
51
-	/**
52
-	 * @return string
53
-	 */
54
-	protected function getActualValue(): string {
55
-		$fileName = $this->path === null ? '' : basename($this->path);
56
-		if ($fileName === '' && (!$this->storage->isLocal() || $this->storage->instanceOfStorage(Local::class))) {
57
-			// Return the mountpoint name of external storage that are not mounted as user home
58
-			$mountPoints = $this->mountManager->findByStorageId($this->storage->getId());
59
-			if (empty($mountPoints) || $mountPoints[0]->getMountType() !== 'external') {
60
-				return $fileName;
61
-			}
62
-			$mountPointPath = rtrim($mountPoints[0]->getMountPoint(), '/');
63
-			$mountPointPieces = explode('/', $mountPointPath);
64
-			$mountPointName = array_pop($mountPointPieces);
65
-			if (!empty($mountPointName) && $mountPointName !== 'files' && count($mountPointPieces) !== 2) {
66
-				return $mountPointName;
67
-			}
68
-		}
69
-		return $fileName;
70
-	}
51
+    /**
52
+     * @return string
53
+     */
54
+    protected function getActualValue(): string {
55
+        $fileName = $this->path === null ? '' : basename($this->path);
56
+        if ($fileName === '' && (!$this->storage->isLocal() || $this->storage->instanceOfStorage(Local::class))) {
57
+            // Return the mountpoint name of external storage that are not mounted as user home
58
+            $mountPoints = $this->mountManager->findByStorageId($this->storage->getId());
59
+            if (empty($mountPoints) || $mountPoints[0]->getMountType() !== 'external') {
60
+                return $fileName;
61
+            }
62
+            $mountPointPath = rtrim($mountPoints[0]->getMountPoint(), '/');
63
+            $mountPointPieces = explode('/', $mountPointPath);
64
+            $mountPointName = array_pop($mountPointPieces);
65
+            if (!empty($mountPointName) && $mountPointName !== 'files' && count($mountPointPieces) !== 2) {
66
+                return $mountPointName;
67
+            }
68
+        }
69
+        return $fileName;
70
+    }
71 71
 
72
-	/**
73
-	 * @param string $operator
74
-	 * @param string $checkValue
75
-	 * @param string $actualValue
76
-	 * @return bool
77
-	 */
78
-	protected function executeStringCheck($operator, $checkValue, $actualValue): bool {
79
-		if ($operator === 'is' || $operator === '!is') {
80
-			$checkValue = mb_strtolower($checkValue);
81
-			$actualValue = mb_strtolower($actualValue);
82
-		}
83
-		return parent::executeStringCheck($operator, $checkValue, $actualValue);
84
-	}
72
+    /**
73
+     * @param string $operator
74
+     * @param string $checkValue
75
+     * @param string $actualValue
76
+     * @return bool
77
+     */
78
+    protected function executeStringCheck($operator, $checkValue, $actualValue): bool {
79
+        if ($operator === 'is' || $operator === '!is') {
80
+            $checkValue = mb_strtolower($checkValue);
81
+            $actualValue = mb_strtolower($actualValue);
82
+        }
83
+        return parent::executeStringCheck($operator, $checkValue, $actualValue);
84
+    }
85 85
 
86
-	public function supportedEntities(): array {
87
-		return [ File::class ];
88
-	}
86
+    public function supportedEntities(): array {
87
+        return [ File::class ];
88
+    }
89 89
 
90
-	public function isAvailableForScope(int $scope): bool {
91
-		return true;
92
-	}
90
+    public function isAvailableForScope(int $scope): bool {
91
+        return true;
92
+    }
93 93
 }
Please login to merge, or discard this patch.
apps/encryption/lib/Hooks/UserHooks.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -266,7 +266,7 @@  discard block
 block discarded – undo
266 266
 			// Save private key
267 267
 			if ($encryptedPrivateKey) {
268 268
 				$this->keyManager->setPrivateKey($user->getUID(),
269
-					$this->crypt->generateHeader() . $encryptedPrivateKey);
269
+					$this->crypt->generateHeader().$encryptedPrivateKey);
270 270
 			} else {
271 271
 				$this->logger->error('Encryption could not update users encryption password');
272 272
 			}
@@ -315,7 +315,7 @@  discard block
 block discarded – undo
315 315
 				$encryptedKey = $this->crypt->encryptPrivateKey($keyPair['privateKey'], $newUserPassword, $userId);
316 316
 
317 317
 				if ($encryptedKey) {
318
-					$this->keyManager->setPrivateKey($userId, $this->crypt->generateHeader() . $encryptedKey);
318
+					$this->keyManager->setPrivateKey($userId, $this->crypt->generateHeader().$encryptedKey);
319 319
 
320 320
 					if ($recoveryPassword) { // if recovery key is set we can re-encrypt the key files
321 321
 						$this->recovery->recoverUsersFiles($recoveryPassword, $userId);
Please login to merge, or discard this patch.
Indentation   +300 added lines, -300 removed lines patch added patch discarded remove patch
@@ -44,304 +44,304 @@
 block discarded – undo
44 44
 
45 45
 class UserHooks implements IHook {
46 46
 
47
-	/**
48
-	 * list of user for which we perform a password reset
49
-	 * @var array
50
-	 */
51
-	protected static $passwordResetUsers = [];
52
-
53
-	/**
54
-	 * @var KeyManager
55
-	 */
56
-	private $keyManager;
57
-	/**
58
-	 * @var IUserManager
59
-	 */
60
-	private $userManager;
61
-	/**
62
-	 * @var ILogger
63
-	 */
64
-	private $logger;
65
-	/**
66
-	 * @var Setup
67
-	 */
68
-	private $userSetup;
69
-	/**
70
-	 * @var IUserSession
71
-	 */
72
-	private $userSession;
73
-	/**
74
-	 * @var Util
75
-	 */
76
-	private $util;
77
-	/**
78
-	 * @var Session
79
-	 */
80
-	private $session;
81
-	/**
82
-	 * @var Recovery
83
-	 */
84
-	private $recovery;
85
-	/**
86
-	 * @var Crypt
87
-	 */
88
-	private $crypt;
89
-
90
-	/**
91
-	 * UserHooks constructor.
92
-	 *
93
-	 * @param KeyManager $keyManager
94
-	 * @param IUserManager $userManager
95
-	 * @param ILogger $logger
96
-	 * @param Setup $userSetup
97
-	 * @param IUserSession $userSession
98
-	 * @param Util $util
99
-	 * @param Session $session
100
-	 * @param Crypt $crypt
101
-	 * @param Recovery $recovery
102
-	 */
103
-	public function __construct(KeyManager $keyManager,
104
-								IUserManager $userManager,
105
-								ILogger $logger,
106
-								Setup $userSetup,
107
-								IUserSession $userSession,
108
-								Util $util,
109
-								Session $session,
110
-								Crypt $crypt,
111
-								Recovery $recovery) {
112
-		$this->keyManager = $keyManager;
113
-		$this->userManager = $userManager;
114
-		$this->logger = $logger;
115
-		$this->userSetup = $userSetup;
116
-		$this->userSession = $userSession;
117
-		$this->util = $util;
118
-		$this->session = $session;
119
-		$this->recovery = $recovery;
120
-		$this->crypt = $crypt;
121
-	}
122
-
123
-	/**
124
-	 * Connects Hooks
125
-	 *
126
-	 * @return null
127
-	 */
128
-	public function addHooks() {
129
-		OCUtil::connectHook('OC_User', 'post_login', $this, 'login');
130
-		OCUtil::connectHook('OC_User', 'logout', $this, 'logout');
131
-
132
-		// this hooks only make sense if no master key is used
133
-		if ($this->util->isMasterKeyEnabled() === false) {
134
-			OCUtil::connectHook('OC_User',
135
-				'post_setPassword',
136
-				$this,
137
-				'setPassphrase');
138
-
139
-			OCUtil::connectHook('OC_User',
140
-				'pre_setPassword',
141
-				$this,
142
-				'preSetPassphrase');
143
-
144
-			OCUtil::connectHook('\OC\Core\LostPassword\Controller\LostController',
145
-				'post_passwordReset',
146
-				$this,
147
-				'postPasswordReset');
148
-
149
-			OCUtil::connectHook('\OC\Core\LostPassword\Controller\LostController',
150
-				'pre_passwordReset',
151
-				$this,
152
-				'prePasswordReset');
153
-
154
-			OCUtil::connectHook('OC_User',
155
-				'post_createUser',
156
-				$this,
157
-				'postCreateUser');
158
-
159
-			OCUtil::connectHook('OC_User',
160
-				'post_deleteUser',
161
-				$this,
162
-				'postDeleteUser');
163
-		}
164
-	}
165
-
166
-
167
-	/**
168
-	 * Startup encryption backend upon user login
169
-	 *
170
-	 * @note This method should never be called for users using client side encryption
171
-	 * @param array $params
172
-	 * @return boolean|null
173
-	 */
174
-	public function login($params) {
175
-		// ensure filesystem is loaded
176
-		if (!\OC\Files\Filesystem::$loaded) {
177
-			$this->setupFS($params['uid']);
178
-		}
179
-		if ($this->util->isMasterKeyEnabled() === false) {
180
-			$this->userSetup->setupUser($params['uid'], $params['password']);
181
-		}
182
-
183
-		$this->keyManager->init($params['uid'], $params['password']);
184
-	}
185
-
186
-	/**
187
-	 * remove keys from session during logout
188
-	 */
189
-	public function logout() {
190
-		$this->session->clear();
191
-	}
192
-
193
-	/**
194
-	 * setup encryption backend upon user created
195
-	 *
196
-	 * @note This method should never be called for users using client side encryption
197
-	 * @param array $params
198
-	 */
199
-	public function postCreateUser($params) {
200
-		$this->userSetup->setupUser($params['uid'], $params['password']);
201
-	}
202
-
203
-	/**
204
-	 * cleanup encryption backend upon user deleted
205
-	 *
206
-	 * @param array $params : uid, password
207
-	 * @note This method should never be called for users using client side encryption
208
-	 */
209
-	public function postDeleteUser($params) {
210
-		$this->keyManager->deletePublicKey($params['uid']);
211
-	}
212
-
213
-	public function prePasswordReset($params) {
214
-		$user = $params['uid'];
215
-		self::$passwordResetUsers[$user] = true;
216
-	}
217
-
218
-	public function postPasswordReset($params) {
219
-		$uid = $params['uid'];
220
-		$password = $params['password'];
221
-		$this->keyManager->backupUserKeys('passwordReset', $uid);
222
-		$this->keyManager->deleteUserKeys($uid);
223
-		$this->userSetup->setupUser($uid, $password);
224
-		unset(self::$passwordResetUsers[$uid]);
225
-	}
226
-
227
-	/**
228
-	 * If the password can't be changed within Nextcloud, than update the key password in advance.
229
-	 *
230
-	 * @param array $params : uid, password
231
-	 * @return boolean|null
232
-	 */
233
-	public function preSetPassphrase($params) {
234
-		$user = $this->userManager->get($params['uid']);
235
-
236
-		if ($user && !$user->canChangePassword()) {
237
-			$this->setPassphrase($params);
238
-		}
239
-	}
240
-
241
-	/**
242
-	 * Change a user's encryption passphrase
243
-	 *
244
-	 * @param array $params keys: uid, password
245
-	 * @return boolean|null
246
-	 */
247
-	public function setPassphrase($params) {
248
-
249
-		// if we are in the process to resetting a user password, we have nothing
250
-		// to do here
251
-		if (isset(self::$passwordResetUsers[$params['uid']])) {
252
-			return true;
253
-		}
254
-
255
-		// Get existing decrypted private key
256
-		$user = $this->userSession->getUser();
257
-
258
-		// current logged in user changes his own password
259
-		if ($user && $params['uid'] === $user->getUID()) {
260
-			$privateKey = $this->session->getPrivateKey();
261
-
262
-			// Encrypt private key with new user pwd as passphrase
263
-			$encryptedPrivateKey = $this->crypt->encryptPrivateKey($privateKey, $params['password'], $params['uid']);
264
-
265
-			// Save private key
266
-			if ($encryptedPrivateKey) {
267
-				$this->keyManager->setPrivateKey($user->getUID(),
268
-					$this->crypt->generateHeader() . $encryptedPrivateKey);
269
-			} else {
270
-				$this->logger->error('Encryption could not update users encryption password');
271
-			}
272
-
273
-			// NOTE: Session does not need to be updated as the
274
-			// private key has not changed, only the passphrase
275
-			// used to decrypt it has changed
276
-		} else { // admin changed the password for a different user, create new keys and re-encrypt file keys
277
-			$userId = $params['uid'];
278
-			$this->initMountPoints($userId);
279
-			$recoveryPassword = isset($params['recoveryPassword']) ? $params['recoveryPassword'] : null;
280
-
281
-			$recoveryKeyId = $this->keyManager->getRecoveryKeyId();
282
-			$recoveryKey = $this->keyManager->getSystemPrivateKey($recoveryKeyId);
283
-			try {
284
-				$decryptedRecoveryKey = $this->crypt->decryptPrivateKey($recoveryKey, $recoveryPassword);
285
-			} catch (\Exception $e) {
286
-				$decryptedRecoveryKey = false;
287
-			}
288
-			if ($decryptedRecoveryKey === false) {
289
-				$message = 'Can not decrypt the recovery key. Maybe you provided the wrong password. Try again.';
290
-				throw new GenericEncryptionException($message, $message);
291
-			}
292
-
293
-			// we generate new keys if...
294
-			// ...we have a recovery password and the user enabled the recovery key
295
-			// ...encryption was activated for the first time (no keys exists)
296
-			// ...the user doesn't have any files
297
-			if (
298
-				($this->recovery->isRecoveryEnabledForUser($userId) && $recoveryPassword)
299
-				|| !$this->keyManager->userHasKeys($userId)
300
-				|| !$this->util->userHasFiles($userId)
301
-			) {
302
-
303
-				// backup old keys
304
-				//$this->backupAllKeys('recovery');
305
-
306
-				$newUserPassword = $params['password'];
307
-
308
-				$keyPair = $this->crypt->createKeyPair();
309
-
310
-				// Save public key
311
-				$this->keyManager->setPublicKey($userId, $keyPair['publicKey']);
312
-
313
-				// Encrypt private key with new password
314
-				$encryptedKey = $this->crypt->encryptPrivateKey($keyPair['privateKey'], $newUserPassword, $userId);
315
-
316
-				if ($encryptedKey) {
317
-					$this->keyManager->setPrivateKey($userId, $this->crypt->generateHeader() . $encryptedKey);
318
-
319
-					if ($recoveryPassword) { // if recovery key is set we can re-encrypt the key files
320
-						$this->recovery->recoverUsersFiles($recoveryPassword, $userId);
321
-					}
322
-				} else {
323
-					$this->logger->error('Encryption Could not update users encryption password');
324
-				}
325
-			}
326
-		}
327
-	}
328
-
329
-	/**
330
-	 * init mount points for given user
331
-	 *
332
-	 * @param string $user
333
-	 * @throws \OC\User\NoUserException
334
-	 */
335
-	protected function initMountPoints($user) {
336
-		Filesystem::initMountPoints($user);
337
-	}
338
-
339
-	/**
340
-	 * setup file system for user
341
-	 *
342
-	 * @param string $uid user id
343
-	 */
344
-	protected function setupFS($uid) {
345
-		\OC_Util::setupFS($uid);
346
-	}
47
+    /**
48
+     * list of user for which we perform a password reset
49
+     * @var array
50
+     */
51
+    protected static $passwordResetUsers = [];
52
+
53
+    /**
54
+     * @var KeyManager
55
+     */
56
+    private $keyManager;
57
+    /**
58
+     * @var IUserManager
59
+     */
60
+    private $userManager;
61
+    /**
62
+     * @var ILogger
63
+     */
64
+    private $logger;
65
+    /**
66
+     * @var Setup
67
+     */
68
+    private $userSetup;
69
+    /**
70
+     * @var IUserSession
71
+     */
72
+    private $userSession;
73
+    /**
74
+     * @var Util
75
+     */
76
+    private $util;
77
+    /**
78
+     * @var Session
79
+     */
80
+    private $session;
81
+    /**
82
+     * @var Recovery
83
+     */
84
+    private $recovery;
85
+    /**
86
+     * @var Crypt
87
+     */
88
+    private $crypt;
89
+
90
+    /**
91
+     * UserHooks constructor.
92
+     *
93
+     * @param KeyManager $keyManager
94
+     * @param IUserManager $userManager
95
+     * @param ILogger $logger
96
+     * @param Setup $userSetup
97
+     * @param IUserSession $userSession
98
+     * @param Util $util
99
+     * @param Session $session
100
+     * @param Crypt $crypt
101
+     * @param Recovery $recovery
102
+     */
103
+    public function __construct(KeyManager $keyManager,
104
+                                IUserManager $userManager,
105
+                                ILogger $logger,
106
+                                Setup $userSetup,
107
+                                IUserSession $userSession,
108
+                                Util $util,
109
+                                Session $session,
110
+                                Crypt $crypt,
111
+                                Recovery $recovery) {
112
+        $this->keyManager = $keyManager;
113
+        $this->userManager = $userManager;
114
+        $this->logger = $logger;
115
+        $this->userSetup = $userSetup;
116
+        $this->userSession = $userSession;
117
+        $this->util = $util;
118
+        $this->session = $session;
119
+        $this->recovery = $recovery;
120
+        $this->crypt = $crypt;
121
+    }
122
+
123
+    /**
124
+     * Connects Hooks
125
+     *
126
+     * @return null
127
+     */
128
+    public function addHooks() {
129
+        OCUtil::connectHook('OC_User', 'post_login', $this, 'login');
130
+        OCUtil::connectHook('OC_User', 'logout', $this, 'logout');
131
+
132
+        // this hooks only make sense if no master key is used
133
+        if ($this->util->isMasterKeyEnabled() === false) {
134
+            OCUtil::connectHook('OC_User',
135
+                'post_setPassword',
136
+                $this,
137
+                'setPassphrase');
138
+
139
+            OCUtil::connectHook('OC_User',
140
+                'pre_setPassword',
141
+                $this,
142
+                'preSetPassphrase');
143
+
144
+            OCUtil::connectHook('\OC\Core\LostPassword\Controller\LostController',
145
+                'post_passwordReset',
146
+                $this,
147
+                'postPasswordReset');
148
+
149
+            OCUtil::connectHook('\OC\Core\LostPassword\Controller\LostController',
150
+                'pre_passwordReset',
151
+                $this,
152
+                'prePasswordReset');
153
+
154
+            OCUtil::connectHook('OC_User',
155
+                'post_createUser',
156
+                $this,
157
+                'postCreateUser');
158
+
159
+            OCUtil::connectHook('OC_User',
160
+                'post_deleteUser',
161
+                $this,
162
+                'postDeleteUser');
163
+        }
164
+    }
165
+
166
+
167
+    /**
168
+     * Startup encryption backend upon user login
169
+     *
170
+     * @note This method should never be called for users using client side encryption
171
+     * @param array $params
172
+     * @return boolean|null
173
+     */
174
+    public function login($params) {
175
+        // ensure filesystem is loaded
176
+        if (!\OC\Files\Filesystem::$loaded) {
177
+            $this->setupFS($params['uid']);
178
+        }
179
+        if ($this->util->isMasterKeyEnabled() === false) {
180
+            $this->userSetup->setupUser($params['uid'], $params['password']);
181
+        }
182
+
183
+        $this->keyManager->init($params['uid'], $params['password']);
184
+    }
185
+
186
+    /**
187
+     * remove keys from session during logout
188
+     */
189
+    public function logout() {
190
+        $this->session->clear();
191
+    }
192
+
193
+    /**
194
+     * setup encryption backend upon user created
195
+     *
196
+     * @note This method should never be called for users using client side encryption
197
+     * @param array $params
198
+     */
199
+    public function postCreateUser($params) {
200
+        $this->userSetup->setupUser($params['uid'], $params['password']);
201
+    }
202
+
203
+    /**
204
+     * cleanup encryption backend upon user deleted
205
+     *
206
+     * @param array $params : uid, password
207
+     * @note This method should never be called for users using client side encryption
208
+     */
209
+    public function postDeleteUser($params) {
210
+        $this->keyManager->deletePublicKey($params['uid']);
211
+    }
212
+
213
+    public function prePasswordReset($params) {
214
+        $user = $params['uid'];
215
+        self::$passwordResetUsers[$user] = true;
216
+    }
217
+
218
+    public function postPasswordReset($params) {
219
+        $uid = $params['uid'];
220
+        $password = $params['password'];
221
+        $this->keyManager->backupUserKeys('passwordReset', $uid);
222
+        $this->keyManager->deleteUserKeys($uid);
223
+        $this->userSetup->setupUser($uid, $password);
224
+        unset(self::$passwordResetUsers[$uid]);
225
+    }
226
+
227
+    /**
228
+     * If the password can't be changed within Nextcloud, than update the key password in advance.
229
+     *
230
+     * @param array $params : uid, password
231
+     * @return boolean|null
232
+     */
233
+    public function preSetPassphrase($params) {
234
+        $user = $this->userManager->get($params['uid']);
235
+
236
+        if ($user && !$user->canChangePassword()) {
237
+            $this->setPassphrase($params);
238
+        }
239
+    }
240
+
241
+    /**
242
+     * Change a user's encryption passphrase
243
+     *
244
+     * @param array $params keys: uid, password
245
+     * @return boolean|null
246
+     */
247
+    public function setPassphrase($params) {
248
+
249
+        // if we are in the process to resetting a user password, we have nothing
250
+        // to do here
251
+        if (isset(self::$passwordResetUsers[$params['uid']])) {
252
+            return true;
253
+        }
254
+
255
+        // Get existing decrypted private key
256
+        $user = $this->userSession->getUser();
257
+
258
+        // current logged in user changes his own password
259
+        if ($user && $params['uid'] === $user->getUID()) {
260
+            $privateKey = $this->session->getPrivateKey();
261
+
262
+            // Encrypt private key with new user pwd as passphrase
263
+            $encryptedPrivateKey = $this->crypt->encryptPrivateKey($privateKey, $params['password'], $params['uid']);
264
+
265
+            // Save private key
266
+            if ($encryptedPrivateKey) {
267
+                $this->keyManager->setPrivateKey($user->getUID(),
268
+                    $this->crypt->generateHeader() . $encryptedPrivateKey);
269
+            } else {
270
+                $this->logger->error('Encryption could not update users encryption password');
271
+            }
272
+
273
+            // NOTE: Session does not need to be updated as the
274
+            // private key has not changed, only the passphrase
275
+            // used to decrypt it has changed
276
+        } else { // admin changed the password for a different user, create new keys and re-encrypt file keys
277
+            $userId = $params['uid'];
278
+            $this->initMountPoints($userId);
279
+            $recoveryPassword = isset($params['recoveryPassword']) ? $params['recoveryPassword'] : null;
280
+
281
+            $recoveryKeyId = $this->keyManager->getRecoveryKeyId();
282
+            $recoveryKey = $this->keyManager->getSystemPrivateKey($recoveryKeyId);
283
+            try {
284
+                $decryptedRecoveryKey = $this->crypt->decryptPrivateKey($recoveryKey, $recoveryPassword);
285
+            } catch (\Exception $e) {
286
+                $decryptedRecoveryKey = false;
287
+            }
288
+            if ($decryptedRecoveryKey === false) {
289
+                $message = 'Can not decrypt the recovery key. Maybe you provided the wrong password. Try again.';
290
+                throw new GenericEncryptionException($message, $message);
291
+            }
292
+
293
+            // we generate new keys if...
294
+            // ...we have a recovery password and the user enabled the recovery key
295
+            // ...encryption was activated for the first time (no keys exists)
296
+            // ...the user doesn't have any files
297
+            if (
298
+                ($this->recovery->isRecoveryEnabledForUser($userId) && $recoveryPassword)
299
+                || !$this->keyManager->userHasKeys($userId)
300
+                || !$this->util->userHasFiles($userId)
301
+            ) {
302
+
303
+                // backup old keys
304
+                //$this->backupAllKeys('recovery');
305
+
306
+                $newUserPassword = $params['password'];
307
+
308
+                $keyPair = $this->crypt->createKeyPair();
309
+
310
+                // Save public key
311
+                $this->keyManager->setPublicKey($userId, $keyPair['publicKey']);
312
+
313
+                // Encrypt private key with new password
314
+                $encryptedKey = $this->crypt->encryptPrivateKey($keyPair['privateKey'], $newUserPassword, $userId);
315
+
316
+                if ($encryptedKey) {
317
+                    $this->keyManager->setPrivateKey($userId, $this->crypt->generateHeader() . $encryptedKey);
318
+
319
+                    if ($recoveryPassword) { // if recovery key is set we can re-encrypt the key files
320
+                        $this->recovery->recoverUsersFiles($recoveryPassword, $userId);
321
+                    }
322
+                } else {
323
+                    $this->logger->error('Encryption Could not update users encryption password');
324
+                }
325
+            }
326
+        }
327
+    }
328
+
329
+    /**
330
+     * init mount points for given user
331
+     *
332
+     * @param string $user
333
+     * @throws \OC\User\NoUserException
334
+     */
335
+    protected function initMountPoints($user) {
336
+        Filesystem::initMountPoints($user);
337
+    }
338
+
339
+    /**
340
+     * setup file system for user
341
+     *
342
+     * @param string $uid user id
343
+     */
344
+    protected function setupFS($uid) {
345
+        \OC_Util::setupFS($uid);
346
+    }
347 347
 }
Please login to merge, or discard this patch.