From 4eb3737d31b73fc436886cafd40264ad1b63a685 Mon Sep 17 00:00:00 2001 From: Noone404 Date: Wed, 19 Feb 2020 23:11:17 +0100 Subject: [PATCH] Added option to use template string for bind DN (#90) * Language update from launchpad * Added login option 'bind_dn_template' --- config/config.php.example | 6 ++++++ htdocs/login_form.php | 2 +- lib/ds.php | 4 ++++ lib/ds_ldap.php | 11 ++++++++++- locale/de_DE/LC_MESSAGES/messages.mo | Bin 38343 -> 65021 bytes 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/config/config.php.example b/config/config.php.example index 6f2d5d9..e375d27 100644 --- a/config/config.php.example +++ b/config/config.php.example @@ -400,6 +400,12 @@ $servers->setValue('server','name','My LDAP Server'); setup. */ // $servers->setValue('login','class',array()); +/* If login_attr was set to 'dn', it is possible to specify a template string to + build the DN from. Use '%s' where user input should be inserted. A user may + still enter the complete DN. In this case the template will not be used. */ +// $servers->setValue('login','bind_dn_template',null); +# $servers->setValue('login','bind_dn_template','cn=%s,ou=people,dc=example,dc=com'); + /* If you specified something different from 'dn', for example 'uid', as the login_attr above, you can optionally specify here to fall back to authentication with dn. diff --git a/htdocs/login_form.php b/htdocs/login_form.php index 91c252c..b6a36b9 100644 --- a/htdocs/login_form.php +++ b/htdocs/login_form.php @@ -80,7 +80,7 @@ if ($app['server']->getAuthType() == 'http') { printf('%s:', $app['server']->getValue('login','auth_text') ? $app['server']->getValue('login','auth_text') : - ($app['server']->getValue('login','attr') == 'dn' ? _('Login DN') : $_SESSION[APPCONFIG]->getFriendlyName($app['server']->getValue('login','attr')))); + ($app['server']->getValue('login','attr') == 'dn' ? ($app['server']->getValue('login', 'bind_dn_template') ? _('User Name') . ' / ' . _('Login DN') : _('Login DN')) : $_SESSION[APPCONFIG]->getFriendlyName($app['server']->getValue('login','attr')))); printf('', $app['server']->getValue('login','attr',false) == 'dn' ? $app['server']->getValue('login','bind_id') : ''); diff --git a/lib/ds.php b/lib/ds.php index e7f4589..4b27227 100644 --- a/lib/ds.php +++ b/lib/ds.php @@ -574,6 +574,10 @@ class Datastore { 'desc'=>'User Login ID to bind to this DS', 'default'=>null); + $this->default->login['bind_dn_template'] = array( + 'desc'=>'Template string for user login DN to bind to this DS. Use \'%s\' where user input should be inserted.', + 'default'=>null); + $this->default->login['bind_pass'] = array( 'desc'=>'User Login Password to bind to this DS', 'default'=>null); diff --git a/lib/ds_ldap.php b/lib/ds_ldap.php index de80066..4352414 100644 --- a/lib/ds_ldap.php +++ b/lib/ds_ldap.php @@ -255,7 +255,7 @@ class ldap extends DS { if (! is_null($user)) { # If login,attr is set to DN, then user should be a DN if (($this->getValue('login','attr') == 'dn') || $method != 'user') - $userDN = $user; + $userDN = $this->getValue('login', 'bind_dn_template') ? $this->fillDNTemplate($user) : $user; else $userDN = $this->getLoginID($user,'login'); @@ -512,6 +512,15 @@ class ldap extends DS { return $this->getBaseDN(); } + private function fillDNTemplate($user) { + foreach($this->getLoginBaseDN() as $base) + if(substr_compare($user, $base, -strlen($base)) === 0) + return $user; // $user already passed as DN + + // fill template + return sprintf($this->getValue('login', 'bind_dn_template'), preg_replace('/([,\\\\#+<>;"=])/', '\\\\$1', $user)); + } + /** * Return the login classes that a user must have to login */ diff --git a/locale/de_DE/LC_MESSAGES/messages.mo b/locale/de_DE/LC_MESSAGES/messages.mo index c683d730b5c28f342d9cb073e4dd9d8fc5116599..0ae7fc224edfc7185638a8b89d0f7c291e68843b 100644 GIT binary patch literal 65021 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 delta 13104 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 O*)INTH+##kN&gE$Ooa0Q