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 @@
+
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;
+ }
+
+ }
+
+}
+
+?>