aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_oauth_sql.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_oauth_sql.erl')
-rw-r--r--src/ejabberd_oauth_sql.erl102
1 files changed, 80 insertions, 22 deletions
diff --git a/src/ejabberd_oauth_sql.erl b/src/ejabberd_oauth_sql.erl
index 9253335ff..fb91a8813 100644
--- a/src/ejabberd_oauth_sql.erl
+++ b/src/ejabberd_oauth_sql.erl
@@ -5,7 +5,7 @@
%%% Created : 27 Jul 2016 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
-%%% ejabberd, Copyright (C) 2002-2016 ProcessOne
+%%% ejabberd, Copyright (C) 2002-2019 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
@@ -25,18 +25,20 @@
%%%-------------------------------------------------------------------
-module(ejabberd_oauth_sql).
-
--compile([{parse_transform, ejabberd_sql_pt}]).
+-behaviour(ejabberd_oauth).
-export([init/0,
store/1,
lookup/1,
- clean/1]).
+ clean/1,
+ lookup_client/1,
+ store_client/1,
+ remove_client/1]).
-include("ejabberd_oauth.hrl").
--include("ejabberd.hrl").
-include("ejabberd_sql_pt.hrl").
--include("jlib.hrl").
+-include("jid.hrl").
+-include("logger.hrl").
init() ->
ok.
@@ -44,35 +46,91 @@ init() ->
store(R) ->
Token = R#oauth_token.token,
{User, Server} = R#oauth_token.us,
- SJID = jid:to_string({User, Server, <<"">>}),
+ SJID = jid:encode({User, Server, <<"">>}),
Scope = str:join(R#oauth_token.scope, <<" ">>),
Expire = R#oauth_token.expire,
- ?SQL_UPSERT(
- ?MYNAME,
- "oauth_token",
- ["!token=%(Token)s",
- "jid=%(SJID)s",
- "scope=%(Scope)s",
- "expire=%(Expire)d"]).
+ case ?SQL_UPSERT(
+ ejabberd_config:get_myname(),
+ "oauth_token",
+ ["!token=%(Token)s",
+ "jid=%(SJID)s",
+ "scope=%(Scope)s",
+ "expire=%(Expire)d"]) of
+ ok ->
+ ok;
+ _ ->
+ {error, db_failure}
+ end.
lookup(Token) ->
case ejabberd_sql:sql_query(
- ?MYNAME,
+ ejabberd_config:get_myname(),
?SQL("select @(jid)s, @(scope)s, @(expire)d"
" from oauth_token where token=%(Token)s")) of
{selected, [{SJID, Scope, Expire}]} ->
- JID = jid:from_string(SJID),
+ JID = jid:decode(SJID),
US = {JID#jid.luser, JID#jid.lserver},
- #oauth_token{token = Token,
- us = US,
- scope = str:tokens(Scope, <<" ">>),
- expire = Expire};
+ {ok, #oauth_token{token = Token,
+ us = US,
+ scope = str:tokens(Scope, <<" ">>),
+ expire = Expire}};
_ ->
- false
+ error
end.
clean(TS) ->
ejabberd_sql:sql_query(
- ?MYNAME,
+ ejabberd_config:get_myname(),
?SQL("delete from oauth_token where expire < %(TS)d")).
+lookup_client(ClientID) ->
+ case ejabberd_sql:sql_query(
+ ejabberd_config:get_myname(),
+ ?SQL("select @(client_name)s, @(grant_type)s, @(options)s"
+ " from oauth_client where client_id=%(ClientID)s")) of
+ {selected, [{ClientName, SGrantType, SOptions}]} ->
+ GrantType =
+ case SGrantType of
+ <<"password">> -> password;
+ <<"implicit">> -> implicit
+ end,
+ case misc:base64_to_term(SOptions) of
+ {term, Options} ->
+ {ok, #oauth_client{client_id = ClientID,
+ client_name = ClientName,
+ grant_type = GrantType,
+ options = Options}};
+ _ ->
+ error
+ end;
+ _ ->
+ error
+ end.
+
+store_client(#oauth_client{client_id = ClientID,
+ client_name = ClientName,
+ grant_type = GrantType,
+ options = Options}) ->
+ SGrantType =
+ case GrantType of
+ password -> <<"password">>;
+ implicit -> <<"implicit">>
+ end,
+ SOptions = misc:term_to_base64(Options),
+ case ?SQL_UPSERT(
+ ejabberd_config:get_myname(),
+ "oauth_client",
+ ["!client_id=%(ClientID)s",
+ "client_name=%(ClientName)s",
+ "grant_type=%(SGrantType)s",
+ "options=%(SOptions)s"]) of
+ ok ->
+ ok;
+ _ ->
+ {error, db_failure}
+ end.
+
+remove_client(Client) ->
+ ejabberd_sql:sql_query(
+ ejabberd_config:get_myname(),
+ ?SQL("delete from oauth_client where client=%(Client)s")).