diff options
author | Christian Weiske <cweiske@cweiske.de> | 2014-01-08 00:03:54 +0400 |
---|---|---|
committer | Christian Weiske <cweiske@cweiske.de> | 2014-02-12 00:05:37 +0400 |
commit | 3c38519b81cf16e635b280a6c9c931f5c6a1ece1 (patch) | |
tree | b0c49342d58f9882274b08202514ea47e04b6705 /user_external | |
parent | 0df350abb211f2b917d8474bd6d1b856d0ebe521 (diff) |
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.
Diffstat (limited to 'user_external')
-rw-r--r-- | user_external/appinfo/app.php | 1 | ||||
-rw-r--r-- | user_external/appinfo/database.xml | 57 | ||||
-rw-r--r-- | user_external/appinfo/version | 2 | ||||
-rw-r--r-- | user_external/lib/base.php | 140 | ||||
-rw-r--r-- | user_external/lib/ftp.php | 8 | ||||
-rw-r--r-- | user_external/lib/imap.php | 8 | ||||
-rw-r--r-- | user_external/lib/smb.php | 6 |
7 files changed, 207 insertions, 15 deletions
diff --git a/user_external/appinfo/app.php b/user_external/appinfo/app.php index b7ae10251..de6bb40a4 100644 --- a/user_external/appinfo/app.php +++ b/user_external/appinfo/app.php @@ -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'; diff --git a/user_external/appinfo/database.xml b/user_external/appinfo/database.xml new file mode 100644 index 000000000..0c97b82ef --- /dev/null +++ b/user_external/appinfo/database.xml @@ -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> diff --git a/user_external/appinfo/version b/user_external/appinfo/version index ceab6e11e..1d71ef974 100644 --- a/user_external/appinfo/version +++ b/user_external/appinfo/version @@ -1 +1 @@ -0.1
\ No newline at end of file +0.3
\ No newline at end of file diff --git a/user_external/lib/base.php b/user_external/lib/base.php new file mode 100644 index 000000000..a8eb15bd5 --- /dev/null +++ b/user_external/lib/base.php @@ -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; + } +} +?> diff --git a/user_external/lib/ftp.php b/user_external/lib/ftp.php index b94d7fe39..35d9aa46a 100644 --- a/user_external/lib/ftp.php +++ b/user_external/lib/ftp.php @@ -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; - } } diff --git a/user_external/lib/imap.php b/user_external/lib/imap.php index d1c62632c..6a6fe2362 100644 --- a/user_external/lib/imap.php +++ b/user_external/lib/imap.php @@ -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; - } } diff --git a/user_external/lib/smb.php b/user_external/lib/smb.php index 8a95120a8..d2bd5af6d 100644 --- a/user_external/lib/smb.php +++ b/user_external/lib/smb.php @@ -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; - } }
\ No newline at end of file |