Skip to content

Commit c1c489e

Browse files
authored
Merge pull request #839 from nextcloud/fix/838/result-undefined
fix(Groups): take other DB errors into consideration
2 parents 4630fee + 2571e3f commit c1c489e

2 files changed

Lines changed: 42 additions & 33 deletions

File tree

lib/GroupBackend.php

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,20 @@
3838
use OCP\Group\Backend\INamedBackend;
3939
use OCP\Group\Backend\IRemoveFromGroupBackend;
4040
use OCP\IDBConnection;
41+
use Psr\Log\LoggerInterface;
4142

4243
class GroupBackend extends ABackend implements IAddToGroupBackend, ICountUsersBackend, ICreateGroupBackend, IDeleteGroupBackend, IGetDisplayNameBackend, IRemoveFromGroupBackend, INamedBackend {
43-
/** @var IDBConnection */
44-
private $dbc;
4544

4645
/** @var array */
4746
private $groupCache = [];
4847

4948
public const TABLE_GROUPS = 'user_saml_groups';
5049
public const TABLE_MEMBERS = 'user_saml_group_members';
5150

52-
public function __construct(IDBConnection $dbc) {
53-
$this->dbc = $dbc;
51+
public function __construct(
52+
protected IDBConnection $dbc,
53+
protected LoggerInterface $logger
54+
) {
5455
}
5556

5657
public function inGroup($uid, $gid): bool {
@@ -208,8 +209,14 @@ public function createGroup(string $gid, string $samlGid = null): bool {
208209
->setValue('saml_gid', $builder->createNamedParameter($samlGid))
209210
->executeStatement();
210211
} catch (Exception $e) {
211-
if ($e->getReason() === \OCP\DB\Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) {
212+
if ($e->getReason() === Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) {
212213
$result = 0;
214+
} else {
215+
$this->logger->warning('Failed to create group: ' . $e->getMessage(), [
216+
'app' => 'user_saml',
217+
'exception' => $e,
218+
]);
219+
$result = -1;
213220
}
214221
}
215222

tests/unit/GroupBackendTest.php

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
*/
2828

2929
use \OCA\User_SAML\GroupBackend;
30+
use OCP\IDBConnection;
31+
use Psr\Log\LoggerInterface;
3032
use Test\TestCase;
3133

3234
/**
@@ -35,8 +37,8 @@
3537
class GroupBackendTest extends TestCase {
3638

3739
/** @var GroupBackend */
38-
private static $groupBackend;
39-
private static $users = [
40+
private $groupBackend;
41+
private $users = [
4042
[
4143
'uid' => 'user_saml_integration_test_uid1',
4244
'groups' => [
@@ -51,7 +53,7 @@ class GroupBackendTest extends TestCase {
5153
]
5254
]
5355
];
54-
private static $groups = [
56+
private $groups = [
5557
[
5658
'gid' => 'user_saml_integration_test_gid1',
5759
'saml_gid' => 'user_saml_integration_test_gid1',
@@ -77,36 +79,36 @@ class GroupBackendTest extends TestCase {
7779
],
7880
];
7981

80-
public static function setUpBeforeClass(): void {
81-
parent::setUpBeforeClass();
82-
self::$groupBackend = new \OCA\User_SAML\GroupBackend(\OC::$server->getDatabaseConnection());
83-
foreach (self::$groups as $group) {
84-
self::$groupBackend->createGroup($group['gid'], $group['saml_gid']);
82+
public function setUp(): void {
83+
parent::setUp();
84+
$this->groupBackend = new GroupBackend(\OC::$server->get(IDBConnection::class), $this->createMock(LoggerInterface::class));
85+
foreach ($this->groups as $group) {
86+
$this->groupBackend->createGroup($group['gid'], $group['saml_gid']);
8587
}
86-
foreach (self::$users as $user) {
88+
foreach ($this->users as $user) {
8789
foreach ($user['groups'] as $group) {
88-
self::$groupBackend->addToGroup($user['uid'], $group);
90+
$this->groupBackend->addToGroup($user['uid'], $group);
8991
}
9092
}
9193
}
9294

93-
public static function tearDownAfterClass(): void {
94-
parent::tearDownAfterClass();
95-
self::$groupBackend = new \OCA\User_SAML\GroupBackend(\OC::$server->getDatabaseConnection());
96-
foreach (self::$users as $user) {
95+
public function tearDown(): void {
96+
parent::tearDown();
97+
$this->groupBackend = new GroupBackend(\OC::$server->get(IDBConnection::class), $this->createMock(LoggerInterface::class));
98+
foreach ($this->users as $user) {
9799
foreach ($user['groups'] as $group) {
98-
self::$groupBackend->removeFromGroup($user['uid'], $group);
100+
$this->groupBackend->removeFromGroup($user['uid'], $group);
99101
}
100102
}
101-
foreach (self::$groups as $group) {
102-
self::$groupBackend->deleteGroup($group['gid']);
103+
foreach ($this->groups as $group) {
104+
$this->groupBackend->deleteGroup($group['gid']);
103105
}
104106
}
105107

106108
public function testInGroup() {
107-
foreach (self::$groups as $group) {
108-
foreach (self::$users as $user) {
109-
$result = self::$groupBackend->inGroup($user['uid'], $group['gid']);
109+
foreach ($this->groups as $group) {
110+
foreach ($this->users as $user) {
111+
$result = $this->groupBackend->inGroup($user['uid'], $group['gid']);
110112
if (in_array($group['gid'], $user['groups'])) {
111113
$this->assertTrue($result, sprintf("User %s should be member of group %s", $user['uid'], $group['gid']));
112114
} else {
@@ -117,15 +119,15 @@ public function testInGroup() {
117119
}
118120

119121
public function testGetGroups() {
120-
$groups = self::$groupBackend->getGroups();
121-
foreach (self::$groups as $group) {
122+
$groups = $this->groupBackend->getGroups();
123+
foreach ($this->groups as $group) {
122124
$this->assertContains($group['gid'], $groups, sprintf('Group %s should be retrieved', $group['gid']));
123125
}
124126
}
125127

126128
public function testGetUserGroups() {
127-
foreach (self::$users as $user) {
128-
$userGroups = self::$groupBackend->getUserGroups($user['uid']);
129+
foreach ($this->users as $user) {
130+
$userGroups = $this->groupBackend->getUserGroups($user['uid']);
129131
$this->assertCount(count($user['groups']), $userGroups, 'Should retrieve all user groups');
130132
foreach ($userGroups as $userGroup) {
131133
$this->assertContains($userGroup, $user['groups'], sprintf('Users %s should be member of groups %s', $user['uid'], $userGroup));
@@ -134,15 +136,15 @@ public function testGetUserGroups() {
134136
}
135137

136138
public function testGroupExists() {
137-
foreach (self::$groups as $group) {
138-
$result = self::$groupBackend->groupExists($group['saml_gid']);
139+
foreach ($this->groups as $group) {
140+
$result = $this->groupBackend->groupExists($group['saml_gid']);
139141
$this->assertSame($group['saml_gid_exists'], $result, sprintf('Group %s should exist', $group['saml_gid']));
140142
}
141143
}
142144

143145
public function testUsersInGroups() {
144-
foreach (self::$groups as $group) {
145-
$users = self::$groupBackend->usersInGroup($group['gid']);
146+
foreach ($this->groups as $group) {
147+
$users = $this->groupBackend->usersInGroup($group['gid']);
146148
$this->assertCount(count($group['members']), $users, 'Should retrieve all group members');
147149
foreach ($users as $user) {
148150
$this->assertContains($user, $group['members'], sprintf('User %s should be member of group %s', $user, $group['gid']));

0 commit comments

Comments
 (0)