diff --git a/README.md b/README.md new file mode 100644 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +user_sql +======== + +Owncloud SQL authentification + +This is plugin is heavily based on user_imap, user_pwauth and user_ldap! + +Enable it in your Admin -> Apps section and configure your server's details. +Currently, it only works with mySQL and the crypt() password encryption string. +It was tested and developed for a postfixadmin database. diff --git a/appinfo/app.php b/appinfo/app.php new file mode 100644 --- /dev/null +++ b/appinfo/app.php @@ -0,0 +1,49 @@ + +* +* 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 . +* +*/ + +require_once('apps/user_sql/user_sql.php'); + +OC_App::registerAdmin('user_sql','settings'); + +// define IMAP_DEFAULTs +define('OC_USER_BACKEND_SQL_DEFAULT_HOST', 'localhost'); +define('OC_USER_BACKEND_SQL_DEFAULT_USER', 'mail_admin'); +define('OC_USER_BACKEND_SQL_DEFAULT_DB', 'postfixadmin'); +define('OC_USER_BACKEND_SQL_DEFAULT_PASSWORD', 'password'); +define('OC_USER_BACKEND_SQL_DEFAULT_TABLE', 'users'); +define('OC_USER_BACKEND_SQL_DEFAULT_PW_COLUMN', 'password'); +define('OC_USER_BACKEND_SQL_DEFAULT_USER_COLUMN', 'username'); + +// register user backend +OC_User::registerBackend('SQL'); +OC_User::useBackend('SQL'); + +// add settings page to navigation +$entry = array( + 'id' => "user_sql_settings", + 'order'=>1, + 'href' => OC_Helper::linkTo( "user_sql", "settings.php" ), + 'name' => 'SQL' +); + + diff --git a/appinfo/info.xml b/appinfo/info.xml new file mode 100644 --- /dev/null +++ b/appinfo/info.xml @@ -0,0 +1,13 @@ + + + user_sql + SQL user backend + Authenticate Users by SQL + AGPL + Andreas Boehler <andreas.boehler@pmu.ac.at> + 4.5 + false + + + + diff --git a/appinfo/version b/appinfo/version new file mode 100644 --- /dev/null +++ b/appinfo/version @@ -0,0 +1,1 @@ +0.1 diff --git a/js/settings.js b/js/settings.js new file mode 100644 --- /dev/null +++ b/js/settings.js @@ -0,0 +1,1 @@ +// diff --git a/settings.php b/settings.php new file mode 100644 --- /dev/null +++ b/settings.php @@ -0,0 +1,51 @@ + + * + * 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 . + * + */ +$params = array('sql_host', 'sql_user', 'sql_database', 'sql_password', 'sql_table', 'sql_column_username', 'sql_column_password'); + +OCP\Util::addscript('user_sql', 'settings'); + +if ($_POST) { + foreach($params as $param){ + if(isset($_POST[$param])){ + OCP\Config::setAppValue('user_sql', $param, $_POST[$param]); + } + } +} + +// fill template +$tmpl = new OCP\Template( 'user_sql', 'settings'); +foreach($params as $param){ + $value = htmlentities(OCP\Config::getAppValue('user_sql', $param,'')); + $tmpl->assign($param, $value); +} + +// settings with default values +$tmpl->assign( 'sql_host', OCP\Config::getAppValue('user_sql', 'sql_host', OC_USER_BACKEND_SQL_DEFAULT_HOST)); +$tmpl->assign( 'sql_user', OCP\Config::getAppValue('user_sql', 'sql_user', OC_USER_BACKEND_SQL_DEFAULT_USER)); +$tmpl->assign( 'sql_database', OCP\Config::getAppValue( 'user_sql', 'sql_database', OC_USER_BACKEND_SQL_DEFAULT_DB)); +$tmpl->assign( 'sql_password', OCP\Config::getAppValue( 'user_sql', 'sql_password', OC_USER_BACKEND_SQL_DEFAULT_PASSWORD)); +$tmpl->assign( 'sql_table', OCP\Config::getAppValue( 'user_sql', 'sql_table', OC_USER_BACKEND_SQL_DEFAULT_TABLE)); +$tmpl->assign( 'sql_column_password', OCP\Config::getAppValue( 'user_sql', 'sql_column_password', OC_USER_BACKEND_SQL_DEFAULT_PW_COLUMN)); +$tmpl->assign( 'sql_column_username', OCP\Config::getAppValue( 'user_sql', 'sql_column_username', OC_USER_BACKEND_SQL_DEFAULT_USER_COLUMN)); + +return $tmpl->fetchPage(); diff --git a/templates/settings.php b/templates/settings.php new file mode 100644 --- /dev/null +++ b/templates/settings.php @@ -0,0 +1,14 @@ +
+
+ t('SQL'); ?> +

+

+

+

+

+

+

+ + +
+
diff --git a/user_sql.php b/user_sql.php new file mode 100644 --- /dev/null +++ b/user_sql.php @@ -0,0 +1,194 @@ + + * + * 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 . + * + */ + +class OC_USER_SQL extends OC_User_Backend implements OC_User_Interface { + + // cached settings + protected $sql_host; + protected $sql_username; + protected $sql_database; + protected $sql_password; + protected $sql_table; + protected $sql_column_username; + protected $sql_column_password; + + public function __construct() { + $this->sql_host = OCP\Config::getAppValue('user_sql', 'sql_host', ''); + $this->sql_username = OCP\Config::getAppValue('user_sql', 'sql_user', ''); + $this->sql_database = OCP\Config::getAppValue('user_sql', 'sql_database', ''); + $this->sql_password = OCP\Config::getAppValue('user_sql', 'sql_password', ''); + $this->sql_table = OCP\Config::getAppValue('user_sql', 'sql_table', ''); + $this->sql_column_username = OCP\Config::getAppValue('user_sql', 'sql_column_username', ''); + $this->sql_column_password = OCP\Config::getAppValue('user_sql', 'sql_column_password', ''); + } + + public function implementsAction($actions) { + return (bool)((OC_USER_BACKEND_CHECK_PASSWORD) & $actions); + } + + public function createUser() { + // Can't create user + OC_Log::write('OC_USER_SQL', 'Not possible to create local users from web frontend using SQL user backend',3); + return false; + } + + public function deleteUser( $uid ) { + // Can't delete user + OC_Log::write('OC_USER_SQL', 'Not possible to delete local users from web frontend using SQL user backend',3); + return false; + } + + public function setPassword ( $uid, $password ) { + // We can't change user password + OC_Log::write('OC_USER_SQL', 'Not possible to change password for local users from web frontend using SQL user backend',3); + return false; + } + + /** + * @brief Check if the password is correct + * @param $uid The username + * @param $password The password + * @returns true/false + * + * Check if the password is correct without logging in the user + */ + public function checkPassword($uid, $password){ + $db = mysqli_connect ($this->sql_host, $this->sql_username, $this->sql_password); + if ($db) + { + $success = mysqli_select_db ($db, $this->sql_database); + if(!$success) + { + return false; + } + } + else + { + return false; + } + $query = "SELECT $this->sql_column_username, $this->sql_column_password FROM $this->sql_table WHERE $this->sql_column_username = '$uid';"; + $result = mysqli_query($db, $query); + if(!$result) + { + return false; + } + if(mysqli_num_rows($result) == 0) + { + return false; + } + $row = mysqli_fetch_row($result); + if(crypt($password, $row[1]) == $row[1]) + { + return $uid; + } + else + { + 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){ + $users = array(); + $db = mysqli_connect ($this->sql_host, $this->sql_username, $this->sql_password); + if ($db) + { + $success = mysqli_select_db ($db, $this->sql_database); + if(!$success) + { + return false; + } + } + else + { + return false; + } + $query = "SELECT $this->sql_column_username FROM $this->sql_table"; + if($search != '') + $query .= " WHERE $this->sql_column_username LIKE '%$search%'"; + if($limit != null) + $query .= " LIMIT $limit"; + if($offset != null) + $query .= " OFFSET $offset"; + $result = mysqli_query($db, $query); + if(!$result) + { + return array(); + } + if(mysqli_num_rows($result) == 0) + { + return array(); + } + while($row = mysqli_fetch_row($result)) + { + $users[] = $row[0]; + } + return $users; + } + + /** + * @brief check if a user exists + * @param string $uid the username + * @return boolean + */ + + public function userExists($uid) + { + $db = mysqli_connect ($this->sql_host, $this->sql_username, $this->sql_password); + if ($db) + { + $success = mysqli_select_db ($db, $this->sql_database); + if(!$success) + { + return false; + } + $query = "SELECT $this->sql_column_username FROM $this->sql_table WHERE $this->sql_column_username = '$uid';"; + $result = mysqli_query($db, $query); + if(!$result) + { + return false; + } + if(mysqli_num_rows($result) == 0) + { + return false; + } + return true; + + + } + else + { + return false; + } + + } + +} + +?>