summaryrefslogtreecommitdiff
path: root/src/ejabberd_auth_odbc.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_auth_odbc.erl')
-rw-r--r--src/ejabberd_auth_odbc.erl210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/ejabberd_auth_odbc.erl b/src/ejabberd_auth_odbc.erl
new file mode 100644
index 00000000..8003338f
--- /dev/null
+++ b/src/ejabberd_auth_odbc.erl
@@ -0,0 +1,210 @@
+%%%----------------------------------------------------------------------
+%%% File : ejabberd_auth_odbc.erl
+%%% Author : Alexey Shchepin <alexey@sevcom.net>
+%%% Purpose : Authentification via ODBC
+%%% Created : 12 Dec 2004 by Alexey Shchepin <alexey@sevcom.net>
+%%% Id : $Id$
+%%%----------------------------------------------------------------------
+
+-module(ejabberd_auth_odbc).
+-author('alexey@sevcom.net').
+-vsn('$Revision$ ').
+
+%% External exports
+-export([start/0,
+ set_password/2,
+ check_password/2,
+ check_password/4,
+ try_register/2,
+ dirty_get_registered_users/0,
+ get_password/1,
+ get_password_s/1,
+ is_user_exists/1,
+ remove_user/1,
+ remove_user/2,
+ plain_password_required/0
+ ]).
+
+-record(passwd, {user, password}).
+
+%%%----------------------------------------------------------------------
+%%% API
+%%%----------------------------------------------------------------------
+start() ->
+ ok.
+
+plain_password_required() ->
+ false.
+
+check_password(User, Password) ->
+ case jlib:nodeprep(User) of
+ error ->
+ false;
+ LUser ->
+ Username = ejabberd_odbc:escape(LUser),
+ case catch ejabberd_odbc:sql_query(
+ ["select password from users "
+ "where username='", Username, "'"]) of
+ {selected, ["password"], [{Password}]} ->
+ true;
+ _ ->
+ false
+ end
+ end.
+
+check_password(User, Password, StreamID, Digest) ->
+ case jlib:nodeprep(User) of
+ error ->
+ false;
+ LUser ->
+ Username = ejabberd_odbc:escape(LUser),
+ case catch ejabberd_odbc:sql_query(
+ ["select password from users "
+ "where username='", Username, "'"]) of
+ {selected, ["password"], [{Passwd}]} ->
+ DigRes = if
+ Digest /= "" ->
+ Digest == sha:sha(StreamID ++ Passwd);
+ true ->
+ false
+ end,
+ if DigRes ->
+ true;
+ true ->
+ (Passwd == Password) and (Password /= "")
+ end;
+ _ ->
+ false
+ end
+ end.
+
+set_password(User, Password) ->
+ case jlib:nodeprep(User) of
+ error ->
+ {error, invalid_jid};
+ LUser ->
+ Username = ejabberd_odbc:escape(LUser),
+ Pass = ejabberd_odbc:escape(Password),
+ catch ejabberd_odbc:sql_query(
+ ["begin;"
+ "delete from users where username='", Username ,"';"
+ "insert into users(username, password) "
+ "values ('", Username, "', '", Pass, "'); commit"])
+ end.
+
+
+try_register(User, Password) ->
+ case jlib:nodeprep(User) of
+ error ->
+ {error, invalid_jid};
+ LUser ->
+ Username = ejabberd_odbc:escape(LUser),
+ Pass = ejabberd_odbc:escape(Password),
+ case catch ejabberd_odbc:sql_query(
+ ["insert into users(username, password) "
+ "values ('", Username, "', '", Pass, "')"]) of
+ {updated, _} ->
+ {atomic, ok};
+ _ ->
+ {atomic, exists}
+ end
+ end.
+
+dirty_get_registered_users() ->
+ case catch ejabberd_odbc:sql_query("select username from users") of
+ {selected, ["username"], Res} ->
+ [U || {U} <- Res];
+ _ ->
+ []
+ end.
+
+get_password(User) ->
+ case jlib:nodeprep(User) of
+ error ->
+ false;
+ LUser ->
+ Username = ejabberd_odbc:escape(LUser),
+ case catch ejabberd_odbc:sql_query(
+ ["select password from users "
+ "where username='", Username, "'"]) of
+ {selected, ["password"], [{Password}]} ->
+ Password;
+ _ ->
+ false
+ end
+ end.
+
+get_password_s(User) ->
+ case jlib:nodeprep(User) of
+ error ->
+ "";
+ LUser ->
+ Username = ejabberd_odbc:escape(LUser),
+ case catch ejabberd_odbc:sql_query(
+ ["select password from users "
+ "where username='", Username, "'"]) of
+ {selected, ["password"], [{Password}]} ->
+ Password;
+ _ ->
+ ""
+ end
+ end.
+
+is_user_exists(User) ->
+ case jlib:nodeprep(User) of
+ error ->
+ false;
+ LUser ->
+ Username = ejabberd_odbc:escape(LUser),
+ case catch ejabberd_odbc:sql_query(
+ ["select password from users "
+ "where username='", Username, "'"]) of
+ {selected, ["password"], [{_Password}]} ->
+ true;
+ _ ->
+ false
+ end
+ end.
+
+remove_user(User) ->
+ case jlib:nodeprep(User) of
+ error ->
+ error;
+ LUser ->
+ Username = ejabberd_odbc:escape(LUser),
+ catch ejabberd_odbc:sql_query(
+ ["delete from users where username='", Username ,"'"]),
+ catch mod_roster:remove_user(User),
+ catch mod_offline:remove_user(User),
+ catch mod_last:remove_user(User),
+ catch mod_vcard:remove_user(User),
+ catch mod_private:remove_user(User)
+ end.
+
+remove_user(User, Password) ->
+ case jlib:nodeprep(User) of
+ error ->
+ error;
+ LUser ->
+ Username = ejabberd_odbc:escape(LUser),
+ Pass = ejabberd_odbc:escape(Password),
+ case catch
+ ejabberd_odbc:sql_query(
+ ["begin;"
+ "select password from users where username='", Username, "';"
+ "delete from users "
+ "where username='", Username, "' and password='", Pass, "';"
+ "commit"]) of
+ {selected, ["password"], [{Password}]} ->
+ catch mod_roster:remove_user(User),
+ catch mod_offline:remove_user(User),
+ catch mod_last:remove_user(User),
+ catch mod_vcard:remove_user(User),
+ catch mod_private:remove_user(User),
+ ok;
+ {selected, ["password"], []} ->
+ not_exists;
+ _ ->
+ not_allowed
+ end
+ end.