Proposal: add enumeration function to IUserManager which simply calls a callbask for each user in all backends
This commit is contained in:
parent
fe67db1ad0
commit
6abc02cb88
|
@ -7,6 +7,7 @@ use OCA\DAV\CardDAV\Converter;
|
||||||
use OCA\DAV\Connector\Sabre\Principal;
|
use OCA\DAV\Connector\Sabre\Principal;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
use OCP\IDBConnection;
|
use OCP\IDBConnection;
|
||||||
|
use OCP\IUser;
|
||||||
use OCP\IUserManager;
|
use OCP\IUserManager;
|
||||||
use Sabre\CardDAV\Plugin;
|
use Sabre\CardDAV\Plugin;
|
||||||
use Sabre\VObject\Component\VCard;
|
use Sabre\VObject\Component\VCard;
|
||||||
|
@ -69,28 +70,24 @@ class SyncSystemAddressBook extends Command {
|
||||||
$output->writeln('Syncing users ...');
|
$output->writeln('Syncing users ...');
|
||||||
$progress = new ProgressBar($output);
|
$progress = new ProgressBar($output);
|
||||||
$progress->start();
|
$progress->start();
|
||||||
$page = 0;
|
$this->userManager->callForAllUsers(function($user) use ($systemAddressBook, $converter, $progress) {
|
||||||
foreach( $this->userManager->getBackends() as $backend) {
|
/** @var IUser $user */
|
||||||
$users = $backend->getUsers('', 50, $page++);
|
$name = $user->getBackendClassName();
|
||||||
foreach($users as $user) {
|
$userId = $user->getUID();
|
||||||
$user = $this->userManager->get($user);
|
|
||||||
$name = $user->getBackendClassName();
|
|
||||||
$userId = $user->getUID();
|
|
||||||
|
|
||||||
$cardId = "$name:$userId.vcf";
|
$cardId = "$name:$userId.vcf";
|
||||||
$card = $this->backend->getCard($systemAddressBook['id'], $cardId);
|
$card = $this->backend->getCard($systemAddressBook['id'], $cardId);
|
||||||
if ($card === false) {
|
if ($card === false) {
|
||||||
$vCard = $converter->createCardFromUser($user);
|
$vCard = $converter->createCardFromUser($user);
|
||||||
$this->backend->createCard($systemAddressBook['id'], $cardId, $vCard->serialize());
|
$this->backend->createCard($systemAddressBook['id'], $cardId, $vCard->serialize());
|
||||||
} else {
|
} else {
|
||||||
$vCard = Reader::read($card['carddata']);
|
$vCard = Reader::read($card['carddata']);
|
||||||
if ($converter->updateCard($vCard, $user)) {
|
if ($converter->updateCard($vCard, $user)) {
|
||||||
$this->backend->updateCard($systemAddressBook['id'], $cardId, $vCard->serialize());
|
$this->backend->updateCard($systemAddressBook['id'], $cardId, $vCard->serialize());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$progress->advance();
|
|
||||||
}
|
}
|
||||||
}
|
$progress->advance();
|
||||||
|
});
|
||||||
$progress->finish();
|
$progress->finish();
|
||||||
$output->writeln('');
|
$output->writeln('');
|
||||||
}
|
}
|
||||||
|
|
|
@ -294,21 +294,47 @@ class Manager extends PublicEmitter implements IUserManager {
|
||||||
$userCountStatistics = array();
|
$userCountStatistics = array();
|
||||||
foreach ($this->backends as $backend) {
|
foreach ($this->backends as $backend) {
|
||||||
if ($backend->implementsActions(\OC_User_Backend::COUNT_USERS)) {
|
if ($backend->implementsActions(\OC_User_Backend::COUNT_USERS)) {
|
||||||
$backendusers = $backend->countUsers();
|
$backendUsers = $backend->countUsers();
|
||||||
if($backendusers !== false) {
|
if($backendUsers !== false) {
|
||||||
if($backend instanceof \OCP\IUserBackend) {
|
if($backend instanceof \OCP\IUserBackend) {
|
||||||
$name = $backend->getBackendName();
|
$name = $backend->getBackendName();
|
||||||
} else {
|
} else {
|
||||||
$name = get_class($backend);
|
$name = get_class($backend);
|
||||||
}
|
}
|
||||||
if(isset($userCountStatistics[$name])) {
|
if(isset($userCountStatistics[$name])) {
|
||||||
$userCountStatistics[$name] += $backendusers;
|
$userCountStatistics[$name] += $backendUsers;
|
||||||
} else {
|
} else {
|
||||||
$userCountStatistics[$name] = $backendusers;
|
$userCountStatistics[$name] = $backendUsers;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $userCountStatistics;
|
return $userCountStatistics;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The callback is executed for each user on each backend.
|
||||||
|
* If the callback returns false no further users will be retrieved.
|
||||||
|
*
|
||||||
|
* @param \Closure $callback
|
||||||
|
* @return void
|
||||||
|
* @since 9.0.0
|
||||||
|
*/
|
||||||
|
public function callForAllUsers(\Closure $callback, $search = '') {
|
||||||
|
foreach($this->getBackends() as $backend) {
|
||||||
|
$limit = 50;
|
||||||
|
$offset = 0;
|
||||||
|
do {
|
||||||
|
$users = $backend->getUsers($search, $limit, $offset);
|
||||||
|
foreach ($users as $user) {
|
||||||
|
$user = $this->get($user);
|
||||||
|
$return = $callback($user);
|
||||||
|
if ($return === false) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$offset += $limit;
|
||||||
|
} while (count($users) >= $limit);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,4 +134,11 @@ interface IUserManager {
|
||||||
* @since 8.0.0
|
* @since 8.0.0
|
||||||
*/
|
*/
|
||||||
public function countUsers();
|
public function countUsers();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \Closure $callback
|
||||||
|
* @return void
|
||||||
|
* @since 9.0.0
|
||||||
|
*/
|
||||||
|
public function callForAllUsers (\Closure $callback, $search = '');
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue