Skip to content

Commit 1a3daa6

Browse files
authored
Merge pull request #23799 from nextcloud/fix/noid/ldap-update-groups-null
LDAP: fix null where IUser is expected in update groups background job
2 parents 9d5362d + 3a51160 commit 1a3daa6

2 files changed

Lines changed: 286 additions & 56 deletions

File tree

apps/user_ldap/lib/Jobs/UpdateGroups.php

Lines changed: 97 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,52 @@
3838
use OCP\EventDispatcher\IEventDispatcher;
3939
use OCP\Group\Events\UserAddedEvent;
4040
use OCP\Group\Events\UserRemovedEvent;
41+
use OCP\IDBConnection;
42+
use OCP\IGroupManager;
4143
use OCP\ILogger;
44+
use OCP\IUser;
45+
use OCP\IUserManager;
46+
use Psr\Log\LoggerInterface;
4247

4348
class UpdateGroups extends TimedJob {
4449
private $groupsFromDB;
4550

4651
/** @var Group_Proxy */
4752
private $groupBackend;
48-
49-
public function __construct(Group_Proxy $groupBackend) {
53+
/** @var IEventDispatcher */
54+
private $dispatcher;
55+
/** @var IGroupManager */
56+
private $groupManager;
57+
/** @var IUserManager */
58+
private $userManager;
59+
/** @var LoggerInterface */
60+
private $logger;
61+
/** @var IDBConnection */
62+
private $dbc;
63+
64+
public function __construct(
65+
Group_Proxy $groupBackend,
66+
IEventDispatcher $dispatcher,
67+
IGroupManager $groupManager,
68+
IUserManager $userManager,
69+
LoggerInterface $logger,
70+
IDBConnection $dbc
71+
) {
5072
$this->interval = $this->getRefreshInterval();
5173
$this->groupBackend = $groupBackend;
74+
$this->dispatcher = $dispatcher;
75+
$this->groupManager = $groupManager;
76+
$this->userManager = $userManager;
77+
$this->logger = $logger;
78+
$this->dbc = $dbc;
79+
}
80+
81+
/**
82+
* @return int
83+
*/
84+
private function getRefreshInterval() {
85+
//defaults to every hour
86+
return \OC::$server->getConfig()->getAppValue('user_ldap', 'bgjRefreshInterval', 3600);
5287
}
5388

5489
/**
@@ -79,28 +114,35 @@ public function updateGroups() {
79114
}
80115

81116
/**
82-
* @return int
117+
* @return array
83118
*/
84-
private function getRefreshInterval() {
85-
//defaults to every hour
86-
return \OC::$server->getConfig()->getAppValue('user_ldap', 'bgjRefreshInterval', 3600);
119+
private function getKnownGroups() {
120+
if (is_array($this->groupsFromDB)) {
121+
$this->groupsFromDB;
122+
}
123+
$qb = $this->dbc->getQueryBuilder();
124+
$qb->select(['owncloudname', 'owncloudusers'])
125+
->from('ldap_group_members');
126+
$result = $qb->execute()->fetchAll();
127+
128+
$this->groupsFromDB = [];
129+
foreach ($result as $dataset) {
130+
$this->groupsFromDB[$dataset['owncloudname']] = $dataset;
131+
}
132+
133+
return $this->groupsFromDB;
87134
}
88135

89-
/**
90-
* @param string[] $groups
91-
*/
92-
private function handleKnownGroups($groups) {
93-
/** @var IEventDispatcher $dispatcher */
94-
$dispatcher = \OC::$server->query(IEventDispatcher::class);
95-
$groupManager = \OC::$server->getGroupManager();
96-
$userManager = \OC::$server->getUserManager();
136+
private function handleKnownGroups(array $groups) {
137+
$this->logger->debug(
138+
'bgJ "updateGroups" – Dealing with known Groups.',
139+
['app' => 'user_ldap']
140+
);
141+
$qb = $this->dbc->getQueryBuilder();
142+
$qb->update('ldap_group_members')
143+
->set('owncloudusers', $qb->createParameter('members'))
144+
->where($qb->expr()->eq('owncloudname', $qb->createParameter('groupId')));
97145

98-
\OCP\Util::writeLog('user_ldap', 'bgJ "updateGroups" – Dealing with known Groups.', ILogger::DEBUG);
99-
$query = \OC_DB::prepare('
100-
UPDATE `*PREFIX*ldap_group_members`
101-
SET `owncloudusers` = ?
102-
WHERE `owncloudname` = ?
103-
');
104146
if (!is_array($this->groupsFromDB)) {
105147
$this->getKnownGroups();
106148
}
@@ -109,30 +151,49 @@ private function handleKnownGroups($groups) {
109151
$actualUsers = $this->groupBackend->usersInGroup($group);
110152
$hasChanged = false;
111153

112-
$groupObject = $groupManager->get($group);
154+
$groupObject = $this->groupManager->get($group);
113155
foreach (array_diff($knownUsers, $actualUsers) as $removedUser) {
114-
$userObject = $userManager->get($removedUser);
115-
$dispatcher->dispatchTyped(new UserRemovedEvent($groupObject, $userObject));
116-
\OCP\Util::writeLog('user_ldap',
117-
'bgJ "updateGroups" – "'.$removedUser.'" removed from "'.$group.'".',
118-
ILogger::INFO);
156+
$userObject = $this->userManager->get($removedUser);
157+
if ($userObject instanceof IUser) {
158+
$this->dispatcher->dispatchTyped(new UserRemovedEvent($groupObject, $userObject));
159+
}
160+
$this->logger->info(
161+
'bgJ "updateGroups" – {user} removed from {group}',
162+
[
163+
'app' => 'user_ldap',
164+
'user' => $removedUser,
165+
'group' => $group
166+
]
167+
);
119168
$hasChanged = true;
120169
}
121170
foreach (array_diff($actualUsers, $knownUsers) as $addedUser) {
122-
$userObject = $userManager->get($addedUser);
123-
$dispatcher->dispatchTyped(new UserAddedEvent($groupObject, $userObject));
124-
\OCP\Util::writeLog('user_ldap',
125-
'bgJ "updateGroups" – "'.$addedUser.'" added to "'.$group.'".',
126-
ILogger::INFO);
171+
$userObject = $this->userManager->get($addedUser);
172+
if ($userObject instanceof IUser) {
173+
$this->dispatcher->dispatchTyped(new UserAddedEvent($groupObject, $userObject));
174+
}
175+
$this->logger->info(
176+
'bgJ "updateGroups" – {user} added to {group}',
177+
[
178+
'app' => 'user_ldap',
179+
'user' => $addedUser,
180+
'group' => $group
181+
]
182+
);
127183
$hasChanged = true;
128184
}
129185
if ($hasChanged) {
130-
$query->execute([serialize($actualUsers), $group]);
186+
$qb->setParameters([
187+
'members' => serialize($actualUsers),
188+
'groupId' => $group
189+
]);
190+
$qb->execute();
131191
}
132192
}
133-
\OCP\Util::writeLog('user_ldap',
193+
$this->logger->debug(
134194
'bgJ "updateGroups" – FINISHED dealing with known Groups.',
135-
ILogger::DEBUG);
195+
['app' => 'user_ldap']
196+
);
136197
}
137198

138199
/**
@@ -147,7 +208,7 @@ private function handleCreatedGroups($createdGroups) {
147208
');
148209
foreach ($createdGroups as $createdGroup) {
149210
\OCP\Util::writeLog('user_ldap',
150-
'bgJ "updateGroups" – new group "'.$createdGroup.'" found.',
211+
'bgJ "updateGroups" – new group "' . $createdGroup . '" found.',
151212
ILogger::INFO);
152213
$users = serialize($this->groupBackend->usersInGroup($createdGroup));
153214
$query->execute([$createdGroup, $users]);
@@ -169,32 +230,12 @@ private function handleRemovedGroups($removedGroups) {
169230
');
170231
foreach ($removedGroups as $removedGroup) {
171232
\OCP\Util::writeLog('user_ldap',
172-
'bgJ "updateGroups" – group "'.$removedGroup.'" was removed.',
233+
'bgJ "updateGroups" – group "' . $removedGroup . '" was removed.',
173234
ILogger::INFO);
174235
$query->execute([$removedGroup]);
175236
}
176237
\OCP\Util::writeLog('user_ldap',
177238
'bgJ "updateGroups" – FINISHED dealing with removed groups.',
178239
ILogger::DEBUG);
179240
}
180-
181-
/**
182-
* @return array
183-
*/
184-
private function getKnownGroups() {
185-
if (is_array($this->groupsFromDB)) {
186-
$this->groupsFromDB;
187-
}
188-
$query = \OC_DB::prepare('
189-
SELECT `owncloudname`, `owncloudusers`
190-
FROM `*PREFIX*ldap_group_members`
191-
');
192-
$result = $query->execute()->fetchAll();
193-
$this->groupsFromDB = [];
194-
foreach ($result as $dataset) {
195-
$this->groupsFromDB[$dataset['owncloudname']] = $dataset;
196-
}
197-
198-
return $this->groupsFromDB;
199-
}
200241
}

0 commit comments

Comments
 (0)