Skip to content
Snippets Groups Projects
Commit 9ec863cf authored by Peter Rotich's avatar Peter Rotich
Browse files

Support unified remote user directory search

Support searching both staff and user backends via a common interface.
parent 002d34fe
Branches
Tags
No related merge requests found
...@@ -33,7 +33,7 @@ class UsersAjaxAPI extends AjaxController { ...@@ -33,7 +33,7 @@ class UsersAjaxAPI extends AjaxController {
$emails=array(); $emails=array();
if (!$type || !strcasecmp($type, 'remote')) { if (!$type || !strcasecmp($type, 'remote')) {
foreach (StaffAuthenticationBackend::searchUsers($_REQUEST['q']) as $u) { foreach (AuthenticationBackend::searchUsers($_REQUEST['q']) as $u) {
$name = "{$u['first']} {$u['last']}"; $name = "{$u['first']} {$u['last']}";
$users[] = array('email' => $u['email'], 'name'=>$name, $users[] = array('email' => $u['email'], 'name'=>$name,
'info' => "{$u['email']} - $name (remote)", 'info' => "{$u['email']} - $name (remote)",
...@@ -213,16 +213,17 @@ class UsersAjaxAPI extends AjaxController { ...@@ -213,16 +213,17 @@ class UsersAjaxAPI extends AjaxController {
$info = array(); $info = array();
if ($_POST) { $info['title'] = 'Add New User';
if (!AuthenticationBackend::getSearchDirectories())
$info['lookup'] = 'local';
if ($_POST) {
$form = UserForm::getUserForm()->getForm($_POST); $form = UserForm::getUserForm()->getForm($_POST);
if (($user = User::fromForm($form))) if (($user = User::fromForm($form)))
Http::response(201, $user->to_json()); Http::response(201, $user->to_json());
$info = array('error' =>'Error adding user - try again!'); $info['error'] = 'Error adding user - try again!';
} else {
$info['lookuptype'] = remote;
$info['title'] = 'Add New User';
} }
return self::_lookupform($form, $info); return self::_lookupform($form, $info);
...@@ -235,10 +236,10 @@ class UsersAjaxAPI extends AjaxController { ...@@ -235,10 +236,10 @@ class UsersAjaxAPI extends AjaxController {
Http::response(403, 'Login Required'); Http::response(403, 'Login Required');
elseif (!$bk || !$id) elseif (!$bk || !$id)
Http::response(422, 'Backend and user id required'); Http::response(422, 'Backend and user id required');
elseif (!($backend = StaffAuthenticationBackend::getBackend($bk))) elseif (!($backend = AuthenticationBackend::getSearchDirectoryBackend($bk))
|| !($user_info = $backend->lookup($id)))
Http::response(404, 'User not found'); Http::response(404, 'User not found');
$user_info = $backend->lookup($id);
$form = UserForm::getUserForm()->getForm($user_info); $form = UserForm::getUserForm()->getForm($user_info);
$info = array('title' => 'Import Remote User'); $info = array('title' => 'Import Remote User');
if (!$user_info) if (!$user_info)
...@@ -290,13 +291,11 @@ class UsersAjaxAPI extends AjaxController { ...@@ -290,13 +291,11 @@ class UsersAjaxAPI extends AjaxController {
Http::response(400, 'Query argument is required'); Http::response(400, 'Query argument is required');
$users = array(); $users = array();
foreach (StaffAuthenticationBackend::allRegistered() as $ab) { foreach (AuthenticationBackend::searchDirectories() as $ab) {
if (!$ab instanceof AuthDirectorySearch)
continue;
foreach ($ab->search($_REQUEST['q']) as $u) foreach ($ab->search($_REQUEST['q']) as $u)
$users[] = $u; $users[] = $u;
} }
return $this->json_encode($users); return $this->json_encode($users);
} }
......
...@@ -138,6 +138,14 @@ abstract class AuthenticationBackend { ...@@ -138,6 +138,14 @@ abstract class AuthenticationBackend {
return $backends[$id]; return $backends[$id];
} }
static function getSearchDirectoryBackend($id) {
if ($id
&& ($backends = static::getSearchDirectories())
&& isset($backends[$id]))
return $backends[$id];
}
/* /*
* Allow the backend to do login audit depending on the result * Allow the backend to do login audit depending on the result
* This is mainly used to track failed login attempts * This is mainly used to track failed login attempts
...@@ -229,13 +237,24 @@ abstract class AuthenticationBackend { ...@@ -229,13 +237,24 @@ abstract class AuthenticationBackend {
self::authAudit($result); self::authAudit($result);
} }
static function getSearchDirectories() {
$backends = array();
foreach (StaffAuthenticationBackend::allRegistered() as $bk)
if ($bk instanceof AuthDirectorySearch)
$backends[$bk::$id] = $bk;
foreach (UserAuthenticationBackend::allRegistered() as $bk)
if ($bk instanceof AuthDirectorySearch)
$backends[$bk::$id] = $bk;
return array_unique($backends);
}
static function searchUsers($query) { static function searchUsers($query) {
$users = array(); $users = array();
foreach (static::allRegistered() as $bk) { foreach (static::getSearchDirectories() as $bk)
if ($bk instanceof AuthDirectorySearch) { $users += $bk->search($query);
$users += $bk->search($query);
}
}
return $users; return $users;
} }
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
<h3><?php echo $info['title']; ?></h3> <h3><?php echo $info['title']; ?></h3>
<b><a class="close" href="#"><i class="icon-remove-circle"></i></a></b> <b><a class="close" href="#"><i class="icon-remove-circle"></i></a></b>
<hr/> <hr/>
<?php
if (!isset($info['lookup']) || $info['lookup'] !== false) { ?>
<div><p id="msg_info"><i class="icon-info-sign"></i>&nbsp; Search existing users or add a new user.</p></div> <div><p id="msg_info"><i class="icon-info-sign"></i>&nbsp; Search existing users or add a new user.</p></div>
<div style="margin-bottom:10px;"> <div style="margin-bottom:10px;">
<input type="text" class="search-input" style="width:100%;" <input type="text" class="search-input" style="width:100%;"
...@@ -9,6 +11,8 @@ ...@@ -9,6 +11,8 @@
autocorrect="off" autocomplete="off"/> autocorrect="off" autocomplete="off"/>
</div> </div>
<?php <?php
}
if ($info['error']) { if ($info['error']) {
echo sprintf('<p id="msg_error">%s</p>', $info['error']); echo sprintf('<p id="msg_error">%s</p>', $info['error']);
} elseif ($info['msg']) { } elseif ($info['msg']) {
...@@ -78,7 +82,7 @@ $(function() { ...@@ -78,7 +82,7 @@ $(function() {
if (last_req) last_req.abort(); if (last_req) last_req.abort();
last_req = $.ajax({ last_req = $.ajax({
url: "ajax.php/users<?php url: "ajax.php/users<?php
echo $info['lookuptype'] ? "/{$info['lookuptype']}" : '' ?>?q="+query, echo $info['lookup'] ? "/{$info['lookup']}" : '' ?>?q="+query,
dataType: 'json', dataType: 'json',
success: function (data) { success: function (data) {
typeahead.process(data); typeahead.process(data);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment