diff --git a/rebar.config b/rebar.config index bac2fce4c..85a0929ff 100644 --- a/rebar.config +++ b/rebar.config @@ -7,12 +7,12 @@ %%% Created : 1 May 2013 by Evgeniy Khramtsov %%%------------------------------------------------------------------- -{deps, [{lager, ".*", {git, "https://github.com/basho/lager", {tag, "3.0.2"}}}, +{deps, [{lager, ".*", {git, "https://github.com/basho/lager", {tag, "3.2.1"}}}, {p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.4"}}}, {cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.3"}}}, {fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.0.5"}}}, {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.4"}}}, - {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.13"}}}, + {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.14"}}}, {stun, ".*", {git, "https://github.com/processone/stun", {tag, "1.0.5"}}}, {esip, ".*", {git, "https://github.com/processone/esip", {tag, "1.0.6"}}}, {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.4"}}}, @@ -34,7 +34,7 @@ "527722d12d0433b837cdb92a60900c2cb5df8942"}}}, %% Forces correct dependency for riakc and allow using newer meck version) {if_var_true, riak, {hamcrest, ".*", {git, "https://github.com/hyperthunk/hamcrest-erlang", - "908a24fda4a46776a5135db60ca071e3d783f9f6"}}}, % for riak_pb-2.1.0.7 + "13f9bfb9b27d216e8e033b0e0a9a29097ed923dd"}}}, % for riak_pb-2.1.0.7 {if_var_true, riak, {protobuffs, ".*", {git, "https://github.com/basho/erlang_protobuffs", "6e7fc924506e2dc166a6170e580ce1d95ebbd5bd"}}}, % for riak_pb-2.1.0.7 with correct meck dependency %% Elixir support, needed to run tests diff --git a/src/adhoc.erl b/src/adhoc.erl index 83a113a0c..6970584f9 100644 --- a/src/adhoc.erl +++ b/src/adhoc.erl @@ -41,13 +41,7 @@ %% Parse an ad-hoc request. Return either an adhoc_request record or %% an {error, ErrorType} tuple. %% --spec(parse_request/1 :: -( - IQ :: iq_request()) - -> adhoc_response() - %% - | {error, _} -). +-spec parse_request(IQ :: iq_request()) -> adhoc_response() | {error, _}. parse_request(#iq{type = set, lang = Lang, sub_el = SubEl, xmlns = ?NS_COMMANDS}) -> ?DEBUG("entering parse_request...", []), @@ -88,12 +82,9 @@ find_xdata_el1([_ | Els]) -> find_xdata_el1(Els). %% record, filling in values for language, node and session id from %% the request. %% --spec(produce_response/2 :: -( - Adhoc_Request :: adhoc_request(), - Adhoc_Response :: adhoc_response()) - -> Xmlel::xmlel() -). +-spec produce_response(Adhoc_Request :: adhoc_request(), + Adhoc_Response :: adhoc_response()) -> + Xmlel::xmlel(). %% Produce a node to use as response from an adhoc_response %% record. @@ -104,11 +95,7 @@ produce_response(#adhoc_request{lang = Lang, node = Node, sessionid = SessionID} }). %% --spec(produce_response/1 :: -( - Adhoc_Response::adhoc_response()) - -> Xmlel::xmlel() -). +-spec produce_response(Adhoc_Response::adhoc_response()) -> Xmlel::xmlel(). produce_response( #adhoc_response{ diff --git a/src/cyrsasl.erl b/src/cyrsasl.erl index 21fbc9660..a101e1380 100644 --- a/src/cyrsasl.erl +++ b/src/cyrsasl.erl @@ -88,13 +88,8 @@ start() -> ok. %% --spec(register_mechanism/3 :: -( - Mechanim :: mechanism(), - Module :: module(), - PasswordType :: password_type()) - -> any() -). +-spec register_mechanism(Mechanim :: mechanism(), Module :: module(), + PasswordType :: password_type()) -> any(). register_mechanism(Mechanism, Module, PasswordType) -> case is_disabled(Mechanism) of @@ -139,11 +134,7 @@ check_credentials(_State, Props) -> _LUser -> ok end. --spec(listmech/1 :: -( - Host ::binary()) - -> Mechanisms::mechanisms() -). +-spec listmech(Host ::binary()) -> Mechanisms::mechanisms(). listmech(Host) -> Mechs = ets:select(sasl_mechanism, @@ -213,12 +204,7 @@ server_step(State, ClientIn) -> %% Remove the anonymous mechanism from the list if not enabled for the given %% host %% --spec(filter_anonymous/2 :: -( - Host :: binary(), - Mechs :: mechanisms()) - -> mechanisms() -). +-spec filter_anonymous(Host :: binary(), Mechs :: mechanisms()) -> mechanisms(). filter_anonymous(Host, Mechs) -> case ejabberd_auth_anonymous:is_sasl_anonymous_enabled(Host) of @@ -226,11 +212,7 @@ filter_anonymous(Host, Mechs) -> false -> Mechs -- [<<"ANONYMOUS">>] end. --spec(is_disabled/1 :: -( - Mechanism :: mechanism()) - -> boolean() -). +-spec is_disabled(Mechanism :: mechanism()) -> boolean(). is_disabled(Mechanism) -> Disabled = ejabberd_config:get_option( diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl index 139047d9c..df9debd62 100644 --- a/src/ejabberd_config.erl +++ b/src/ejabberd_config.erl @@ -90,7 +90,7 @@ hosts_to_start(State) -> %% @private %% At the moment, these functions are mainly used to setup unit tests. --spec(start/2 :: (Hosts :: [binary()], Opts :: [acl:acl() | local_config()]) -> ok). +-spec start(Hosts :: [binary()], Opts :: [acl:acl() | local_config()]) -> ok. start(Hosts, Opts) -> mnesia_init(), set_opts(set_hosts_in_options(Hosts, #state{opts = Opts})). diff --git a/src/jlib.erl b/src/jlib.erl index e5cba3180..532a74610 100644 --- a/src/jlib.erl +++ b/src/jlib.erl @@ -307,21 +307,16 @@ get_iq_namespace(#xmlel{name = <<"iq">>, children = Els}) -> get_iq_namespace(_) -> <<"">>. %% --spec(iq_query_info/1 :: -( - Xmlel :: xmlel()) - -> iq_request() | 'reply' | 'invalid' | 'not_iq' -). +-spec iq_query_info(Xmlel :: xmlel()) -> + iq_request() | 'reply' | 'invalid' | 'not_iq'. %% @spec (xmlelement()) -> iq() | reply | invalid | not_iq iq_query_info(El) -> iq_info_internal(El, request). %% --spec(iq_query_or_response_info/1 :: -( - Xmlel :: xmlel()) - -> iq_request() | iq_reply() | 'reply' | 'invalid' | 'not_iq' -). +-spec iq_query_or_response_info(Xmlel :: xmlel()) -> + iq_request() | iq_reply() | + 'reply' | 'invalid' | 'not_iq'. iq_query_or_response_info(El) -> iq_info_internal(El, any). @@ -373,11 +368,7 @@ iq_type_to_string(get) -> <<"get">>; iq_type_to_string(result) -> <<"result">>; iq_type_to_string(error) -> <<"error">>. --spec(iq_to_xml/1 :: -( - IQ :: iq()) - -> xmlel() -). +-spec iq_to_xml(IQ :: iq()) -> xmlel(). iq_to_xml(#iq{id = ID, type = Type, sub_el = SubEl}) -> if ID /= <<"">> -> @@ -391,13 +382,8 @@ iq_to_xml(#iq{id = ID, type = Type, sub_el = SubEl}) -> children = SubEl} end. --spec(parse_xdata_submit/1 :: -( - El :: xmlel()) - -> [{Var::binary(), Values::[binary()]}] - %% - | 'invalid' -). +-spec parse_xdata_submit(El :: xmlel()) -> + [{Var::binary(), Values::[binary()]}] | 'invalid'. parse_xdata_submit(#xmlel{attrs = Attrs, children = Els}) -> case fxml:get_attr_s(<<"type">>, Attrs) of @@ -409,12 +395,9 @@ parse_xdata_submit(#xmlel{attrs = Attrs, children = Els}) -> invalid end. --spec(parse_xdata_fields/2 :: -( - Xmlels :: [xmlel() | cdata()], - Res :: [{Var::binary(), Values :: [binary()]}]) - -> [{Var::binary(), Values::[binary()]}] -). +-spec parse_xdata_fields(Xmlels :: [xmlel() | cdata()], + Res :: [{Var::binary(), Values :: [binary()]}]) -> + [{Var::binary(), Values::[binary()]}]. parse_xdata_fields([], Res) -> Res; parse_xdata_fields([#xmlel{name = <<"field">>, attrs = Attrs, children = SubEls} @@ -429,12 +412,8 @@ parse_xdata_fields([#xmlel{name = <<"field">>, attrs = Attrs, children = SubEls} parse_xdata_fields([_ | Els], Res) -> parse_xdata_fields(Els, Res). --spec(parse_xdata_values/2 :: -( - Xmlels :: [xmlel() | cdata()], - Res :: [binary()]) - -> [binary()] -). +-spec parse_xdata_values(Xmlels :: [xmlel() | cdata()], + Res :: [binary()]) -> [binary()]. parse_xdata_values([], Res) -> Res; parse_xdata_values([#xmlel{name = <<"value">>, children = SubEls} | Els], Res) -> diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index a978cc5f3..53378c355 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -234,11 +234,7 @@ stop(Host) -> %% {stop, Reason} %% Description: Initiates the server %%-------------------------------------------------------------------- --spec(init/1 :: - ( - [binary() | [{_,_}],...]) - -> {'ok',state()} - ). +-spec init([binary() | [{_,_}],...]) -> {'ok',state()}. init([ServerHost, Opts]) -> ?DEBUG("pubsub init ~p ~p", [ServerHost, Opts]), @@ -480,15 +476,10 @@ send_loop(State) -> %% disco hooks handling functions %% --spec(disco_local_identity/5 :: - ( - Acc :: [xmlel()], - _From :: jid(), - To :: jid(), - Node :: <<>> | mod_pubsub:nodeId(), - Lang :: binary()) - -> [xmlel()] - ). +-spec disco_local_identity(Acc :: [xmlel()], _From :: jid(), + To :: jid(), Node :: <<>> | mod_pubsub:nodeId(), + Lang :: binary()) -> [xmlel()]. + disco_local_identity(Acc, _From, To, <<>>, _Lang) -> case lists:member(?PEPNODE, plugins(host(To#jid.lserver))) of true -> @@ -502,15 +493,10 @@ disco_local_identity(Acc, _From, To, <<>>, _Lang) -> disco_local_identity(Acc, _From, _To, _Node, _Lang) -> Acc. --spec(disco_local_features/5 :: - ( - Acc :: [xmlel()], - _From :: jid(), - To :: jid(), - Node :: <<>> | mod_pubsub:nodeId(), - Lang :: binary()) - -> [binary(),...] - ). +-spec disco_local_features(Acc :: [xmlel()], _From :: jid(), + To :: jid(), Node :: <<>> | mod_pubsub:nodeId(), + Lang :: binary()) -> [binary(),...]. + disco_local_features(Acc, _From, To, <<>>, _Lang) -> Host = host(To#jid.lserver), Feats = case Acc of @@ -528,15 +514,10 @@ disco_local_items(Acc, _From, _To, _Node, _Lang) -> Acc. % when is_binary(Node) -> % disco_sm_identity(Acc, From, To, iolist_to_binary(Node), % Lang); --spec(disco_sm_identity/5 :: - ( - Acc :: empty | [xmlel()], - From :: jid(), - To :: jid(), - Node :: mod_pubsub:nodeId(), - Lang :: binary()) - -> [xmlel()] - ). +-spec disco_sm_identity(Acc :: empty | [xmlel()], From :: jid(), + To :: jid(), Node :: mod_pubsub:nodeId(), + Lang :: binary()) -> [xmlel()]. + disco_sm_identity(empty, From, To, Node, Lang) -> disco_sm_identity([], From, To, Node, Lang); disco_sm_identity(Acc, From, To, Node, _Lang) -> @@ -571,15 +552,9 @@ disco_identity(Host, Node, From) -> _ -> [] end. --spec(disco_sm_features/5 :: - ( - Acc :: empty | {result, Features::[Feature::binary()]}, - From :: jid(), - To :: jid(), - Node :: mod_pubsub:nodeId(), - Lang :: binary()) - -> {result, Features::[Feature::binary()]} - ). +-spec disco_sm_features(Acc :: empty | {result, Features::[Feature::binary()]}, + From :: jid(), To :: jid(), Node :: mod_pubsub:nodeId(), + Lang :: binary()) -> {result, Features::[Feature::binary()]}. %disco_sm_features(Acc, From, To, Node, Lang) % when is_binary(Node) -> % disco_sm_features(Acc, From, To, iolist_to_binary(Node), @@ -607,15 +582,9 @@ disco_features(Host, Node, From) -> _ -> [] end. --spec(disco_sm_items/5 :: - ( - Acc :: empty | {result, [xmlel()]}, - From :: jid(), - To :: jid(), - Node :: mod_pubsub:nodeId(), - Lang :: binary()) - -> {result, [xmlel()]} - ). +-spec disco_sm_items(Acc :: empty | {result, [xmlel()]}, From :: jid(), + To :: jid(), Node :: mod_pubsub:nodeId(), + Lang :: binary()) -> {result, [xmlel()]}. %disco_sm_items(Acc, From, To, Node, Lang) % when is_binary(Node) -> % disco_sm_items(Acc, From, To, iolist_to_binary(Node), @@ -627,13 +596,8 @@ disco_sm_items({result, OtherItems}, From, To, Node, _Lang) -> disco_items(jid:tolower(jid:remove_resource(To)), Node, From))}; disco_sm_items(Acc, _From, _To, _Node, _Lang) -> Acc. --spec(disco_items/3 :: - ( - Host :: mod_pubsub:host(), - Node :: mod_pubsub:nodeId(), - From :: jid()) - -> [xmlel()] - ). +-spec disco_items(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(), + From :: jid()) -> [xmlel()]. disco_items(Host, <<>>, From) -> Action = fun (#pubsub_node{nodeid = {_, Node}, options = Options, type = Type, id = Nidx, owners = O}, @@ -847,12 +811,8 @@ handle_call(stop, _From, State) -> %% @private handle_cast(_Msg, State) -> {noreply, State}. --spec(handle_info/2 :: - ( - _ :: {route, From::jid(), To::jid(), Packet::xmlel()}, - State :: state()) - -> {noreply, state()} - ). +-spec handle_info(_ :: {route, From::jid(), To::jid(), Packet::xmlel()}, + State :: state()) -> {noreply, state()}. %%-------------------------------------------------------------------- %% Function: handle_info(Info, State) -> {noreply, State} | @@ -935,17 +895,9 @@ terminate(_Reason, %% @private code_change(_OldVsn, State, _Extra) -> {ok, State}. --spec(do_route/7 :: - ( - ServerHost :: binary(), - Access :: atom(), - Plugins :: [binary(),...], - Host :: mod_pubsub:hostPubsub(), - From :: jid(), - To :: jid(), - Packet :: xmlel()) - -> ok - ). +-spec do_route(ServerHost :: binary(), Access :: atom(), + Plugins :: [binary(),...], Host :: mod_pubsub:hostPubsub(), + From :: jid(), To :: jid(), Packet :: xmlel()) -> ok. %%-------------------------------------------------------------------- %%% Internal functions @@ -1132,14 +1084,8 @@ iq_disco_info(Host, SNode, From, Lang) -> node_disco_info(Host, Node, From) end. --spec(iq_disco_items/4 :: - ( - Host :: mod_pubsub:host(), - Node :: <<>> | mod_pubsub:nodeId(), - From :: jid(), - Rsm :: none | rsm_in()) - -> {result, [xmlel()]} - ). +-spec iq_disco_items(Host :: mod_pubsub:host(), Node :: <<>> | mod_pubsub:nodeId(), + From :: jid(), Rsm :: none | rsm_in()) -> {result, [xmlel()]}. iq_disco_items(Host, <<>>, From, _RSM) -> {result, lists:map(fun (#pubsub_node{nodeid = {_, SubNode}, options = Options}) -> @@ -1202,13 +1148,7 @@ iq_disco_items(Host, Item, From, RSM) -> end end. --spec(iq_sm/3 :: - ( - From :: jid(), - To :: jid(), - IQ :: iq_request()) - -> iq_result() | iq_error() - ). +-spec iq_sm(From :: jid(), To :: jid(), IQ :: iq_request()) -> iq_result() | iq_error(). iq_sm(From, To, #iq{type = Type, sub_el = SubEl, xmlns = XMLNS, lang = Lang} = IQ) -> ServerHost = To#jid.lserver, LOwner = jid:tolower(jid:remove_resource(To)), @@ -1233,36 +1173,17 @@ iq_get_vcard(Lang) -> <<(translate:translate(Lang, <<"ejabberd Publish-Subscribe module">>))/binary, "\nCopyright (c) 2004-2016 ProcessOne">>}]}]. --spec(iq_pubsub/6 :: - ( - Host :: mod_pubsub:host(), - ServerHost :: binary(), - From :: jid(), - IQType :: 'get' | 'set', - SubEl :: xmlel(), - Lang :: binary()) - -> {result, [xmlel()]} - %%% - | {error, xmlel()} - ). +-spec iq_pubsub(Host :: mod_pubsub:host(), ServerHost :: binary(), From :: jid(), + IQType :: 'get' | 'set', SubEl :: xmlel(), Lang :: binary()) -> + {result, [xmlel()]} | {error, xmlel()}. iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang) -> iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, all, plugins(Host)). --spec(iq_pubsub/8 :: - ( - Host :: mod_pubsub:host(), - ServerHost :: binary(), - From :: jid(), - IQType :: 'get' | 'set', - SubEl :: xmlel(), - Lang :: binary(), - Access :: atom(), - Plugins :: [binary(),...]) - -> {result, [xmlel()]} - %%% - | {error, xmlel()} - ). +-spec iq_pubsub(Host :: mod_pubsub:host(), ServerHost :: binary(), From :: jid(), + IQType :: 'get' | 'set', SubEl :: xmlel(), Lang :: binary(), + Access :: atom(), Plugins :: [binary(),...]) -> + {result, [xmlel()]} | {error, xmlel()}. iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) -> #xmlel{children = SubEls} = SubEl, @@ -1368,18 +1289,10 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) -> end. --spec(iq_pubsub_owner/6 :: - ( - Host :: mod_pubsub:host(), - ServerHost :: binary(), - From :: jid(), - IQType :: 'get' | 'set', - SubEl :: xmlel(), - Lang :: binary()) - -> {result, [xmlel()]} - %%% - | {error, xmlel()} - ). +-spec iq_pubsub_owner(Host :: mod_pubsub:host(), ServerHost :: binary(), From :: jid(), + IQType :: 'get' | 'set', SubEl :: xmlel(), Lang :: binary()) -> + {result, [xmlel()]} | {error, xmlel()}. + iq_pubsub_owner(Host, ServerHost, From, IQType, SubEl, Lang) -> #xmlel{children = SubEls} = SubEl, Action = fxml:remove_cdata(SubEls), @@ -1654,10 +1567,10 @@ send_authorization_approval(Host, JID, SNode, Subscription) -> %{S, SID} -> % [{<<"subscription">>, subscription_to_string(S)}, % {<<"subid">>, SID}]; - S -> + S -> [{<<"subscription">>, subscription_to_string(S)}] end, - Stanza = event_stanza(<<"subscription">>, + Stanza = event_stanza(<<"subscription">>, [{<<"jid">>, jid:to_string(JID)} | nodeAttr(SNode)] ++ SubAttrs), @@ -1802,33 +1715,17 @@ update_auth(Host, Node, Type, Nidx, Subscriber, Allow, Subs) -> %%
  • nodetree create_node checks if nodeid already exists
  • %%
  • node plugin create_node just sets default affiliation/subscription
  • %% --spec(create_node/5 :: - ( - Host :: mod_pubsub:host(), - ServerHost :: binary(), - Node :: <<>> | mod_pubsub:nodeId(), - Owner :: jid(), - Type :: binary()) - -> {result, [xmlel(),...]} - %%% - | {error, xmlel()} - ). +-spec create_node(Host :: mod_pubsub:host(), ServerHost :: binary(), + Node :: <<>> | mod_pubsub:nodeId(), Owner :: jid(), + Type :: binary()) -> {result, [xmlel(),...]} | {error, xmlel()}. create_node(Host, ServerHost, Node, Owner, Type) -> create_node(Host, ServerHost, Node, Owner, Type, all, []). --spec(create_node/7 :: - ( - Host :: mod_pubsub:host(), - ServerHost :: binary(), - Node :: <<>> | mod_pubsub:nodeId(), - Owner :: jid(), - Type :: binary(), - Access :: atom(), - Configuration :: [xmlel()]) - -> {result, [xmlel(),...]} - %%% - | {error, xmlel()} - ). +-spec create_node(Host :: mod_pubsub:host(), ServerHost :: binary(), + Node :: <<>> | mod_pubsub:nodeId(), Owner :: jid(), + Type :: binary(), Access :: atom(), Configuration :: [xmlel()]) -> + {result, [xmlel(),...]} | {error, xmlel()}. + create_node(Host, ServerHost, <<>>, Owner, Type, Access, Configuration) -> case lists:member(<<"instant-nodes">>, plugin_features(Host, Type)) of true -> @@ -1942,15 +1839,8 @@ create_node(Host, ServerHost, Node, Owner, GivenType, Access, Configuration) -> %%
  • The node is the root collection node, which cannot be deleted.
  • %%
  • The specified node does not exist.
  • %% --spec(delete_node/3 :: - ( - Host :: mod_pubsub:host(), - Node :: mod_pubsub:nodeId(), - Owner :: jid()) - -> {result, [xmlel(),...]} - %%% - | {error, xmlel()} - ). +-spec delete_node(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(), + Owner :: jid()) -> {result, [xmlel(),...]} | {error, xmlel()}. delete_node(_Host, <<>>, _Owner) -> {error, ?ERRT_NOT_ALLOWED(?MYLANG, <<"No node specified">>)}; delete_node(Host, Node, Owner) -> @@ -2026,17 +1916,9 @@ delete_node(Host, Node, Owner) -> %%
  • The node does not support subscriptions.
  • %%
  • The node does not exist.
  • %% --spec(subscribe_node/5 :: - ( - Host :: mod_pubsub:host(), - Node :: mod_pubsub:nodeId(), - From :: jid(), - JID :: binary(), - Configuration :: [xmlel()]) - -> {result, [xmlel(),...]} - %%% - | {error, xmlel()} - ). +-spec subscribe_node(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(), + From :: jid(), JID :: binary(), Configuration :: [xmlel()]) -> + {result, [xmlel(),...]} | {error, xmlel()}. subscribe_node(Host, Node, From, JID, Configuration) -> SubModule = subscription_plugin(Host), SubOpts = case SubModule:parse_options_xform(Configuration) of @@ -2145,17 +2027,11 @@ subscribe_node(Host, Node, From, JID, Configuration) -> %%
  • The node does not exist.
  • %%
  • The request specifies a subscription ID that is not valid or current.
  • %% --spec(unsubscribe_node/5 :: - ( - Host :: mod_pubsub:host(), - Node :: mod_pubsub:nodeId(), - From :: jid(), - JID :: binary() | ljid(), - SubId :: mod_pubsub:subId()) - -> {result, []} - %%% - | {error, xmlel()} - ). +-spec unsubscribe_node(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(), + From :: jid(), JID :: binary() | ljid(), + SubId :: mod_pubsub:subId()) -> + {result, []} | {error, xmlel()}. + unsubscribe_node(Host, Node, From, JID, SubId) when is_binary(JID) -> unsubscribe_node(Host, Node, From, string_to_ljid(JID), SubId); unsubscribe_node(Host, Node, From, Subscriber, SubId) -> @@ -2183,18 +2059,12 @@ unsubscribe_node(Host, Node, From, Subscriber, SubId) -> %%
  • The item contains more than one payload element or the namespace of the root payload element does not match the configured namespace for the node.
  • %%
  • The request does not match the node configuration.
  • %% --spec(publish_item/6 :: - ( - Host :: mod_pubsub:host(), - ServerHost :: binary(), - Node :: mod_pubsub:nodeId(), - Publisher :: jid(), - ItemId :: <<>> | mod_pubsub:itemId(), - Payload :: mod_pubsub:payload()) - -> {result, [xmlel(),...]} - %%% - | {error, xmlel()} - ). +-spec publish_item(Host :: mod_pubsub:host(), ServerHost :: binary(), + Node :: mod_pubsub:nodeId(), Publisher :: jid(), + ItemId :: <<>> | mod_pubsub:itemId(), + Payload :: mod_pubsub:payload()) -> + {result, [xmlel(),...]} | {error, xmlel()}. + publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload) -> publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload, [], all). publish_item(Host, ServerHost, Node, Publisher, <<>>, Payload, PubOpts, Access) -> @@ -2319,16 +2189,10 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload, PubOpts, Access %%
  • The node does not support persistent items.
  • %%
  • The service does not support the deletion of items.
  • %% --spec(delete_item/4 :: - ( - Host :: mod_pubsub:host(), - Node :: mod_pubsub:nodeId(), - Publisher :: jid(), - ItemId :: mod_pubsub:itemId()) - -> {result, []} - %%% - | {error, xmlel()} - ). +-spec delete_item(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(), + Publisher :: jid(), ItemId :: mod_pubsub:itemId()) -> + {result, []} | {error, xmlel()}. + delete_item(Host, Node, Publisher, ItemId) -> delete_item(Host, Node, Publisher, ItemId, false). delete_item(_, <<>>, _, _, _) -> @@ -2383,15 +2247,10 @@ delete_item(Host, Node, Publisher, ItemId, ForceNotify) -> %%
  • The node is not configured to persist items.
  • %%
  • The specified node does not exist.
  • %% --spec(purge_node/3 :: - ( - Host :: mod_pubsub:host(), - Node :: mod_pubsub:nodeId(), - Owner :: jid()) - -> {result, []} - %%% - | {error, xmlel()} - ). +-spec purge_node(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(), + Owner :: jid()) -> + {result, []} | {error, xmlel()}. + purge_node(Host, Node, Owner) -> Action = fun (#pubsub_node{options = Options, type = Type, id = Nidx}) -> Features = plugin_features(Host, Type), @@ -2435,19 +2294,12 @@ purge_node(Host, Node, Owner) -> %%

    The permission are not checked in this function.

    %% @todo We probably need to check that the user doing the query has the right %% to read the items. --spec(get_items/7 :: - ( - Host :: mod_pubsub:host(), - Node :: mod_pubsub:nodeId(), - From :: jid(), - SubId :: mod_pubsub:subId(), - SMaxItems :: binary(), - ItemIds :: [mod_pubsub:itemId()], - Rsm :: none | rsm_in()) - -> {result, [xmlel(),...]} - %%% - | {error, xmlel()} - ). +-spec get_items(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(), + From :: jid(), SubId :: mod_pubsub:subId(), + SMaxItems :: binary(), ItemIds :: [mod_pubsub:itemId()], + Rsm :: none | rsm_in()) -> + {result, [xmlel(),...]} | {error, xmlel()}. + get_items(Host, Node, From, SubId, SMaxItems, ItemIds, RSM) -> MaxItems = if SMaxItems == <<>> -> case get_max_items_node(Host) of @@ -2511,7 +2363,7 @@ get_items(Host, Node, From, SubId, SMaxItems, ItemIds, RSM) -> get_items(Host, Node) -> Action = fun (#pubsub_node{type = Type, id = Nidx}) -> - node_call(Host, Type, get_items, [Nidx, service_jid(Host), none]) + node_call(Host, Type, get_items, [Nidx, service_jid(Host), none]) end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, {Items, _}}} -> Items; @@ -2610,16 +2462,10 @@ dispatch_items(From, To, _Node, Stanza) -> ejabberd_router:route(service_jid(From), jid:make(To), Stanza). %% @doc

    Return the list of affiliations as an XMPP response.

    --spec(get_affiliations/4 :: - ( - Host :: mod_pubsub:host(), - Node :: mod_pubsub:nodeId(), - JID :: jid(), - Plugins :: [binary()]) - -> {result, [xmlel(),...]} - %%% - | {error, xmlel()} - ). +-spec get_affiliations(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(), + JID :: jid(), Plugins :: [binary()]) -> + {result, [xmlel(),...]} | {error, xmlel()}. + get_affiliations(Host, Node, JID, Plugins) when is_list(Plugins) -> Result = lists:foldl( fun (Type, {Status, Acc}) -> Features = plugin_features(Host, Type), @@ -2663,15 +2509,10 @@ get_affiliations(Host, Node, JID, Plugins) when is_list(Plugins) -> Error end. --spec(get_affiliations/3 :: - ( - Host :: mod_pubsub:host(), - Node :: mod_pubsub:nodeId(), - JID :: jid()) - -> {result, [xmlel(),...]} - %%% - | {error, xmlel()} - ). +-spec get_affiliations(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(), + JID :: jid()) -> + {result, [xmlel(),...]} | {error, xmlel()}. + get_affiliations(Host, Node, JID) -> Action = fun (#pubsub_node{type = Type, id = Nidx}) -> Features = plugin_features(Host, Type), @@ -2708,16 +2549,10 @@ get_affiliations(Host, Node, JID) -> Error end. --spec(set_affiliations/4 :: - ( - Host :: mod_pubsub:host(), - Node :: mod_pubsub:nodeId(), - From :: jid(), - EntitiesEls :: [xmlel()]) - -> {result, []} - %%% - | {error, xmlel()} - ). +-spec set_affiliations(Host :: mod_pubsub:host(), Node :: mod_pubsub:nodeId(), + From :: jid(), EntitiesEls :: [xmlel()]) -> + {result, []} | {error, xmlel()}. + set_affiliations(Host, Node, From, EntitiesEls) -> Owner = jid:tolower(jid:remove_resource(From)), Entities = lists:foldl(fun @@ -3113,15 +2948,13 @@ set_subscriptions(Host, Node, From, EntitiesEls) -> end end. --spec(get_presence_and_roster_permissions/5 :: - ( - Host :: mod_pubsub:host(), - From :: ljid(), - Owners :: [ljid(),...], - AccessModel :: mod_pubsub:accessModel(), - AllowedGroups :: [binary()]) - -> {PresenceSubscription::boolean(), RosterGroup::boolean()} - ). +-spec get_presence_and_roster_permissions(Host :: mod_pubsub:host(), + From :: ljid(), Owners :: [ljid(),...], + AccessModel :: mod_pubsub:accessModel(), + AllowedGroups :: [binary()]) -> + {PresenceSubscription::boolean(), + RosterGroup::boolean()}. + get_presence_and_roster_permissions(Host, From, Owners, AccessModel, AllowedGroups) -> if (AccessModel == presence) or (AccessModel == roster) -> case Host of @@ -3179,11 +3012,7 @@ subscription_to_string(pending) -> <<"pending">>; subscription_to_string(unconfigured) -> <<"unconfigured">>; subscription_to_string(_) -> <<"none">>. --spec(service_jid/1 :: - ( - Host :: mod_pubsub:host()) - -> jid() - ). +-spec service_jid(Host :: mod_pubsub:host()) -> jid(). service_jid(#jid{} = Jid) -> Jid; service_jid({U, S, R}) -> jid:make(U, S, R); service_jid(Host) -> jid:make(<<>>, Host, <<>>). @@ -3217,12 +3046,7 @@ sub_option_can_deliver(_, _, {deliver, false}) -> false; sub_option_can_deliver(_, _, {expire, When}) -> p1_time_compat:timestamp() < When; sub_option_can_deliver(_, _, _) -> true. --spec(presence_can_deliver/2 :: - ( - Entity :: ljid(), - _ :: boolean()) - -> boolean() - ). +-spec presence_can_deliver(Entity :: ljid(), _ :: boolean()) -> boolean(). presence_can_deliver(_, false) -> true; presence_can_deliver({User, Server, Resource}, true) -> @@ -3243,12 +3067,10 @@ presence_can_deliver({User, Server, Resource}, true) -> false, Ss) end. --spec(state_can_deliver/2 :: - ( - Entity::ljid(), - SubOptions :: mod_pubsub:subOptions() | []) - -> [ljid()] - ). +-spec state_can_deliver(Entity::ljid(), + SubOptions :: mod_pubsub:subOptions() | []) -> + [ljid()]. + state_can_deliver({U, S, R}, []) -> [{U, S, R}]; state_can_deliver({U, S, R}, SubOptions) -> case lists:keysearch(show_values, 1, SubOptions) of @@ -3268,13 +3090,10 @@ state_can_deliver({U, S, R}, SubOptions) -> [], Resources) end. --spec(get_resource_state/3 :: - ( - Entity :: ljid(), - ShowValues :: [binary()], - JIDs :: [ljid()]) - -> [ljid()] - ). +-spec get_resource_state(Entity :: ljid(), ShowValues :: [binary()], + JIDs :: [ljid()]) -> + [ljid()]. + get_resource_state({U, S, R}, ShowValues, JIDs) -> case ejabberd_sm:get_session_pid(U, S, R) of none -> @@ -3293,11 +3112,8 @@ get_resource_state({U, S, R}, ShowValues, JIDs) -> end end. --spec(payload_xmlelements/1 :: - ( - Payload :: mod_pubsub:payload()) - -> Count :: non_neg_integer() - ). +-spec payload_xmlelements(Payload :: mod_pubsub:payload()) -> + Count :: non_neg_integer(). payload_xmlelements(Payload) -> payload_xmlelements(Payload, 0). @@ -4040,12 +3856,9 @@ unset_cached_item(Host, Nidx) -> _ -> ok end. --spec(get_cached_item/2 :: - ( - Host :: mod_pubsub:host(), - Nidx :: mod_pubsub:nodeIdx()) - -> undefined | mod_pubsub:pubsubItem() - ). +-spec get_cached_item(Host :: mod_pubsub:host(), Nidx :: mod_pubsub:nodeIdx()) -> + undefined | mod_pubsub:pubsubItem(). + get_cached_item({_, ServerHost, _}, Nidx) -> get_cached_item(ServerHost, Nidx); get_cached_item(Host, Nidx) -> @@ -4340,7 +4153,7 @@ string_to_ljid(JID) -> end end. --spec(uniqid/0 :: () -> mod_pubsub:itemId()). +-spec uniqid() -> mod_pubsub:itemId(). uniqid() -> {T1, T2, T3} = p1_time_compat:timestamp(), iolist_to_binary(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3])). @@ -4355,12 +4168,7 @@ itemsEls(Items) -> [#xmlel{name = <<"item">>, attrs = itemAttr(ItemId), children = Payload} || #pubsub_item{itemid = {ItemId, _}, payload = Payload} <- Items]. --spec(add_message_type/2 :: - ( - Message :: xmlel(), - Type :: atom()) - -> xmlel() - ). +-spec add_message_type(Message :: xmlel(), Type :: atom()) -> xmlel(). add_message_type(Message, normal) -> Message; add_message_type(#xmlel{name = <<"message">>, attrs = Attrs, children = Els}, Type) -> diff --git a/src/node_flat_sql.erl b/src/node_flat_sql.erl index 68116cf50..2030b12c7 100644 --- a/src/node_flat_sql.erl +++ b/src/node_flat_sql.erl @@ -402,17 +402,13 @@ get_entity_subscriptions(Host, Owner) -> end, {result, Reply}. --spec(get_entity_subscriptions_for_send_last/2 :: - ( - Host :: mod_pubsub:hostPubsub(), - Owner :: jid()) - -> {result, - [{mod_pubsub:pubsubNode(), - mod_pubsub:subscription(), - mod_pubsub:subId(), - ljid()}] - } - ). +-spec get_entity_subscriptions_for_send_last(Host :: mod_pubsub:hostPubsub(), + Owner :: jid()) -> + {result, [{mod_pubsub:pubsubNode(), + mod_pubsub:subscription(), + mod_pubsub:subId(), + ljid()}]}. + get_entity_subscriptions_for_send_last(Host, Owner) -> SubKey = jid:tolower(Owner), GenKey = jid:remove_resource(SubKey), @@ -611,11 +607,9 @@ get_state(Nidx, JID) -> {SJID, _} = State#pubsub_state.stateid, State#pubsub_state{items = itemids(Nidx, SJID)}. --spec(get_state_without_itemids/2 :: - (Nidx :: mod_pubsub:nodeIdx(), - Key :: ljid()) -> - mod_pubsub:pubsubState() - ). +-spec get_state_without_itemids(Nidx :: mod_pubsub:nodeIdx(), Key :: ljid()) -> + mod_pubsub:pubsubState(). + get_state_without_itemids(Nidx, JID) -> J = encode_jid(JID), case catch @@ -973,17 +967,11 @@ update_subscription(Nidx, JID, Subscription) -> "-affiliation='n'" ]). --spec(decode_jid/1 :: - ( SJID :: binary()) - -> ljid() - ). +-spec decode_jid(SJID :: binary()) -> ljid(). decode_jid(SJID) -> jid:tolower(jid:from_string(SJID)). --spec(decode_affiliation/1 :: - ( Arg :: binary()) - -> atom() - ). +-spec decode_affiliation(Arg :: binary()) -> atom(). decode_affiliation(<<"o">>) -> owner; decode_affiliation(<<"p">>) -> publisher; decode_affiliation(<<"u">>) -> publish_only; @@ -991,19 +979,13 @@ decode_affiliation(<<"m">>) -> member; decode_affiliation(<<"c">>) -> outcast; decode_affiliation(_) -> none. --spec(decode_subscription/1 :: - ( Arg :: binary()) - -> atom() - ). +-spec decode_subscription(Arg :: binary()) -> atom(). decode_subscription(<<"s">>) -> subscribed; decode_subscription(<<"p">>) -> pending; decode_subscription(<<"u">>) -> unconfigured; decode_subscription(_) -> none. --spec(decode_subscriptions/1 :: - ( Subscriptions :: binary()) - -> [] | [{atom(), binary()},...] - ). +-spec decode_subscriptions(Subscriptions :: binary()) -> [] | [{atom(), binary()},...]. decode_subscriptions(Subscriptions) -> lists:foldl(fun (Subscription, Acc) -> case str:tokens(Subscription, <<":">>) of @@ -1013,36 +995,24 @@ decode_subscriptions(Subscriptions) -> end, [], str:tokens(Subscriptions, <<",">>)). --spec(encode_jid/1 :: - ( JID :: ljid()) - -> binary() - ). +-spec encode_jid(JID :: ljid()) -> binary(). encode_jid(JID) -> jid:to_string(JID). --spec(encode_jid_like/1 :: (JID :: ljid()) -> binary()). +-spec encode_jid_like(JID :: ljid()) -> binary(). encode_jid_like(JID) -> ejabberd_sql:escape_like_arg_circumflex(jid:to_string(JID)). --spec(encode_host/1 :: - ( Host :: host()) - -> binary() - ). +-spec encode_host(Host :: host()) -> binary(). encode_host({_U, _S, _R} = LJID) -> encode_jid(LJID); encode_host(Host) -> Host. --spec(encode_host_like/1 :: - ( Host :: host()) - -> binary() - ). +-spec encode_host_like(Host :: host()) -> binary(). encode_host_like({_U, _S, _R} = LJID) -> ejabberd_sql:escape(encode_jid_like(LJID)); encode_host_like(Host) -> ejabberd_sql:escape(ejabberd_sql:escape_like_arg_circumflex(Host)). --spec(encode_affiliation/1 :: - ( Arg :: atom()) - -> binary() - ). +-spec encode_affiliation(Arg :: atom()) -> binary(). encode_affiliation(owner) -> <<"o">>; encode_affiliation(publisher) -> <<"p">>; encode_affiliation(publish_only) -> <<"u">>; @@ -1050,19 +1020,13 @@ encode_affiliation(member) -> <<"m">>; encode_affiliation(outcast) -> <<"c">>; encode_affiliation(_) -> <<"n">>. --spec(encode_subscription/1 :: - ( Arg :: atom()) - -> binary() - ). +-spec encode_subscription(Arg :: atom()) -> binary(). encode_subscription(subscribed) -> <<"s">>; encode_subscription(pending) -> <<"p">>; encode_subscription(unconfigured) -> <<"u">>; encode_subscription(_) -> <<"n">>. --spec(encode_subscriptions/1 :: - ( Subscriptions :: [] | [{atom(), binary()},...]) - -> binary() - ). +-spec encode_subscriptions(Subscriptions :: [] | [{atom(), binary()},...]) -> binary(). encode_subscriptions(Subscriptions) -> str:join([<<(encode_subscription(S))/binary, ":", SubId/binary>> || {S, SubId} <- Subscriptions], <<",">>). diff --git a/src/nodetree_dag.erl b/src/nodetree_dag.erl index a105db832..387d98413 100644 --- a/src/nodetree_dag.erl +++ b/src/nodetree_dag.erl @@ -167,12 +167,8 @@ oid(Key, Name) -> {Key, Name}. %% Key = jlib:jid() | host() %% Node = string() --spec(find_node/2 :: - ( - Key :: mod_pubsub:hostPubsub(), - Node :: mod_pubsub:nodeId()) - -> mod_pubsub:pubsubNode() | false - ). +-spec find_node(Key :: mod_pubsub:hostPubsub(), Node :: mod_pubsub:nodeId()) -> + mod_pubsub:pubsubNode() | false. find_node(Key, Node) -> case mnesia:read(pubsub_node, oid(Key, Node), read) of [] -> false; @@ -188,14 +184,11 @@ find_opt(Key, Default, Options) -> _ -> Default end. --spec(traversal_helper/4 :: - ( - Pred :: fun(), - Tr :: fun(), - Host :: mod_pubsub:hostPubsub(), - Nodes :: [mod_pubsub:nodeId(),...]) - -> [{Depth::non_neg_integer(), Nodes::[mod_pubsub:pubsubNode(),...]}] - ). +-spec traversal_helper(Pred :: fun(), Tr :: fun(), Host :: mod_pubsub:hostPubsub(), + Nodes :: [mod_pubsub:nodeId(),...]) -> + [{Depth::non_neg_integer(), + Nodes::[mod_pubsub:pubsubNode(),...]}]. + traversal_helper(Pred, Tr, Host, Nodes) -> traversal_helper(Pred, Tr, 0, Host, Nodes, []). @@ -220,15 +213,10 @@ remove_config_parent(Node, [{collection, Parents} | T], Acc) -> remove_config_parent(Node, [H | T], Acc) -> remove_config_parent(Node, T, [H | Acc]). --spec(validate_parentage/3 :: - ( - Key :: mod_pubsub:hostPubsub(), - Owners :: [ljid(),...], - Parent_Nodes :: [mod_pubsub:nodeId()]) - -> true - %%% - | {error, xmlel()} - ). +-spec validate_parentage(Key :: mod_pubsub:hostPubsub(), Owners :: [ljid(),...], + Parent_Nodes :: [mod_pubsub:nodeId()]) -> + true | {error, xmlel()}. + validate_parentage(_Key, _Owners, []) -> true; validate_parentage(Key, Owners, [[] | T]) -> diff --git a/src/pubsub_subscription.erl b/src/pubsub_subscription.erl index f990f6e38..3ab502184 100644 --- a/src/pubsub_subscription.erl +++ b/src/pubsub_subscription.erl @@ -152,13 +152,9 @@ create_table() -> Other -> Other end. --spec(add_subscription/3 :: - ( - _JID :: ljid(), - _NodeId :: mod_pubsub:nodeIdx(), - Options :: [] | mod_pubsub:subOptions()) - -> SubId :: mod_pubsub:subId() - ). +-spec add_subscription(_JID :: ljid(), _NodeId :: mod_pubsub:nodeIdx(), + Options :: [] | mod_pubsub:subOptions()) -> + SubId :: mod_pubsub:subId(). add_subscription(_JID, _NodeId, []) -> make_subid(); add_subscription(_JID, _NodeId, Options) -> @@ -166,25 +162,13 @@ add_subscription(_JID, _NodeId, Options) -> mnesia:write(#pubsub_subscription{subid = SubID, options = Options}), SubID. --spec(delete_subscription/3 :: - ( - _JID :: _, - _NodeId :: _, - SubId :: mod_pubsub:subId()) - -> ok - ). +-spec delete_subscription(_JID :: _, _NodeId :: _, SubId :: mod_pubsub:subId()) -> ok. delete_subscription(_JID, _NodeId, SubID) -> mnesia:delete({pubsub_subscription, SubID}). --spec(read_subscription/3 :: - ( - _JID :: ljid(), - _NodeId :: _, - SubID :: mod_pubsub:subId()) - -> mod_pubsub:pubsubSubscription() - | {error, notfound} - ). +-spec read_subscription(_JID :: ljid(), _NodeId :: _, SubID :: mod_pubsub:subId()) -> + mod_pubsub:pubsubSubscription() | {error, notfound}. read_subscription(_JID, _NodeId, SubID) -> case mnesia:read({pubsub_subscription, SubID}) of @@ -192,19 +176,13 @@ read_subscription(_JID, _NodeId, SubID) -> _ -> {error, notfound} end. --spec(write_subscription/4 :: - ( - _JID :: ljid(), - _NodeId :: _, - SubID :: mod_pubsub:subId(), - Options :: mod_pubsub:subOptions()) - -> ok - ). +-spec write_subscription(_JID :: ljid(), _NodeId :: _, SubID :: mod_pubsub:subId(), + Options :: mod_pubsub:subOptions()) -> ok. write_subscription(_JID, _NodeId, SubID, Options) -> mnesia:write(#pubsub_subscription{subid = SubID, options = Options}). --spec(make_subid/0 :: () -> SubId::mod_pubsub:subId()). +-spec make_subid() -> SubId::mod_pubsub:subId(). make_subid() -> {T1, T2, T3} = p1_time_compat:timestamp(), iolist_to_binary(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3])). @@ -272,13 +250,8 @@ xopt_to_bool(Option, _) -> ErrTxt = iolist_to_binary(io_lib:format(Txt, [Option])), {error, ?ERRT_NOT_ACCEPTABLE(?MYLANG, ErrTxt)}. --spec(get_option_xfield/3 :: - ( - Lang :: binary(), - Key :: atom(), - Options :: mod_pubsub:subOptions()) - -> xmlel() - ). +-spec get_option_xfield(Lang :: binary(), Key :: atom(), + Options :: mod_pubsub:subOptions()) -> xmlel(). %% Return a field for an XForm for Key, with data filled in, if %% applicable, from Options. diff --git a/src/pubsub_subscription_sql.erl b/src/pubsub_subscription_sql.erl index 1f82aa008..6e598320c 100644 --- a/src/pubsub_subscription_sql.erl +++ b/src/pubsub_subscription_sql.erl @@ -73,54 +73,34 @@ init() -> ok = create_table(). --spec(subscribe_node/3 :: - ( - _JID :: _, - _NodeId :: _, - Options :: [] | mod_pubsub:subOptions()) - -> {result, mod_pubsub:subId()} - ). +-spec subscribe_node(_JID :: _, _NodeId :: _, Options :: [] | mod_pubsub:subOptions()) -> + {result, mod_pubsub:subId()}. + subscribe_node(_JID, _NodeId, Options) -> SubID = make_subid(), (?DB_MOD):add_subscription(#pubsub_subscription{subid = SubID, options = Options}), {result, SubID}. --spec(unsubscribe_node/3 :: - ( - _JID :: _, - _NodeId :: _, - SubID :: mod_pubsub:subId()) - -> {result, mod_pubsub:subscription()} - | {error, notfound} - ). +-spec unsubscribe_node(_JID :: _, _NodeId :: _, SubID :: mod_pubsub:subId()) -> + {result, mod_pubsub:subscription()} | {error, notfound}. + unsubscribe_node(_JID, _NodeId, SubID) -> case (?DB_MOD):read_subscription(SubID) of {ok, Sub} -> (?DB_MOD):delete_subscription(SubID), {result, Sub}; notfound -> {error, notfound} end. --spec(get_subscription/3 :: - ( - _JID :: _, - _NodeId :: _, - SubId :: mod_pubsub:subId()) - -> {result, mod_pubsub:subscription()} - | {error, notfound} - ). +-spec get_subscription(_JID :: _, _NodeId :: _, SubId :: mod_pubsub:subId()) -> + {result, mod_pubsub:subscription()} | {error, notfound}. + get_subscription(_JID, _NodeId, SubID) -> case (?DB_MOD):read_subscription(SubID) of {ok, Sub} -> {result, Sub}; notfound -> {error, notfound} end. --spec(set_subscription/4 :: - ( - _JID :: _, - _NodeId :: _, - SubId :: mod_pubsub:subId(), - Options :: mod_pubsub:subOptions()) - -> {result, ok} - ). +-spec set_subscription(_JID :: _, _NodeId :: _, SubId :: mod_pubsub:subId(), + Options :: mod_pubsub:subOptions()) -> {result, ok}. set_subscription(_JID, _NodeId, SubID, Options) -> case (?DB_MOD):read_subscription(SubID) of {ok, _} -> @@ -167,7 +147,7 @@ parse_options_xform(XFields) -> %%==================================================================== create_table() -> ok. --spec(make_subid/0 :: () -> mod_pubsub:subId()). +-spec make_subid() -> mod_pubsub:subId(). make_subid() -> {T1, T2, T3} = p1_time_compat:timestamp(), iolist_to_binary(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3])).