diff options
Diffstat (limited to 'src/ejabberd_oauth_sql.erl')
-rw-r--r-- | src/ejabberd_oauth_sql.erl | 102 |
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")). |