Implement request #301: Create users when using external auth login
After a successful login with imap, smb or ftp, the corresponding user is created in an own database table. This is needed to make e.g. sharing files with this users work. The table may be used by several different external user authentication services. See the discussion in https://github.com/owncloud/apps/pull/1579 for details on the implementation design.
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
<?php
|
||||
OC::$CLASSPATH['OC_User_External_Base']='user_external/lib/base.php';
|
||||
OC::$CLASSPATH['OC_User_IMAP']='user_external/lib/imap.php';
|
||||
OC::$CLASSPATH['OC_User_SMB']='user_external/lib/smb.php';
|
||||
OC::$CLASSPATH['OC_User_FTP']='user_external/lib/ftp.php';
|
||||
|
||||
57
appinfo/database.xml
Normal file
57
appinfo/database.xml
Normal file
@@ -0,0 +1,57 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1" ?>
|
||||
<database>
|
||||
|
||||
<name>*dbname*</name>
|
||||
<create>true</create>
|
||||
<overwrite>false</overwrite>
|
||||
|
||||
<charset>utf8</charset>
|
||||
|
||||
<table>
|
||||
|
||||
<name>*dbprefix*users_external</name>
|
||||
|
||||
<declaration>
|
||||
|
||||
<field>
|
||||
<name>backend</name>
|
||||
<type>text</type>
|
||||
<default></default>
|
||||
<notnull>true</notnull>
|
||||
<length>255</length>
|
||||
</field>
|
||||
|
||||
<field>
|
||||
<name>uid</name>
|
||||
<type>text</type>
|
||||
<default></default>
|
||||
<notnull>true</notnull>
|
||||
<length>64</length>
|
||||
</field>
|
||||
|
||||
<field>
|
||||
<name>displayname</name>
|
||||
<type>text</type>
|
||||
<default></default>
|
||||
<length>64</length>
|
||||
</field>
|
||||
|
||||
<index>
|
||||
<name>users_unique</name>
|
||||
<primary>true</primary>
|
||||
<unique>true</unique>
|
||||
<field>
|
||||
<name>uid</name>
|
||||
<sorting>ascending</sorting>
|
||||
</field>
|
||||
<field>
|
||||
<name>backend</name>
|
||||
<sorting>ascending</sorting>
|
||||
</field>
|
||||
</index>
|
||||
|
||||
</declaration>
|
||||
|
||||
</table>
|
||||
|
||||
</database>
|
||||
@@ -1 +1 @@
|
||||
0.1
|
||||
0.3
|
||||
140
lib/base.php
Normal file
140
lib/base.php
Normal file
@@ -0,0 +1,140 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Christian Weiske <cweiske@cweiske.de>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Base class for external auth implementations that stores users
|
||||
* on their first login in a local table.
|
||||
* This is required for making many of the user-related owncloud functions
|
||||
* work, including sharing files with them.
|
||||
*/
|
||||
abstract class OC_User_External_Base extends OC_User_Backend{
|
||||
protected $backend = '';
|
||||
|
||||
public function __construct($backend) {
|
||||
$this->backend = $backend;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief delete a user
|
||||
* @param string $uid The username of the user to delete
|
||||
* @return bool
|
||||
*
|
||||
* Deletes a user
|
||||
*/
|
||||
public function deleteUser($uid) {
|
||||
$query = OC_DB::prepare('DELETE FROM `*PREFIX*users_external` WHERE `uid` = ? AND backend = ?');
|
||||
$query->execute(array($uid, $this->backend));
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get display name of the user
|
||||
* @param $uid user ID of the user
|
||||
* @return string display name
|
||||
*/
|
||||
public function getDisplayName($uid) {
|
||||
$query = OC_DB::prepare('SELECT `displayname` FROM `*PREFIX*users_external` WHERE `uid` = ? AND backend = ?');
|
||||
$result = $query->execute(array($uid, $this->backend))->fetchAll();
|
||||
$displayName = trim($result[0]['displayname'], ' ');
|
||||
if (!empty($displayName)) {
|
||||
return $displayName;
|
||||
} else {
|
||||
return $uid;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @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_external`'
|
||||
. ' WHERE (LOWER(`displayname`) LIKE LOWER(?) OR '
|
||||
. 'LOWER(`uid`) LIKE LOWER(?)) AND backend = ?', $limit, $offset);
|
||||
$result = $query->execute(array($search . '%', $search . '%', $this->backend));
|
||||
$users = array();
|
||||
while ($row = $result->fetchRow()) {
|
||||
$displayNames[$row['uid']] = $row['displayname'];
|
||||
}
|
||||
|
||||
return $displayNames;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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_external` WHERE LOWER(`uid`) LIKE LOWER(?) AND backend = ?', $limit, $offset);
|
||||
$result = $query->execute(array($search . '%', $this->backend));
|
||||
$users = array();
|
||||
while ($row = $result->fetchRow()) {
|
||||
$users[] = $row['uid'];
|
||||
}
|
||||
return $users;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasUserListings() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set display name
|
||||
* @param $uid The username
|
||||
* @param $displayName The new display name
|
||||
* @returns true/false
|
||||
*
|
||||
* Change the display name of a user
|
||||
*/
|
||||
public function setDisplayName($uid, $displayName) {
|
||||
if ($this->userExists($uid)) {
|
||||
$query = OC_DB::prepare('UPDATE `*PREFIX*users_external` SET `displayname` = ? WHERE LOWER(`uid`) = ? AND backend = ?');
|
||||
$query->execute(array($displayName, $uid, $this->backend));
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create user record in database
|
||||
* @param $uid The username
|
||||
* @returns void
|
||||
*/
|
||||
protected function storeUser($uid)
|
||||
{
|
||||
if (!$this->userExists($uid)) {
|
||||
$query = OC_DB::prepare('INSERT INTO `*PREFIX*users_external` ( `uid`, `backend` ) VALUES( ?, ? )');
|
||||
$result = $query->execute(array($uid, $this->backend));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief check if a user exists
|
||||
* @param string $uid the username
|
||||
* @return boolean
|
||||
*/
|
||||
public function userExists($uid) {
|
||||
$query = OC_DB::prepare('SELECT COUNT(*) FROM `*PREFIX*users_external` WHERE LOWER(`uid`) = LOWER(?) AND backend = ?');
|
||||
$result = $query->execute(array($uid, $this->backend));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('user_external', OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
return false;
|
||||
}
|
||||
return $result->fetchOne() > 0;
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -6,7 +6,7 @@
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
class OC_User_FTP extends OC_User_Backend{
|
||||
class OC_User_FTP extends OC_User_External_Base{
|
||||
private $host;
|
||||
private $secure;
|
||||
private $protocol;
|
||||
@@ -18,6 +18,7 @@ class OC_User_FTP extends OC_User_Backend{
|
||||
if($this->secure) {
|
||||
$this->protocol.='s';
|
||||
}
|
||||
parent::__construct($this->protocol . '://' . $this->host);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -36,13 +37,10 @@ class OC_User_FTP extends OC_User_Backend{
|
||||
$url = sprintf('%s://%s:%s@%s/', $this->protocol, $uid, $password, $this->host);
|
||||
$result=@opendir($url);
|
||||
if(is_resource($result)) {
|
||||
$this->storeUser($uid);
|
||||
return $uid;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function userExists($uid) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,10 +6,11 @@
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
class OC_User_IMAP extends OC_User_Backend{
|
||||
class OC_User_IMAP extends OC_User_External_Base {
|
||||
private $mailbox;
|
||||
|
||||
public function __construct($mailbox) {
|
||||
parent::__construct($mailbox);
|
||||
$this->mailbox=$mailbox;
|
||||
}
|
||||
|
||||
@@ -31,13 +32,10 @@ class OC_User_IMAP extends OC_User_Backend{
|
||||
imap_alerts();
|
||||
if($mbox) {
|
||||
imap_close($mbox);
|
||||
$this->storeUser($uid);
|
||||
return $uid;
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function userExists($uid) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ class OC_User_SMB extends OC_User_Backend{
|
||||
const loginError='NT_STATUS_LOGON_FAILURE';
|
||||
|
||||
public function __construct($host) {
|
||||
parent::__construct($host);
|
||||
$this->host=$host;
|
||||
}
|
||||
|
||||
@@ -41,11 +42,8 @@ class OC_User_SMB extends OC_User_Backend{
|
||||
OCP\Util::writeLog('user_external', 'ERROR: smbclient error: ' . trim($lastline), OCP\Util::ERROR);
|
||||
return false;
|
||||
} else {
|
||||
$this->storeUser($uid);
|
||||
return $uid;
|
||||
}
|
||||
}
|
||||
|
||||
public function userExists($uid) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user