-
-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Fixes #7175 - Allow to search for email address in user management #7419
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -40,6 +40,7 @@ | |
| * along with this program. If not, see <http://www.gnu.org/licenses/> | ||
| * | ||
| */ | ||
|
|
||
| /* | ||
| * | ||
| * The following SQL statement is just a help for developers and will not be | ||
|
|
@@ -56,6 +57,7 @@ | |
| namespace OC\User; | ||
|
|
||
| use OC\Cache\CappedMemoryCache; | ||
| use OC\DB\QueryBuilder\Literal; | ||
| use OCP\IUserBackend; | ||
| use OCP\Util; | ||
| use Symfony\Component\EventDispatcher\EventDispatcher; | ||
|
|
@@ -83,6 +85,7 @@ public function __construct($eventDispatcher = null) { | |
|
|
||
| /** | ||
| * Create a new user | ||
| * | ||
| * @param string $uid The username of the user to create | ||
| * @param string $password The password of the new user | ||
| * @return bool | ||
|
|
@@ -112,6 +115,7 @@ public function createUser($uid, $password) { | |
|
|
||
| /** | ||
| * delete a user | ||
| * | ||
| * @param string $uid The username of the user to delete | ||
| * @return bool | ||
| * | ||
|
|
@@ -131,6 +135,7 @@ public function deleteUser($uid) { | |
|
|
||
| /** | ||
| * Set password | ||
| * | ||
| * @param string $uid The username | ||
| * @param string $password The new password | ||
| * @return bool | ||
|
|
@@ -152,6 +157,7 @@ public function setPassword($uid, $password) { | |
|
|
||
| /** | ||
| * Set display name | ||
| * | ||
| * @param string $uid The username | ||
| * @param string $displayName The new display name | ||
| * @return bool | ||
|
|
@@ -172,6 +178,7 @@ public function setDisplayName($uid, $displayName) { | |
|
|
||
| /** | ||
| * get display name of the user | ||
| * | ||
| * @param string $uid user ID of the user | ||
| * @return string display name | ||
| */ | ||
|
|
@@ -189,20 +196,29 @@ public function getDisplayName($uid) { | |
| * @return array an array of all displayNames (value) and the corresponding uids (key) | ||
| */ | ||
| public function getDisplayNames($search = '', $limit = null, $offset = null) { | ||
| $parameters = []; | ||
| $searchLike = ''; | ||
| if ($search !== '') { | ||
| $parameters[] = '%' . \OC::$server->getDatabaseConnection()->escapeLikeParameter($search) . '%'; | ||
| $parameters[] = '%' . \OC::$server->getDatabaseConnection()->escapeLikeParameter($search) . '%'; | ||
| $searchLike = ' WHERE LOWER(`displayname`) LIKE LOWER(?) OR ' | ||
| . 'LOWER(`uid`) LIKE LOWER(?)'; | ||
| } | ||
| $connection = \OC::$server->getDatabaseConnection(); | ||
|
|
||
| $query = $connection->getQueryBuilder(); | ||
|
|
||
| $query->select('uid', 'displayname') | ||
| ->from('users', 'u') | ||
| ->leftJoin('u', 'preferences', 'p', $query->expr()->andX( | ||
| $query->expr()->eq('userid', 'uid')), | ||
| $query->expr()->eq('appid', new Literal('settings')), | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Literal cannot be hidden from consumers?
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. All plain strings are used as column names
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I mean whether everywhere where we use strings in queries they need to be instances of
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We need to use
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ok |
||
| $query->expr()->eq('configkey', new Literal('email')) | ||
| ) | ||
| // sqlite doesn't like re-using a single named parameter here | ||
| ->where($query->expr()->iLike('uid', $query->createPositionalParameter('%' . $connection->escapeLikeParameter($search) . '%'))) | ||
| ->orWhere($query->expr()->iLike('displayname', $query->createPositionalParameter('%' . $connection->escapeLikeParameter($search) . '%'))) | ||
| ->orWhere($query->expr()->iLike('configvalue', $query->createPositionalParameter('%' . $connection->escapeLikeParameter($search) . '%'))) | ||
| ->orderBy($query->func()->lower('displayname'), 'ASC') | ||
| ->orderBy($query->func()->lower('uid'), 'ASC') | ||
| ->setMaxResults($limit) | ||
| ->setFirstResult($offset); | ||
|
|
||
| $displayNames = array(); | ||
| $query = \OC_DB::prepare('SELECT `uid`, `displayname` FROM `*PREFIX*users`' | ||
| . $searchLike .' ORDER BY LOWER(`displayname`), LOWER(`uid`) ASC', $limit, $offset); | ||
| $result = $query->execute($parameters); | ||
| while ($row = $result->fetchRow()) { | ||
| $result = $query->execute(); | ||
| $displayNames = []; | ||
| while ($row = $result->fetch()) { | ||
| $displayNames[$row['uid']] = $row['displayname']; | ||
| } | ||
|
|
||
|
|
@@ -211,6 +227,7 @@ public function getDisplayNames($search = '', $limit = null, $offset = null) { | |
|
|
||
| /** | ||
| * Check if the password is correct | ||
| * | ||
| * @param string $uid The username | ||
| * @param string $password The password | ||
| * @return string | ||
|
|
@@ -226,8 +243,8 @@ public function checkPassword($uid, $password) { | |
| if ($row) { | ||
| $storedHash = $row['password']; | ||
| $newHash = ''; | ||
| if(\OC::$server->getHasher()->verify($password, $storedHash, $newHash)) { | ||
| if(!empty($newHash)) { | ||
| if (\OC::$server->getHasher()->verify($password, $storedHash, $newHash)) { | ||
| if (!empty($newHash)) { | ||
| $this->setPassword($uid, $password); | ||
| } | ||
| return $row['uid']; | ||
|
|
@@ -240,15 +257,16 @@ public function checkPassword($uid, $password) { | |
|
|
||
| /** | ||
| * Load an user in the cache | ||
| * | ||
| * @param string $uid the username | ||
| * @return boolean true if user was found, false otherwise | ||
| */ | ||
| private function loadUser($uid) { | ||
| $uid = (string) $uid; | ||
| $uid = (string)$uid; | ||
| if (!isset($this->cache[$uid])) { | ||
| //guests $uid could be NULL or '' | ||
| if ($uid === '') { | ||
| $this->cache[$uid]=false; | ||
| $this->cache[$uid] = false; | ||
| return true; | ||
| } | ||
|
|
||
|
|
@@ -285,26 +303,15 @@ private function loadUser($uid) { | |
| * @return string[] an array of all uids | ||
| */ | ||
| public function getUsers($search = '', $limit = null, $offset = null) { | ||
| $parameters = []; | ||
| $searchLike = ''; | ||
| if ($search !== '') { | ||
| $parameters[] = '%' . \OC::$server->getDatabaseConnection()->escapeLikeParameter($search) . '%'; | ||
| $searchLike = ' WHERE LOWER(`uid`) LIKE LOWER(?)'; | ||
| $parameters[] = '%' . \OC::$server->getDatabaseConnection()->escapeLikeParameter($search) . '%'; | ||
| $searchLike .= ' OR LOWER(`displayname`) LIKE LOWER(?)'; | ||
| } | ||
|
|
||
| $query = \OC_DB::prepare('SELECT `uid` FROM `*PREFIX*users`' . $searchLike . ' ORDER BY LOWER(`uid`) ASC', $limit, $offset); | ||
| $result = $query->execute($parameters); | ||
| $users = array(); | ||
| while ($row = $result->fetchRow()) { | ||
| $users[] = $row['uid']; | ||
| } | ||
| return $users; | ||
| $users = $this->getDisplayNames($search, $limit, $offset); | ||
| $userIds = array_keys($users); | ||
| sort($userIds, SORT_STRING | SORT_FLAG_CASE); | ||
| return $userIds; | ||
| } | ||
|
|
||
| /** | ||
| * check if a user exists | ||
| * | ||
| * @param string $uid the username | ||
| * @return boolean | ||
| */ | ||
|
|
@@ -315,6 +322,7 @@ public function userExists($uid) { | |
|
|
||
| /** | ||
| * get the user's home directory | ||
| * | ||
| * @param string $uid the username | ||
| * @return string|false | ||
| */ | ||
|
|
@@ -364,14 +372,15 @@ public function loginName2UserName($loginName) { | |
|
|
||
| /** | ||
| * Backend name to be shown in user management | ||
| * | ||
| * @return string the name of the backend to be shown | ||
| */ | ||
| public function getBackendName(){ | ||
| public function getBackendName() { | ||
| return 'Database'; | ||
| } | ||
|
|
||
| public static function preLoginNameUsedAsUserName($param) { | ||
| if(!isset($param['uid'])) { | ||
| if (!isset($param['uid'])) { | ||
| throw new \Exception('key uid is expected to be set in $param'); | ||
| } | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -71,4 +71,13 @@ public function substring($input, $start, $length = null); | |
| * @since 12.0.0 | ||
| */ | ||
| public function sum($field); | ||
|
|
||
| /** | ||
| * Transforms a string field or value to lower case | ||
| * | ||
| * @param mixed $field | ||
| * @return IQueryFunction | ||
| * @since 13.0.0 | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. See #8696 |
||
| */ | ||
| public function lower($field); | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is fine.