Blame view
sources/lib/private/user/database.php
7.32 KB
|
03e52840d
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?php
/**
* ownCloud
*
* @author Frank Karlitschek
* @copyright 2012 Frank Karlitschek frank@owncloud.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
/*
*
* The following SQL statement is just a help for developers and will not be
* executed!
*
* CREATE TABLE `users` (
* `uid` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
* `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
* PRIMARY KEY (`uid`)
* ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
*
*/
require_once 'phpass/PasswordHash.php';
/**
* Class for user management in a SQL Database (e.g. MySQL, SQLite)
*/
class OC_User_Database extends OC_User_Backend {
/**
* @var PasswordHash
*/
|
|
a293d369c
|
45 |
static private $hasher = null; |
|
03e52840d
|
46 47 |
private function getHasher() {
|
|
a293d369c
|
48 |
if (!self::$hasher) {
|
|
31b7f2792
|
49 |
//we don't want to use DES based crypt(), since it doesn't return a hash with a recognisable prefix |
|
a293d369c
|
50 51 |
$forcePortable = (CRYPT_BLOWFISH != 1); self::$hasher = new PasswordHash(8, $forcePortable); |
|
03e52840d
|
52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
} return self::$hasher; } /** * @brief Create a new user * @param $uid The username of the user to create * @param $password The password of the new user * @returns true/false * * Creates a new user. Basic checking of username is done in OC_User * itself, not in its subclasses. */ |
|
a293d369c
|
66 67 |
public function createUser($uid, $password) {
if ($this->userExists($uid)) {
|
|
03e52840d
|
68 |
return false; |
|
a293d369c
|
69 70 71 72 73 |
} else {
$hasher = $this->getHasher();
$hash = $hasher->HashPassword($password . OC_Config::getValue('passwordsalt', ''));
$query = OC_DB::prepare('INSERT INTO `*PREFIX*users` ( `uid`, `password` ) VALUES( ?, ? )');
$result = $query->execute(array($uid, $hash));
|
|
03e52840d
|
74 75 76 77 78 79 80 81 82 83 84 85 |
return $result ? true : false; } } /** * @brief delete a user * @param $uid The username of the user to delete * @returns true/false * * Deletes a user */ |
|
a293d369c
|
86 |
public function deleteUser($uid) {
|
|
03e52840d
|
87 |
// Delete user-group-relation |
|
a293d369c
|
88 89 |
$query = OC_DB::prepare('DELETE FROM `*PREFIX*users` WHERE `uid` = ?');
$query->execute(array($uid));
|
|
03e52840d
|
90 91 92 93 94 95 96 97 98 99 100 |
return true; } /** * @brief Set password * @param $uid The username * @param $password The new password * @returns true/false * * Change the password of a user */ |
|
a293d369c
|
101 102 103 104 105 106 |
public function setPassword($uid, $password) {
if ($this->userExists($uid)) {
$hasher = $this->getHasher();
$hash = $hasher->HashPassword($password . OC_Config::getValue('passwordsalt', ''));
$query = OC_DB::prepare('UPDATE `*PREFIX*users` SET `password` = ? WHERE `uid` = ?');
$query->execute(array($hash, $uid));
|
|
03e52840d
|
107 108 |
return true; |
|
a293d369c
|
109 |
} else {
|
|
03e52840d
|
110 111 112 113 114 115 116 117 118 119 120 121 |
return false; } } /** * @brief Set display name * @param $uid The username * @param $displayName The new display name * @returns true/false * * Change the display name of a user */ |
|
a293d369c
|
122 123 124 125 |
public function setDisplayName($uid, $displayName) {
if ($this->userExists($uid)) {
$query = OC_DB::prepare('UPDATE `*PREFIX*users` SET `displayname` = ? WHERE LOWER(`uid`) = ?');
$query->execute(array($displayName, $uid));
|
|
03e52840d
|
126 |
return true; |
|
a293d369c
|
127 |
} else {
|
|
03e52840d
|
128 129 130 131 132 133 134 |
return false; } } /** * @brief get display name of the user * @param $uid user ID of the user |
|
a293d369c
|
135 |
* @return string display name |
|
03e52840d
|
136 137 |
*/
public function getDisplayName($uid) {
|
|
a293d369c
|
138 139 140 141 142 143 144 |
$query = OC_DB::prepare('SELECT `displayname` FROM `*PREFIX*users` WHERE `uid` = ?');
$result = $query->execute(array($uid))->fetchAll();
$displayName = trim($result[0]['displayname'], ' ');
if (!empty($displayName)) {
return $displayName;
} else {
return $uid;
|
|
03e52840d
|
145 146 147 148 149 150 151 152 153 154 155 156 |
}
}
/**
* @brief Get a list of all display names
* @returns array with all displayNames (value) and the correspondig uids (key)
*
* Get a list of all display names and user ids.
*/
public function getDisplayNames($search = '', $limit = null, $offset = null) {
$displayNames = array();
$query = OC_DB::prepare('SELECT `uid`, `displayname` FROM `*PREFIX*users`'
|
|
a293d369c
|
157 158 159 |
. ' WHERE LOWER(`displayname`) LIKE LOWER(?) OR ' . 'LOWER(`uid`) LIKE LOWER(?)', $limit, $offset); $result = $query->execute(array($search . '%', $search . '%')); |
|
03e52840d
|
160 161 162 163 |
$users = array();
while ($row = $result->fetchRow()) {
$displayNames[$row['uid']] = $row['displayname'];
}
|
|
03e52840d
|
164 165 166 167 168 169 170 171 172 173 174 175 |
return $displayNames; } /** * @brief Check if the password is correct * @param $uid The username * @param $password The password * @returns string * * Check if the password is correct without logging in the user * returns the user id or false */ |
|
a293d369c
|
176 177 178 |
public function checkPassword($uid, $password) {
$query = OC_DB::prepare('SELECT `uid`, `password` FROM `*PREFIX*users` WHERE LOWER(`uid`) = LOWER(?)');
$result = $query->execute(array($uid));
|
|
03e52840d
|
179 |
|
|
a293d369c
|
180 181 182 183 184 185 |
$row = $result->fetchRow();
if ($row) {
$storedHash = $row['password'];
if ($storedHash[0] == '$') { //the new phpass based hashing
$hasher = $this->getHasher();
if ($hasher->CheckPassword($password . OC_Config::getValue('passwordsalt', ''), $storedHash)) {
|
|
03e52840d
|
186 |
return $row['uid']; |
|
a293d369c
|
187 |
} else {
|
|
03e52840d
|
188 189 |
return false; } |
|
a293d369c
|
190 191 |
} else { //old sha1 based hashing
if (sha1($password) == $storedHash) {
|
|
03e52840d
|
192 193 194 |
//upgrade to new hashing $this->setPassword($row['uid'], $password); return $row['uid']; |
|
a293d369c
|
195 |
} else {
|
|
03e52840d
|
196 197 198 |
return false; } } |
|
a293d369c
|
199 |
} else {
|
|
03e52840d
|
200 201 202 203 204 205 206 207 208 209 210 211 |
return false;
}
}
/**
* @brief Get a list of all users
* @returns array with all uids
*
* Get a list of all users.
*/
public function getUsers($search = '', $limit = null, $offset = null) {
$query = OC_DB::prepare('SELECT `uid` FROM `*PREFIX*users` WHERE LOWER(`uid`) LIKE LOWER(?)', $limit, $offset);
|
|
a293d369c
|
212 |
$result = $query->execute(array($search . '%')); |
|
03e52840d
|
213 214 215 216 217 218 219 220 221 222 223 224 225 |
$users = array();
while ($row = $result->fetchRow()) {
$users[] = $row['uid'];
}
return $users;
}
/**
* @brief check if a user exists
* @param string $uid the username
* @return boolean
*/
public function userExists($uid) {
|
|
a293d369c
|
226 227 |
$query = OC_DB::prepare('SELECT COUNT(*) FROM `*PREFIX*users` WHERE LOWER(`uid`) = LOWER(?)');
$result = $query->execute(array($uid));
|
|
03e52840d
|
228 229 230 231 |
if (OC_DB::isError($result)) {
OC_Log::write('core', OC_DB::getErrorMessage($result), OC_Log::ERROR);
return false;
}
|
|
31b7f2792
|
232 |
return $result->fetchOne() > 0; |
|
03e52840d
|
233 234 235 |
} /** |
|
a293d369c
|
236 237 238 239 |
* @brief get the user's home directory * @param string $uid the username * @return boolean */ |
|
03e52840d
|
240 |
public function getHome($uid) {
|
|
a293d369c
|
241 242 243 |
if ($this->userExists($uid)) {
return OC_Config::getValue("datadirectory", OC::$SERVERROOT . "/data") . '/' . $uid;
} else {
|
|
03e52840d
|
244 245 246 247 248 249 250 251 252 253 |
return false;
}
}
/**
* @return bool
*/
public function hasUserListings() {
return true;
}
|
|
a293d369c
|
254 255 256 257 258 259 260 261 262 263 264 265 266 267 |
/**
* counts the users in the database
*
* @return int | bool
*/
public function countUsers() {
$query = OC_DB::prepare('SELECT COUNT(*) FROM `*PREFIX*users`');
$result = $query->execute();
if (OC_DB::isError($result)) {
OC_Log::write('core', OC_DB::getErrorMessage($result), OC_Log::ERROR);
return false;
}
return $result->fetchOne();
}
|
|
03e52840d
|
268 |
} |