mirror of
https://github.com/nextcloud/server.git
synced 2026-06-10 09:13:19 -04:00
enh(LDAP): implement IIsAdmin interface
- add configuration to specify one LDAP group acting as admin group (CLI) - implement `isAdmin()` method, basically relying on inGroup against the configured group Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This commit is contained in:
parent
2e9f364aa6
commit
7236b04133
5 changed files with 55 additions and 2 deletions
|
|
@ -133,6 +133,7 @@ class Configuration {
|
|||
'ldapAttributeRole' => null,
|
||||
'ldapAttributeHeadline' => null,
|
||||
'ldapAttributeBiography' => null,
|
||||
'ldapAdminGroup' => '',
|
||||
];
|
||||
|
||||
public function __construct(string $configPrefix, bool $autoRead = true) {
|
||||
|
|
@ -488,6 +489,7 @@ class Configuration {
|
|||
'ldap_attr_role' => '',
|
||||
'ldap_attr_headline' => '',
|
||||
'ldap_attr_biography' => '',
|
||||
'ldap_admin_group' => '',
|
||||
];
|
||||
}
|
||||
|
||||
|
|
@ -563,6 +565,7 @@ class Configuration {
|
|||
'ldap_attr_role' => 'ldapAttributeRole',
|
||||
'ldap_attr_headline' => 'ldapAttributeHeadline',
|
||||
'ldap_attr_biography' => 'ldapAttributeBiography',
|
||||
'ldap_admin_group' => 'ldapAdminGroup',
|
||||
];
|
||||
return $array;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -82,6 +82,7 @@ use Psr\Log\LoggerInterface;
|
|||
* @property string ldapAttributeRole
|
||||
* @property string ldapAttributeHeadline
|
||||
* @property string ldapAttributeBiography
|
||||
* @property string ldapAdminGroup
|
||||
*/
|
||||
class Connection extends LDAPUtility {
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ use Exception;
|
|||
use OC\ServerNotAvailableException;
|
||||
use OCA\User_LDAP\User\OfflineUser;
|
||||
use OCP\Cache\CappedMemoryCache;
|
||||
use OCP\Group\Backend\IIsAdminBackend;
|
||||
use OCP\GroupInterface;
|
||||
use OCP\Group\Backend\IDeleteGroupBackend;
|
||||
use OCP\Group\Backend\IGetDisplayNameBackend;
|
||||
|
|
@ -57,7 +58,7 @@ use OCP\Server;
|
|||
use Psr\Log\LoggerInterface;
|
||||
use function json_decode;
|
||||
|
||||
class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, IGetDisplayNameBackend, IDeleteGroupBackend {
|
||||
class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, IGetDisplayNameBackend, IDeleteGroupBackend, IIsAdminBackend {
|
||||
protected bool $enabled = false;
|
||||
|
||||
/** @var CappedMemoryCache<string[]> $cachedGroupMembers array of users with gid as key */
|
||||
|
|
@ -1227,6 +1228,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I
|
|||
public function implementsActions($actions): bool {
|
||||
return (bool)((GroupInterface::COUNT_USERS |
|
||||
GroupInterface::DELETE_GROUP |
|
||||
GroupInterface::IS_ADMIN |
|
||||
$this->groupPluginManager->getImplementedActions()) & $actions);
|
||||
}
|
||||
|
||||
|
|
@ -1392,4 +1394,18 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I
|
|||
$this->access->connection->writeToCache($cacheKey, $displayName);
|
||||
return $displayName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ServerNotAvailableException
|
||||
*/
|
||||
public function isAdmin(string $uid): bool {
|
||||
if (!$this->enabled) {
|
||||
return false;
|
||||
}
|
||||
$ldapAdminGroup = $this->access->connection->ldapAdminGroup;
|
||||
if ($ldapAdminGroup === '') {
|
||||
return false;
|
||||
}
|
||||
return $this->inGroup($uid, $ldapAdminGroup);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,12 +30,13 @@ namespace OCA\User_LDAP;
|
|||
|
||||
use OCP\Group\Backend\IDeleteGroupBackend;
|
||||
use OCP\Group\Backend\IGetDisplayNameBackend;
|
||||
use OCP\Group\Backend\IIsAdminBackend;
|
||||
use OCP\Group\Backend\INamedBackend;
|
||||
use OCP\GroupInterface;
|
||||
use OCP\IConfig;
|
||||
use OCP\IUserManager;
|
||||
|
||||
class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGetDisplayNameBackend, INamedBackend, IDeleteGroupBackend {
|
||||
class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGetDisplayNameBackend, INamedBackend, IDeleteGroupBackend, IIsAdminBackend {
|
||||
private $backends = [];
|
||||
private ?Group_LDAP $refBackend = null;
|
||||
private Helper $helper;
|
||||
|
|
@ -347,4 +348,8 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet
|
|||
public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array {
|
||||
return $this->handleRequest($gid, 'searchInGroup', [$gid, $search, $limit, $offset]);
|
||||
}
|
||||
|
||||
public function isAdmin(string $uid): bool {
|
||||
return $this->handleRequest($uid, 'isAdmin', [$uid]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,3 +66,31 @@ Scenario: Test LDAP group membership with intermediate groups not matching filte
|
|||
| 50194 | 1 |
|
||||
| 59376 | 1 |
|
||||
| 59463 | 1 |
|
||||
|
||||
Scenario: Test LDAP admin group mapping, empowered user
|
||||
Given modify LDAP configuration
|
||||
| ldapBaseGroups | ou=NumericGroups,dc=nextcloud,dc=ci |
|
||||
| ldapGroupFilter | (objectclass=groupOfNames) |
|
||||
| ldapGroupMemberAssocAttr | member |
|
||||
| ldapAdminGroup | 3001 |
|
||||
| useMemberOfToDetectMembership | 1 |
|
||||
And cookies are reset
|
||||
# alice, part of the promoted group
|
||||
And Logging in using web as "92379"
|
||||
And sending "GET" to "/cloud/groups"
|
||||
And sending "GET" to "/cloud/groups/2000/users"
|
||||
And Sending a "GET" to "/index.php/settings/admin/overview" with requesttoken
|
||||
Then the HTTP status code should be "200"
|
||||
|
||||
Scenario: Test LDAP admin group mapping, regular user (no access)
|
||||
Given modify LDAP configuration
|
||||
| ldapBaseGroups | ou=NumericGroups,dc=nextcloud,dc=ci |
|
||||
| ldapGroupFilter | (objectclass=groupOfNames) |
|
||||
| ldapGroupMemberAssocAttr | member |
|
||||
| ldapAdminGroup | 3001 |
|
||||
| useMemberOfToDetectMembership | 1 |
|
||||
And cookies are reset
|
||||
# gustaf, not part of the promoted group
|
||||
And Logging in using web as "59376"
|
||||
And Sending a "GET" to "/index.php/settings/admin/overview" with requesttoken
|
||||
Then the HTTP status code should be "403"
|
||||
|
|
|
|||
Loading…
Reference in a new issue