Skip to content
Snippets Groups Projects
Commit c4d7483a authored by Lukas Reschke's avatar Lukas Reschke
Browse files

Use new hashing API for OC_User_Database

This will use the new Hashing API for OC_User_Database and migrate old passwords upon initial login of the user.
parent 2090e9b6
No related branches found
No related tags found
No related merge requests found
...@@ -33,28 +33,12 @@ ...@@ -33,28 +33,12 @@
* *
*/ */
require_once 'phpass/PasswordHash.php';
/** /**
* Class for user management in a SQL Database (e.g. MySQL, SQLite) * Class for user management in a SQL Database (e.g. MySQL, SQLite)
*/ */
class OC_User_Database extends OC_User_Backend { class OC_User_Database extends OC_User_Backend {
/**
* @var PasswordHash
*/
private static $hasher = null;
private $cache = array(); private $cache = array();
private function getHasher() {
if (!self::$hasher) {
//we don't want to use DES based crypt(), since it doesn't return a hash with a recognisable prefix
$forcePortable = (CRYPT_BLOWFISH != 1);
self::$hasher = new PasswordHash(8, $forcePortable);
}
return self::$hasher;
}
/** /**
* Create a new user * Create a new user
* @param string $uid The username of the user to create * @param string $uid The username of the user to create
...@@ -66,10 +50,8 @@ class OC_User_Database extends OC_User_Backend { ...@@ -66,10 +50,8 @@ class OC_User_Database extends OC_User_Backend {
*/ */
public function createUser($uid, $password) { public function createUser($uid, $password) {
if (!$this->userExists($uid)) { if (!$this->userExists($uid)) {
$hasher = $this->getHasher();
$hash = $hasher->HashPassword($password . OC_Config::getValue('passwordsalt', ''));
$query = OC_DB::prepare('INSERT INTO `*PREFIX*users` ( `uid`, `password` ) VALUES( ?, ? )'); $query = OC_DB::prepare('INSERT INTO `*PREFIX*users` ( `uid`, `password` ) VALUES( ?, ? )');
$result = $query->execute(array($uid, $hash)); $result = $query->execute(array($uid, \OC::$server->getHasher()->hash($password)));
return $result ? true : false; return $result ? true : false;
} }
...@@ -106,10 +88,8 @@ class OC_User_Database extends OC_User_Backend { ...@@ -106,10 +88,8 @@ class OC_User_Database extends OC_User_Backend {
*/ */
public function setPassword($uid, $password) { public function setPassword($uid, $password) {
if ($this->userExists($uid)) { 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 = OC_DB::prepare('UPDATE `*PREFIX*users` SET `password` = ? WHERE `uid` = ?');
$result = $query->execute(array($hash, $uid)); $result = $query->execute(array(\OC::$server->getHasher()->hash($password), $uid));
return $result ? true : false; return $result ? true : false;
} }
...@@ -159,7 +139,6 @@ class OC_User_Database extends OC_User_Backend { ...@@ -159,7 +139,6 @@ class OC_User_Database extends OC_User_Backend {
. ' WHERE LOWER(`displayname`) LIKE LOWER(?) OR ' . ' WHERE LOWER(`displayname`) LIKE LOWER(?) OR '
. 'LOWER(`uid`) LIKE LOWER(?) ORDER BY `uid` ASC', $limit, $offset); . 'LOWER(`uid`) LIKE LOWER(?) ORDER BY `uid` ASC', $limit, $offset);
$result = $query->execute(array('%' . $search . '%', '%' . $search . '%')); $result = $query->execute(array('%' . $search . '%', '%' . $search . '%'));
$users = array();
while ($row = $result->fetchRow()) { while ($row = $result->fetchRow()) {
$displayNames[$row['uid']] = $row['displayname']; $displayNames[$row['uid']] = $row['displayname'];
} }
...@@ -183,18 +162,14 @@ class OC_User_Database extends OC_User_Backend { ...@@ -183,18 +162,14 @@ class OC_User_Database extends OC_User_Backend {
$row = $result->fetchRow(); $row = $result->fetchRow();
if ($row) { if ($row) {
$storedHash = $row['password']; $storedHash = $row['password'];
if ($storedHash[0] === '$') { //the new phpass based hashing $newHash = '';
$hasher = $this->getHasher(); if(\OC::$server->getHasher()->verify($password, $storedHash, $newHash)) {
if ($hasher->CheckPassword($password . OC_Config::getValue('passwordsalt', ''), $storedHash)) { if(!empty($newHash)) {
return $row['uid']; $this->setPassword($uid, $password);
} }
//old sha1 based hashing
} elseif (sha1($password) === $storedHash) {
//upgrade to new hashing
$this->setPassword($row['uid'], $password);
return $row['uid']; return $row['uid'];
} }
} }
return false; return false;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment