Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/apps.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Weiske <cweiske@cweiske.de>2014-01-08 00:03:54 +0400
committerChristian Weiske <cweiske@cweiske.de>2014-02-12 00:05:37 +0400
commit3c38519b81cf16e635b280a6c9c931f5c6a1ece1 (patch)
treeb0c49342d58f9882274b08202514ea47e04b6705 /user_external
parent0df350abb211f2b917d8474bd6d1b856d0ebe521 (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.php1
-rw-r--r--user_external/appinfo/database.xml57
-rw-r--r--user_external/appinfo/version2
-rw-r--r--user_external/lib/base.php140
-rw-r--r--user_external/lib/ftp.php8
-rw-r--r--user_external/lib/imap.php8
-rw-r--r--user_external/lib/smb.php6
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