%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/ldap/commands/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/ldap/commands/LdapController.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2019 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\modules\ldap\commands; use Exception; use humhub\modules\ldap\authclient\LdapAuth; use humhub\modules\user\models\User; use Yii; use yii\base\InvalidArgumentException; use yii\console\ExitCode; use yii\console\widgets\Table; use yii\db\Expression; use yii\helpers\Console; use Laminas\Ldap\Ldap; /** * Console tools for manage Ldap * @method updateAttributes(array $array) */ class LdapController extends \yii\console\Controller { /** * @inheritdoc */ public $defaultAction = 'list'; /** * Lists configured LDAP auth clients * * @return int the exit code */ public function actionList() { $this->stdout("*** Configured LDAP AuthClients \n\n"); $clients = []; foreach (Yii::$app->authClientCollection->getClients(true) as $id => $client) { if ($client instanceof LdapAuth) { /** @var LdapAuth $client */ $clients[] = [$id, $client->getName() . ' (' . $client->getId() . ')', $client->hostname, $client->port, $client->baseDn]; } } try { echo Table::widget(['headers' => ['AuthClient ID', 'Name (ClientId)', 'Host', 'Port', 'Base DN'], 'rows' => $clients]); } catch (Exception $e) { $this->stderr("Error: " . $e->getMessage() . "\n\n"); return ExitCode::UNSPECIFIED_ERROR; } print "\n\n"; } /** * Returns status information * * @param string $id the auth client id (default: ldap) * @return int status code */ public function actionStatus($id = 'ldap') { $this->stdout("*** LDAP Status for AuthClient ID: " . $id . "\n\n"); try { $ldapAuthClient = $this->getAuthClient($id); $ldap = $ldapAuthClient->getLdap(); $userCount = $ldap->count($ldapAuthClient->userFilter, $ldapAuthClient->baseDn, Ldap::SEARCH_SCOPE_SUB); } catch (Exception $ex) { $this->stderr("Error: " . $ex->getMessage() . "\n\n"); return ExitCode::UNSPECIFIED_ERROR; } $this->stdout("Host:\t\t" . $ldapAuthClient->hostname . "\n"); $this->stdout("Port:\t\t" . $ldapAuthClient->port . "\n"); $this->stdout("BaseDN:\t\t" . $ldapAuthClient->baseDn . "\n\n"); $this->stdout("LDAP connection successful!\n\n", Console::FG_GREEN); $activeUserCount = User::find()->andWhere(['auth_mode' => $ldapAuthClient->getId(), 'status' => User::STATUS_ENABLED])->count(); $disabledUserCount = User::find()->andWhere(['auth_mode' => $ldapAuthClient->getId(), 'status' => User::STATUS_DISABLED])->count(); $this->stdout("LDAP user count:\t\t" . $userCount . " users.\n");; $this->stdout("HumHub user count (active):\t" . $activeUserCount . " users.\n"); $this->stdout("HumHub user count (disabled):\t" . $disabledUserCount . " users.\n\n"); return ExitCode::OK; } /** * Synchronizes all ldap users (if autoRefresh is enabled) * * @param string $id the auth client id (default: ldap) * @return int status code */ public function actionSync($id = 'ldap') { $this->stdout("*** LDAP Sync for AuthClient ID: " . $id . "\n\n"); try { $ldapAuthClient = $this->getAuthClient($id); $ldapAuthClient->syncUsers(); } catch (Exception $ex) { $this->stderr("Error: " . $ex->getMessage() . "\n\n"); return ExitCode::UNSPECIFIED_ERROR; } $this->stdout("\nLDAP sync completed!\n\n", Console::FG_GREEN); return ExitCode::OK; } /** * Lists all users found in the LDAP server * * @param string $id the auth client id (default: ldap) * @return int status code */ public function actionListUsers($id = 'ldap') { $this->stdout("*** LDAP User List for AuthClient ID: " . $id . "\n\n"); try { $ldapAuthClient = $this->getAuthClient($id); $users = []; foreach ($ldapAuthClient->getUserCollection() as $user) { $authClient = $ldapAuthClient->getAuthClientInstance($user); $attributes = $authClient->getUserAttributes(); $username = (isset($attributes['username']) ? $attributes['username'] : '---'); $id = (isset($attributes['id']) ? $attributes['id'] : '---'); $email = (isset($attributes['email']) ? $attributes['email'] : '---'); $users[] = [$id, $username, $email]; } echo Table::widget(['headers' => ['ID', 'Username', 'E-Mail'], 'rows' => $users]); } catch (Exception $ex) { $this->stderr("Error: " . $ex->getMessage() . "\n\n"); return ExitCode::UNSPECIFIED_ERROR; } return ExitCode::OK; } /** * Resets the LDAP mapping of all or a certain account. * * @param string $id the auth client id (default: ldap) * @param string $userName UserName, if set, the assignment will be deleted for this user only. * @return int status code */ public function actionMappingClear($id = 'ldap', $userName = null) { $this->stdout("*** LDAP Flush user id mappings for AuthClient ID: " . $id . "\n\n"); if ($userName === null) { User::updateAll(['authclient_id' => new Expression('NULL')], ['auth_mode' => $id]); } else { User::updateAll(['authclient_id' => new Expression('NULL')], ['auth_mode' => $id, 'username' => $userName]); } $this->stdout("Mapping(s) cleared!\n"); return ExitCode::OK; } /** * Rebuilds the authclient_id and auth_mode mappings in the user table * * @param string $id the auth client id (default: ldap) * @return int status code */ public function actionMappingRebuild($id = 'ldap') { $this->stdout("*** LDAP ReMap Users for AuthClient ID: " . $id . "\n\n"); $i = 0; $m = 0; $d = 0; try { $newAuthClient = $this->getAuthClient($id); // Loop over users of this authclient foreach ($newAuthClient->getUserCollection() as $userEntry) { $i++; $authClient = $newAuthClient->getAuthClientInstance($userEntry); $attributes = $authClient->getUserAttributes(); if (!isset($attributes['id'])) { print "Skipped - No ID for: " . $attributes['dn'] . "\n"; continue; } // Fix empty 'authclient_id' by e-mail if (isset($attributes['email'])) { $user = User::find()->where(['email' => $attributes['email']])->andWhere(['IS', 'authclient_id', new Expression('NULL')])->one(); if ($user !== null && User::findOne(['authclient_id' => $attributes['id']]) === null) { $user->updateAttributes(['authclient_id' => $attributes['id']]); $d++; } } // Fix empty 'authclient_id' by username if (isset($attributes['username'])) { $user = User::find()->where(['username' => $attributes['username']])->andWhere(['IS', 'authclient_id', new Expression('NULL')])->one(); if ($user !== null && User::findOne(['authclient_id' => $attributes['id']]) === null) { $user->updateAttributes(['authclient_id' => $attributes['id']]); $d++; } } // Fix wrong/missing 'auth_mode' by authclient_id $user = User::findOne(['authclient_id' => $attributes['id']]); if ($user !== null && $user->auth_mode != $newAuthClient->getId()) { $user->updateAttributes(['auth_mode' => $newAuthClient->getId()]); $m++; } } $this->stdout("Checked:\t" . $i . " users.\n"); $this->stdout("Remapped 'authclient_id' value:\t" . $d . " users.\n"); $this->stdout("Remapped 'auth_mode' value:\t" . $m . " users.\n"); } catch (Exception $ex) { $this->stderr("Error: " . $ex->getMessage() . "\n\n"); return ExitCode::UNSPECIFIED_ERROR; } return ExitCode::OK; } /** * Shows all returned user attributes provided by the LDAP connection. * * @param string $user the username (inserted into the LoginFilter) * @param string $id the auth client id (default: ldap) * @return int status code * @since 1.8 */ public function actionShowUser($user, $id = 'ldap') { $this->stdout("*** LDAP User Details for \"" . $user . "\" for AuthClient ID: " . $id . "\n\n"); try { $ldapAuthClient = $this->getAuthClient($id); $dn = $ldapAuthClient->getLdap()->getCanonicalAccountName($user, Ldap::ACCTNAME_FORM_DN); $x = $ldapAuthClient->getAuthClientInstance($ldapAuthClient->getLdap()->getEntry($dn)); $rows = []; foreach ($x->getUserAttributes() as $name => $value) { if (!is_array($value) && empty(mb_detect_encoding($value))) { $value = '-Binary-'; } $rows[] = [$name, $value]; } echo Table::widget(['headers' => ['LDAP Attribute Name', 'Value'], 'rows' => $rows]) . "\n\n"; } catch (Exception $ex) { $this->stderr("Error: " . $ex->getMessage() . "\n\n"); return ExitCode::UNSPECIFIED_ERROR; } return ExitCode::OK; } /** * @param $id * @return LdapAuth */ protected function getAuthClient($id) { /** @var LdapAuth $ldapAuthClient */ $ldapAuthClient = Yii::$app->authClientCollection->getClient($id, true); if (!$ldapAuthClient instanceof LdapAuth) { throw new InvalidArgumentException("The specified ID does not match to a LDAP AuthClient"); } return $ldapAuthClient; } }