Skip to content

Instantly share code, notes, and snippets.

@zinid
Created March 28, 2018 12:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zinid/74111d618fcfa9f5dfbe57d45b786c1d to your computer and use it in GitHub Desktop.
Save zinid/74111d618fcfa9f5dfbe57d45b786c1d to your computer and use it in GitHub Desktop.
%%%-------------------------------------------------------------------
%%% @author xram <xram@debian.zinid.ru>
%%% @copyright (C) 2018, xram
%%% @doc
%%%
%%% @end
%%% Created : 28 Mar 2018 by xram <xram@debian.zinid.ru>
%%%-------------------------------------------------------------------
-module(mod_foo).
-behaviour(gen_mod).
%% API
-export([start/2, stop/1, reload/3, depends/2, mod_options/1]).
-export([roster_in_subscription/2]).
-include("xmpp.hrl").
-include("mod_roster.hrl").
%%%===================================================================
%%% API
%%%===================================================================
start(Host, _) ->
ejabberd_hooks:add(roster_in_subscription, Host,
?MODULE, roster_in_subscription, 30).
stop(Host) ->
ejabberd_hooks:delete(roster_in_subscription, Host,
?MODULE, roster_in_subscription, 30).
reload(_, _, _) ->
ok.
depends(_, _) ->
[{mod_roster, hard}].
mod_options(_) ->
[].
roster_in_subscription(Acc, #presence{from = From, to = To,
type = subscribe} = Pres) ->
case is_valid_token(Pres) of
true ->
{LUser, LServer, _} = jid:tolower(To),
{Sub, _Ask, Groups} = ejabberd_hooks:run_fold(
roster_get_jid_info, LServer,
{none, none, []},
[LUser, LServer, From]),
case Sub of
both ->
Acc;
from ->
Acc;
_ ->
{NewSub, NewAsk} = case Sub of
to -> {both, none};
none -> {from, out}
end,
LFrom = jid:tolower(jid:remove_resource(From)),
Item = #roster{us = {LUser, LServer},
usj = {LUser, LServer, LFrom},
jid = LFrom,
subscription = NewSub,
ask = NewAsk,
groups = Groups},
mod_roster:set_roster(Item),
mod_roster:push_item(To, Item#roster{subscription = none}, Item),
ejabberd_router:route(
#presence{from = To, to = From, type = subscribed}),
{stop, false}
end;
false ->
Acc
end;
roster_in_subscription(Acc, _) ->
Acc.
%%%===================================================================
%%% Internal functions
%%%===================================================================
is_valid_token(#presence{from = From} = Pres) ->
case xmpp:get_subtag(Pres, #preauth{}) of
#preauth{token = Token} ->
case read_database(From, Token) of
ok ->
true;
_ ->
false
end;
false ->
false
end.
read_database(_, _) ->
ok.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment