mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-22 16:20:52 +01:00
Port to latest exmpp changes (attribute names as binary()).
All atributes are now binary() instead of atoms.
This commit is contained in:
parent
f9e2466867
commit
ef572c815f
@ -43,9 +43,9 @@ parse_request(#iq{type = Type, ns = NS, payload = SubEl, lang = Lang}) ->
|
||||
case {Type, NS} of
|
||||
{set, ?NS_ADHOC} ->
|
||||
?DEBUG("entering parse_request...", []),
|
||||
Node = exmpp_xml:get_attribute_as_list(SubEl, 'node', ""),
|
||||
SessionID = exmpp_xml:get_attribute_as_list(SubEl, 'sessionid', ""),
|
||||
Action = exmpp_xml:get_attribute_as_list(SubEl, 'action', ""),
|
||||
Node = exmpp_xml:get_attribute_as_list(SubEl, <<"node">>, ""),
|
||||
SessionID = exmpp_xml:get_attribute_as_list(SubEl, <<"sessionid">>, ""),
|
||||
Action = exmpp_xml:get_attribute_as_list(SubEl, <<"action">>, ""),
|
||||
XData = find_xdata_el(SubEl),
|
||||
AllEls = exmpp_xml:get_child_elements(SubEl),
|
||||
Others = case XData of
|
||||
@ -114,7 +114,7 @@ produce_response(#adhoc_response{lang = _Lang,
|
||||
"" ->
|
||||
ActionsElAttrs = [];
|
||||
_ ->
|
||||
ActionsElAttrs = [?XMLATTR('execute', DefaultAction)]
|
||||
ActionsElAttrs = [?XMLATTR(<<"execute">>, DefaultAction)]
|
||||
end,
|
||||
ActionsEls = [#xmlel{ns = ?NS_ADHOC, name = 'actions', attrs =
|
||||
ActionsElAttrs, children =
|
||||
@ -122,11 +122,11 @@ produce_response(#adhoc_response{lang = _Lang,
|
||||
end,
|
||||
NotesEls = lists:map(fun({Type, Text}) ->
|
||||
#xmlel{ns = ?NS_ADHOC, name = 'note', attrs =
|
||||
[?XMLATTR('type', Type)],
|
||||
[?XMLATTR(<<"type">>, Type)],
|
||||
children = [#xmlcdata{cdata = list_to_binary(Text)}]}
|
||||
end, Notes),
|
||||
#xmlel{ns = ?NS_ADHOC, name = 'command', attrs =
|
||||
[?XMLATTR('sessionid', SessionID),
|
||||
?XMLATTR('node', Node),
|
||||
?XMLATTR('status', Status)], children =
|
||||
[?XMLATTR(<<"sessionid">>, SessionID),
|
||||
?XMLATTR(<<"node">>, Node),
|
||||
?XMLATTR(<<"status">>, Status)], children =
|
||||
ActionsEls ++ NotesEls ++ Elements}.
|
||||
|
@ -1256,17 +1256,17 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
|
||||
?DEBUG("broadcast~n~p~n", [Packet#xmlel.children]),
|
||||
case Packet#xmlel.ns of
|
||||
roster_item ->
|
||||
IJID = exmpp_jid:make(exmpp_xml:get_attribute(Packet, u, <<"">>),
|
||||
exmpp_xml:get_attribute(Packet, s, <<"">>),
|
||||
exmpp_xml:get_attribute(Packet, r, <<"">>)),
|
||||
ISubscription = exmpp_xml:get_attribute(Packet, subs, <<"none">>),
|
||||
IJID = exmpp_jid:make(exmpp_xml:get_attribute(Packet, <<"u">>, <<"">>),
|
||||
exmpp_xml:get_attribute(Packet, <<"s">>, <<"">>),
|
||||
exmpp_xml:get_attribute(Packet, <<"r">>, <<"">>)),
|
||||
ISubscription = exmpp_xml:get_attribute(Packet, <<"subs">>, <<"none">>),
|
||||
{false, Attrs,
|
||||
roster_change(IJID, ISubscription, StateData)};
|
||||
exit ->
|
||||
Reason = exmpp_xml:get_attribute_as_list(Packet, reason, "Unknown reason"),
|
||||
Reason = exmpp_xml:get_attribute_as_list(Packet, <<"reason">>, "Unknown reason"),
|
||||
{exit, Attrs, Reason};
|
||||
privacy_list ->
|
||||
PrivListName = exmpp_xml:get_attribute_as_list(Packet, list_name, "Unknown list name"),
|
||||
PrivListName = exmpp_xml:get_attribute_as_list(Packet, <<"list_name">>, "Unknown list name"),
|
||||
CDataString = exmpp_xml:get_cdata_as_list(Packet),
|
||||
{ok, A2, _} = erl_scan:string(CDataString),
|
||||
{_, W} = erl_parse:parse_exprs(A2),
|
||||
@ -1516,22 +1516,22 @@ send_header(StateData, Server, Version, Lang)
|
||||
VersionAttr =
|
||||
case Version of
|
||||
"" -> [];
|
||||
_ -> [{"version", Version}]
|
||||
_ -> [?XMLATTR(<<"version">>, Version)]
|
||||
end,
|
||||
LangAttr =
|
||||
case Lang of
|
||||
"" -> [];
|
||||
_ -> [{"xml:lang", Lang}]
|
||||
_ -> [?XMLATTR(<<"xml:lang">>, Lang)]
|
||||
end,
|
||||
Header =
|
||||
{xmlstreamstart,
|
||||
"stream:stream",
|
||||
VersionAttr ++
|
||||
LangAttr ++
|
||||
[{"xmlns", "jabber:client"},
|
||||
{"xmlns:stream", "http://etherx.jabber.org/streams"},
|
||||
{"id", StateData#state.streamid},
|
||||
{"from", Server}]},
|
||||
[?XMLATTR(<<"xmlns">>, "jabber:client"),
|
||||
?XMLATTR(<<"xmlns:stream">>, "http://etherx.jabber.org/streams"),
|
||||
?XMLATTR(<<"id">>, StateData#state.streamid),
|
||||
?XMLATTR(<<"from">>, Server)]},
|
||||
(StateData#state.sockmod):send_xml(
|
||||
StateData#state.socket, Header);
|
||||
send_header(StateData, Server, Version, Lang) ->
|
||||
|
@ -64,10 +64,10 @@
|
||||
-define(VFIELD(Type, Var, Value),
|
||||
#xmlel{name = 'field',
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
value = Type
|
||||
},
|
||||
#xmlattr{name = 'var',
|
||||
#xmlattr{name = <<"var">>,
|
||||
value = Var
|
||||
}
|
||||
],
|
||||
@ -111,13 +111,13 @@ create_captcha(SID, From, To, Lang, Args)
|
||||
name = 'data',
|
||||
ns = ?NS_BOB,
|
||||
attrs = [
|
||||
#xmlattr{name = 'cid',
|
||||
#xmlattr{name = <<"cid">>,
|
||||
value = CID
|
||||
},
|
||||
#xmlattr{name = 'max-age',
|
||||
#xmlattr{name = <<"max-age">>,
|
||||
value = <<"0">>
|
||||
},
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
value = Type
|
||||
}
|
||||
],
|
||||
@ -142,7 +142,7 @@ create_captcha(SID, From, To, Lang, Args)
|
||||
#xmlel{name = 'x',
|
||||
ns = ?NS_DATA_FORMS_s,
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
value = <<"form">>
|
||||
}
|
||||
],
|
||||
@ -153,10 +153,10 @@ create_captcha(SID, From, To, Lang, Args)
|
||||
?VFIELD(<<"hidden">>, <<"sid">>, #xmlcdata{cdata = SID}),
|
||||
#xmlel{name = 'field',
|
||||
attrs = [
|
||||
#xmlattr{name = 'var',
|
||||
#xmlattr{name = <<"var">>,
|
||||
value = <<"ocr">>
|
||||
},
|
||||
#xmlattr{name = 'label',
|
||||
#xmlattr{name = <<"label">>,
|
||||
value = ?CAPTCHA_TEXT(Lang)
|
||||
}
|
||||
],
|
||||
@ -167,7 +167,7 @@ create_captcha(SID, From, To, Lang, Args)
|
||||
children = [
|
||||
#xmlel{name = 'uri',
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
value = Type
|
||||
}
|
||||
],
|
||||
@ -229,13 +229,13 @@ create_captcha_x(SID, To, Lang, HeadEls, TailEls) ->
|
||||
name = 'data',
|
||||
ns = ?NS_BOB,
|
||||
attrs = [
|
||||
#xmlattr{name = 'cid',
|
||||
#xmlattr{name = <<"cid">>,
|
||||
value = CID
|
||||
},
|
||||
#xmlattr{name = 'max-age',
|
||||
#xmlattr{name = <<"max-age">>,
|
||||
value = <<"0">>
|
||||
},
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
value = Type
|
||||
}
|
||||
],
|
||||
@ -249,25 +249,25 @@ create_captcha_x(SID, To, Lang, HeadEls, TailEls) ->
|
||||
#xmlel{name = 'x',
|
||||
ns = ?NS_DATA_FORMS_s,
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
value = <<"form">>
|
||||
}
|
||||
],
|
||||
children = [
|
||||
?VFIELD(<<"hidden">>, <<"FORM_TYPE">>, #xmlcdata{cdata = ?NS_CAPTCHA_b}) | HeadEls] ++ [
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"fixed">>), ?XMLATTR('label', HelpTxt)]},
|
||||
[?XMLATTR(<<"type">>, <<"fixed">>), ?XMLATTR(<<"label">>, HelpTxt)]},
|
||||
?VFIELD(<<"hidden">>, <<"captchahidden">>, #xmlcdata{cdata = <<"workaround-for-psi">>}),
|
||||
|
||||
#xmlel{name = 'field',
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
value = <<"text-single">>
|
||||
},
|
||||
#xmlattr{name = 'label',
|
||||
#xmlattr{name = <<"label">>,
|
||||
value = list_to_binary(translate:translate(Lang, "CAPTCHA web page"))
|
||||
},
|
||||
#xmlattr{name = 'var',
|
||||
#xmlattr{name = <<"var">>,
|
||||
value = <<"url">>
|
||||
}
|
||||
],
|
||||
@ -281,10 +281,10 @@ create_captcha_x(SID, To, Lang, HeadEls, TailEls) ->
|
||||
?VFIELD(<<"hidden">>, <<"sid">>, #xmlcdata{cdata = SID}),
|
||||
#xmlel{name = 'field',
|
||||
attrs = [
|
||||
#xmlattr{name = 'var',
|
||||
#xmlattr{name = <<"var">>,
|
||||
value = <<"ocr">>
|
||||
},
|
||||
#xmlattr{name = 'label',
|
||||
#xmlattr{name = <<"label">>,
|
||||
value = ?CAPTCHA_TEXT(Lang)
|
||||
}
|
||||
],
|
||||
@ -295,7 +295,7 @@ create_captcha_x(SID, To, Lang, HeadEls, TailEls) ->
|
||||
children = [
|
||||
#xmlel{name = 'uri',
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
value = Type
|
||||
}
|
||||
],
|
||||
@ -329,7 +329,7 @@ build_captcha_html(Id, Lang) ->
|
||||
ImgEl =
|
||||
#xmlel{name = 'img',
|
||||
attrs = [
|
||||
#xmlattr{name = 'src',
|
||||
#xmlattr{name = <<"src">>,
|
||||
value = list_to_binary(get_url(Id ++ "/image"))
|
||||
}
|
||||
]
|
||||
@ -342,13 +342,13 @@ build_captcha_html(Id, Lang) ->
|
||||
IdEl =
|
||||
#xmlel{name = 'input',
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
value = <<"hidden">>
|
||||
},
|
||||
#xmlattr{name = 'name',
|
||||
#xmlattr{name = <<"name">>,
|
||||
value = <<"id">>
|
||||
},
|
||||
#xmlattr{name = 'value',
|
||||
#xmlattr{name = <<"value">>,
|
||||
value = list_to_binary(Id)
|
||||
}
|
||||
]
|
||||
@ -359,13 +359,13 @@ build_captcha_html(Id, Lang) ->
|
||||
KeyEl =
|
||||
#xmlel{name = 'input',
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
value = <<"text">>
|
||||
},
|
||||
#xmlattr{name = 'name',
|
||||
#xmlattr{name = <<"name">>,
|
||||
value = <<"key">>
|
||||
},
|
||||
#xmlattr{name = 'size',
|
||||
#xmlattr{name = <<"size">>,
|
||||
value = <<"10">>
|
||||
}
|
||||
]
|
||||
@ -387,13 +387,13 @@ build_captcha_html(Id, Lang) ->
|
||||
FormEl =
|
||||
#xmlel{name = 'form',
|
||||
attrs = [
|
||||
#xmlattr{name = 'action',
|
||||
#xmlattr{name = <<"action">>,
|
||||
value = list_to_binary(get_url(Id))
|
||||
},
|
||||
#xmlattr{name = 'name',
|
||||
#xmlattr{name = <<"name">>,
|
||||
value = <<"captcha">>
|
||||
},
|
||||
#xmlattr{name = 'method',
|
||||
#xmlattr{name = <<"method">>,
|
||||
value = <<"POST">>
|
||||
}
|
||||
],
|
||||
@ -410,13 +410,13 @@ build_captcha_html(Id, Lang) ->
|
||||
},
|
||||
#xmlel{name = 'input',
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
value = <<"submit">>
|
||||
},
|
||||
#xmlattr{name = 'name',
|
||||
#xmlattr{name = <<"name">>,
|
||||
value = <<"enter">>
|
||||
},
|
||||
#xmlattr{name = 'value',
|
||||
#xmlattr{name = <<"value">>,
|
||||
value = <<"OK">>
|
||||
}
|
||||
]
|
||||
@ -481,7 +481,7 @@ process(_Handlers, #request{method='GET', lang=Lang, path=[_, Id]}) ->
|
||||
%[FormEl]},
|
||||
#xmlel{name = 'div',
|
||||
attrs = [
|
||||
#xmlattr{name = 'align',
|
||||
#xmlattr{name = <<"align">>,
|
||||
value = <<"center">>
|
||||
}
|
||||
],
|
||||
|
@ -123,13 +123,13 @@ process_element(El=#xmlel{name=user, ns=_XMLNS},
|
||||
State;
|
||||
|
||||
process_element(H=#xmlel{name=host},State) ->
|
||||
State#parsing_state{host=exmpp_xml:get_attribute(H,"jid",none)};
|
||||
State#parsing_state{host=exmpp_xml:get_attribute(H,<<"jid">>,none)};
|
||||
|
||||
process_element(#xmlel{name='server-data'},State) ->
|
||||
State;
|
||||
|
||||
process_element(El=#xmlel{name=include, ns=?NS_XINCLUDE}, State=#parsing_state{dir=Dir}) ->
|
||||
case exmpp_xml:get_attribute(El, href, none) of
|
||||
case exmpp_xml:get_attribute(El, <<"href">>, none) of
|
||||
none ->
|
||||
ok;
|
||||
HrefB ->
|
||||
@ -158,8 +158,8 @@ process_element(El,State) ->
|
||||
%%%% Add user
|
||||
|
||||
add_user(El, Domain) ->
|
||||
User = exmpp_xml:get_attribute(El,name,none),
|
||||
Password = exmpp_xml:get_attribute(El,password,none),
|
||||
User = exmpp_xml:get_attribute(El,<<"name">>,none),
|
||||
Password = exmpp_xml:get_attribute(El,<<"password">>,none),
|
||||
add_user(El, Domain, User, Password).
|
||||
|
||||
%% @spec (El::xmlel(), Domain::string(), User::string(), Password::string())
|
||||
@ -301,7 +301,7 @@ populate_user(User,Domain,El=#xmlel{name='offline-messages'}) ->
|
||||
fun (_Element, {xmlcdata, _}) ->
|
||||
ok;
|
||||
(_Element, Child) ->
|
||||
From = exmpp_xml:get_attribute(Child,from,none),
|
||||
From = exmpp_xml:get_attribute(Child,<<"from">>,none),
|
||||
FullFrom = exmpp_jid:parse(From),
|
||||
FullUser = exmpp_jid:make(User, Domain),
|
||||
_R = M:store_packet(FullFrom, FullUser, Child)
|
||||
@ -558,7 +558,7 @@ mnesia_pop_offline_messages(Ls, User, Server) ->
|
||||
fun(R) ->
|
||||
[Packet] = exmpp_xml:parse_document(R#offline_msg.packet, [names_as_atom]),
|
||||
FromString = exmpp_jid:prep_to_list(R#offline_msg.from),
|
||||
Packet2 = exmpp_xml:set_attribute(Packet, "from", FromString),
|
||||
Packet2 = exmpp_xml:set_attribute(Packet, <<"from">>, FromString),
|
||||
Packet3 = Packet2#xmlel{ns = ?NS_JABBER_CLIENT},
|
||||
exmpp_xml:append_children(
|
||||
Packet3,
|
||||
|
@ -443,7 +443,6 @@ new_xmlstream(C2SPid, MaxStanzaSize) ->
|
||||
Parser = exmpp_xml:start_parser([{names_as_atom, true},
|
||||
{check_nss, xmpp},
|
||||
{check_elems, xmpp},
|
||||
{check_attrs, xmpp},
|
||||
{max_size, MaxStanzaSize}
|
||||
]),
|
||||
exmpp_xmlstream:start({gen_fsm, C2SPid}, Parser,
|
||||
|
@ -370,9 +370,9 @@ code_change(_OldVsn, State, _Extra) ->
|
||||
%%% Internal functions
|
||||
%%--------------------------------------------------------------------
|
||||
route_check_id(From, To, #xmlel{name = iq} = Packet) ->
|
||||
case exmpp_xml:get_attribute_as_list(Packet, 'id', "") of
|
||||
case exmpp_xml:get_attribute_as_list(Packet, <<"id">>, "") of
|
||||
?ROUTE_PREFIX ++ Rest ->
|
||||
Type = exmpp_xml:get_attribute_as_list(Packet, 'type', ""),
|
||||
Type = exmpp_xml:get_attribute_as_list(Packet, <<"type">>, ""),
|
||||
if Type == "error"; Type == "result" ->
|
||||
case string:tokens(Rest, "-") of
|
||||
[_, NodeID] ->
|
||||
|
@ -155,7 +155,7 @@ disconnect_removed_user(User, Server) ->
|
||||
exmpp_jid:make(User,
|
||||
Server),
|
||||
#xmlel{name = 'broadcast', ns = exit,
|
||||
attrs = [exmpp_xml:attribute(reason, "User removed")]}).
|
||||
attrs = [?XMLATTR(<<"reason">>, <<"User removed">>)]}).
|
||||
|
||||
get_user_resources(User, Server)
|
||||
when is_binary(User), is_binary(Server) ->
|
||||
|
@ -127,7 +127,7 @@ xdb_data(User, Server, #xmlel{ns = NS} = El) ->
|
||||
catch mod_roster:set_items(UserB, ServerB, El),
|
||||
ok;
|
||||
?NS_LAST_ACTIVITY ->
|
||||
TimeStamp = exmpp_xml:get_attribute_as_list(El, 'last', ""),
|
||||
TimeStamp = exmpp_xml:get_attribute_as_list(El, <<"last">>, ""),
|
||||
Status = exmpp_xml:get_cdata(El),
|
||||
catch mod_last:store_last_info(
|
||||
UserB,
|
||||
@ -145,7 +145,7 @@ xdb_data(User, Server, #xmlel{ns = NS} = El) ->
|
||||
process_offline(Server, From, El),
|
||||
ok;
|
||||
XMLNS ->
|
||||
case exmpp_xml:get_attribute_as_list(El, "j_private_flag", "") of
|
||||
case exmpp_xml:get_attribute_as_list(El, <<"j_private_flag">>, "") of
|
||||
"1" ->
|
||||
catch mod_private:process_sm_iq(
|
||||
From,
|
||||
|
12
src/jlib.erl
12
src/jlib.erl
@ -57,7 +57,7 @@
|
||||
%% R = binary().
|
||||
|
||||
parse_xdata_submit(#xmlel{attrs = Attrs, children = Els}) ->
|
||||
case exmpp_xml:get_attribute_from_list_as_list(Attrs, 'type', "") of
|
||||
case exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"type">>, "") of
|
||||
"submit" ->
|
||||
lists:reverse(parse_xdata_fields(Els, []));
|
||||
"form" -> %% This is a workaround to accept Psi's wrong forms
|
||||
@ -70,7 +70,7 @@ parse_xdata_fields([], Res) ->
|
||||
Res;
|
||||
parse_xdata_fields([#xmlel{name = 'field', attrs = Attrs, children = SubEls} |
|
||||
Els], Res) ->
|
||||
case exmpp_xml:get_attribute_from_list_as_list(Attrs, 'var', "") of
|
||||
case exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"var">>, "") of
|
||||
"" ->
|
||||
parse_xdata_fields(Els, Res);
|
||||
Var ->
|
||||
@ -140,7 +140,7 @@ rsm_encode_first(undefined, undefined, Arr) ->
|
||||
rsm_encode_first(First, undefined, Arr) ->
|
||||
[#xmlel{ns = ?NS_RSM, name = 'first', children = [#xmlcdata{cdata = list_to_binary(First)}]}|Arr];
|
||||
rsm_encode_first(First, Index, Arr) ->
|
||||
[#xmlel{ns = ?NS_RSM, name = 'first', attrs = [?XMLATTR('index', Index)], children = [#xmlcdata{cdata = list_to_binary(First)}]}|Arr].
|
||||
[#xmlel{ns = ?NS_RSM, name = 'first', attrs = [?XMLATTR(<<"index">>, Index)], children = [#xmlcdata{cdata = list_to_binary(First)}]}|Arr].
|
||||
|
||||
rsm_encode_last(undefined, Arr) -> Arr;
|
||||
rsm_encode_last(Last, Arr) ->
|
||||
@ -182,8 +182,8 @@ timestamp_to_xml(DateTime, Timezone, FromJID, Desc) ->
|
||||
{T_string, Tz_string} = timestamp_to_iso(DateTime, Timezone),
|
||||
From = exmpp_jid:to_list(FromJID),
|
||||
P1 = exmpp_xml:set_attributes(#xmlel{ns = ?NS_DELAY, name = 'delay'},
|
||||
[{'from', From},
|
||||
{'stamp', T_string ++ Tz_string}]),
|
||||
[{<<"from">>, From},
|
||||
{<<"stamp">>, T_string ++ Tz_string}]),
|
||||
exmpp_xml:set_cdata(P1, Desc).
|
||||
|
||||
%% TODO: Remove this function once XEP-0091 is Obsolete
|
||||
@ -192,7 +192,7 @@ timestamp_to_xml({{Year, Month, Day}, {Hour, Minute, Second}}) ->
|
||||
io_lib:format("~4..0w~2..0w~2..0wT~2..0w:~2..0w:~2..0w",
|
||||
[Year, Month, Day, Hour, Minute, Second])),
|
||||
exmpp_xml:set_attribute(#xmlel{ns = ?NS_DELAY_OLD, name = 'x'},
|
||||
'stamp', Timestamp).
|
||||
<<"stamp">>, Timestamp).
|
||||
|
||||
now_to_utc_string({MegaSecs, Secs, MicroSecs}) ->
|
||||
{{Year, Month, Day}, {Hour, Minute, Second}} =
|
||||
|
@ -95,9 +95,9 @@ get_local_commands(Acc, _From, To, <<>>, Lang) ->
|
||||
end,
|
||||
Nodes = [#xmlel{ns = ?NS_DISCO_ITEMS,
|
||||
name = 'item', attrs =
|
||||
[?XMLATTR('jid', Server),
|
||||
?XMLATTR('node', ?NS_ADHOC_s),
|
||||
?XMLATTR('name', translate:translate(Lang, "Commands"))]
|
||||
[?XMLATTR(<<"jid">>, Server),
|
||||
?XMLATTR(<<"node">>, ?NS_ADHOC_s),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang, "Commands"))]
|
||||
}],
|
||||
{result, Items ++ Nodes}
|
||||
end;
|
||||
@ -126,9 +126,9 @@ get_sm_commands(Acc, _From, To, <<>>, Lang) ->
|
||||
end,
|
||||
Nodes = [#xmlel{ns = ?NS_DISCO_ITEMS,
|
||||
name = 'item', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(To)),
|
||||
?XMLATTR('node', ?NS_ADHOC_s),
|
||||
?XMLATTR('name', translate:translate(Lang, "Commands"))]
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(To)),
|
||||
?XMLATTR(<<"node">>, ?NS_ADHOC_s),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang, "Commands"))]
|
||||
}],
|
||||
{result, Items ++ Nodes}
|
||||
end;
|
||||
@ -144,15 +144,15 @@ get_sm_commands(Acc, _From, _To, _Node, _Lang) ->
|
||||
%% On disco info request to the ad-hoc node, return automation/command-list.
|
||||
get_local_identity(Acc, _From, _To, ?NS_ADHOC_b, Lang) ->
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
|
||||
[?XMLATTR('category', <<"automation">>),
|
||||
?XMLATTR('type', <<"command-list">>),
|
||||
?XMLATTR('name', translate:translate(Lang, "Commands"))]} | Acc];
|
||||
[?XMLATTR(<<"category">>, <<"automation">>),
|
||||
?XMLATTR(<<"type">>, <<"command-list">>),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang, "Commands"))]} | Acc];
|
||||
|
||||
get_local_identity(Acc, _From, _To, <<"ping">>, Lang) ->
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
|
||||
[?XMLATTR('category', <<"automation">>),
|
||||
?XMLATTR('type', <<"command-node">>),
|
||||
?XMLATTR('name', translate:translate(Lang, "Ping"))]} | Acc];
|
||||
[?XMLATTR(<<"category">>, <<"automation">>),
|
||||
?XMLATTR(<<"type">>, <<"command-node">>),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang, "Ping"))]} | Acc];
|
||||
|
||||
get_local_identity(Acc, _From, _To, _Node, _Lang) ->
|
||||
Acc.
|
||||
@ -162,9 +162,9 @@ get_local_identity(Acc, _From, _To, _Node, _Lang) ->
|
||||
%% On disco info request to the ad-hoc node, return automation/command-list.
|
||||
get_sm_identity(Acc, _From, _To, ?NS_ADHOC_s, Lang) ->
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
|
||||
[?XMLATTR('category', <<"automation">>),
|
||||
?XMLATTR('type', <<"command-list">>),
|
||||
?XMLATTR('name', translate:translate(Lang, "Commands"))]} | Acc];
|
||||
[?XMLATTR(<<"category">>, <<"automation">>),
|
||||
?XMLATTR(<<"type">>, <<"command-list">>),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang, "Commands"))]} | Acc];
|
||||
|
||||
get_sm_identity(Acc, _From, _To, _Node, _Lang) ->
|
||||
Acc.
|
||||
@ -244,9 +244,9 @@ ping_item(Acc, _From, To, Lang) ->
|
||||
[]
|
||||
end,
|
||||
Nodes = [#xmlel{ns = ?NS_DISCO_INFO, name = 'item', attrs =
|
||||
[?XMLATTR('jid', Server),
|
||||
?XMLATTR('node', <<"ping">>),
|
||||
?XMLATTR('name', translate:translate(Lang, "Ping"))]}],
|
||||
[?XMLATTR(<<"jid">>, Server),
|
||||
?XMLATTR(<<"node">>, <<"ping">>),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang, "Ping"))]}],
|
||||
{result, Items ++ Nodes}.
|
||||
|
||||
|
||||
|
@ -178,9 +178,9 @@ announce(From, To, Packet) ->
|
||||
%% Announcing via ad-hoc commands
|
||||
-define(INFO_COMMAND(Lang, Node),
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
|
||||
[?XMLATTR('category', <<"automation">>),
|
||||
?XMLATTR('type', <<"command-node">>),
|
||||
?XMLATTR('name', get_title(Lang, Node))]}]).
|
||||
[?XMLATTR(<<"category">>, <<"automation">>),
|
||||
?XMLATTR(<<"type">>, <<"command-node">>),
|
||||
?XMLATTR(<<"name">>, get_title(Lang, Node))]}]).
|
||||
|
||||
disco_identity(Acc, _From, _To, Node, Lang) ->
|
||||
LNode = tokenize(binary_to_list(Node)),
|
||||
@ -276,9 +276,9 @@ disco_features(Acc, From, To, Node, _Lang) ->
|
||||
|
||||
-define(NODE_TO_ITEM(Lang, Server, Node),
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', Server),
|
||||
?XMLATTR('node', Node),
|
||||
?XMLATTR('name', get_title(Lang, Node))]}).
|
||||
[?XMLATTR(<<"jid">>, Server),
|
||||
?XMLATTR(<<"node">>, Node),
|
||||
?XMLATTR(<<"name">>, get_title(Lang, Node))]}).
|
||||
|
||||
-define(ITEMS_RESULT(Allow, Items),
|
||||
case Allow of
|
||||
@ -487,8 +487,8 @@ announce_commands(From, To,
|
||||
_ -> [?VVALUE(Val)]
|
||||
end).
|
||||
-define(TVFIELD(Type, Var, Val),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('var', Var)], children =
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"var">>, Var)], children =
|
||||
?VVALUEL(Val)}).
|
||||
-define(HFIELD(), ?TVFIELD(<<"hidden">>, <<"FORM_TYPE">>, list_to_binary(?NS_ADMIN_s))).
|
||||
|
||||
@ -501,28 +501,28 @@ generate_adhoc_form(Lang, Node, ServerHost) ->
|
||||
{[], []}
|
||||
end,
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
|
||||
[?XMLATTR('type', <<"form">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
[?HFIELD(),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children = [#xmlcdata{cdata = list_to_binary(get_title(Lang, Node))}]}]
|
||||
++
|
||||
if (LNode == ?NS_ADMINL("delete-motd"))
|
||||
or (LNode == ?NS_ADMINL("delete-motd-allhosts")) ->
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"confirm">>),
|
||||
?XMLATTR('type', <<"boolean">>),
|
||||
?XMLATTR('label', translate:translate(Lang, "Really delete message of the day?"))], children =
|
||||
[?XMLATTR(<<"var">>, <<"confirm">>),
|
||||
?XMLATTR(<<"type">>, <<"boolean">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, "Really delete message of the day?"))], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
[#xmlcdata{cdata = <<"true">>}]}]}];
|
||||
true ->
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"subject">>),
|
||||
?XMLATTR('type', <<"text-single">>),
|
||||
?XMLATTR('label', translate:translate(Lang, "Subject"))], children =
|
||||
[?XMLATTR(<<"var">>, <<"subject">>),
|
||||
?XMLATTR(<<"type">>, <<"text-single">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, "Subject"))], children =
|
||||
?VVALUEL(list_to_binary(OldSubject))},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"body">>),
|
||||
?XMLATTR('type', <<"text-multi">>),
|
||||
?XMLATTR('label', translate:translate(Lang, "Message body"))], children =
|
||||
[?XMLATTR(<<"var">>, <<"body">>),
|
||||
?XMLATTR(<<"type">>, <<"text-multi">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, "Message body"))], children =
|
||||
?VVALUEL(list_to_binary(OldBody))}]
|
||||
end}.
|
||||
|
||||
@ -568,7 +568,7 @@ handle_adhoc_form(From, To,
|
||||
node = Node,
|
||||
sessionid = SessionID,
|
||||
status = completed},
|
||||
Packet = #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', attrs = [?XMLATTR('type', <<"normal">>)], children =
|
||||
Packet = #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', attrs = [?XMLATTR(<<"type">>, <<"normal">>)], children =
|
||||
if Subject /= [] ->
|
||||
[#xmlel{ns = ?NS_JABBER_CLIENT, name = 'subject', children =
|
||||
[#xmlcdata{cdata = list_to_binary(Subject)}]}];
|
||||
@ -870,7 +870,7 @@ send_announcement_to_all(Host, SubjectS, BodyS) ->
|
||||
true ->
|
||||
[]
|
||||
end,
|
||||
Packet = #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', attrs = [?XMLATTR('type', <<"normal">>)], children = SubjectEls ++ BodyEls},
|
||||
Packet = #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', attrs = [?XMLATTR(<<"type">>, <<"normal">>)], children = SubjectEls ++ BodyEls},
|
||||
Sessions = ejabberd_sm:dirty_get_sessions_list(),
|
||||
Local = exmpp_jid:make(Host),
|
||||
lists:foreach(
|
||||
|
@ -116,9 +116,9 @@ get_features(#caps{node = Node, version = Version, exts = Exts}) ->
|
||||
read_caps(Els) ->
|
||||
read_caps(Els, nothing).
|
||||
read_caps([#xmlel{ns = ?NS_CAPS, name = 'c'} = El | Tail], _Result) ->
|
||||
Node = exmpp_xml:get_attribute_as_list(El, 'node', ""),
|
||||
Version = exmpp_xml:get_attribute_as_list(El, 'ver', ""),
|
||||
Exts = string:tokens(exmpp_xml:get_attribute_as_list(El, 'ext', ""), " "),
|
||||
Node = exmpp_xml:get_attribute_as_list(El, <<"node">>, ""),
|
||||
Version = exmpp_xml:get_attribute_as_list(El, <<"ver">>, ""),
|
||||
Exts = string:tokens(exmpp_xml:get_attribute_as_list(El, <<"ext">>, ""), " "),
|
||||
read_caps(Tail, #caps{node = Node, version = Version, exts = Exts});
|
||||
read_caps([#xmlel{ns = ?NS_MUC_USER, name = 'x'} | _Tail], _Result) ->
|
||||
nothing;
|
||||
@ -133,7 +133,7 @@ read_caps([], Result) ->
|
||||
user_send_packet(From, To, #xmlel{name = 'presence', attrs = Attrs, children = Els}) ->
|
||||
case exmpp_jid:bare_compare(From, To) of
|
||||
true ->
|
||||
Type = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'type', ""),
|
||||
Type = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"type">>, ""),
|
||||
if Type == ""; Type == "available" ->
|
||||
case read_caps(Els) of
|
||||
nothing ->
|
||||
@ -158,9 +158,9 @@ caps_stream_features(Acc, MyHost) ->
|
||||
Hash ->
|
||||
[#xmlel{name = c,
|
||||
ns = ?NS_CAPS,
|
||||
attrs = [?XMLATTR(hash, "sha-1"),
|
||||
?XMLATTR(node, ?EJABBERD_URI),
|
||||
?XMLATTR(ver, Hash)]} | Acc]
|
||||
attrs = [?XMLATTR(<<"hash">>, "sha-1"),
|
||||
?XMLATTR(<<"node">>, ?EJABBERD_URI),
|
||||
?XMLATTR(<<"ver">>, Hash)]} | Acc]
|
||||
end.
|
||||
|
||||
disco_features(_Acc, From, To, <<?EJABBERD_URI, $#, _/binary>>, Lang) ->
|
||||
@ -262,7 +262,7 @@ feature_request(Host, From, Caps, [SubNode | Tail] = SubNodes) ->
|
||||
IQ = #iq{type = get,
|
||||
iq_ns = ?NS_JABBER_CLIENT,
|
||||
payload = #xmlel{ns = ?NS_DISCO_INFO, name = 'query',
|
||||
attrs = [?XMLATTR('node', Node ++ "#" ++ SubNode)]}},
|
||||
attrs = [?XMLATTR(<<"node">>, Node ++ "#" ++ SubNode)]}},
|
||||
F = fun(IQReply) ->
|
||||
feature_response(
|
||||
IQReply, Host, From, Caps, SubNodes)
|
||||
@ -279,7 +279,7 @@ feature_response(#iq{type = result, payload = El},
|
||||
Host, From, Caps, [SubNode | SubNodes]) ->
|
||||
Features = lists:flatmap(
|
||||
fun(#xmlel{name = 'feature', attrs = FAttrs}) ->
|
||||
[exmpp_xml:get_attribute_from_list_as_list(FAttrs, 'var', "")];
|
||||
[exmpp_xml:get_attribute_from_list_as_list(FAttrs, <<"var">>, "")];
|
||||
(_) ->
|
||||
[]
|
||||
end, El#xmlel.children),
|
||||
@ -340,10 +340,10 @@ make_my_disco_hash(Host) ->
|
||||
Feats = lists:map(
|
||||
fun({{Feat, _Host}}) ->
|
||||
#xmlel{name = feature,
|
||||
attrs = [?XMLATTR(var, Feat)]};
|
||||
attrs = [?XMLATTR(<<"var">>, Feat)]};
|
||||
(Feat) ->
|
||||
#xmlel{name = feature,
|
||||
attrs = [?XMLATTR(var, Feat)]}
|
||||
attrs = [?XMLATTR(<<"var">>, Feat)]}
|
||||
end, Features),
|
||||
make_disco_hash(Identities ++ Info ++ Feats, sha1);
|
||||
_Err ->
|
||||
@ -360,7 +360,7 @@ concat_features(Els) ->
|
||||
lists:usort(
|
||||
lists:flatmap(
|
||||
fun(#xmlel{name = feature} = El) ->
|
||||
[[exmpp_xml:get_attribute(El, var, <<>>), $<]];
|
||||
[[exmpp_xml:get_attribute(El, <<"var">>, <<>>), $<]];
|
||||
(_) ->
|
||||
[]
|
||||
end, Els)).
|
||||
@ -369,10 +369,10 @@ concat_identities(Els) ->
|
||||
lists:sort(
|
||||
lists:flatmap(
|
||||
fun(#xmlel{name = identity} = El) ->
|
||||
[[exmpp_xml:get_attribute_as_binary(El, category, <<>>), $/,
|
||||
exmpp_xml:get_attribute_as_binary(El, type, <<>>), $/,
|
||||
exmpp_xml:get_attribute_as_binary(El, lang, <<>>), $/,
|
||||
exmpp_xml:get_attribute_as_binary(El, name, <<>>), $<]];
|
||||
[[exmpp_xml:get_attribute_as_binary(El, <<"category">>, <<>>), $/,
|
||||
exmpp_xml:get_attribute_as_binary(El, <<"type">>, <<>>), $/,
|
||||
exmpp_xml:get_attribute_as_binary(El, <<"lang">>, <<>>), $/,
|
||||
exmpp_xml:get_attribute_as_binary(El, <<"name">>, <<>>), $<]];
|
||||
(_) ->
|
||||
[]
|
||||
end, Els)).
|
||||
@ -381,7 +381,7 @@ concat_info(Els) ->
|
||||
lists:sort(
|
||||
lists:flatmap(
|
||||
fun(#xmlel{name = x, ns = ?NS_DATA_FORMS, children = Fields} = El) ->
|
||||
case exmpp_xml:get_attribute_as_list(El, 'type', "") of
|
||||
case exmpp_xml:get_attribute_as_list(El, <<"type">>, "") of
|
||||
"result" ->
|
||||
[concat_xdata_fields(Fields)];
|
||||
_ ->
|
||||
@ -396,7 +396,7 @@ concat_xdata_fields(Fields) ->
|
||||
lists:foldl(
|
||||
fun(#xmlel{name = field, children = Els} = El,
|
||||
[FormType, VarFields] = Acc) ->
|
||||
case exmpp_xml:get_attribute_as_binary(El, var, <<>>) of
|
||||
case exmpp_xml:get_attribute_as_binary(El, <<"var">>, <<>>) of
|
||||
<<>> ->
|
||||
Acc;
|
||||
<<"FORM_TYPE">> ->
|
||||
|
@ -89,24 +89,24 @@ stop(Host) ->
|
||||
|
||||
-define(INFO_IDENTITY(Category, Type, Name, Lang),
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
|
||||
[?XMLATTR('category', Category),
|
||||
?XMLATTR('type', Type),
|
||||
?XMLATTR('name', ?T(Lang, Name))]}]).
|
||||
[?XMLATTR(<<"category">>, Category),
|
||||
?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"name">>, ?T(Lang, Name))]}]).
|
||||
|
||||
-define(INFO_COMMAND(Name, Lang),
|
||||
?INFO_IDENTITY(<<"automation">>, <<"command-node">>, Name, Lang)).
|
||||
|
||||
-define(NODEJID(To, Name, Node),
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(To)),
|
||||
?XMLATTR('name', ?T(Lang, Name)),
|
||||
?XMLATTR('node', Node)]}).
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(To)),
|
||||
?XMLATTR(<<"name">>, ?T(Lang, Name)),
|
||||
?XMLATTR(<<"node">>, Node)]}).
|
||||
|
||||
-define(NODE(Name, Node),
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', Server),
|
||||
?XMLATTR('name', ?T(Lang, Name)),
|
||||
?XMLATTR('node', Node)]}).
|
||||
[?XMLATTR(<<"jid">>, Server),
|
||||
?XMLATTR(<<"name">>, ?T(Lang, Name)),
|
||||
?XMLATTR(<<"node">>, Node)]}).
|
||||
|
||||
-define(NS_ADMINX(Sub), <<?NS_ADMIN_s,"#", Sub/binary>>).
|
||||
-define(NS_ADMINL(Sub), ["http:","jabber.org","protocol","admin", Sub]).
|
||||
@ -277,9 +277,9 @@ adhoc_sm_items(Acc, From, To, Lang) ->
|
||||
empty -> []
|
||||
end,
|
||||
Nodes = [#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(To)),
|
||||
?XMLATTR('name', ?T(Lang, "Configuration")),
|
||||
?XMLATTR('node', <<"config">>)]}],
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(To)),
|
||||
?XMLATTR(<<"name">>, ?T(Lang, "Configuration")),
|
||||
?XMLATTR(<<"node">>, <<"config">>)]}],
|
||||
{result, Items ++ Nodes};
|
||||
_ ->
|
||||
Acc
|
||||
@ -316,10 +316,10 @@ get_user_resources(BareJID) ->
|
||||
exmpp_jid:prep_domain(BareJID)),
|
||||
lists:map(fun(R) ->
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid',
|
||||
[?XMLATTR(<<"jid">>,
|
||||
exmpp_jid:to_binary(
|
||||
exmpp_jid:full(BareJID, R))),
|
||||
?XMLATTR('name',
|
||||
?XMLATTR(<<"name">>,
|
||||
exmpp_jid:prep_node(BareJID))]}
|
||||
end, lists:sort(Rs)).
|
||||
|
||||
@ -339,7 +339,7 @@ adhoc_local_items(Acc, From, To, Lang) ->
|
||||
Lang),
|
||||
Nodes1 = lists:filter(
|
||||
fun(N) ->
|
||||
Nd = exmpp_xml:get_attribute_as_binary(N, 'node', ""),
|
||||
Nd = exmpp_xml:get_attribute_as_binary(N, <<"node">>, ""),
|
||||
F = get_local_features([], From, To, Nd, Lang),
|
||||
case F of
|
||||
{result, [?NS_ADHOC_s]} ->
|
||||
@ -370,8 +370,8 @@ recursively_get_local_items(PermLev, LServer, Node, Server, Lang) ->
|
||||
Nodes = lists:flatten(
|
||||
lists:map(
|
||||
fun(N) ->
|
||||
S = exmpp_xml:get_attribute_as_list(N, 'jid', ""),
|
||||
Nd = exmpp_xml:get_attribute_as_list(N, 'node', ""),
|
||||
S = exmpp_xml:get_attribute_as_list(N, <<"jid">>, ""),
|
||||
Nd = exmpp_xml:get_attribute_as_list(N, <<"node">>, ""),
|
||||
if (S /= Server) or (Nd == "") ->
|
||||
[];
|
||||
true ->
|
||||
@ -560,8 +560,8 @@ get_local_items({_, Host}, ["all users", [$@ | Diap]], _Server, _Lang) ->
|
||||
Sub = lists:sublist(SUsers, N1, N2 - N1 + 1),
|
||||
lists:map(fun({S, U}) ->
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(U, S)),
|
||||
?XMLATTR('name', exmpp_jid:to_binary(U, S))]}
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(U, S)),
|
||||
?XMLATTR(<<"name">>, exmpp_jid:to_binary(U, S))]}
|
||||
end, Sub)
|
||||
end of
|
||||
{'EXIT', _Reason} ->
|
||||
@ -653,8 +653,8 @@ get_online_vh_users(Host) ->
|
||||
SURs = lists:sort([{S, U, R} || {U, S, R} <- USRs]),
|
||||
lists:map(fun({S, U, R}) ->
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(U, S, R)),
|
||||
?XMLATTR('name', exmpp_jid:to_binary(U, S))]}
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(U, S, R)),
|
||||
?XMLATTR(<<"name">>, exmpp_jid:to_binary(U, S))]}
|
||||
end, SURs)
|
||||
end.
|
||||
|
||||
@ -668,8 +668,8 @@ get_all_vh_users(Host) ->
|
||||
N when N =< 100 ->
|
||||
lists:map(fun({S, U}) ->
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(U, S)),
|
||||
?XMLATTR('name', exmpp_jid:to_binary(U, S))]}
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(U, S)),
|
||||
?XMLATTR(<<"name">>, exmpp_jid:to_binary(U, S))]}
|
||||
end, SUsers);
|
||||
N ->
|
||||
NParts = trunc(math:sqrt(N * 0.618)) + 1,
|
||||
@ -688,9 +688,9 @@ get_all_vh_users(Host) ->
|
||||
<<(list_to_binary(FU))/binary, "@", (list_to_binary(FS))/binary,
|
||||
" -- ", (list_to_binary(LU))/binary, "@", (list_to_binary(LS))/binary>>,
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', Host),
|
||||
?XMLATTR('node', <<"all users/", Node/binary>>),
|
||||
?XMLATTR('name', Name)]}
|
||||
[?XMLATTR(<<"jid">>, Host),
|
||||
?XMLATTR(<<"node">>, <<"all users/", Node/binary>>),
|
||||
?XMLATTR(<<"name">>, Name)]}
|
||||
end, lists:seq(1, N, M))
|
||||
end
|
||||
end.
|
||||
@ -706,9 +706,9 @@ get_outgoing_s2s(Host, Lang) ->
|
||||
lists:map(
|
||||
fun(T) ->
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', Host),
|
||||
?XMLATTR('node', <<"outgoing s2s/", (list_to_binary(T))/binary>>),
|
||||
?XMLATTR('name',
|
||||
[?XMLATTR(<<"jid">>, Host),
|
||||
?XMLATTR(<<"node">>, <<"outgoing s2s/", (list_to_binary(T))/binary>>),
|
||||
?XMLATTR(<<"name">>,
|
||||
io_lib:format(?T(Lang, "To ~s"), [T]))]}
|
||||
end, lists:usort(TConns))
|
||||
end.
|
||||
@ -721,9 +721,9 @@ get_outgoing_s2s(Host, Lang, To) ->
|
||||
lists:map(
|
||||
fun({F, _T}) ->
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', Host),
|
||||
?XMLATTR('node', <<"outgoing s2s/", (list_to_binary(To))/binary, "/", (list_to_binary(F))/binary>>),
|
||||
?XMLATTR('name',
|
||||
[?XMLATTR(<<"jid">>, Host),
|
||||
?XMLATTR(<<"node">>, <<"outgoing s2s/", (list_to_binary(To))/binary, "/", (list_to_binary(F))/binary>>),
|
||||
?XMLATTR(<<"name">>,
|
||||
io_lib:format(?T(Lang, "From ~s"), [F]))]}
|
||||
end, lists:keysort(1, lists:filter(fun(E) ->
|
||||
element(2, E) == To
|
||||
@ -740,9 +740,9 @@ get_running_nodes(Server, _Lang) ->
|
||||
fun(N) ->
|
||||
S = list_to_binary(atom_to_list(N)),
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', Server),
|
||||
?XMLATTR('node', <<"running nodes/", S/binary>>),
|
||||
?XMLATTR('name', S)]}
|
||||
[?XMLATTR(<<"jid">>, Server),
|
||||
?XMLATTR(<<"node">>, <<"running nodes/", S/binary>>),
|
||||
?XMLATTR(<<"name">>, S)]}
|
||||
end, lists:sort(DBNodes))
|
||||
end.
|
||||
|
||||
@ -757,9 +757,9 @@ get_stopped_nodes(_Lang) ->
|
||||
fun(N) ->
|
||||
S = list_to_binary(atom_to_list(N)),
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs =
|
||||
[?XMLATTR('jid', ?MYNAME),
|
||||
?XMLATTR('node', <<"stopped nodes/", S/binary>>),
|
||||
?XMLATTR('name', S)]}
|
||||
[?XMLATTR(<<"jid">>, ?MYNAME),
|
||||
?XMLATTR(<<"node">>, <<"stopped nodes/", S/binary>>),
|
||||
?XMLATTR(<<"name">>, S)]}
|
||||
end, lists:sort(DBNodes))
|
||||
end.
|
||||
|
||||
@ -858,45 +858,45 @@ adhoc_local_commands(From, To,
|
||||
|
||||
|
||||
-define(TVFIELD(Type, Var, Val),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('var', Var)],
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"var">>, Var)],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = Val}]}]}).
|
||||
-define(HFIELD(), ?TVFIELD(<<"hidden">>, <<"FORM_TYPE">>, list_to_binary(?NS_ADMIN_s))).
|
||||
|
||||
-define(TLFIELD(Type, Label, Var),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('label', ?T(Lang, Label)),
|
||||
?XMLATTR('var', Var)]}).
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)]}).
|
||||
|
||||
-define(XFIELD(Type, Label, Var, Val),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('label', ?T(Lang, Label)),
|
||||
?XMLATTR('var', Var)],
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = Val}]}]}).
|
||||
|
||||
-define(XMFIELD(Type, Label, Var, Vals),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('label', ?T(Lang, Label)),
|
||||
?XMLATTR('var', Var)],
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Val)}]} || Val <- Vals]}).
|
||||
|
||||
-define(TABLEFIELD(Table, Val),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', <<"list-single">>),
|
||||
?XMLATTR('label', Table),
|
||||
?XMLATTR('var', Table)],
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, <<"list-single">>),
|
||||
?XMLATTR(<<"label">>, Table),
|
||||
?XMLATTR(<<"var">>, Table)],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(atom_to_list(Val))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR('label',
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR(<<"label">>,
|
||||
?T(Lang, "RAM copy"))],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"ram_copies">>}]}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR('label',
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR(<<"label">>,
|
||||
?T(Lang,
|
||||
"RAM and disc copy"))],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"disc_copies">>}]}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR('label',
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR(<<"label">>,
|
||||
?T(Lang,
|
||||
"Disc only copy"))],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"disc_only_copies">>}]}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR('label',
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs = [?XMLATTR(<<"label">>,
|
||||
?T(Lang, "Remote copy"))],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"unknown">>}]}]}
|
||||
]}).
|
||||
@ -1057,7 +1057,7 @@ get_form(_Host, ["running nodes", _ENode, "restart"], Lang) ->
|
||||
Make_option =
|
||||
fun(LabelNum, LabelUnit, Value)->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs =
|
||||
[?XMLATTR('label', LabelNum ++ ?T(Lang, LabelUnit))], children =
|
||||
[?XMLATTR(<<"label">>, LabelNum ++ ?T(Lang, LabelUnit))], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Value)}]}]}
|
||||
end,
|
||||
{result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
|
||||
@ -1065,9 +1065,9 @@ get_form(_Host, ["running nodes", _ENode, "restart"], Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(?T(Lang, "Restart Service"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"list-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Time delay")),
|
||||
?XMLATTR('var', <<"delay">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"list-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Time delay")),
|
||||
?XMLATTR(<<"var">>, <<"delay">>)], children =
|
||||
[Make_option("", "immediately", "1"),
|
||||
Make_option("15 ", "seconds", "15"),
|
||||
Make_option("30 ", "seconds", "30"),
|
||||
@ -1083,23 +1083,23 @@ get_form(_Host, ["running nodes", _ENode, "restart"], Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}
|
||||
]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"fixed">>),
|
||||
?XMLATTR('label', ?T(Lang, "Send announcement to all online users on all hosts"))]},
|
||||
[?XMLATTR(<<"type">>, <<"fixed">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Send announcement to all online users on all hosts"))]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"subject">>),
|
||||
?XMLATTR('type', <<"text-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Subject"))]},
|
||||
[?XMLATTR(<<"var">>, <<"subject">>),
|
||||
?XMLATTR(<<"type">>, <<"text-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Subject"))]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"announcement">>),
|
||||
?XMLATTR('type', <<"text-multi">>),
|
||||
?XMLATTR('label', ?T(Lang, "Message body"))]}
|
||||
[?XMLATTR(<<"var">>, <<"announcement">>),
|
||||
?XMLATTR(<<"type">>, <<"text-multi">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Message body"))]}
|
||||
]}]};
|
||||
|
||||
get_form(_Host, ["running nodes", _ENode, "shutdown"], Lang) ->
|
||||
Make_option =
|
||||
fun(LabelNum, LabelUnit, Value)->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs =
|
||||
[?XMLATTR('label', LabelNum ++ ?T(Lang, LabelUnit))], children =
|
||||
[?XMLATTR(<<"label">>, LabelNum ++ ?T(Lang, LabelUnit))], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Value)}]}]}
|
||||
end,
|
||||
{result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
|
||||
@ -1107,9 +1107,9 @@ get_form(_Host, ["running nodes", _ENode, "shutdown"], Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(?T(Lang, "Shut Down Service"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"list-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Time delay")),
|
||||
?XMLATTR('var', <<"delay">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"list-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Time delay")),
|
||||
?XMLATTR(<<"var">>, <<"delay">>)], children =
|
||||
[Make_option("", "immediately", "1"),
|
||||
Make_option("15 ", "seconds", "15"),
|
||||
Make_option("30 ", "seconds", "30"),
|
||||
@ -1125,16 +1125,16 @@ get_form(_Host, ["running nodes", _ENode, "shutdown"], Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}
|
||||
]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"fixed">>),
|
||||
?XMLATTR('label', ?T(Lang, "Send announcement to all online users on all hosts"))]},
|
||||
[?XMLATTR(<<"type">>, <<"fixed">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Send announcement to all online users on all hosts"))]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"subject">>),
|
||||
?XMLATTR('type', <<"text-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Subject"))]},
|
||||
[?XMLATTR(<<"var">>, <<"subject">>),
|
||||
?XMLATTR(<<"type">>, <<"text-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Subject"))]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"announcement">>),
|
||||
?XMLATTR('type', <<"text-multi">>),
|
||||
?XMLATTR('label', ?T(Lang, "Message body"))]}
|
||||
[?XMLATTR(<<"var">>, <<"announcement">>),
|
||||
?XMLATTR(<<"type">>, <<"text-multi">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Message body"))]}
|
||||
]}]};
|
||||
|
||||
get_form(Host, ["config", "acls"], Lang) ->
|
||||
@ -1144,11 +1144,11 @@ get_form(Host, ["config", "acls"], Lang) ->
|
||||
[#xmlcdata{cdata =
|
||||
list_to_binary(?T(
|
||||
Lang, "Access Control List Configuration"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', <<"text-multi">>),
|
||||
?XMLATTR('label',
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, <<"text-multi">>),
|
||||
?XMLATTR(<<"label">>,
|
||||
?T(
|
||||
Lang, "Access control lists")),
|
||||
?XMLATTR('var', <<"acls">>)],
|
||||
?XMLATTR(<<"var">>, <<"acls">>)],
|
||||
children = lists:map(fun(S) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(S)}]}
|
||||
end,
|
||||
@ -1172,11 +1172,11 @@ get_form(Host, ["config", "access"], Lang) ->
|
||||
[#xmlcdata{cdata =
|
||||
list_to_binary(?T(
|
||||
Lang, "Access Configuration"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =[?XMLATTR('type', <<"text-multi">>),
|
||||
?XMLATTR('label',
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =[?XMLATTR(<<"type">>, <<"text-multi">>),
|
||||
?XMLATTR(<<"label">>,
|
||||
?T(
|
||||
Lang, "Access rules")),
|
||||
?XMLATTR('var', <<"access">>)],
|
||||
?XMLATTR(<<"var">>, <<"access">>)],
|
||||
children = lists:map(fun(S) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =[#xmlcdata{cdata = list_to_binary(S)}]}
|
||||
end,
|
||||
@ -1199,19 +1199,19 @@ get_form(_Host, ?NS_ADMINL("add-user"), Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(?T(Lang, "Add User"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"jid-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR('var', <<"accountjid">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"jid-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR(<<"var">>, <<"accountjid">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"text-private">>),
|
||||
?XMLATTR('label', ?T(Lang, "Password")),
|
||||
?XMLATTR('var', <<"password">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"text-private">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Password")),
|
||||
?XMLATTR(<<"var">>, <<"password">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"text-private">>),
|
||||
?XMLATTR('label', ?T(Lang, "Password Verification")),
|
||||
?XMLATTR('var', <<"password-verify">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"text-private">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Password Verification")),
|
||||
?XMLATTR(<<"var">>, <<"password-verify">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
|
||||
]}]};
|
||||
|
||||
@ -1221,9 +1221,9 @@ get_form(_Host, ?NS_ADMINL("delete-user"), Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(?T(Lang, "Delete User"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"jid-multi">>),
|
||||
?XMLATTR('label', ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR('var', <<"accountjids">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"jid-multi">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR(<<"var">>, <<"accountjids">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
|
||||
]}]};
|
||||
|
||||
@ -1233,9 +1233,9 @@ get_form(_Host, ?NS_ADMINL("end-user-session"), Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(?T(Lang, "End User Session"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"jid-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR('var', <<"accountjid">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"jid-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR(<<"var">>, <<"accountjid">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
|
||||
]}]};
|
||||
|
||||
@ -1245,9 +1245,9 @@ get_form(_Host, ?NS_ADMINL("get-user-password"), Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(?T(Lang, "Get User Password"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"jid-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR('var', <<"accountjid">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"jid-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR(<<"var">>, <<"accountjid">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
|
||||
]}]};
|
||||
|
||||
@ -1257,14 +1257,14 @@ get_form(_Host, ?NS_ADMINL("change-user-password"), Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(?T(Lang, "Get User Password"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"jid-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR('var', <<"accountjid">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"jid-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR(<<"var">>, <<"accountjid">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"text-private">>),
|
||||
?XMLATTR('label', ?T(Lang, "Password")),
|
||||
?XMLATTR('var', <<"password">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"text-private">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Password")),
|
||||
?XMLATTR(<<"var">>, <<"password">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
|
||||
]}]};
|
||||
|
||||
@ -1274,9 +1274,9 @@ get_form(_Host, ?NS_ADMINL("get-user-lastlogin"), Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(?T(Lang, "Get User Last Login Time"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"jid-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR('var', <<"accountjid">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"jid-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR(<<"var">>, <<"accountjid">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
|
||||
]}]};
|
||||
|
||||
@ -1286,9 +1286,9 @@ get_form(_Host, ?NS_ADMINL("user-stats"), Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(?T(Lang, "Get User Statistics"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"jid-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR('var', <<"accountjid">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"jid-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Jabber ID")),
|
||||
?XMLATTR(<<"var">>, <<"accountjid">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]}
|
||||
]}]};
|
||||
|
||||
@ -1298,9 +1298,9 @@ get_form(Host, ?NS_ADMINL("get-registered-users-num"), Lang) ->
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
|
||||
[?HFIELD(),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"text-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Number of registered users")),
|
||||
?XMLATTR('var', <<"registeredusersnum">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"text-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Number of registered users")),
|
||||
?XMLATTR(<<"var">>, <<"registeredusersnum">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Num)}]}]
|
||||
}]}]};
|
||||
|
||||
@ -1310,9 +1310,9 @@ get_form(Host, ?NS_ADMINL("get-online-users-num"), Lang) ->
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
|
||||
[?HFIELD(),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"text-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Number of online users")),
|
||||
?XMLATTR('var', <<"onlineusersnum">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"text-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Number of online users")),
|
||||
?XMLATTR(<<"var">>, <<"onlineusersnum">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Num)}]}]
|
||||
}]}]};
|
||||
|
||||
@ -1688,7 +1688,7 @@ set_form(From, Host, ?NS_ADMINL("get-user-lastlogin"), Lang, XData) ->
|
||||
_ ->
|
||||
?T(Lang, "Online")
|
||||
end,
|
||||
{result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"result">>)], children =
|
||||
{result, [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR(<<"type">>, <<"result">>)], children =
|
||||
[?HFIELD(),
|
||||
?XFIELD(<<"jid-single">>, "Jabber ID", <<"accountjid">>, list_to_binary(AccountString)),
|
||||
?XFIELD(<<"text-single">>, "Last login", <<"lastlogin">>, list_to_binary(FLast))
|
||||
@ -1748,12 +1748,12 @@ stop_node(From, Host, ENode, Action, XData) ->
|
||||
Delay = list_to_integer(get_value("delay", XData)),
|
||||
Subject = case get_value("subject", XData) of
|
||||
[] -> [];
|
||||
S -> [#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('var', <<"subject">>)], children =
|
||||
S -> [#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"var">>, <<"subject">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(S)}]}]}]
|
||||
end,
|
||||
Announcement = case get_values("announcement", XData) of
|
||||
[] -> [];
|
||||
As -> [#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('var', <<"body">>)], children =
|
||||
As -> [#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"var">>, <<"body">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Line)}]} || Line <- As] }]
|
||||
end,
|
||||
case Subject ++ Announcement of
|
||||
@ -1763,10 +1763,10 @@ stop_node(From, Host, ENode, Action, XData) ->
|
||||
node = binary_to_list(?NS_ADMINX(<<"announce-allhosts">>)),
|
||||
action = "complete",
|
||||
xdata = #xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
|
||||
[?XMLATTR('type', <<"submit">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"submit">>)], children =
|
||||
SubEls},
|
||||
others= [#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
|
||||
[?XMLATTR('type', <<"submit">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"submit">>)], children =
|
||||
SubEls}]
|
||||
},
|
||||
To = exmpp_jid:make(Host),
|
||||
@ -1845,15 +1845,15 @@ get_sm_form(User, Server, "config", Lang) ->
|
||||
list_to_binary(?T(
|
||||
Lang, "Administration of ") ++ User)}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('type', <<"list-single">>),
|
||||
?XMLATTR('label', ?T(Lang, "Action on user")),
|
||||
?XMLATTR('var', <<"action">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"list-single">>),
|
||||
?XMLATTR(<<"label">>, ?T(Lang, "Action on user")),
|
||||
?XMLATTR(<<"var">>, <<"action">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"edit">>}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs =
|
||||
[?XMLATTR('label', ?T(Lang, "Edit Properties"))], children =
|
||||
[?XMLATTR(<<"label">>, ?T(Lang, "Edit Properties"))], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"edit">>}]}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', attrs =
|
||||
[?XMLATTR('label', ?T(Lang, "Remove User"))], children =
|
||||
[?XMLATTR(<<"label">>, ?T(Lang, "Remove User"))], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"remove">>}]}]}
|
||||
]},
|
||||
?XFIELD(<<"text-private">>, "Password", <<"password">>,
|
||||
|
@ -124,15 +124,15 @@ process_local_iq(From, To, #iq{type = Type, payload = Request} = IQ_Rec) ->
|
||||
process_get(#xmlel{ns = ?NS_ECONFIGURE, name = 'info'}) ->
|
||||
S2SConns = ejabberd_s2s:dirty_get_connections(),
|
||||
TConns = lists:usort([element(2, C) || C <- S2SConns]),
|
||||
Attrs = [?XMLATTR('registered-users', mnesia:table_info(passwd, size)),
|
||||
?XMLATTR('online-users', mnesia:table_info(presence, size)),
|
||||
?XMLATTR('running-nodes',
|
||||
Attrs = [?XMLATTR(<<"registered-users">>, mnesia:table_info(passwd, size)),
|
||||
?XMLATTR(<<"online-users">>, mnesia:table_info(presence, size)),
|
||||
?XMLATTR(<<"running-nodes">>,
|
||||
length(mnesia:system_info(running_db_nodes))),
|
||||
?XMLATTR('stopped-nodes',
|
||||
?XMLATTR(<<"stopped-nodes">>,
|
||||
length(lists:usort(mnesia:system_info(db_nodes) ++
|
||||
mnesia:system_info(extra_db_nodes)) --
|
||||
mnesia:system_info(running_db_nodes))),
|
||||
?XMLATTR('outgoing-s2s-servers',
|
||||
?XMLATTR(<<"outgoing-s2s-servers">>,
|
||||
length(TConns))],
|
||||
{result, #xmlel{ns = ?NS_ECONFIGURE, name = 'info', attrs = Attrs}};
|
||||
process_get(#xmlel{ns = ?NS_ECONFIGURE, name = 'welcome-message', attrs = Attrs}) ->
|
||||
|
@ -124,14 +124,14 @@ unregister_extra_domain(HostB, Domain) when is_binary(HostB) ->
|
||||
|
||||
process_local_iq_items(From, To, #iq{type = get, payload = SubEl,
|
||||
lang = Lang} = IQ_Rec) ->
|
||||
Node = exmpp_xml:get_attribute_as_binary(SubEl, 'node', <<>>),
|
||||
Node = exmpp_xml:get_attribute_as_binary(SubEl, <<"node">>, <<>>),
|
||||
|
||||
Host = exmpp_jid:prep_domain(To),
|
||||
case find_items(disco_local_items, Host, From, To, Node, Lang) of
|
||||
{result, Items} ->
|
||||
ANode = case Node of
|
||||
<<>> -> [];
|
||||
_ -> [?XMLATTR('node', Node)]
|
||||
_ -> [?XMLATTR(<<"node">>, Node)]
|
||||
end,
|
||||
Result = #xmlel{ns = ?NS_DISCO_ITEMS, name = 'query',
|
||||
attrs = ANode, children = Items},
|
||||
@ -145,7 +145,7 @@ process_local_iq_items(_From, _To, #iq{type = set} = IQ_Rec) ->
|
||||
|
||||
process_local_iq_info(From, To, #iq{type = get, payload = SubEl,
|
||||
lang = Lang} = IQ_Rec) ->
|
||||
Node = exmpp_xml:get_attribute_as_binary(SubEl, 'node', <<>>),
|
||||
Node = exmpp_xml:get_attribute_as_binary(SubEl, <<"node">>, <<>>),
|
||||
HostB = exmpp_jid:prep_domain(To),
|
||||
Identity = ejabberd_hooks:run_fold(disco_local_identity,
|
||||
HostB,
|
||||
@ -158,7 +158,7 @@ process_local_iq_info(From, To, #iq{type = get, payload = SubEl,
|
||||
{result, Features} ->
|
||||
ANode = case Node of
|
||||
<<>> -> [];
|
||||
_ -> [?XMLATTR('node', Node)]
|
||||
_ -> [?XMLATTR(<<"node">>, Node)]
|
||||
end,
|
||||
Result = #xmlel{ns = ?NS_DISCO_INFO, name = 'query',
|
||||
attrs = ANode,
|
||||
@ -172,9 +172,9 @@ process_local_iq_info(_From, _To, #iq{type = set} = IQ_Rec) ->
|
||||
|
||||
get_local_identity(Acc, _From, _To, <<>>, _Lang) ->
|
||||
Acc ++ [#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs = [
|
||||
?XMLATTR('category', <<"server">>),
|
||||
?XMLATTR('type', <<"im">>),
|
||||
?XMLATTR('name', <<"ejabberd">>)
|
||||
?XMLATTR(<<"category">>, <<"server">>),
|
||||
?XMLATTR(<<"type">>, <<"im">>),
|
||||
?XMLATTR(<<"name">>, <<"ejabberd">>)
|
||||
]}];
|
||||
|
||||
get_local_identity(Acc, _From, _To, _Node, _Lang) ->
|
||||
@ -208,7 +208,7 @@ get_local_features(Acc, _From, _To, _Node, _Lang) ->
|
||||
features_to_xml(FeatureList) ->
|
||||
%% Avoid duplicating features
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
|
||||
attrs = [?XMLATTR('var', Feat)]} ||
|
||||
attrs = [?XMLATTR(<<"var">>, Feat)]} ||
|
||||
Feat <- lists:usort(
|
||||
lists:map(
|
||||
fun({{Feature, _Host}}) ->
|
||||
@ -228,7 +228,7 @@ domain_to_xml({Domain}) ->
|
||||
domain_to_xml(Domain);
|
||||
domain_to_xml(Domain) when is_binary(Domain)->
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [
|
||||
?XMLATTR('jid', Domain)
|
||||
?XMLATTR(<<"jid">>, Domain)
|
||||
]};
|
||||
domain_to_xml(Domain) when is_list(Domain) ->
|
||||
domain_to_xml(list_to_binary(Domain)).
|
||||
@ -284,13 +284,13 @@ get_vh_services(Host) ->
|
||||
|
||||
process_sm_iq_items(From, To, #iq{type = get, payload = SubEl,
|
||||
lang = Lang} = IQ_Rec) ->
|
||||
Node = exmpp_xml:get_attribute_as_binary(SubEl, 'node', <<>>),
|
||||
Node = exmpp_xml:get_attribute_as_binary(SubEl, <<"node">>, <<>>),
|
||||
Host = exmpp_jid:prep_domain(To),
|
||||
case find_items(disco_sm_items, Host, From, To, Node, Lang) of
|
||||
{result, Items} ->
|
||||
ANode = case Node of
|
||||
<<>> -> [];
|
||||
_ -> [?XMLATTR('node', Node)]
|
||||
_ -> [?XMLATTR(<<"node">>, Node)]
|
||||
end,
|
||||
AItems = case Node of
|
||||
<<>> ->
|
||||
@ -362,7 +362,7 @@ process_sm_iq_info(From, To, #iq{type = get, payload = SubEl,
|
||||
lang = Lang} = IQ_Rec) ->
|
||||
case is_presence_subscribed(From, To) of
|
||||
true ->
|
||||
Node = exmpp_xml:get_attribute_as_binary(SubEl, 'node', <<>>),
|
||||
Node = exmpp_xml:get_attribute_as_binary(SubEl, <<"node">>, <<>>),
|
||||
Identity = ejabberd_hooks:run_fold(disco_sm_identity,
|
||||
exmpp_jid:prep_domain(To),
|
||||
[],
|
||||
@ -372,7 +372,7 @@ process_sm_iq_info(From, To, #iq{type = get, payload = SubEl,
|
||||
{result, Features} ->
|
||||
ANode = case Node of
|
||||
<<>> -> [];
|
||||
_ -> [?XMLATTR('node', Node)]
|
||||
_ -> [?XMLATTR(<<"node">>, Node)]
|
||||
end,
|
||||
Result = #xmlel{ns = ?NS_DISCO_INFO, name = 'query',
|
||||
attrs = ANode,
|
||||
@ -421,9 +421,9 @@ get_user_resources(JID) ->
|
||||
exmpp_jid:prep_domain(JID)),
|
||||
lists:map(fun(R) ->
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [
|
||||
?XMLATTR('jid',
|
||||
?XMLATTR(<<"jid">>,
|
||||
exmpp_jid:to_binary(exmpp_jid:full(JID, R))),
|
||||
?XMLATTR('name', exmpp_jid:prep_node(JID))
|
||||
?XMLATTR(<<"name">>, exmpp_jid:prep_node(JID))
|
||||
]}
|
||||
end, lists:sort(Rs)).
|
||||
|
||||
@ -440,13 +440,13 @@ get_info(Acc, Host, Mod, Node, _Lang) when Node == <<>> ->
|
||||
CData1 = #xmlcdata{cdata = list_to_binary(?NS_SERVERINFO_s)},
|
||||
Value1 = #xmlel{name = 'value', children = [CData1]},
|
||||
Field1 = #xmlel{name = 'field',
|
||||
attrs = [?XMLATTR('type', <<"hidden">>),
|
||||
?XMLATTR('var', <<"FORM_TYPE">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"hidden">>),
|
||||
?XMLATTR(<<"var">>, <<"FORM_TYPE">>)],
|
||||
children = [Value1]
|
||||
},
|
||||
X = #xmlel{name = 'x',
|
||||
ns = ?NS_DATA_FORMS,
|
||||
attrs = [?XMLATTR('type', <<"result">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"result">>)],
|
||||
children = [Field1 | Serverinfo_fields]
|
||||
},
|
||||
[X | Acc];
|
||||
@ -475,7 +475,7 @@ fields_to_xml(Fields) ->
|
||||
field_to_xml({_, Var, Values}) ->
|
||||
Values_xml = values_to_xml(Values),
|
||||
#xmlel{name = 'field',
|
||||
attrs = [?XMLATTR('var', list_to_binary(Var))],
|
||||
attrs = [?XMLATTR(<<"var">>, list_to_binary(Var))],
|
||||
children = Values_xml
|
||||
}.
|
||||
|
||||
|
@ -113,7 +113,7 @@ stop(Host) ->
|
||||
process_local_iq(_From, _To, #iq{type = get} = IQ_Rec) ->
|
||||
Sec = get_node_uptime(),
|
||||
Response = #xmlel{ns = ?NS_LAST_ACTIVITY, name = 'query', attrs =
|
||||
[?XMLATTR('seconds', Sec)]},
|
||||
[?XMLATTR(<<"seconds">>, Sec)]},
|
||||
exmpp_iq:result(IQ_Rec, Response);
|
||||
process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
|
||||
exmpp_iq:error(IQ_Rec, 'not-allowed').
|
||||
@ -186,7 +186,7 @@ get_last_iq(IQ_Rec, LUser, LServer) ->
|
||||
_ ->
|
||||
Sec = 0,
|
||||
#xmlel{ns = ?NS_LAST_ACTIVITY, name = 'query',
|
||||
attrs = [?XMLATTR('seconds', Sec)]}
|
||||
attrs = [?XMLATTR(<<"seconds">>, Sec)]}
|
||||
end.
|
||||
|
||||
get_last_iq_disconnected(IQ_Rec, LUser, LServer) ->
|
||||
@ -199,7 +199,7 @@ get_last_iq_disconnected(IQ_Rec, LUser, LServer) ->
|
||||
TimeStamp2 = now_to_seconds(now()),
|
||||
Sec = TimeStamp2 - TimeStamp,
|
||||
Response = #xmlel{ns = ?NS_LAST_ACTIVITY, name = 'query',
|
||||
attrs = [?XMLATTR('seconds', Sec)],
|
||||
attrs = [?XMLATTR(<<"seconds">>, Sec)],
|
||||
children = [#xmlcdata{cdata = Status}]},
|
||||
exmpp_iq:result(IQ_Rec, Response)
|
||||
end.
|
||||
|
@ -71,7 +71,7 @@ stop(Host) ->
|
||||
process_local_iq(_From, _To, #iq{type = get} = IQ_Rec) ->
|
||||
Sec = get_node_uptime(),
|
||||
Response = #xmlel{ns = ?NS_LAST_ACTIVITY, name = 'query', attrs =
|
||||
[?XMLATTR('seconds', Sec)]},
|
||||
[?XMLATTR(<<"seconds">>, Sec)]},
|
||||
exmpp_iq:result(IQ_Rec, Response);
|
||||
process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
|
||||
exmpp_iq:error(IQ_Rec, 'not-allowed').
|
||||
@ -137,7 +137,7 @@ get_last(IQ_Rec, LUser, LServer) ->
|
||||
TimeStamp2 = now_to_seconds(now()),
|
||||
Sec = TimeStamp2 - TimeStamp,
|
||||
Response = #xmlel{ns = ?NS_LAST_ACTIVITY, name = 'query',
|
||||
attrs = [?XMLATTR('seconds', Sec)],
|
||||
attrs = [?XMLATTR(<<"seconds">>, Sec)],
|
||||
children = [#xmlcdata{cdata = list_to_binary(Status)}]},
|
||||
exmpp_iq:result(IQ_Rec, Response);
|
||||
_ ->
|
||||
|
@ -524,7 +524,7 @@ do_route1(Host, ServerHost, Access, HistorySize, RoomShaper,
|
||||
ejabberd_router:route(To, From, Err)
|
||||
end;
|
||||
'message' ->
|
||||
case exmpp_xml:get_attribute_as_list(Packet,type, "chat") of
|
||||
case exmpp_xml:get_attribute_as_list(Packet,<<"type">>, "chat") of
|
||||
"error" ->
|
||||
ok;
|
||||
_ ->
|
||||
@ -676,32 +676,32 @@ register_room(Host, Room, Pid) ->
|
||||
|
||||
iq_disco_info(Lang) ->
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'identity',
|
||||
attrs = [?XMLATTR('category',
|
||||
attrs = [?XMLATTR(<<"category">>,
|
||||
<<"conference">>),
|
||||
?XMLATTR('type',
|
||||
?XMLATTR(<<"type">>,
|
||||
<<"text">>),
|
||||
?XMLATTR('name',
|
||||
?XMLATTR(<<"name">>,
|
||||
translate:translate(Lang, "Rooms"))]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
|
||||
[?XMLATTR('var',
|
||||
[?XMLATTR(<<"var">>,
|
||||
?NS_DISCO_INFO_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
|
||||
[?XMLATTR('var',
|
||||
[?XMLATTR(<<"var">>,
|
||||
?NS_DISCO_ITEMS_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
|
||||
[?XMLATTR('var',
|
||||
[?XMLATTR(<<"var">>,
|
||||
?NS_MUC_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
|
||||
[?XMLATTR('var',
|
||||
[?XMLATTR(<<"var">>,
|
||||
?NS_MUC_UNIQUE_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
|
||||
[?XMLATTR('var',
|
||||
[?XMLATTR(<<"var">>,
|
||||
?NS_INBAND_REGISTER_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
|
||||
[?XMLATTR('var',
|
||||
[?XMLATTR(<<"var">>,
|
||||
?NS_RSM_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs =
|
||||
[?XMLATTR('var',
|
||||
[?XMLATTR(<<"var">>,
|
||||
?NS_VCARD_s)]}].
|
||||
|
||||
|
||||
@ -730,9 +730,9 @@ iq_disco_items(Host, From, Lang, Rsm) ->
|
||||
flush(),
|
||||
{true,
|
||||
#xmlel{name = 'item',
|
||||
attrs = [?XMLATTR('jid',
|
||||
attrs = [?XMLATTR(<<"jid">>,
|
||||
exmpp_jid:to_binary(exmpp_jid:make(Name, Host))),
|
||||
?XMLATTR('name',
|
||||
?XMLATTR(<<"name">>,
|
||||
Desc)]}};
|
||||
_ ->
|
||||
false
|
||||
@ -808,10 +808,10 @@ flush() ->
|
||||
|
||||
-define(XFIELD(Type, Label, Var, Val),
|
||||
#xmlel{name = "field",
|
||||
attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('label',
|
||||
attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>,
|
||||
translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)],
|
||||
?XMLATTR(<<"var">>, Var)],
|
||||
children = [#xmlel{name = 'value',
|
||||
children = [#xmlcdata{cdata = Val}]}]}).
|
||||
|
||||
|
@ -578,7 +578,7 @@ normal_state(_Event, StateData) ->
|
||||
%%----------------------------------------------------------------------
|
||||
handle_event({service_message, Msg}, _StateName, StateData) ->
|
||||
MessagePkt = #xmlel{name = 'message',
|
||||
attrs = [?XMLATTR('type', <<"groupchat">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"groupchat">>)],
|
||||
children = [#xmlel{name = 'body',
|
||||
children = [#xmlcdata{cdata = Msg}]}]},
|
||||
send_multiple(
|
||||
@ -757,16 +757,16 @@ terminate(Reason, _StateName, StateData) ->
|
||||
_ -> <<"Room terminates">>
|
||||
end,
|
||||
ReasonEl = #xmlel{name = 'reason', children = [#xmlcdata{cdata = ReasonT}]},
|
||||
ItemAttrs = [?XMLATTR('affiliation', <<"none">>),
|
||||
?XMLATTR('role', <<"none">>)],
|
||||
ItemAttrs = [?XMLATTR(<<"affiliation">>, <<"none">>),
|
||||
?XMLATTR(<<"role">>, <<"none">>)],
|
||||
XEls = [#xmlel{ns = ?NS_MUC_USER, name = 'item',
|
||||
attrs = ItemAttrs,
|
||||
children = [ReasonEl]},
|
||||
#xmlel{ns = ?NS_MUC_USER, name = 'status',
|
||||
attrs = [?XMLATTR('code', <<"332">>)]}],
|
||||
attrs = [?XMLATTR(<<"code">>, <<"332">>)]}],
|
||||
Packet = #xmlel{ns = ?NS_JABBER_CLIENT,
|
||||
name = 'presence',
|
||||
attrs = [?XMLATTR('type', <<"unavailable">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"unavailable">>)],
|
||||
children = [#xmlel{ns = ?NS_MUC_USER, name = 'x',
|
||||
children = XEls}
|
||||
]},
|
||||
@ -1643,7 +1643,7 @@ add_new_user(From, Nick, Packet, StateData) ->
|
||||
if not (NewState#state.config)#config.anonymous ->
|
||||
WPacket =
|
||||
#xmlel{name = 'message',
|
||||
attrs = [?XMLATTR('type', <<"groupchat">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"groupchat">>)],
|
||||
children = [
|
||||
#xmlel{name = 'body',
|
||||
children = [#xmlcdata{cdata =
|
||||
@ -1693,7 +1693,7 @@ add_new_user(From, Nick, Packet, StateData) ->
|
||||
SID, RoomJID, To, Lang, From) of
|
||||
{ok, ID, CaptchaEls} ->
|
||||
MsgPkt = #xmlel{name = 'message',
|
||||
attrs = [#xmlattr{name = 'id', value = list_to_binary(ID)}],
|
||||
attrs = [#xmlattr{name = <<"id">>, value = list_to_binary(ID)}],
|
||||
children = CaptchaEls},
|
||||
Robots = ?DICT:store(From,
|
||||
{Nick, Packet}, StateData#state.robots),
|
||||
@ -1933,12 +1933,12 @@ send_new_presence(NJID, Reason, StateData) ->
|
||||
case (Info#user.role == moderator) orelse
|
||||
((StateData#state.config)#config.anonymous == false) of
|
||||
true ->
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(RealJID)),
|
||||
?XMLATTR('affiliation', SAffiliation),
|
||||
?XMLATTR('role', SRole)];
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(RealJID)),
|
||||
?XMLATTR(<<"affiliation">>, SAffiliation),
|
||||
?XMLATTR(<<"role">>, SRole)];
|
||||
_ ->
|
||||
[?XMLATTR('affiliation', SAffiliation),
|
||||
?XMLATTR('role', SRole)]
|
||||
[?XMLATTR(<<"affiliation">>, SAffiliation),
|
||||
?XMLATTR(<<"role">>, SRole)]
|
||||
end,
|
||||
ItemEls = case Reason of
|
||||
<<>> ->
|
||||
@ -1950,7 +1950,7 @@ send_new_presence(NJID, Reason, StateData) ->
|
||||
Status = case StateData#state.just_created of
|
||||
true ->
|
||||
[#xmlel{name = 'status',
|
||||
attrs = [?XMLATTR('code', <<"201">>)]}];
|
||||
attrs = [?XMLATTR(<<"code">>, <<"201">>)]}];
|
||||
false ->
|
||||
[]
|
||||
end,
|
||||
@ -1958,7 +1958,7 @@ send_new_presence(NJID, Reason, StateData) ->
|
||||
andalso (NJID == Info#user.jid) of
|
||||
true ->
|
||||
[#xmlel{name = 'status',
|
||||
attrs = [?XMLATTR('code', <<"100">>)]}
|
||||
attrs = [?XMLATTR(<<"code">>, <<"100">>)]}
|
||||
| Status];
|
||||
false ->
|
||||
Status
|
||||
@ -1998,14 +1998,14 @@ send_existing_presences(ToJID, StateData) ->
|
||||
((StateData#state.config)#config.anonymous ==
|
||||
false) of
|
||||
true ->
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(FromJID)),
|
||||
?XMLATTR('affiliation',
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(FromJID)),
|
||||
?XMLATTR(<<"affiliation">>,
|
||||
affiliation_to_binary(FromAffiliation)),
|
||||
?XMLATTR('role', role_to_binary(FromRole))];
|
||||
?XMLATTR(<<"role">>, role_to_binary(FromRole))];
|
||||
_ ->
|
||||
[?XMLATTR('affiliation',
|
||||
[?XMLATTR(<<"affiliation">>,
|
||||
affiliation_to_binary(FromAffiliation)),
|
||||
?XMLATTR('role', role_to_binary(FromRole))]
|
||||
?XMLATTR(<<"role">>, role_to_binary(FromRole))]
|
||||
end,
|
||||
Packet = exmpp_xml:append_child(Presence,
|
||||
#xmlel{ns = ?NS_MUC_USER, name = 'x',
|
||||
@ -2055,36 +2055,36 @@ send_nick_changing(JID, OldNick, StateData) ->
|
||||
case (Info#user.role == moderator) orelse
|
||||
((StateData#state.config)#config.anonymous == false) of
|
||||
true ->
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(RealJID)),
|
||||
?XMLATTR('affiliation', SAffiliation),
|
||||
?XMLATTR('role', SRole),
|
||||
?XMLATTR('nick', Nick)];
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(RealJID)),
|
||||
?XMLATTR(<<"affiliation">>, SAffiliation),
|
||||
?XMLATTR(<<"role">>, SRole),
|
||||
?XMLATTR(<<"nick">>, Nick)];
|
||||
_ ->
|
||||
[?XMLATTR('affiliation', SAffiliation),
|
||||
?XMLATTR('role', SRole),
|
||||
?XMLATTR('nick', Nick)]
|
||||
[?XMLATTR(<<"affiliation">>, SAffiliation),
|
||||
?XMLATTR(<<"role">>, SRole),
|
||||
?XMLATTR(<<"nick">>, Nick)]
|
||||
end,
|
||||
ItemAttrs2 =
|
||||
case (Info#user.role == moderator) orelse
|
||||
((StateData#state.config)#config.anonymous == false) of
|
||||
true ->
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(RealJID)),
|
||||
?XMLATTR('affiliation', SAffiliation),
|
||||
?XMLATTR('role', SRole)];
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(RealJID)),
|
||||
?XMLATTR(<<"affiliation">>, SAffiliation),
|
||||
?XMLATTR(<<"role">>, SRole)];
|
||||
_ ->
|
||||
[?XMLATTR('affiliation', SAffiliation),
|
||||
?XMLATTR('role', SRole)]
|
||||
[?XMLATTR(<<"affiliation">>, SAffiliation),
|
||||
?XMLATTR(<<"role">>, SRole)]
|
||||
end,
|
||||
Packet1 =
|
||||
#xmlel{ns = ?NS_JABBER_CLIENT,
|
||||
name = 'presence',
|
||||
attrs = [?XMLATTR('type', <<"unavailable">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"unavailable">>)],
|
||||
children = [#xmlel{ns = ?NS_MUC_USER, name = 'x',
|
||||
children = [
|
||||
#xmlel{ns = ?NS_MUC_USER, name = 'item',
|
||||
attrs = ItemAttrs1},
|
||||
#xmlel{ns = ?NS_MUC_USER, name = 'status',
|
||||
attrs = [?XMLATTR('code',
|
||||
attrs = [?XMLATTR(<<"code">>,
|
||||
<<"303">>)]}]}]},
|
||||
|
||||
Packet2 = exmpp_xml:append_child(
|
||||
@ -2216,9 +2216,9 @@ process_iq_admin(From, get, Lang, SubEl, StateData) ->
|
||||
Item ->
|
||||
FAffiliation = get_affiliation(From, StateData),
|
||||
FRole = get_role(From, StateData),
|
||||
case exmpp_xml:get_attribute_as_binary(Item, 'role', false) of
|
||||
case exmpp_xml:get_attribute_as_binary(Item, <<"role">>, false) of
|
||||
false ->
|
||||
case exmpp_xml:get_attribute_as_binary(Item, 'affiliation', false) of
|
||||
case exmpp_xml:get_attribute_as_binary(Item, <<"affiliation">>, false) of
|
||||
false ->
|
||||
{error, 'bad-request'};
|
||||
StrAffiliation ->
|
||||
@ -2267,9 +2267,9 @@ items_with_affiliation(SAffiliation, StateData) ->
|
||||
fun({JID, {Affiliation, Reason}}) ->
|
||||
{N, D, R} = JID,
|
||||
#xmlel{name = 'item',
|
||||
attrs = [?XMLATTR('affiliation',
|
||||
attrs = [?XMLATTR(<<"affiliation">>,
|
||||
affiliation_to_binary(Affiliation)),
|
||||
?XMLATTR('jid',
|
||||
?XMLATTR(<<"jid">>,
|
||||
exmpp_jid:to_binary(N, D, R))],
|
||||
children = [ #xmlel{name = 'reason',
|
||||
children = [#xmlcdata{cdata = Reason}]}]};
|
||||
@ -2277,9 +2277,9 @@ items_with_affiliation(SAffiliation, StateData) ->
|
||||
({JID, Affiliation}) ->
|
||||
{N, D, R} = JID,
|
||||
#xmlel{name = 'item',
|
||||
attrs = [?XMLATTR('affiliation',
|
||||
attrs = [?XMLATTR(<<"affiliation">>,
|
||||
affiliation_to_binary(Affiliation)),
|
||||
?XMLATTR('jid',
|
||||
?XMLATTR(<<"jid">>,
|
||||
exmpp_jid:to_binary(N, D, R))]}
|
||||
end, search_affiliation(SAffiliation, StateData)).
|
||||
|
||||
@ -2290,10 +2290,10 @@ user_to_item(#user{role = Role,
|
||||
Affiliation = get_affiliation(JID, StateData),
|
||||
#xmlel{name = 'item',
|
||||
attrs = [
|
||||
?XMLATTR('role', role_to_binary(Role)),
|
||||
?XMLATTR('affiliation', affiliation_to_binary(Affiliation)),
|
||||
?XMLATTR('nick', Nick),
|
||||
?XMLATTR('jid', exmpp_jid:to_binary(JID))]
|
||||
?XMLATTR(<<"role">>, role_to_binary(Role)),
|
||||
?XMLATTR(<<"affiliation">>, affiliation_to_binary(Affiliation)),
|
||||
?XMLATTR(<<"nick">>, Nick),
|
||||
?XMLATTR(<<"jid">>, exmpp_jid:to_binary(JID))]
|
||||
}.
|
||||
|
||||
search_role(Role, StateData) ->
|
||||
@ -2418,7 +2418,7 @@ find_changed_items(UJID, UAffiliation, URole, [#xmlcdata{} | Items],
|
||||
find_changed_items(UJID, UAffiliation, URole,
|
||||
[#xmlel{name = 'item'} = Item | Items],
|
||||
Lang, StateData, Res) ->
|
||||
TJID = case exmpp_xml:get_attribute_as_binary(Item, 'jid',false) of
|
||||
TJID = case exmpp_xml:get_attribute_as_binary(Item, <<"jid">>,false) of
|
||||
S when S =/= false ->
|
||||
try exmpp_jid:parse(S) of
|
||||
J ->
|
||||
@ -2432,7 +2432,7 @@ find_changed_items(UJID, UAffiliation, URole,
|
||||
{error, ?ERR(Item, 'not-acceptable', Lang, ErrText)}
|
||||
end;
|
||||
_ ->
|
||||
case exmpp_xml:get_attribute(Item, 'nick', false) of
|
||||
case exmpp_xml:get_attribute(Item, <<"nick">>, false) of
|
||||
N when N =/= false ->
|
||||
case find_jid_by_nick(N, StateData) of
|
||||
false ->
|
||||
@ -2454,9 +2454,9 @@ find_changed_items(UJID, UAffiliation, URole,
|
||||
{value, JID} ->
|
||||
TAffiliation = get_affiliation(JID, StateData),
|
||||
TRole = get_role(JID, StateData),
|
||||
case exmpp_xml:get_attribute_as_binary(Item, 'role',false) of
|
||||
case exmpp_xml:get_attribute_as_binary(Item, <<"role">>,false) of
|
||||
false ->
|
||||
case exmpp_xml:get_attribute_as_binary(Item, 'affiliation', false) of
|
||||
case exmpp_xml:get_attribute_as_binary(Item, <<"affiliation">>, false) of
|
||||
false ->
|
||||
{error, 'bad-request'};
|
||||
StrAffiliation ->
|
||||
@ -2764,8 +2764,8 @@ send_kickban_presence1(UJID, Reason, Code, Affiliation, StateData) ->
|
||||
SAffiliation = affiliation_to_binary(Affiliation),
|
||||
lists:foreach(
|
||||
fun({_LJID, Info}) ->
|
||||
ItemAttrs = [?XMLATTR('affiliation', SAffiliation),
|
||||
?XMLATTR('role', <<"none">>)],
|
||||
ItemAttrs = [?XMLATTR(<<"affiliation">>, SAffiliation),
|
||||
?XMLATTR(<<"role">>, <<"none">>)],
|
||||
ItemEls = case Reason of
|
||||
"" ->
|
||||
[];
|
||||
@ -2776,14 +2776,14 @@ send_kickban_presence1(UJID, Reason, Code, Affiliation, StateData) ->
|
||||
Packet =
|
||||
#xmlel{ns = ?NS_JABBER_CLIENT,
|
||||
name = 'presence',
|
||||
attrs = [?XMLATTR('type', <<"unavailable">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"unavailable">>)],
|
||||
children = [#xmlel{ns = ?NS_MUC_USER, name = 'x',
|
||||
children = [
|
||||
#xmlel{ns = ?NS_MUC_USER, name = 'item',
|
||||
attrs = ItemAttrs,
|
||||
children = ItemEls},
|
||||
#xmlel{ns = ?NS_MUC_USER, name = 'status',
|
||||
attrs = [?XMLATTR('code',
|
||||
attrs = [?XMLATTR(<<"code">>,
|
||||
Code)]}]}]},
|
||||
ejabberd_router:route(
|
||||
jid_replace_resource(StateData#state.jid, Nick),
|
||||
@ -2802,7 +2802,7 @@ process_iq_owner(From, set, Lang, SubEl, StateData) ->
|
||||
owner ->
|
||||
case exmpp_xml:get_child_elements(SubEl) of
|
||||
[#xmlel{ns = XMLNS, name = 'x'} = XEl] ->
|
||||
case {XMLNS, exmpp_xml:get_attribute_as_binary(XEl, 'type',false)} of
|
||||
case {XMLNS, exmpp_xml:get_attribute_as_binary(XEl, <<"type">>,false)} of
|
||||
{?NS_DATA_FORMS, <<"cancel">>} ->
|
||||
{result, [], StateData};
|
||||
{?NS_DATA_FORMS, <<"submit">>} ->
|
||||
@ -2842,7 +2842,7 @@ process_iq_owner(From, get, Lang, SubEl, StateData) ->
|
||||
[] ->
|
||||
get_config(Lang, StateData, From);
|
||||
[Item] ->
|
||||
case exmpp_xml:get_attribute_as_binary(Item, 'affiliation',false) of
|
||||
case exmpp_xml:get_attribute_as_binary(Item, <<"affiliation">>,false) of
|
||||
false ->
|
||||
{error, 'bad-request'};
|
||||
StrAffiliation ->
|
||||
@ -2954,9 +2954,9 @@ is_password_settings_correct(XEl, StateData) ->
|
||||
|
||||
-define(XFIELD(Type, Label, Var, Val),
|
||||
#xmlel{name = 'field',
|
||||
attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)],
|
||||
attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)],
|
||||
children = [#xmlel{name = 'value',
|
||||
children = [#xmlcdata{cdata = Val} ]}]}).
|
||||
|
||||
@ -2996,8 +2996,8 @@ get_config(Lang, StateData, From) ->
|
||||
list_to_binary(io_lib:format(translate:translate(Lang, "Configuration of room ~s"),
|
||||
[exmpp_jid:to_list(StateData#state.jid)]))
|
||||
}]},
|
||||
#xmlel{name = 'field', attrs = [?XMLATTR('type', <<"hidden">>),
|
||||
?XMLATTR('var', <<"FORM_TYPE">>)],
|
||||
#xmlel{name = 'field', attrs = [?XMLATTR(<<"type">>, <<"hidden">>),
|
||||
?XMLATTR(<<"var">>, <<"FORM_TYPE">>)],
|
||||
children = [#xmlel{name = 'value', children = [#xmlcdata{cdata =
|
||||
<<"http://jabber.org/protocol/muc#roomconfig">>
|
||||
}]}]},
|
||||
@ -3032,44 +3032,44 @@ get_config(Lang, StateData, From) ->
|
||||
false -> ""
|
||||
end),
|
||||
#xmlel{name = 'field', attrs = [
|
||||
?XMLATTR('type', <<"list-single">>),
|
||||
?XMLATTR('label', translate:translate(Lang,
|
||||
?XMLATTR(<<"type">>, <<"list-single">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang,
|
||||
"Maximum Number of Occupants")),
|
||||
?XMLATTR('var', <<"muc#roomconfig_maxusers">>)],
|
||||
?XMLATTR(<<"var">>, <<"muc#roomconfig_maxusers">>)],
|
||||
children = [#xmlel{name = 'value',
|
||||
children = [#xmlcdata{cdata =
|
||||
list_to_binary(MaxUsersRoomString)}]}] ++
|
||||
if
|
||||
is_integer(ServiceMaxUsers) -> [];
|
||||
true ->
|
||||
[#xmlel{name = 'option', attrs = [?XMLATTR('label',
|
||||
[#xmlel{name = 'option', attrs = [?XMLATTR(<<"label">>,
|
||||
translate:translate(Lang, "No limit"))],
|
||||
children = [#xmlel{name = 'value',
|
||||
children = [#xmlcdata{cdata = <<"none">>}]}]}]
|
||||
end ++
|
||||
[#xmlel{name = 'option', attrs = [?XMLATTR('label', N)],
|
||||
[#xmlel{name = 'option', attrs = [?XMLATTR(<<"label">>, N)],
|
||||
children = [#xmlel{name = 'value', children = [
|
||||
#xmlcdata{cdata = list_to_binary(erlang:integer_to_list(N))}]}]} ||
|
||||
N <- lists:usort([ServiceMaxUsers, DefaultRoomMaxUsers, MaxUsersRoomInteger |
|
||||
?MAX_USERS_DEFAULT_LIST]), N =< ServiceMaxUsers]},
|
||||
#xmlel{name = 'field', attrs = [
|
||||
?XMLATTR('type', <<"list-single">>),
|
||||
?XMLATTR('label',
|
||||
?XMLATTR(<<"type">>, <<"list-single">>),
|
||||
?XMLATTR(<<"label">>,
|
||||
translate:translate(Lang, "Present real Jabber IDs to")),
|
||||
?XMLATTR('var', <<"muc#roomconfig_whois">>)],
|
||||
?XMLATTR(<<"var">>, <<"muc#roomconfig_whois">>)],
|
||||
children = [#xmlel{name = 'value',
|
||||
children = [#xmlcdata{cdata =
|
||||
if Config#config.anonymous -> <<"moderators">>;
|
||||
true -> <<"anyone">>
|
||||
end}]},
|
||||
#xmlel{name = 'option', attrs = [
|
||||
?XMLATTR('label',
|
||||
?XMLATTR(<<"label">>,
|
||||
translate:translate(Lang, "moderators only"))],
|
||||
children = [#xmlel{name = 'value',
|
||||
children = [#xmlcdata{cdata =
|
||||
<<"moderators">>}]}]},
|
||||
#xmlel{name = 'option', attrs = [
|
||||
?XMLATTR('label',
|
||||
?XMLATTR(<<"label">>,
|
||||
translate:translate(Lang, "anyone"))],
|
||||
children = [#xmlel{name = 'value',
|
||||
children = [#xmlcdata{cdata =
|
||||
@ -3122,7 +3122,7 @@ get_config(Lang, StateData, From) ->
|
||||
#xmlcdata{cdata = translate:translate(Lang,
|
||||
"You need an x:data capable client to configure room")}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'x',
|
||||
attrs = [?XMLATTR('type', <<"form">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"form">>)],
|
||||
children = Res}],
|
||||
StateData}.
|
||||
|
||||
@ -3364,11 +3364,11 @@ destroy_room(DEl, StateData) ->
|
||||
lists:foreach(
|
||||
fun({_LJID, Info}) ->
|
||||
Nick = Info#user.nick,
|
||||
ItemAttrs = [?XMLATTR('affiliation', <<"none">>),
|
||||
?XMLATTR('role', <<"none">>)],
|
||||
ItemAttrs = [?XMLATTR(<<"affiliation">>, <<"none">>),
|
||||
?XMLATTR(<<"role">>, <<"none">>)],
|
||||
Packet = #xmlel{ns = ?NS_JABBER_CLIENT,
|
||||
name = 'presence',
|
||||
attrs = [?XMLATTR('type',
|
||||
attrs = [?XMLATTR(<<"type">>,
|
||||
<<"unavailable">>)],
|
||||
children = [
|
||||
#xmlel{ns = ?NS_MUC_USER, name = 'x', children =
|
||||
@ -3394,7 +3394,7 @@ destroy_room(DEl, StateData) ->
|
||||
% Disco
|
||||
|
||||
-define(FEATURE(Var), #xmlel{name = 'feature',
|
||||
attrs = [?XMLATTR('var', Var)]}).
|
||||
attrs = [?XMLATTR(<<"var">>, Var)]}).
|
||||
|
||||
-define(CONFIG_OPT_TO_FEATURE(Opt, Fiftrue, Fiffalse),
|
||||
case Opt of
|
||||
@ -3410,13 +3410,13 @@ process_iq_disco_info(_From, set, _Lang, _StateData) ->
|
||||
process_iq_disco_info(_From, get, Lang, StateData) ->
|
||||
Config = StateData#state.config,
|
||||
{result, [ #xmlel{name = 'identity',
|
||||
attrs = [?XMLATTR('category',
|
||||
attrs = [?XMLATTR(<<"category">>,
|
||||
<<"conference">>),
|
||||
?XMLATTR('type', <<"text">>),
|
||||
?XMLATTR('name',
|
||||
?XMLATTR(<<"type">>, <<"text">>),
|
||||
?XMLATTR(<<"name">>,
|
||||
get_title(StateData))]},
|
||||
#xmlel{name = 'feature',
|
||||
attrs = [?XMLATTR('var', ?NS_MUC_s)]},
|
||||
attrs = [?XMLATTR(<<"var">>, ?NS_MUC_s)]},
|
||||
|
||||
?CONFIG_OPT_TO_FEATURE(Config#config.public,
|
||||
"muc_public", "muc_hidden"),
|
||||
@ -3433,15 +3433,15 @@ process_iq_disco_info(_From, get, Lang, StateData) ->
|
||||
] ++ iq_disco_info_extras(Lang, StateData), StateData}.
|
||||
|
||||
-define(RFIELDT(Type, Var, Val),
|
||||
#xmlel{name = 'field', attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('var', Var)],
|
||||
#xmlel{name = 'field', attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"var">>, Var)],
|
||||
children = [#xmlel{name = 'value',
|
||||
children = [#xmlcdata{cdata = list_to_binary(Val)}]}]}).
|
||||
|
||||
-define(RFIELD(Label, Var, Val),
|
||||
#xmlel{name = 'field', attrs = [?XMLATTR('label',
|
||||
#xmlel{name = 'field', attrs = [?XMLATTR(<<"label">>,
|
||||
translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)],
|
||||
?XMLATTR(<<"var">>, Var)],
|
||||
children = [#xmlel{name = 'value', children = [
|
||||
#xmlcdata{cdata = list_to_binary(Val)}]}]}).
|
||||
|
||||
@ -3449,7 +3449,7 @@ iq_disco_info_extras(Lang, StateData) ->
|
||||
Len = length(?DICT:to_list(StateData#state.users)),
|
||||
RoomDescription = (StateData#state.config)#config.description,
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x',
|
||||
attrs = [?XMLATTR('type', <<"result">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"result">>)],
|
||||
children =
|
||||
[?RFIELDT("hidden", "FORM_TYPE",
|
||||
"http://jabber.org/protocol/muc#roominfo"),
|
||||
@ -3520,12 +3520,12 @@ get_mucroom_disco_items(StateData) ->
|
||||
lists:map(
|
||||
fun({_LJID, Info}) ->
|
||||
Nick = Info#user.nick,
|
||||
#xmlel{name = 'item', attrs = [?XMLATTR('jid',
|
||||
#xmlel{name = 'item', attrs = [?XMLATTR(<<"jid">>,
|
||||
exmpp_jid:to_binary(
|
||||
StateData#state.room,
|
||||
StateData#state.host,
|
||||
Nick)),
|
||||
?XMLATTR('name',
|
||||
?XMLATTR(<<"name">>,
|
||||
Nick)]}
|
||||
end,
|
||||
?DICT:to_list(StateData#state.users)).
|
||||
@ -3554,7 +3554,7 @@ check_invitation(From, Els, Lang, StateData) ->
|
||||
throw({error, 'bad-request'})
|
||||
end,
|
||||
JID = try exmpp_jid:parse(exmpp_xml:get_attribute_as_binary(InviteEl,
|
||||
'to',
|
||||
<<"to">>,
|
||||
false)) of
|
||||
JID1 -> JID1
|
||||
catch
|
||||
@ -3579,7 +3579,7 @@ check_invitation(From, Els, Lang, StateData) ->
|
||||
IEl =
|
||||
[#xmlel{ns = ?NS_MUC_USER,
|
||||
name = 'invite',
|
||||
attrs = [?XMLATTR('from',
|
||||
attrs = [?XMLATTR(<<"from">>,
|
||||
exmpp_jid:to_binary(From))],
|
||||
children = [#xmlel{ns =?NS_MUC_USER, name = 'reason',
|
||||
children = [#xmlcdata{cdata = Reason} ]}]
|
||||
@ -3621,11 +3621,11 @@ check_invitation(From, Els, Lang, StateData) ->
|
||||
%%TODO: always NS_JABBER_CLIENT?
|
||||
Msg =
|
||||
#xmlel{ns = ?NS_JABBER_CLIENT, name = 'message',
|
||||
attrs = [?XMLATTR('type', <<"normal">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"normal">>)],
|
||||
children = [#xmlel{ns = ?NS_MUC_USER, name = 'x',
|
||||
children = IEl ++ PasswdEl},
|
||||
#xmlel{ns = 'jabber:x:conference', name = 'x',
|
||||
attrs = [?XMLATTR('jid',
|
||||
attrs = [?XMLATTR(<<"jid">>,
|
||||
exmpp_jid:to_binary(
|
||||
StateData#state.room,
|
||||
StateData#state.host)
|
||||
@ -3655,7 +3655,7 @@ check_decline_invitation(Packet) ->
|
||||
#xmlel{name = 'message'} = Packet,
|
||||
#xmlel{ns = ?NS_MUC_USER} = XEl = exmpp_xml:get_element(Packet, 'x'),
|
||||
DEl = exmpp_xml:get_element(XEl, 'decline'),
|
||||
ToString = exmpp_xml:get_attribute_as_binary(DEl, 'to', false),
|
||||
ToString = exmpp_xml:get_attribute_as_binary(DEl, <<"to">>, false),
|
||||
ToJID = exmpp_jid:parse(ToString),
|
||||
{true, {Packet, XEl, DEl, ToJID}}.
|
||||
|
||||
@ -3666,7 +3666,7 @@ send_decline_invitation({Packet, XEl, DEl = #xmlel{name='decline'}, ToJID},
|
||||
FromString = exmpp_jid:to_binary(FromJID),
|
||||
|
||||
DEl1 = exmpp_xml:remove_attribute(DEl, 'to'),
|
||||
DEl2 = exmpp_xml:set_attribute(DEl1, 'from',FromString),
|
||||
DEl2 = exmpp_xml:set_attribute(DEl1, <<"from">>,FromString),
|
||||
XEl2 = replace_subelement(XEl,DEl2),
|
||||
Packet2 = replace_subelement(Packet,XEl2),
|
||||
ejabberd_router:route(RoomJID, ToJID, Packet2).
|
||||
|
@ -206,7 +206,7 @@ handle_info({route, From, To, #xmlel{name=iq} = Packet}, State) ->
|
||||
ejabberd_router:route(To, From, Err);
|
||||
reply ->
|
||||
LServiceS = jts(To),
|
||||
case exmpp_xml:get_attribute_as_list(Packet, type, "error") of
|
||||
case exmpp_xml:get_attribute_as_list(Packet, <<"type">>, "error") of
|
||||
"result" -> process_iqreply_result(From, LServiceS, Packet, State);
|
||||
"error" -> process_iqreply_error(From, LServiceS, Packet)
|
||||
end
|
||||
@ -299,13 +299,13 @@ process_iq(_, #iq{type=Type}, _) when Type==result; Type==error ->
|
||||
process_iq(_, _IQ, _) ->
|
||||
unknown_iq.
|
||||
|
||||
-define(FEATURE(Feat), #xmlel{name = feature, attrs = [#xmlattr{name = var, value = Feat}]}).
|
||||
-define(FEATURE(Feat), #xmlel{name = feature, attrs = [#xmlattr{name = <<"var">>, value = Feat}]}).
|
||||
|
||||
iq_disco_info(From, Lang, State) ->
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'identity',
|
||||
attrs = [?XMLATTR('category', <<"service">>),
|
||||
?XMLATTR('type', <<"multicast">>),
|
||||
?XMLATTR('name', translate:translate(Lang,
|
||||
attrs = [?XMLATTR(<<"category">>, <<"service">>),
|
||||
?XMLATTR(<<"type">>, <<"multicast">>),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang,
|
||||
"Multicast"))]},
|
||||
?FEATURE(?NS_DISCO_INFO_b),
|
||||
?FEATURE(?NS_DISCO_ITEMS_b),
|
||||
@ -342,8 +342,8 @@ route_trusted(LServiceS, LServerS, FromJID, Destinations, Packet) ->
|
||||
DS = jts(D),
|
||||
XML = #xmlel{name = address,
|
||||
ns = ?NS_ADDRESS,
|
||||
attrs = [#xmlattr{name = type, value = <<"bcc">>},
|
||||
#xmlattr{name = jid, value = list_to_binary(DS)}] },
|
||||
attrs = [#xmlattr{name = <<"type">>, value = <<"bcc">>},
|
||||
#xmlattr{name = <<"jid">>, value = list_to_binary(DS)}] },
|
||||
#dest{jid_string = DS,
|
||||
jid_jid = D,
|
||||
type = "bcc",
|
||||
@ -479,10 +479,10 @@ split_addresses_todeliver(Addresses) ->
|
||||
fun(XML) ->
|
||||
case XML of
|
||||
#xmlel{name = address} = Packet ->
|
||||
case exmpp_xml:get_attribute_as_binary(Packet, "delivered", no_delivered) of
|
||||
case exmpp_xml:get_attribute_as_binary(Packet, <<"delivered">>, no_delivered) of
|
||||
<<"true">> -> false;
|
||||
_ ->
|
||||
Type = exmpp_xml:get_attribute_as_binary(Packet, "type", no_type),
|
||||
Type = exmpp_xml:get_attribute_as_binary(Packet, <<"type">>, no_type),
|
||||
case Type of
|
||||
<<"to">> -> true;
|
||||
<<"cc">> -> true;
|
||||
@ -516,11 +516,11 @@ check_limit_dests(SLimits, FromJID, Packet, Addresses) ->
|
||||
convert_dest_record(XMLs) ->
|
||||
lists:map(
|
||||
fun(XML) ->
|
||||
case exmpp_xml:get_attribute_as_list(XML, jid, "") of
|
||||
case exmpp_xml:get_attribute_as_list(XML, <<"jid">>, "") of
|
||||
[] ->
|
||||
#dest{jid_string = none, full_xml = XML};
|
||||
JIDS ->
|
||||
Type = exmpp_xml:get_attribute_as_list(XML, type, ""),
|
||||
Type = exmpp_xml:get_attribute_as_list(XML, <<"type">>, ""),
|
||||
JIDJ = stj(JIDS),
|
||||
#dest{jid_string = JIDS,
|
||||
jid_jid = JIDJ,
|
||||
@ -603,7 +603,7 @@ build_other_xml(Dests) ->
|
||||
Dests).
|
||||
|
||||
add_delivered(Stanza) ->
|
||||
exmpp_xml:set_attribute(Stanza, delivered, 'true').
|
||||
exmpp_xml:set_attribute(Stanza, <<"delivered">>, <<"true">>).
|
||||
|
||||
%%%==================================
|
||||
%%%% Add preliminary packets
|
||||
@ -782,7 +782,7 @@ process_discoinfo_result2(From, FromS, LServiceS, Els, Waiter) ->
|
||||
fun(XML) ->
|
||||
case XML of
|
||||
#xmlel{name = feature, attrs = Attrs} ->
|
||||
?NS_ADDRESS_b == exmpp_xml:get_attribute_from_list_as_binary(Attrs, var, "");
|
||||
?NS_ADDRESS_b == exmpp_xml:get_attribute_from_list_as_binary(Attrs, <<"var">>, "");
|
||||
_ -> false
|
||||
end
|
||||
end,
|
||||
@ -850,8 +850,9 @@ get_limits_els(Els) ->
|
||||
fun(XML, R) ->
|
||||
case XML of
|
||||
#xmlel{name = x, attrs = Attrs, children = SubEls} ->
|
||||
case (?NS_DATA_FORMS_b == exmpp_xml:get_attribute_from_list_as_binary(Attrs, xmlns, "")) and
|
||||
(<<"result">> == exmpp_xml:get_attribute_from_list_as_binary(Attrs, type, "")) of
|
||||
%%TODO: do ask for "xmlns" works here?. Seems it should ask for namespace?
|
||||
case (?NS_DATA_FORMS_b == exmpp_xml:get_attribute_from_list_as_binary(Attrs, <<"xmlns">>, "")) and
|
||||
(<<"result">> == exmpp_xml:get_attribute_from_list_as_binary(Attrs, <<"type">>, "")) of
|
||||
true -> get_limits_fields(SubEls) ++ R;
|
||||
false -> R
|
||||
end;
|
||||
@ -867,8 +868,8 @@ get_limits_fields(Fields) ->
|
||||
fun(Field) ->
|
||||
case Field of
|
||||
#xmlel{name = field, attrs = Attrs} ->
|
||||
(<<"FORM_TYPE">> == exmpp_xml:get_attribute_from_list_as_binary(Attrs, var, ""))
|
||||
and (<<"hidden">> == exmpp_xml:get_attribute_from_list_as_binary(Attrs, type, ""));
|
||||
(<<"FORM_TYPE">> == exmpp_xml:get_attribute_from_list_as_binary(Attrs, <<"var">>, ""))
|
||||
and (<<"hidden">> == exmpp_xml:get_attribute_from_list_as_binary(Attrs, <<"type">>, ""));
|
||||
_ -> false
|
||||
end
|
||||
end,
|
||||
@ -887,7 +888,7 @@ get_limits_values(Values) ->
|
||||
%% TODO: Only one subel is expected here, but there may be several
|
||||
#xmlel{children = SubElsV} = exmpp_xml:get_element(SubEls, value),
|
||||
Number = exmpp_xml:get_cdata_from_list_as_list(SubElsV),
|
||||
Name = exmpp_xml:get_attribute_from_list_as_list(Attrs, var, ""),
|
||||
Name = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"var">>, ""),
|
||||
[{list_to_atom(Name), list_to_integer(Number)} | R];
|
||||
_ -> R
|
||||
end
|
||||
@ -906,7 +907,7 @@ process_discoitems_result(From, LServiceS, Els) ->
|
||||
%% For each one, if it's "item", look for jid
|
||||
case XML of
|
||||
#xmlel{name = item, attrs = Attrs} ->
|
||||
Res ++ [exmpp_xml:get_attribute_from_list_as_list(Attrs, jid, "")];
|
||||
Res ++ [exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"jid">>, "")];
|
||||
_ -> Res
|
||||
end
|
||||
end,
|
||||
@ -1197,13 +1198,13 @@ fragment_dests(Dests, Limit_number) ->
|
||||
%% Some parts of code are borrowed from mod_muc_room.erl
|
||||
|
||||
-define(RFIELDT(Type, Var, Val),
|
||||
#xmlel{name = 'field', attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('var', Var)],
|
||||
#xmlel{name = 'field', attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"var">>, Var)],
|
||||
children = [#xmlel{name = 'value',
|
||||
children = [#xmlcdata{cdata = Val}]}]}).
|
||||
|
||||
-define(RFIELDV(Var, Val),
|
||||
#xmlel{name = 'field', attrs = [?XMLATTR('var', Var)],
|
||||
#xmlel{name = 'field', attrs = [?XMLATTR(<<"var">>, Var)],
|
||||
children = [#xmlel{name = 'value',
|
||||
children = [#xmlcdata{cdata = Val}]}]}).
|
||||
|
||||
@ -1214,7 +1215,7 @@ iq_disco_info_extras(From, State) ->
|
||||
[] -> [];
|
||||
List_limits_xmpp ->
|
||||
Children = [?RFIELDT("hidden", "FORM_TYPE", ?NS_ADDRESS)] ++ List_limits_xmpp,
|
||||
[#xmlel{name = x, ns = ?NS_DATA_FORMS, attrs = [#xmlattr{name = type, value = <<"result">>}], children = Children}]
|
||||
[#xmlel{name = x, ns = ?NS_DATA_FORMS, attrs = [#xmlattr{name = <<"type">>, value = <<"result">>}], children = Children}]
|
||||
end.
|
||||
|
||||
sender_type(From) ->
|
||||
|
@ -320,7 +320,7 @@ find_x_event_chatstates([_ | Els], {A, B, _}) ->
|
||||
find_x_expire(_, []) ->
|
||||
0;
|
||||
find_x_expire(TimeStamp, [#xmlel{ns = ?NS_MESSAGE_EXPIRE} = El | _Els]) ->
|
||||
Val = exmpp_xml:get_attribute_as_list(El, 'seconds', ""),
|
||||
Val = exmpp_xml:get_attribute_as_list(El, <<"seconds">>, ""),
|
||||
case catch list_to_integer(Val) of
|
||||
{'EXIT', _} ->
|
||||
0;
|
||||
@ -541,7 +541,7 @@ find_x_timestamp([{xmlcdata, _} | Els]) ->
|
||||
find_x_timestamp(Els);
|
||||
|
||||
find_x_timestamp([#xmlel{ns = ?NS_DELAY} = El | Els]) ->
|
||||
Stamp = exmpp_xml:get_attribute_as_list(El, 'stamp', ""),
|
||||
Stamp = exmpp_xml:get_attribute_as_list(El, <<"stamp">>, ""),
|
||||
case jlib:datetime_string_to_timestamp(Stamp) of
|
||||
undefined -> find_x_timestamp(Els);
|
||||
{MegaSecs, Secs, _MicroSecs} -> MegaSecs * 1000000 + Secs
|
||||
@ -611,11 +611,11 @@ user_queue(User, Server, Query, Lang) ->
|
||||
exmpp_xml:indent_document(Packet1, <<" ">>),
|
||||
[?DEFAULT_NS], ?PREFIXED_NS),
|
||||
?XE("tr",
|
||||
[?XAE("td", [?XMLATTR('class', <<"valign">>)], [?INPUT("checkbox", "selected", ID)]),
|
||||
?XAC("td", [?XMLATTR('class', <<"valign">>)], Time),
|
||||
?XAC("td", [?XMLATTR('class', <<"valign">>)], SFrom),
|
||||
?XAC("td", [?XMLATTR('class', <<"valign">>)], STo),
|
||||
?XAE("td", [?XMLATTR('class', <<"valign">>)], [?XC("pre", FPacket)])]
|
||||
[?XAE("td", [?XMLATTR(<<"class">>, <<"valign">>)], [?INPUT("checkbox", "selected", ID)]),
|
||||
?XAC("td", [?XMLATTR(<<"class">>, <<"valign">>)], Time),
|
||||
?XAC("td", [?XMLATTR(<<"class">>, <<"valign">>)], SFrom),
|
||||
?XAC("td", [?XMLATTR(<<"class">>, <<"valign">>)], STo),
|
||||
?XAE("td", [?XMLATTR(<<"class">>, <<"valign">>)], [?XC("pre", FPacket)])]
|
||||
)
|
||||
end, Msgs),
|
||||
[?XC("h1", io_lib:format(?T("~s's Offline Messages Queue"),
|
||||
@ -624,7 +624,7 @@ user_queue(User, Server, Query, Lang) ->
|
||||
ok -> [?CT("Submitted"), ?P];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE("form", [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?XE("table",
|
||||
[?XE("thead",
|
||||
[?XE("tr",
|
||||
@ -638,7 +638,7 @@ user_queue(User, Server, Query, Lang) ->
|
||||
if
|
||||
FMsgs == [] ->
|
||||
[?XE("tr",
|
||||
[?XAC("td", [?XMLATTR('colspan', <<"4">>)], " ")]
|
||||
[?XAC("td", [?XMLATTR(<<"colspan">>, <<"4">>)], " ")]
|
||||
)];
|
||||
true ->
|
||||
FMsgs
|
||||
|
@ -289,7 +289,7 @@ find_x_event_chatstates([_ | Els], {A, B, _}) ->
|
||||
find_x_expire(_, []) ->
|
||||
never;
|
||||
find_x_expire(TimeStamp, [#xmlel{ns = ?NS_MESSAGE_EXPIRE} = El | _Els]) ->
|
||||
Val = exmpp_xml:get_attribute_as_list(El, 'seconds', ""),
|
||||
Val = exmpp_xml:get_attribute_as_list(El, <<"seconds">>, ""),
|
||||
case catch list_to_integer(Val) of
|
||||
{'EXIT', _} ->
|
||||
never;
|
||||
@ -319,7 +319,7 @@ pop_offline_messages(Ls, User, Server)
|
||||
try
|
||||
[El] = exmpp_xml:parse_document(XML,
|
||||
[names_as_atom, {check_elems, xmpp},
|
||||
{check_nss,xmpp}, {check_attrs,xmpp}]),
|
||||
{check_nss,xmpp} ]),
|
||||
To = exmpp_jid:parse(
|
||||
exmpp_stanza:get_recipient(El)),
|
||||
From = exmpp_jid:parse(
|
||||
@ -400,7 +400,7 @@ user_queue(User, Server, Query, Lang) ->
|
||||
fun({_, XML}) ->
|
||||
try exmpp_xml:parse_document(XML,
|
||||
[names_as_atom, {check_elems, xmpp},
|
||||
{check_nss,xmpp}, {check_attrs,xmpp}]) of
|
||||
{check_nss,xmpp}]) of
|
||||
[El] ->
|
||||
[El]
|
||||
catch
|
||||
@ -426,8 +426,8 @@ user_queue(User, Server, Query, Lang) ->
|
||||
exmpp_xml:indent_document(Packet, <<" ">>),
|
||||
[?DEFAULT_NS], ?PREFIXED_NS),
|
||||
?XE("tr",
|
||||
[?XAE("td", [?XMLATTR('class', <<"valign">>)], [?INPUT("checkbox", "selected", ID)]),
|
||||
?XAE("td", [?XMLATTR('class', <<"valign">>)], [?XC("pre", FPacket)])]
|
||||
[?XAE("td", [?XMLATTR(<<"class">>, <<"valign">>)], [?INPUT("checkbox", "selected", ID)]),
|
||||
?XAE("td", [?XMLATTR(<<"class">>, <<"valign">>)], [?XC("pre", FPacket)])]
|
||||
)
|
||||
end, Msgs),
|
||||
[?XC("h1", io_lib:format(?T("~s's Offline Messages Queue"),
|
||||
@ -436,7 +436,7 @@ user_queue(User, Server, Query, Lang) ->
|
||||
ok -> [?XREST("Submitted")];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE("form", [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?XE("table",
|
||||
[?XE("thead",
|
||||
[?XE("tr",
|
||||
@ -447,7 +447,7 @@ user_queue(User, Server, Query, Lang) ->
|
||||
if
|
||||
FMsgs == [] ->
|
||||
[?XE("tr",
|
||||
[?XAC("td", [?XMLATTR('colspan', <<"4">>)], " ")]
|
||||
[?XAC("td", [?XMLATTR(<<"colspan">>, <<"4">>)], " ")]
|
||||
)];
|
||||
true ->
|
||||
FMsgs
|
||||
@ -472,7 +472,7 @@ user_queue_parse_query(Username, LServer, Query) ->
|
||||
fun({XML, Seq}) ->
|
||||
try exmpp_xml:parse_document(XML,
|
||||
[names_as_atom, {check_elems, xmpp},
|
||||
{check_nss,xmpp}, {check_attrs,xmpp}]) of
|
||||
{check_nss,xmpp} ]) of
|
||||
[El] ->
|
||||
[{El, Seq}]
|
||||
catch
|
||||
|
@ -204,7 +204,7 @@ process_iq_get(_, From, _To, #iq{payload = SubEl},
|
||||
[#xmlel{name = Name} = Child] ->
|
||||
case Name of
|
||||
list ->
|
||||
ListName = exmpp_xml:get_attribute_as_list(Child, name, false),
|
||||
ListName = exmpp_xml:get_attribute_as_list(Child, <<"name">>, false),
|
||||
process_list_get(LUser, LServer, ListName);
|
||||
_ ->
|
||||
{error, 'bad-request'}
|
||||
@ -236,20 +236,20 @@ process_lists_get(LUser, LServer, Active) ->
|
||||
[] ->
|
||||
{result, #xmlel{ns = ?NS_PRIVACY, name = 'query'}};
|
||||
_ ->
|
||||
LItems = [exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = list}, name, N) || N <- Lists],
|
||||
LItems = [exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = list}, <<"name">>, N) || N <- Lists],
|
||||
DItems =
|
||||
case Default of
|
||||
none ->
|
||||
LItems;
|
||||
_ ->
|
||||
[exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = default}, name, Default) | LItems]
|
||||
[exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = default}, <<"name">>, Default) | LItems]
|
||||
end,
|
||||
ADItems =
|
||||
case Active of
|
||||
none ->
|
||||
DItems;
|
||||
_ ->
|
||||
[exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = active}, name, Active) | DItems]
|
||||
[exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = active}, <<"name">>, Active) | DItems]
|
||||
end,
|
||||
{result, #xmlel{ns = ?NS_PRIVACY, name = 'query', children = ADItems}}
|
||||
end
|
||||
@ -279,20 +279,20 @@ process_list_get(LUser, LServer, Name) ->
|
||||
{error, 'item-not-found'};
|
||||
{atomic, List} ->
|
||||
LItems = lists:map(fun item_to_xml/1, List),
|
||||
ListEl = exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = list, children = LItems}, name, Name),
|
||||
ListEl = exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = list, children = LItems}, <<"name">>, Name),
|
||||
{result,#xmlel{ns = ?NS_PRIVACY, name = 'query', children = [ListEl]}}
|
||||
end.
|
||||
|
||||
|
||||
item_to_xml(Item) ->
|
||||
Attrs1 = [?XMLATTR('action', action_to_binary(Item#privacy_list_data.action)),
|
||||
?XMLATTR('order', order_to_binary(Item#privacy_list_data.order))],
|
||||
Attrs1 = [?XMLATTR(<<"action">>, action_to_binary(Item#privacy_list_data.action)),
|
||||
?XMLATTR(<<"order">>, order_to_binary(Item#privacy_list_data.order))],
|
||||
Attrs2 = case Item#privacy_list_data.type of
|
||||
none ->
|
||||
Attrs1;
|
||||
Type ->
|
||||
[?XMLATTR('type', type_to_binary(Type)),
|
||||
?XMLATTR('value', Item#privacy_list_data.value) |
|
||||
[?XMLATTR(<<"type">>, type_to_binary(Type)),
|
||||
?XMLATTR(<<"value">>, Item#privacy_list_data.value) |
|
||||
Attrs1]
|
||||
end,
|
||||
SubEls = case Item#privacy_list_data.match_all of
|
||||
@ -359,7 +359,7 @@ process_iq_set(_, From, _To, #iq{payload = SubEl}) ->
|
||||
LServer = exmpp_jid:prep_domain_as_list(From),
|
||||
case exmpp_xml:get_child_elements(SubEl) of
|
||||
[#xmlel{name = Name} = Child] ->
|
||||
ListName = exmpp_xml:get_attribute_as_list(Child, 'name', false),
|
||||
ListName = exmpp_xml:get_attribute_as_list(Child, <<"name">>, false),
|
||||
case Name of
|
||||
list ->
|
||||
process_list_set(LUser, LServer, ListName,
|
||||
@ -477,7 +477,7 @@ process_list_set(LUser, LServer, Name, Els) ->
|
||||
exmpp_jid:make(LUser, LServer),
|
||||
exmpp_jid:make(LUser, LServer),
|
||||
#xmlel{name = 'broadcast', ns = privacy_list,
|
||||
attrs = [exmpp_xml:attribute(list_name, Name)],
|
||||
attrs = [?XMLATTR(<<"list_name">>, Name)],
|
||||
children = [exmpp_xml:cdata(ListString)]}),
|
||||
Res;
|
||||
_ ->
|
||||
@ -512,7 +512,7 @@ process_list_set(LUser, LServer, Name, Els) ->
|
||||
exmpp_jid:make(LUser, LServer),
|
||||
exmpp_jid:make(LUser, LServer),
|
||||
#xmlel{name = 'broadcast', ns = privacy_list,
|
||||
attrs = [exmpp_xml:attribute(list_name, Name)],
|
||||
attrs = [?XMLATTR(<<"list_name">>, Name)],
|
||||
children = [exmpp_xml:cdata(ListString)]}),
|
||||
Res;
|
||||
_ ->
|
||||
@ -532,10 +532,10 @@ parse_items([], Res) ->
|
||||
%% lists:keysort(#listitem.order, Res);
|
||||
lists:reverse(Res);
|
||||
parse_items([El = #xmlel{name = item} | Els], Res) ->
|
||||
Type = exmpp_xml:get_attribute_as_list(El, type, false),
|
||||
Value = exmpp_xml:get_attribute_as_binary(El, value, false),
|
||||
SAction =exmpp_xml:get_attribute_as_list(El, action, false),
|
||||
SOrder = exmpp_xml:get_attribute_as_list(El, order, false),
|
||||
Type = exmpp_xml:get_attribute_as_list(El, <<"type">>, false),
|
||||
Value = exmpp_xml:get_attribute_as_binary(El, <<"value">>, false),
|
||||
SAction =exmpp_xml:get_attribute_as_list(El, <<"action">>, false),
|
||||
SOrder = exmpp_xml:get_attribute_as_list(El, <<"order">>, false),
|
||||
Action = case catch list_to_action(SAction) of
|
||||
{'EXIT', _} -> false;
|
||||
Val -> Val
|
||||
@ -698,7 +698,7 @@ check_packet(_, User, Server,
|
||||
'message' -> message;
|
||||
'iq' -> iq;
|
||||
'presence' ->
|
||||
case exmpp_xml:get_attribute(El, type, '') of
|
||||
case exmpp_xml:get_attribute(El, <<"type">>, '') of
|
||||
%% notification
|
||||
'' -> presence;
|
||||
'unavailable' -> presence;
|
||||
|
@ -91,7 +91,7 @@ process_iq_get(_, From, _To, #iq{payload = SubEl},
|
||||
[#xmlel{name = Name} = Child] ->
|
||||
case Name of
|
||||
list ->
|
||||
ListName = exmpp_xml:get_attribute_as_list(Child, name, false),
|
||||
ListName = exmpp_xml:get_attribute_as_list(Child, <<"name">>, false),
|
||||
process_list_get(LUser, LServer, ListName);
|
||||
_ ->
|
||||
{error, 'bad-request'}
|
||||
@ -116,21 +116,21 @@ process_lists_get(LUser, LServer, Active) ->
|
||||
{selected, ["name"], Names} ->
|
||||
LItems = lists:map(
|
||||
fun({N}) ->
|
||||
exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = list}, name, N)
|
||||
exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = list}, <<"name">>, N)
|
||||
end, Names),
|
||||
DItems =
|
||||
case Default of
|
||||
none ->
|
||||
LItems;
|
||||
_ ->
|
||||
[exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = default}, name, Default) | LItems]
|
||||
[exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = default}, <<"name">>, Default) | LItems]
|
||||
end,
|
||||
ADItems =
|
||||
case Active of
|
||||
none ->
|
||||
DItems;
|
||||
_ ->
|
||||
[exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = active}, name, Active) | DItems]
|
||||
[exmpp_xml:set_attribute(#xmlel{ns = ?NS_PRIVACY, name = active}, <<"name">>, Active) | DItems]
|
||||
end,
|
||||
{result, #xmlel{ns = ?NS_PRIVACY, name = 'query', children = ADItems}};
|
||||
_ ->
|
||||
@ -155,7 +155,7 @@ process_list_get(LUser, LServer, Name) ->
|
||||
ListEl = exmpp_xml:set_attribute(#xmlel{name = list,
|
||||
ns = ?NS_PRIVACY,
|
||||
children = LItems},
|
||||
name,
|
||||
<<"name">>,
|
||||
Name),
|
||||
{result, #xmlel{ns = ?NS_PRIVACY, name = 'query', children = [ListEl]}};
|
||||
_ ->
|
||||
@ -167,14 +167,14 @@ process_list_get(LUser, LServer, Name) ->
|
||||
|
||||
|
||||
item_to_xml(Item) ->
|
||||
Attrs1 = [?XMLATTR('action', action_to_binary(Item#listitem.action)),
|
||||
?XMLATTR('order', order_to_binary(Item#listitem.order))],
|
||||
Attrs1 = [?XMLATTR(<<"action">>, action_to_binary(Item#listitem.action)),
|
||||
?XMLATTR(<<"order">>, order_to_binary(Item#listitem.order))],
|
||||
Attrs2 = case Item#listitem.type of
|
||||
none ->
|
||||
Attrs1;
|
||||
Type ->
|
||||
[?XMLATTR('type', type_to_binary(Item#listitem.type)),
|
||||
?XMLATTR('value', value_to_binary(Type, Item#listitem.value)) |
|
||||
[?XMLATTR(<<"type">>, type_to_binary(Item#listitem.type)),
|
||||
?XMLATTR(<<"value">>, value_to_binary(Type, Item#listitem.value)) |
|
||||
Attrs1]
|
||||
end,
|
||||
SubEls = case Item#listitem.match_all of
|
||||
@ -256,7 +256,7 @@ process_iq_set(_, From, _To, #iq{payload = SubEl}) ->
|
||||
LServer = exmpp_jid:prep_domain_as_list(From),
|
||||
case exmpp_xml:get_child_elements(SubEl) of
|
||||
[#xmlel{name = Name} = Child] ->
|
||||
ListName = exmpp_xml:get_attribute_as_list(Child, 'name', false),
|
||||
ListName = exmpp_xml:get_attribute_as_list(Child, <<"name">>, false),
|
||||
case Name of
|
||||
list ->
|
||||
process_list_set(LUser, LServer, ListName,
|
||||
@ -370,7 +370,7 @@ process_list_set(LUser, LServer, Name, Els) ->
|
||||
exmpp_jid:make(LUser, LServer),
|
||||
exmpp_jid:make(LUser, LServer),
|
||||
#xmlel{name = 'broadcast', ns = privacy_list,
|
||||
attrs = [exmpp_xml:attribute(list_name, Name)],
|
||||
attrs = [?XMLATTR(<<"list_name">>, Name)],
|
||||
children = [exmpp_xml:cdata(ListString)]}),
|
||||
Res;
|
||||
_ ->
|
||||
@ -407,7 +407,7 @@ process_list_set(LUser, LServer, Name, Els) ->
|
||||
exmpp_jid:make(LUser, LServer),
|
||||
exmpp_jid:make(LUser, LServer),
|
||||
#xmlel{name = 'broadcast', ns = privacy_list,
|
||||
attrs = [exmpp_xml:attribute(list_name, Name)],
|
||||
attrs = [?XMLATTR(<<"list_name">>, Name)],
|
||||
children = [exmpp_xml:cdata(ListString)]}),
|
||||
Res;
|
||||
_ ->
|
||||
@ -426,10 +426,10 @@ parse_items([], Res) ->
|
||||
%% Sort the items by their 'order' attribute
|
||||
lists:keysort(#listitem.order, Res);
|
||||
parse_items([El = #xmlel{name = item} | Els], Res) ->
|
||||
Type = exmpp_xml:get_attribute_as_list(El, type, false),
|
||||
Value = exmpp_xml:get_attribute_as_list(El, value, false),
|
||||
SAction =exmpp_xml:get_attribute_as_list(El, action, false),
|
||||
SOrder = exmpp_xml:get_attribute_as_list(El, order, false),
|
||||
Type = exmpp_xml:get_attribute_as_list(El, <<"type">>, false),
|
||||
Value = exmpp_xml:get_attribute_as_list(El, <<"value">>, false),
|
||||
SAction =exmpp_xml:get_attribute_as_list(El, <<"action">>, false),
|
||||
SOrder = exmpp_xml:get_attribute_as_list(El, <<"order">>, false),
|
||||
Action = case catch list_to_action(SAction) of
|
||||
{'EXIT', _} -> false;
|
||||
Val -> Val
|
||||
|
@ -158,7 +158,7 @@ get_data(LUser, LServer, [El | Els], Res) ->
|
||||
{selected, ["data"], [{SData}]} ->
|
||||
[Data] = exmpp_xml:parse_document(SData,
|
||||
[names_as_atom, {check_elems, xmpp},
|
||||
{check_nss,xmpp}, {check_attrs,xmpp}]),
|
||||
{check_nss,xmpp} ]),
|
||||
get_data(LUser, LServer, Els, [Data | Res]);
|
||||
%% MREMOND: I wonder when the query could return a vcard ?
|
||||
{selected, ["vcard"], []} ->
|
||||
|
@ -163,7 +163,7 @@ process_iq(InitiatorJID, #iq{type = set, payload = SubEl, ns = ?NS_BYTESTREAMS}
|
||||
case acl:match_rule(ServerHost, ACL, InitiatorJID) of
|
||||
allow ->
|
||||
ActivateEl = exmpp_xml:get_path(SubEl, [{element, 'activate'}]),
|
||||
SID = exmpp_xml:get_attribute_as_list(SubEl, 'sid', ""),
|
||||
SID = exmpp_xml:get_attribute_as_list(SubEl, <<"sid">>, ""),
|
||||
case catch exmpp_jid:parse(exmpp_xml:get_cdata_as_list(ActivateEl)) of
|
||||
TargetJID when ?IS_JID(TargetJID), SID /= "",
|
||||
length(SID) =< 128, TargetJID /= InitiatorJID ->
|
||||
@ -201,13 +201,13 @@ process_iq(_, _, _) ->
|
||||
%%% Auxiliary functions.
|
||||
%%%-------------------------
|
||||
-define(FEATURE(Feat), #xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
|
||||
attrs = [?XMLATTR('var', Feat)]}).
|
||||
attrs = [?XMLATTR(<<"var">>, Feat)]}).
|
||||
|
||||
iq_disco_info(Lang, Name) ->
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
|
||||
[?XMLATTR('category', <<"proxy">>),
|
||||
?XMLATTR('type', <<"bytestreams">>),
|
||||
?XMLATTR('name', translate:translate(Lang, Name))]},
|
||||
[?XMLATTR(<<"category">>, <<"proxy">>),
|
||||
?XMLATTR(<<"type">>, <<"bytestreams">>),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang, Name))]},
|
||||
?FEATURE(?NS_DISCO_INFO_s),
|
||||
?FEATURE(?NS_VCARD_s),
|
||||
?FEATURE(?NS_BYTESTREAMS_s)].
|
||||
@ -238,8 +238,8 @@ parse_options(ServerHost, Opts) ->
|
||||
HostNameStr ->
|
||||
HostNameStr
|
||||
end,
|
||||
StreamAddr = [?XMLATTR('jid', MyHost), ?XMLATTR('host', HostName),
|
||||
?XMLATTR('port', Port)],
|
||||
StreamAddr = [?XMLATTR(<<"jid">>, MyHost), ?XMLATTR(<<"host">>, HostName),
|
||||
?XMLATTR(<<"port">>, Port)],
|
||||
#state{myhost = MyHost,
|
||||
serverhost = ServerHost,
|
||||
name = Name,
|
||||
|
@ -692,7 +692,7 @@ disco_local_identity(Acc, _From, #jid{domain = Host} = _To, <<>> = _NodeId, _Lan
|
||||
case lists:member(?PEPNODE, plugins(Host)) of
|
||||
true ->
|
||||
[#xmlel{name = 'identity', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"pep">>)]}
|
||||
attrs = [?XMLATTR(<<"category">>, <<"pubsub">>), ?XMLATTR(<<"type">>, <<"pep">>)]}
|
||||
| Acc];
|
||||
false -> Acc
|
||||
end;
|
||||
@ -762,19 +762,19 @@ disco_sm_identity(Acc, From, To, NodeId, _Lang) ->
|
||||
|
||||
disco_identity(_Host, <<>> = _NodeId, _From) ->
|
||||
[#xmlel{name = 'identity', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"pep">>)]}];
|
||||
attrs = [?XMLATTR(<<"category">>, <<"pubsub">>), ?XMLATTR(<<"type">>, <<"pep">>)]}];
|
||||
disco_identity(#jid{node = U, domain = S, resource = R} = Host, NodeId, From) ->
|
||||
Action = fun(#pubsub_node{idx = NodeIdx, type = Type, options = Options, owners = Owners}) ->
|
||||
case get_allowed_items_call(Host, NodeIdx, From, Type, Options, Owners) of
|
||||
{result, _} ->
|
||||
{result,
|
||||
[#xmlel{name = 'identity', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"pep">>)]},
|
||||
attrs = [?XMLATTR(<<"category">>, <<"pubsub">>), ?XMLATTR(<<"type">>, <<"pep">>)]},
|
||||
#xmlel{name = 'identity', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"leaf">>)
|
||||
attrs = [?XMLATTR(<<"category">>, <<"pubsub">>), ?XMLATTR(<<"type">>, <<"leaf">>)
|
||||
| case get_option(Options, 'title') of
|
||||
false -> [];
|
||||
Title -> [?XMLATTR('name', Title)]
|
||||
Title -> [?XMLATTR(<<"name">>, Title)]
|
||||
end
|
||||
]}]};
|
||||
{error, _} -> {result, []}
|
||||
@ -858,11 +858,11 @@ disco_items(#jid{raw = JID, node = U, domain = S, resource = R} = Host, <<>>, Fr
|
||||
case get_allowed_items_call(Host, NodeIdx, From, Type, Options, Owners) of
|
||||
{result, _} ->
|
||||
[#xmlel{name = 'item', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('jid', JID),
|
||||
?XMLATTR('node', NodeId) |
|
||||
attrs = [?XMLATTR(<<"jid">>, JID),
|
||||
?XMLATTR(<<"node">>, NodeId) |
|
||||
case get_option(Options, 'title') of
|
||||
false -> [];
|
||||
[Title] -> [?XMLATTR('title', Title)]
|
||||
[Title] -> [?XMLATTR(<<"title">>, Title)]
|
||||
end]}
|
||||
| Acc];
|
||||
_ -> Acc
|
||||
@ -879,8 +879,8 @@ disco_items(#jid{raw = JID, node = U, domain = S, resource = R} = Host, NodeId,
|
||||
{result, Items} ->
|
||||
{result,
|
||||
[#xmlel{name = 'item', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('jid', JID),
|
||||
?XMLATTR('name', ItemId)]}
|
||||
attrs = [?XMLATTR(<<"jid">>, JID),
|
||||
?XMLATTR(<<"name">>, ItemId)]}
|
||||
|| #pubsub_item{id = {ItemId,_}} <- Items]};
|
||||
_ -> {result, []}
|
||||
end
|
||||
@ -1164,7 +1164,7 @@ do_route(ServerHost, Access, Plugins, Host, From, To, #xmlel{name = 'iq'} = Pack
|
||||
case exmpp_iq:xmlel_to_iq(Packet) of
|
||||
%% Service discovery : disco#info
|
||||
#iq{type = 'get', ns = ?NS_DISCO_INFO, payload = #xmlel{attrs = Attrs}, lang = Lang} ->
|
||||
NodeId = exmpp_xml:get_attribute_from_list(Attrs, 'node', <<>>),
|
||||
NodeId = exmpp_xml:get_attribute_from_list(Attrs, <<"node">>, <<>>),
|
||||
Info = ejabberd_hooks:run_fold(
|
||||
disco_info, ServerHost, [],
|
||||
[ServerHost, ?MODULE, <<>>, ""]),
|
||||
@ -1181,7 +1181,7 @@ do_route(ServerHost, Access, Plugins, Host, From, To, #xmlel{name = 'iq'} = Pack
|
||||
ejabberd_router:route(To, From, Res);
|
||||
%% Service discovery : disco#items
|
||||
#iq{type = 'get', ns = ?NS_DISCO_ITEMS, payload = #xmlel{attrs = Attrs}} ->
|
||||
NodeId = exmpp_xml:get_attribute_from_list(Attrs, 'node', <<>>),
|
||||
NodeId = exmpp_xml:get_attribute_from_list(Attrs, <<"node">>, <<>>),
|
||||
Res = case iq_disco_items(Host, NodeId, From) of
|
||||
{result, IQRes} ->
|
||||
Result = #xmlel{ns = ?NS_DISCO_ITEMS,
|
||||
@ -1258,8 +1258,8 @@ do_route(ServerHost, _Access, _Plugins, Host, From, To,
|
||||
undefined ->
|
||||
ok;
|
||||
#xmlel{attrs = Attrs, children = Els} = _Item ->
|
||||
NodeId = exmpp_xml:get_attribute(Publish, 'node', <<>>),
|
||||
ItemId = exmpp_xml:get_attribute_from_list(Attrs, 'id', <<>>),
|
||||
NodeId = exmpp_xml:get_attribute(Publish, <<"node">>, <<>>),
|
||||
ItemId = exmpp_xml:get_attribute_from_list(Attrs, <<"id">>, <<>>),
|
||||
case publish_item(Host, ServerHost, NodeId, From, ItemId, Els) of
|
||||
{result, _} ->
|
||||
ok;
|
||||
@ -1302,19 +1302,19 @@ command_disco_info(_Host, ?NS_ADHOC_b = _NodeId, _From) ->
|
||||
{result,
|
||||
[#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'identity',
|
||||
attrs = [?XMLATTR('category', <<"automation">>),
|
||||
?XMLATTR('type', <<"command-list">>)]}]};
|
||||
attrs = [?XMLATTR(<<"category">>, <<"automation">>),
|
||||
?XMLATTR(<<"type">>, <<"command-list">>)]}]};
|
||||
command_disco_info(_Host, ?NS_PUBSUB_GET_PENDING_b = _NodeId, _From) ->
|
||||
{result,
|
||||
% Identity
|
||||
[#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'identity',
|
||||
attrs = [?XMLATTR('category', <<"automation">>),
|
||||
?XMLATTR('type', <<"command-node">>)]},
|
||||
attrs = [?XMLATTR(<<"category">>, <<"automation">>),
|
||||
?XMLATTR(<<"type">>, <<"command-node">>)]},
|
||||
% Features
|
||||
#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'feature',
|
||||
attrs = [?XMLATTR('var', ?NS_ADHOC)]}]}.
|
||||
attrs = [?XMLATTR(<<"var">>, ?NS_ADHOC)]}]}.
|
||||
|
||||
|
||||
-spec(node_disco_info/3 ::
|
||||
@ -1343,16 +1343,16 @@ node_disco_info(Host, NodeId, From) ->
|
||||
%% Identities
|
||||
[#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'identity',
|
||||
attrs = [?XMLATTR('category', <<"pubsub">>),
|
||||
?XMLATTR('type', Type)]} || Type <- Types ]
|
||||
attrs = [?XMLATTR(<<"category">>, <<"pubsub">>),
|
||||
?XMLATTR(<<"type">>, Type)]} || Type <- Types ]
|
||||
++
|
||||
%% Features
|
||||
[#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'feature',
|
||||
attrs = [?XMLATTR('var', ?NS_PUBSUB_b)]} |
|
||||
attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_b)]} |
|
||||
[#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'feature',
|
||||
attrs = [?XMLATTR('var', list_to_binary(?NS_PUBSUB_s++"#"++Type))]}
|
||||
attrs = [?XMLATTR(<<"var">>, list_to_binary(?NS_PUBSUB_s++"#"++Type))]}
|
||||
|| Type <- features(Plugin)]]}
|
||||
end,
|
||||
case transaction(Host, NodeId, Action, sync_dirty) of
|
||||
@ -1377,29 +1377,29 @@ iq_disco_info(Host, <<>> = _NodeId, _From, Lang) ->
|
||||
%% Identities
|
||||
[#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'identity',
|
||||
attrs = [?XMLATTR('category', "pubsub"),
|
||||
?XMLATTR('type', "service"),
|
||||
?XMLATTR('name', translate:translate(Lang, "Publish-Subscribe"))]},
|
||||
attrs = [?XMLATTR(<<"category">>, "pubsub"),
|
||||
?XMLATTR(<<"type">>, "service"),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang, "Publish-Subscribe"))]},
|
||||
%% Features
|
||||
#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'feature',
|
||||
attrs = [?XMLATTR('var', ?NS_DISCO_INFO_b)]},
|
||||
attrs = [?XMLATTR(<<"var">>, ?NS_DISCO_INFO_b)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'feature',
|
||||
attrs = [?XMLATTR('var', ?NS_DISCO_ITEMS_b)]},
|
||||
attrs = [?XMLATTR(<<"var">>, ?NS_DISCO_ITEMS_b)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'feature',
|
||||
attrs = [?XMLATTR('var', ?NS_PUBSUB_b)]},
|
||||
attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_b)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'feature',
|
||||
attrs = [?XMLATTR('var', ?NS_ADHOC_b)]},
|
||||
attrs = [?XMLATTR(<<"var">>, ?NS_ADHOC_b)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'feature',
|
||||
attrs = [?XMLATTR('var', ?NS_VCARD_b)]}]
|
||||
attrs = [?XMLATTR(<<"var">>, ?NS_VCARD_b)]}]
|
||||
++
|
||||
[#xmlel{ns = ?NS_DISCO_INFO,
|
||||
name = 'feature',
|
||||
attrs = [?XMLATTR('var', list_to_binary(?NS_PUBSUB_s++"#"++Feature))]}
|
||||
attrs = [?XMLATTR(<<"var">>, list_to_binary(?NS_PUBSUB_s++"#"++Feature))]}
|
||||
|| Feature <- features(Host, <<>>)]};
|
||||
iq_disco_info(Host, NodeId, From, _Lang)
|
||||
when NodeId == ?NS_ADHOC_b orelse NodeId == ?NS_PUBSUB_GET_PENDING_b ->
|
||||
@ -1425,9 +1425,9 @@ iq_disco_items(Host, <<>> = _NodeId, From) ->
|
||||
Attrs =
|
||||
case get_option(Options, 'title') of
|
||||
false ->
|
||||
[?XMLATTR('jid', Host) | nodeAttr(SubNodeId)];
|
||||
[?XMLATTR(<<"jid">>, Host) | nodeAttr(SubNodeId)];
|
||||
Title ->
|
||||
[?XMLATTR('jid', Host), ?XMLATTR('name', Title) | nodeAttr(SubNodeId)]
|
||||
[?XMLATTR(<<"jid">>, Host), ?XMLATTR(<<"name">>, Title) | nodeAttr(SubNodeId)]
|
||||
end,
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = Attrs}
|
||||
end, Nodes)};
|
||||
@ -1439,9 +1439,9 @@ iq_disco_items(Host, ?NS_ADHOC_b = _NodeId, _From) ->
|
||||
{result,
|
||||
[#xmlel{ns = ?NS_DISCO_ITEMS,
|
||||
name = 'item',
|
||||
attrs = [?XMLATTR('jid', Host),
|
||||
?XMLATTR('node', ?NS_PUBSUB_GET_PENDING_b),
|
||||
?XMLATTR('name', "Get Pending")]}]};
|
||||
attrs = [?XMLATTR(<<"jid">>, Host),
|
||||
?XMLATTR(<<"node">>, ?NS_PUBSUB_GET_PENDING_b),
|
||||
?XMLATTR(<<"name">>, "Get Pending")]}]};
|
||||
iq_disco_items(_Host, ?NS_PUBSUB_GET_PENDING_b = _NodeId, _From) ->
|
||||
%% TODO
|
||||
{result, []};
|
||||
@ -1456,9 +1456,9 @@ iq_disco_items(Host, NodeId, From) ->
|
||||
Attrs =
|
||||
case get_option(SubOptions, 'title') of
|
||||
false ->
|
||||
[?XMLATTR('jid', Host) | nodeAttr(SubNodeId)];
|
||||
[?XMLATTR(<<"jid">>, Host) | nodeAttr(SubNodeId)];
|
||||
Title ->
|
||||
[?XMLATTR('jid', Host), ?XMLATTR('name', Title) | nodeAttr(SubNodeId)]
|
||||
[?XMLATTR(<<"jid">>, Host), ?XMLATTR(<<"name">>, Title) | nodeAttr(SubNodeId)]
|
||||
end,
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS,
|
||||
name = 'item',
|
||||
@ -1469,8 +1469,8 @@ iq_disco_items(Host, NodeId, From) ->
|
||||
{result, Name} = node_call(Type, get_item_name, [Host, NodeId, RN]),
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS,
|
||||
name = 'item',
|
||||
attrs = [?XMLATTR('jid', Host),
|
||||
?XMLATTR('name', Name)]}
|
||||
attrs = [?XMLATTR(<<"jid">>, Host),
|
||||
?XMLATTR(<<"name">>, Name)]}
|
||||
end, NodeItems),
|
||||
{result, Nodes ++ Items}
|
||||
end,
|
||||
@ -1573,7 +1573,7 @@ iq_pubsub(Host, ServerHost, From, IQType, #xmlel{children = Els}, Lang, Access,
|
||||
case exmpp_xml:remove_cdata_from_list(Els) of
|
||||
[#xmlel{name = Name, attrs = Attrs, children = SubEls} | Rest] ->
|
||||
%% Fix bug when owner retrieves his affiliations
|
||||
NodeId = exmpp_xml:get_attribute_from_list(Attrs, 'node', <<>>),
|
||||
NodeId = exmpp_xml:get_attribute_from_list(Attrs, <<"node">>, <<>>),
|
||||
case {IQType, Name} of
|
||||
{'set', 'create'} ->
|
||||
Config = case Rest of
|
||||
@ -1581,7 +1581,7 @@ iq_pubsub(Host, ServerHost, From, IQType, #xmlel{children = Els}, Lang, Access,
|
||||
_ -> []
|
||||
end,
|
||||
%% Get the type of the node
|
||||
Plugin = case exmpp_xml:get_attribute_from_list_as_list(Attrs, 'type', "") of
|
||||
Plugin = case exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"type">>, "") of
|
||||
"" -> hd(Plugins);
|
||||
T -> T
|
||||
end,
|
||||
@ -1596,7 +1596,7 @@ iq_pubsub(Host, ServerHost, From, IQType, #xmlel{children = Els}, Lang, Access,
|
||||
{'set', 'publish'} ->
|
||||
case exmpp_xml:remove_cdata_from_list(SubEls) of
|
||||
[#xmlel{name = 'item', attrs = ItemAttrs, children = Payload}] ->
|
||||
ItemId = exmpp_xml:get_attribute_from_list(ItemAttrs, 'id', <<>>),
|
||||
ItemId = exmpp_xml:get_attribute_from_list(ItemAttrs, <<"id">>, <<>>),
|
||||
publish_item(Host, ServerHost, NodeId, From, ItemId,
|
||||
exmpp_xml:remove_cdata_from_list(Payload));
|
||||
[] ->
|
||||
@ -1607,14 +1607,14 @@ iq_pubsub(Host, ServerHost, From, IQType, #xmlel{children = Els}, Lang, Access,
|
||||
{error, extended_error('bad-request', "invalid-payload")}
|
||||
end;
|
||||
{'set', 'retract'} ->
|
||||
ForceNotify = case exmpp_xml:get_attribute_from_list(Attrs, 'notify', <<>>) of
|
||||
ForceNotify = case exmpp_xml:get_attribute_from_list(Attrs, <<"notify">>, <<>>) of
|
||||
<<"1">> -> true;
|
||||
<<"true">> -> true;
|
||||
_ -> false
|
||||
end,
|
||||
case exmpp_xml:remove_cdata_from_list(SubEls) of
|
||||
[#xmlel{name = 'item', attrs = ItemAttrs}] ->
|
||||
ItemId = exmpp_xml:get_attribute_from_list(ItemAttrs, 'id', <<>>),
|
||||
ItemId = exmpp_xml:get_attribute_from_list(ItemAttrs, <<"id">>, <<>>),
|
||||
delete_item(Host, NodeId, From, ItemId, ForceNotify);
|
||||
_ ->
|
||||
%% Request does not specify an item
|
||||
@ -1625,18 +1625,18 @@ iq_pubsub(Host, ServerHost, From, IQType, #xmlel{children = Els}, Lang, Access,
|
||||
[#xmlel{name = 'options', children = C}] -> C;
|
||||
_ -> []
|
||||
end,
|
||||
JID = exmpp_xml:get_attribute_from_list(Attrs, 'jid', <<>>),
|
||||
JID = exmpp_xml:get_attribute_from_list(Attrs, <<"jid">>, <<>>),
|
||||
subscribe_node(Host, NodeId, From, JID, Config);
|
||||
{'set', 'unsubscribe'} ->
|
||||
JID = exmpp_xml:get_attribute_from_list(Attrs, 'jid', <<>>),
|
||||
SubId = exmpp_xml:get_attribute_from_list(Attrs, 'subid', <<>>),
|
||||
JID = exmpp_xml:get_attribute_from_list(Attrs, <<"jid">>, <<>>),
|
||||
SubId = exmpp_xml:get_attribute_from_list(Attrs, <<"subid">>, <<>>),
|
||||
unsubscribe_node(Host, NodeId, From, JID, SubId);
|
||||
{'get', 'items'} ->
|
||||
MaxItems = exmpp_xml:get_attribute_from_list(Attrs, 'max_items', <<>>),
|
||||
SubId = exmpp_xml:get_attribute_from_list(Attrs, 'subid', <<>>),
|
||||
MaxItems = exmpp_xml:get_attribute_from_list(Attrs, <<"max_items">>, <<>>),
|
||||
SubId = exmpp_xml:get_attribute_from_list(Attrs, <<"subid">>, <<>>),
|
||||
ItemIds = lists:foldl(fun
|
||||
(#xmlel{name = 'item', attrs = ItemAttrs}, Acc) ->
|
||||
case exmpp_xml:get_attribute_from_list(ItemAttrs, 'id', <<>>) of
|
||||
case exmpp_xml:get_attribute_from_list(ItemAttrs, <<"id">>, <<>>) of
|
||||
<<>> -> Acc;
|
||||
ItemId -> [ItemId|Acc]
|
||||
end;
|
||||
@ -1648,12 +1648,12 @@ iq_pubsub(Host, ServerHost, From, IQType, #xmlel{children = Els}, Lang, Access,
|
||||
{'get', 'affiliations'} ->
|
||||
get_affiliations(Host, From, Plugins);
|
||||
{'get', 'options'} ->
|
||||
SubId = exmpp_xml:get_attribute_from_list(Attrs, 'subid', <<>>),
|
||||
JID = exmpp_xml:get_attribute_from_list(Attrs, 'jid', <<>>),
|
||||
SubId = exmpp_xml:get_attribute_from_list(Attrs, <<"subid">>, <<>>),
|
||||
JID = exmpp_xml:get_attribute_from_list(Attrs, <<"jid">>, <<>>),
|
||||
get_options(Host, NodeId, JID, SubId, Lang);
|
||||
{'set', 'options'} ->
|
||||
SubId = exmpp_xml:get_attribute_from_list(Attrs, 'subid', <<>>),
|
||||
JID = exmpp_xml:get_attribute_from_list(Attrs, 'jid', <<>>),
|
||||
SubId = exmpp_xml:get_attribute_from_list(Attrs, <<"subid">>, <<>>),
|
||||
JID = exmpp_xml:get_attribute_from_list(Attrs, <<"jid">>, <<>>),
|
||||
set_options(Host, NodeId, JID, SubId, SubEls);
|
||||
_ ->
|
||||
{error, 'feature-not-implemented'}
|
||||
@ -1678,7 +1678,7 @@ iq_pubsub(Host, ServerHost, From, IQType, #xmlel{children = Els}, Lang, Access,
|
||||
iq_pubsub_owner(Host, ServerHost, From, IQType, #xmlel{children = Els}, Lang) ->
|
||||
case Action = exmpp_xml:remove_cdata_from_list(Els) of
|
||||
[#xmlel{name = Name, attrs = Attrs, children = SubEls}] ->
|
||||
NodeId = exmpp_xml:get_attribute_from_list(Attrs, 'node', <<>>),
|
||||
NodeId = exmpp_xml:get_attribute_from_list(Attrs, <<"node">>, <<>>),
|
||||
case {IQType, Name} of
|
||||
{'get', 'configure'} ->
|
||||
get_configure(Host, ServerHost, NodeId, From, Lang);
|
||||
@ -1814,11 +1814,11 @@ send_pending_node_form(Host, Owner, _Lang, Plugins) ->
|
||||
children = [
|
||||
exmpp_xml:cdata(node_to_string(Node))]}]}
|
||||
end, get_pending_nodes(Host, Owner, Ps)),
|
||||
XForm = #xmlel{ns = ?NS_DATA_FORMS, name ='x', attrs = [?XMLATTR('type', <<"form">>)],
|
||||
XForm = #xmlel{ns = ?NS_DATA_FORMS, name ='x', attrs = [?XMLATTR(<<"type">>, <<"form">>)],
|
||||
children = [
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field',
|
||||
attrs = [?XMLATTR('type', <<"list-single">>),
|
||||
?XMLATTR('var', <<"pubsub#node">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"list-single">>),
|
||||
?XMLATTR(<<"var">>, <<"pubsub#node">>)],
|
||||
children = lists:usort(XOpts)}]},
|
||||
#adhoc_response{status = executing,
|
||||
defaultaction = "execute",
|
||||
@ -1881,28 +1881,28 @@ send_authorization_request(#pubsub_node{owners = Owners, id = {Host, Node}}, Sub
|
||||
Lang = <<"en">>, %% TODO fix
|
||||
{U, S, R} = Subscriber,
|
||||
Stanza = #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "PubSub subscriber request"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
|
||||
[#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Choose whether to approve this entity's subscription."))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"FORM_TYPE">>), ?XMLATTR('type', <<"hidden">>)], children =
|
||||
[?XMLATTR(<<"var">>, <<"FORM_TYPE">>), ?XMLATTR(<<"type">>, <<"hidden">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(?NS_PUBSUB_SUBSCRIBE_AUTH_s)}]}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"pubsub#node">>), ?XMLATTR('type', <<"text-single">>),
|
||||
?XMLATTR('label', translate:translate(Lang, "Node ID"))], children =
|
||||
[?XMLATTR(<<"var">>, <<"pubsub#node">>), ?XMLATTR(<<"type">>, <<"text-single">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, "Node ID"))], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
[#xmlcdata{cdata = Node}]}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('var', <<"pubsub#subscriber_jid">>),
|
||||
?XMLATTR('type', <<"jid-single">>),
|
||||
?XMLATTR('label', translate:translate(Lang, "Subscriber Address"))], children =
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"var">>, <<"pubsub#subscriber_jid">>),
|
||||
?XMLATTR(<<"type">>, <<"jid-single">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, "Subscriber Address"))], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
[#xmlcdata{cdata = exmpp_jid:to_binary(U, S, R)}]}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"pubsub#allow">>),
|
||||
?XMLATTR('type', <<"boolean">>),
|
||||
?XMLATTR('label', translate:translate(Lang, "Allow this Jabber ID to subscribe to this pubsub node?"))], children =
|
||||
[?XMLATTR(<<"var">>, <<"pubsub#allow">>),
|
||||
?XMLATTR(<<"type">>, <<"boolean">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, "Allow this Jabber ID to subscribe to this pubsub node?"))], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"false">>}]}]}]}]},
|
||||
lists:foreach(fun(Owner) ->
|
||||
{U, S, R} = Owner,
|
||||
@ -1912,7 +1912,7 @@ send_authorization_request(#pubsub_node{owners = Owners, id = {Host, Node}}, Sub
|
||||
find_authorization_response(Packet) ->
|
||||
Els = Packet#xmlel.children,
|
||||
XData1 = lists:map(fun(#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = XAttrs} = XEl) ->
|
||||
case exmpp_xml:get_attribute_from_list_as_list(XAttrs, 'type', "") of
|
||||
case exmpp_xml:get_attribute_from_list_as_list(XAttrs, <<"type">>, "") of
|
||||
"cancel" ->
|
||||
none;
|
||||
_ ->
|
||||
@ -1943,13 +1943,13 @@ find_authorization_response(Packet) ->
|
||||
%% @doc Send a message to JID with the supplied Subscription
|
||||
send_authorization_approval(Host, JID, SNode, Subscription) ->
|
||||
SubAttrs = case Subscription of
|
||||
{S, SID} -> [?XMLATTR('subscription', subscription_to_string(S)),
|
||||
?XMLATTR('subid', SID)];
|
||||
S -> [?XMLATTR('subscription', subscription_to_string(S))]
|
||||
{S, SID} -> [?XMLATTR(<<"subscription">>, subscription_to_string(S)),
|
||||
?XMLATTR(<<"subid">>, SID)];
|
||||
S -> [?XMLATTR(<<"subscription">>, subscription_to_string(S))]
|
||||
end,
|
||||
Stanza = event_stanza(
|
||||
[#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'subscription', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(JID)) | nodeAttr(SNode)] ++ SubAttrs
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(JID)) | nodeAttr(SNode)] ++ SubAttrs
|
||||
}]),
|
||||
ejabberd_router:route(service_jid(Host), JID, Stanza).
|
||||
|
||||
@ -2014,9 +2014,9 @@ update_auth(Host, Node, Type, Nidx, Subscriber,
|
||||
end.
|
||||
|
||||
-define(XFIELD(Type, Label, Var, Val),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)], children =
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Val)}]}]}).
|
||||
|
||||
-define(BOOLXFIELD(Label, Var, Val),
|
||||
@ -2032,17 +2032,17 @@ update_auth(Host, Node, Type, Nidx, Subscriber,
|
||||
-define(STRINGMXFIELD(Label, Var, Vals),
|
||||
#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'field',
|
||||
attrs = [?XMLATTR('type', <<"text-multi">>),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)
|
||||
attrs = [?XMLATTR(<<"type">>, <<"text-multi">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)
|
||||
],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value',
|
||||
children = [?XMLCDATA(V)]} || V <- Vals]}).
|
||||
|
||||
-define(XFIELDOPT(Type, Label, Var, Val, Opts),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)], children =
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)], children =
|
||||
lists:map(fun(Opt) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
@ -2054,9 +2054,9 @@ update_auth(Host, Node, Type, Nidx, Subscriber,
|
||||
?XFIELDOPT("list-single", Label, Var, Val, Opts)).
|
||||
|
||||
-define(LISTMXFIELD(Label, Var, Vals, Opts),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', <<"list-multi">>),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)], children =
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, <<"list-multi">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)], children =
|
||||
lists:map(fun(Opt) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
@ -2315,13 +2315,13 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
|
||||
%% TODO, this is subscription-notification, should depends on node features
|
||||
SubAttrs = case Subscription of
|
||||
{subscribed, SubId} ->
|
||||
[?XMLATTR("subscription", subscription_to_string(subscribed)),
|
||||
?XMLATTR("subid", SubId)];
|
||||
[?XMLATTR(<<"subscription">>, subscription_to_string(subscribed)),
|
||||
?XMLATTR(<<"subid">>, SubId)];
|
||||
Other ->
|
||||
[?XMLATTR("subscription", subscription_to_string(Other))]
|
||||
[?XMLATTR(<<"subscription">>, subscription_to_string(Other))]
|
||||
end,
|
||||
Fields =
|
||||
[ ?XMLATTR('jid', JID) | SubAttrs],
|
||||
[ ?XMLATTR(<<"jid">>, JID) | SubAttrs],
|
||||
#xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs = Fields}]}
|
||||
end,
|
||||
@ -2796,8 +2796,8 @@ get_affiliations(Host, JID, Plugins) when is_list(Plugins) ->
|
||||
fun({_, none}) -> [];
|
||||
({#pubsub_node{id = {_, Node}}, Affiliation}) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'affiliation', attrs =
|
||||
[?XMLATTR('node', node_to_string(Node)),
|
||||
?XMLATTR('affiliation', affiliation_to_string(Affiliation))]}]
|
||||
[?XMLATTR(<<"node">>, node_to_string(Node)),
|
||||
?XMLATTR(<<"affiliation">>, affiliation_to_string(Affiliation))]}]
|
||||
end, lists:usort(lists:flatten(Affiliations))),
|
||||
{result, #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'affiliations', children =
|
||||
@ -2827,8 +2827,8 @@ get_affiliations(Host, Node, JID) ->
|
||||
fun({_, none}) -> [];
|
||||
({{AU, AS, AR}, Affiliation}) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'affiliation', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR('affiliation', affiliation_to_string(Affiliation))]}]
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR(<<"affiliation">>, affiliation_to_string(Affiliation))]}]
|
||||
end, Affiliations),
|
||||
{result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'affiliations', attrs = nodeAttr(Node), children =
|
||||
@ -2850,12 +2850,12 @@ set_affiliations(Host, Node, From, EntitiesEls) ->
|
||||
#xmlel{name = 'affiliation', attrs = Attrs} ->
|
||||
JID = try
|
||||
exmpp_jid:parse(
|
||||
exmpp_xml:get_attribute_from_list(Attrs, 'jid', ""))
|
||||
exmpp_xml:get_attribute_from_list(Attrs, <<"jid">>, ""))
|
||||
catch
|
||||
_:_ -> error
|
||||
end,
|
||||
Affiliation = string_to_affiliation(
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, 'affiliation', "")),
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"affiliation">>, "")),
|
||||
if
|
||||
(JID == error) or
|
||||
(Affiliation == false) ->
|
||||
@ -2958,8 +2958,8 @@ read_sub(Subscriber, Node, NodeId, SubId, Lang) ->
|
||||
{result, #pubsub_subscription{options = Options}} ->
|
||||
{result, XdataEl} = pubsub_subscription:get_options_xform(Lang, Options),
|
||||
OptionsEl = #xmlel{ns = ?NS_PUBSUB, name = 'options',
|
||||
attrs = [ ?XMLATTR('jid', exmpp_jid:to_binary(Subscriber)),
|
||||
?XMLATTR('subid', SubId) | nodeAttr(Node)],
|
||||
attrs = [ ?XMLATTR(<<"jid">>, exmpp_jid:to_binary(Subscriber)),
|
||||
?XMLATTR(<<"subid">>, SubId) | nodeAttr(Node)],
|
||||
children = [XdataEl]},
|
||||
PubsubEl = #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children = [OptionsEl]},
|
||||
{result, PubsubEl}
|
||||
@ -3052,11 +3052,11 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
|
||||
case Node of
|
||||
<<>> ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
|
||||
[?XMLATTR('node', node_to_string(SubsNode)),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
[?XMLATTR(<<"node">>, node_to_string(SubsNode)),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
SubsNode ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
|
||||
[?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
[?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
_ ->
|
||||
[]
|
||||
end;
|
||||
@ -3066,14 +3066,14 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
|
||||
case Node of
|
||||
<<>> ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name='subscription',
|
||||
attrs = [?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR('subid', SubId),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription)) | nodeAttr(SubsNode)]}];
|
||||
attrs = [?XMLATTR(<<"jid">>, exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR(<<"subid">>, SubId),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription)) | nodeAttr(SubsNode)]}];
|
||||
SubsNode ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription',
|
||||
attrs = [?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR('subid', SubId),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
attrs = [?XMLATTR(<<"jid">>, exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR(<<"subid">>, SubId),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
_ ->
|
||||
[]
|
||||
end;
|
||||
@ -3081,13 +3081,13 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
|
||||
case Node of
|
||||
<<>> ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
|
||||
[?XMLATTR('node', node_to_string(SubsNode)),
|
||||
?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
[?XMLATTR(<<"node">>, node_to_string(SubsNode)),
|
||||
?XMLATTR(<<"jid">>, exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
SubsNode ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
_ ->
|
||||
[]
|
||||
end
|
||||
@ -3124,13 +3124,13 @@ get_subscriptions(Host, Node, JID) ->
|
||||
({_, pending, _}) -> [];
|
||||
({{AU, AS, AR}, Subscription}) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscription', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
({{AU, AS, AR}, Subscription, SubId}) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscription', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription)),
|
||||
?XMLATTR('subid', SubId)]}]
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription)),
|
||||
?XMLATTR(<<"subid">>, SubId)]}]
|
||||
end, Subscriptions),
|
||||
{result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscriptions', attrs = nodeAttr(Node), children =
|
||||
@ -3152,14 +3152,14 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
|
||||
#xmlel{name = 'subscription', attrs = Attrs} ->
|
||||
JID = try
|
||||
exmpp_jid:parse(
|
||||
exmpp_xml:get_attribute_from_list(Attrs, 'jid', ""))
|
||||
exmpp_xml:get_attribute_from_list(Attrs, <<"jid">>, ""))
|
||||
catch
|
||||
_:_ ->
|
||||
error
|
||||
end,
|
||||
Subscription = string_to_subscription(
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subscription', false)),
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, "subid", false),
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"subscription">>, false)),
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"subid">>, false),
|
||||
if
|
||||
(JID == error) or
|
||||
(Subscription == false) ->
|
||||
@ -3183,8 +3183,8 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
|
||||
children =
|
||||
[#xmlel{ns = ?NS_PUBSUB,
|
||||
name = 'subscription',
|
||||
attrs = [?XMLATTR('jid', exmpp_jid:to_binary(JID)),
|
||||
?XMLATTR('subsription', subscription_to_string(Sub)) | nodeAttr(Node)]}]}]},
|
||||
attrs = [?XMLATTR(<<"jid">>, exmpp_jid:to_binary(JID)),
|
||||
?XMLATTR(<<"subsription">>, subscription_to_string(Sub)) | nodeAttr(Node)]}]}]},
|
||||
ejabberd_router:route(service_jid(Host), JID, Stanza)
|
||||
end,
|
||||
Action = fun(#pubsub_node{owners = Owners, type = Type, idx = Nidx}) ->
|
||||
@ -3519,14 +3519,14 @@ broadcast_config_notification(Host, Node, NodeId, Type, NodeOptions, Lang) ->
|
||||
SubsByDepth when is_list(SubsByDepth) ->
|
||||
Content = case get_option(NodeOptions, deliver_payloads) of
|
||||
true ->
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
get_configure_xfields(Type, NodeOptions, Lang, [])}];
|
||||
false ->
|
||||
[]
|
||||
end,
|
||||
Stanza = event_stanza(
|
||||
[#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
|
||||
[#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'item', attrs = [?XMLATTR('id', <<"configuration">>)], children =
|
||||
[#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'item', attrs = [?XMLATTR(<<"id">>, <<"configuration">>)], children =
|
||||
Content}]}]),
|
||||
broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza, false),
|
||||
{result, true};
|
||||
@ -3773,7 +3773,7 @@ get_configure(Host, ServerHost, Node, #jid{node = User, domain = Server} = From,
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'configure', attrs =
|
||||
nodeAttr(Node), children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
|
||||
[?XMLATTR('type', <<"form">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
get_configure_xfields(Type, Options, Lang, Groups)
|
||||
}]}]}};
|
||||
_ ->
|
||||
@ -3790,7 +3790,7 @@ get_default(Host, Node, _From, Lang) ->
|
||||
Options = node_options(Type),
|
||||
{result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'default', children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
get_configure_xfields(Type, Options, Lang, [])
|
||||
}]}]}}.
|
||||
|
||||
@ -3947,7 +3947,7 @@ get_configure_xfields(_Type, Options, Lang, Groups) ->
|
||||
set_configure(Host, Node, From, Els, Lang) ->
|
||||
case exmpp_xml:remove_cdata_from_list(Els) of
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x'} = XEl] ->
|
||||
case exmpp_xml:get_attribute_as_list(XEl, 'type', undefined) of
|
||||
case exmpp_xml:get_attribute_as_list(XEl, <<"type">>, undefined) of
|
||||
"cancel" ->
|
||||
{result, []};
|
||||
"submit" ->
|
||||
@ -4476,7 +4476,7 @@ extended_error(Error, Ext) ->
|
||||
extended_error(Error, Ext, []).
|
||||
extended_error(Error, unsupported, Feature) ->
|
||||
extended_error(Error, unsupported,
|
||||
[?XMLATTR('feature', Feature)]);
|
||||
[?XMLATTR(<<"feature">>, Feature)]);
|
||||
extended_error(Error, Ext, ExtAttrs) ->
|
||||
%Pubsub_Err = #xmlel{ns = ?NS_PUBSUB_ERRORS, name = Ext, attrs = ExtAttrs},
|
||||
exmpp_xml:append_child(exmpp_stanza:error(?NS_JABBER_CLIENT, Error),
|
||||
@ -4491,13 +4491,13 @@ uniqid() ->
|
||||
|
||||
% node attributes
|
||||
nodeAttr(Node) when is_list(Node) ->
|
||||
[?XMLATTR('node', Node)];
|
||||
[?XMLATTR(<<"node">>, Node)];
|
||||
nodeAttr(Node) ->
|
||||
[?XMLATTR('node', node_to_string(Node))].
|
||||
[?XMLATTR(<<"node">>, node_to_string(Node))].
|
||||
|
||||
% item attributes
|
||||
itemAttr([]) -> [];
|
||||
itemAttr(ItemId) -> [?XMLATTR('id', ItemId)].
|
||||
itemAttr(ItemId) -> [?XMLATTR(<<"id">>, ItemId)].
|
||||
|
||||
|
||||
% build item elements from item list
|
||||
@ -4545,19 +4545,19 @@ add_headers(#xmlel{children = Els} = Stanza, HeaderName, HeaderNS, HeaderEls) ->
|
||||
%% identifier of the collection".
|
||||
collection_shim(Node) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name ='header',
|
||||
attrs = [?XMLATTR('name', <<"Collection">>)],
|
||||
attrs = [?XMLATTR(<<"name">>, <<"Collection">>)],
|
||||
children = [?XMLCDATA(node_to_string(Node))]}].
|
||||
|
||||
subid_shim(SubIds) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name ='header',
|
||||
attrs = [?XMLATTR('name', <<"SubId">>)],
|
||||
attrs = [?XMLATTR(<<"name">>, <<"SubId">>)],
|
||||
children = [?XMLCDATA(SubId)]}
|
||||
|| SubId <- SubIds].
|
||||
|
||||
|
||||
extended_headers(JIDs) ->
|
||||
[#xmlel{ns = ?NS_ADDRESS, name = 'address',
|
||||
attrs = [?XMLATTR('type', <<"replyto">>), ?XMLATTR('jid', JID)]}
|
||||
attrs = [?XMLATTR(<<"type">>, <<"replyto">>), ?XMLATTR(<<"jid">>, JID)]}
|
||||
|| JID <- JIDs].
|
||||
|
||||
feature_check_packet(allow, _User, Server, Pres, {From, _To, El}, in) ->
|
||||
@ -4570,7 +4570,7 @@ feature_check_packet(allow, _User, Server, Pres, {From, _To, El}, in) ->
|
||||
case exmpp_xml:get_element(El, 'event') of
|
||||
#xmlel{name = 'event', ns = ?NS_PUBSUB_EVENT} = Event ->
|
||||
Items = exmpp_xml:get_element(Event, ?NS_PUBSUB_EVENT, 'items'),
|
||||
Feature = exmpp_xml:get_attribute_as_list(Items, "node", ""),
|
||||
Feature = exmpp_xml:get_attribute_as_list(Items, <<"node">>, ""),
|
||||
case is_feature_supported(Pres, Feature) of
|
||||
true -> allow;
|
||||
false -> deny
|
||||
@ -4661,9 +4661,9 @@ notify_owners(true, JID, Host, Node, Owners, State) ->
|
||||
Message = #xmlel{name = 'message', ns = ?NS_JABBER_CLIENT,
|
||||
children = [#xmlel{name = 'pubsub', ns = ?NS_PUBSUB,
|
||||
children = [#xmlel{name = 'subscription', ns = ?NS_PUBSUB,
|
||||
attrs = [?XMLATTR('node', Node),
|
||||
?XMLATTR('jid', exmpp_jid:prep_to_binary(exmpp_jid:make(JID))),
|
||||
?XMLATTR('subscription', State)]}]}]},
|
||||
attrs = [?XMLATTR(<<"node">>, Node),
|
||||
?XMLATTR(<<"jid">>, exmpp_jid:prep_to_binary(exmpp_jid:make(JID))),
|
||||
?XMLATTR(<<"subscription">>, State)]}]}]},
|
||||
lists:foreach(
|
||||
fun(Owner) ->
|
||||
ejabberd_router:route(exmpp_jid:make(Host), exmpp_jid:make(Owner), Message)
|
||||
|
@ -391,7 +391,7 @@ disco_local_identity(Acc, _From, To, <<>>, _Lang) ->
|
||||
case lists:member(?PEPNODE, plugins(exmpp_jid:prep_domain_as_list(To))) of
|
||||
true ->
|
||||
[#xmlel{name = 'identity', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"pep">>)]}
|
||||
attrs = [?XMLATTR(<<"category">>, <<"pubsub">>), ?XMLATTR(<<"type">>, <<"pep">>)]}
|
||||
| Acc];
|
||||
false -> Acc
|
||||
end;
|
||||
@ -420,7 +420,7 @@ disco_sm_identity(Acc, From, To, Node, _Lang) ->
|
||||
|
||||
disco_identity(_Host, <<>>, _From) ->
|
||||
[#xmlel{name = 'identity', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"pep">>)]}];
|
||||
attrs = [?XMLATTR(<<"category">>, <<"pubsub">>), ?XMLATTR(<<"type">>, <<"pep">>)]}];
|
||||
disco_identity(Host, Node, From) ->
|
||||
Action = fun(#pubsub_node{idx = Nidx, type = Type, options = Options}) ->
|
||||
Owners = node_owners_call(Type, Nidx),
|
||||
@ -428,12 +428,12 @@ disco_identity(Host, Node, From) ->
|
||||
{result, _} ->
|
||||
{result,
|
||||
[#xmlel{name = 'identity', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"pep">>)]},
|
||||
attrs = [?XMLATTR(<<"category">>, <<"pubsub">>), ?XMLATTR(<<"type">>, <<"pep">>)]},
|
||||
#xmlel{name = 'identity', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"leaf">>)
|
||||
attrs = [?XMLATTR(<<"category">>, <<"pubsub">>), ?XMLATTR(<<"type">>, <<"leaf">>)
|
||||
| case get_option(Options, title) of
|
||||
false -> [];
|
||||
Title -> [?XMLATTR('name', Title)]
|
||||
Title -> [?XMLATTR(<<"name">>, Title)]
|
||||
end
|
||||
]}]};
|
||||
{error, _} -> {result, []}
|
||||
@ -479,11 +479,11 @@ disco_items(Host, <<>>, From) ->
|
||||
case get_allowed_items_call(Host, Nidx, From, Type, Options, Owners) of
|
||||
{result, _} ->
|
||||
[#xmlel{name = 'item', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('jid', exmpp_jid:to_binary(Host)),
|
||||
?XMLATTR('node', NodeId) |
|
||||
attrs = [?XMLATTR(<<"jid">>, exmpp_jid:to_binary(Host)),
|
||||
?XMLATTR(<<"node">>, NodeId) |
|
||||
case get_option(Options, title) of
|
||||
false -> [];
|
||||
[Title] -> [?XMLATTR('title', Title)]
|
||||
[Title] -> [?XMLATTR(<<"title">>, Title)]
|
||||
end]}
|
||||
| Acc];
|
||||
_ -> Acc
|
||||
@ -501,8 +501,8 @@ disco_items(Host, Node, From) ->
|
||||
{result, Items} ->
|
||||
{result,
|
||||
[#xmlel{name = 'item', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('jid', exmpp_jid:to_binary(Host)),
|
||||
?XMLATTR('name', ItemId)]}
|
||||
attrs = [?XMLATTR(<<"jid">>, exmpp_jid:to_binary(Host)),
|
||||
?XMLATTR(<<"name">>, ItemId)]}
|
||||
|| #pubsub_item{id = {ItemId,_}} <- Items]};
|
||||
_ -> {result, []}
|
||||
end
|
||||
@ -744,7 +744,7 @@ do_route(ServerHost, Access, Plugins, Host, From, To, Packet) ->
|
||||
#iq{type = get, ns = ?NS_DISCO_INFO,
|
||||
payload = SubEl, lang = Lang} ->
|
||||
QAttrs = SubEl#xmlel.attrs,
|
||||
Node = exmpp_xml:get_attribute_from_list_as_list(QAttrs, 'node', ""),
|
||||
Node = exmpp_xml:get_attribute_from_list_as_list(QAttrs, <<"node">>, ""),
|
||||
ServerHostB = list_to_binary(ServerHost),
|
||||
Info = ejabberd_hooks:run_fold(
|
||||
disco_info, ServerHostB, [],
|
||||
@ -762,7 +762,7 @@ do_route(ServerHost, Access, Plugins, Host, From, To, Packet) ->
|
||||
#iq{type = get, ns = ?NS_DISCO_ITEMS,
|
||||
payload = SubEl} = IQ ->
|
||||
QAttrs = SubEl#xmlel.attrs,
|
||||
Node = exmpp_xml:get_attribute_from_list_as_list(QAttrs, 'node', ""),
|
||||
Node = exmpp_xml:get_attribute_from_list_as_list(QAttrs, <<"node">>, ""),
|
||||
Rsm = jlib:rsm_decode(IQ),
|
||||
Res = case iq_disco_items(Host, Node, From, Rsm) of
|
||||
{result, IQRes} ->
|
||||
@ -838,12 +838,12 @@ do_route(ServerHost, Access, Plugins, Host, From, To, Packet) ->
|
||||
undefined ->
|
||||
ok;
|
||||
Publish ->
|
||||
Node = exmpp_xml:get_attribute(Publish, 'node', <<>>),
|
||||
Node = exmpp_xml:get_attribute(Publish, <<"node">>, <<>>),
|
||||
case exmpp_xml:get_element(Publish, 'item') of
|
||||
undefined ->
|
||||
ok;
|
||||
Item ->
|
||||
ItemId = exmpp_xml:get_attribute_as_list(Item, 'id', ""),
|
||||
ItemId = exmpp_xml:get_attribute_as_list(Item, <<"id">>, ""),
|
||||
case publish_item(Host, ServerHost, Node, From, ItemId, Item#xmlel.children) of
|
||||
{result, _} ->
|
||||
ok;
|
||||
@ -875,16 +875,16 @@ do_route(ServerHost, Access, Plugins, Host, From, To, Packet) ->
|
||||
command_disco_info(_Host, ?NS_ADHOC_b, _From) ->
|
||||
IdentityEl =
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'identity',
|
||||
attrs = [?XMLATTR('category', <<"automation">>),
|
||||
?XMLATTR('type', <<"command-list">>)]},
|
||||
attrs = [?XMLATTR(<<"category">>, <<"automation">>),
|
||||
?XMLATTR(<<"type">>, <<"command-list">>)]},
|
||||
{result, [IdentityEl]};
|
||||
command_disco_info(_Host, ?NS_PUBSUB_GET_PENDING_b, _From) ->
|
||||
IdentityEl =
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'identity',
|
||||
attrs = [?XMLATTR('category', <<"automation">>),
|
||||
?XMLATTR('type', <<"command-node">>)]},
|
||||
attrs = [?XMLATTR(<<"category">>, <<"automation">>),
|
||||
?XMLATTR(<<"type">>, <<"command-node">>)]},
|
||||
FeaturesEl = #xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
|
||||
attrs = [?XMLATTR('var', ?NS_ADHOC)]},
|
||||
attrs = [?XMLATTR(<<"var">>, ?NS_ADHOC)]},
|
||||
{result, [IdentityEl, FeaturesEl]}.
|
||||
|
||||
node_disco_info(Host, Node, From) ->
|
||||
@ -908,18 +908,18 @@ node_disco_info(Host, Node, From, Identity, Features) ->
|
||||
end
|
||||
end,
|
||||
lists:map(fun(T) ->
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs = [?XMLATTR('category', <<"pubsub">>),
|
||||
?XMLATTR('type', T)]}
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs = [?XMLATTR(<<"category">>, <<"pubsub">>),
|
||||
?XMLATTR(<<"type">>, T)]}
|
||||
end, Types)
|
||||
end,
|
||||
F = case Features of
|
||||
false ->
|
||||
[];
|
||||
true ->
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s)]} |
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_s)]} |
|
||||
lists:map(fun
|
||||
("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_RSM_s)]};
|
||||
(T) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++T)]}
|
||||
("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_RSM_s)]};
|
||||
(T) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_s++"#"++T)]}
|
||||
end, features(Type))]
|
||||
end,
|
||||
%% TODO: add meta-data info (spec section 5.4)
|
||||
@ -940,17 +940,17 @@ iq_disco_info(Host, SNode, From, Lang) ->
|
||||
<<>> ->
|
||||
{result,
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'identity', attrs =
|
||||
[?XMLATTR('category', "pubsub"),
|
||||
?XMLATTR('type', "service"),
|
||||
?XMLATTR('name', translate:translate(Lang, "Publish-Subscribe"))]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_DISCO_INFO_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_DISCO_ITEMS_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_ADHOC_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_VCARD_s)]}] ++
|
||||
[?XMLATTR(<<"category">>, "pubsub"),
|
||||
?XMLATTR(<<"type">>, "service"),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang, "Publish-Subscribe"))]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_DISCO_INFO_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_DISCO_ITEMS_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_ADHOC_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_VCARD_s)]}] ++
|
||||
lists:map(fun
|
||||
("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_RSM_s)]};
|
||||
(Feature) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++Feature)]}
|
||||
("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_RSM_s)]};
|
||||
(Feature) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_s++"#"++Feature)]}
|
||||
end, features(Host, Node))};
|
||||
?NS_ADHOC_b ->
|
||||
command_disco_info(Host, Node, From);
|
||||
@ -968,9 +968,9 @@ iq_disco_items(Host, [], From, _RSM) ->
|
||||
Attrs =
|
||||
case get_option(Options, title) of
|
||||
false ->
|
||||
[?XMLATTR('jid', Host) | nodeAttr(SubNode)];
|
||||
[?XMLATTR(<<"jid">>, Host) | nodeAttr(SubNode)];
|
||||
Title ->
|
||||
[?XMLATTR('jid', Host), ?XMLATTR('name', Title) | nodeAttr(SubNode)]
|
||||
[?XMLATTR(<<"jid">>, Host), ?XMLATTR(<<"name">>, Title) | nodeAttr(SubNode)]
|
||||
end,
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = Attrs}
|
||||
end, Nodes)};
|
||||
@ -981,9 +981,9 @@ iq_disco_items(Host, ?NS_ADHOC_s, _From, _RSM) ->
|
||||
%% TODO: support localization of this string
|
||||
CommandItems = [
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item',
|
||||
attrs = [?XMLATTR('jid', Host),
|
||||
?XMLATTR('node', ?NS_PUBSUB_GET_PENDING),
|
||||
?XMLATTR('name', "Get Pending")
|
||||
attrs = [?XMLATTR(<<"jid">>, Host),
|
||||
?XMLATTR(<<"node">>, ?NS_PUBSUB_GET_PENDING),
|
||||
?XMLATTR(<<"name">>, "Get Pending")
|
||||
]}],
|
||||
{result, CommandItems};
|
||||
iq_disco_items(_Host, ?NS_PUBSUB_GET_PENDING, _From, _RSM) ->
|
||||
@ -1006,16 +1006,16 @@ iq_disco_items(Host, Item, From, RSM) ->
|
||||
Attrs =
|
||||
case get_option(SubOptions, title) of
|
||||
false ->
|
||||
[?XMLATTR('jid', Host) | nodeAttr(SubNode)];
|
||||
[?XMLATTR(<<"jid">>, Host) | nodeAttr(SubNode)];
|
||||
Title ->
|
||||
[?XMLATTR('jid', Host), ?XMLATTR('name', Title) | nodeAttr(SubNode)]
|
||||
[?XMLATTR(<<"jid">>, Host), ?XMLATTR(<<"name">>, Title) | nodeAttr(SubNode)]
|
||||
end,
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = Attrs}
|
||||
end, tree_call(Host, get_subnodes, [Host, Node, From])),
|
||||
Items = lists:map(
|
||||
fun(#pubsub_item{id = {RN, _}}) ->
|
||||
{result, Name} = node_call(Type, get_item_name, [Host, Node, RN]),
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR('jid', Host), ?XMLATTR('name', Name)]}
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR(<<"jid">>, Host), ?XMLATTR(<<"name">>, Name)]}
|
||||
end, NodeItems),
|
||||
{result, Nodes ++ Items ++ jlib:rsm_encode(RsmOut)}
|
||||
end,
|
||||
@ -1067,7 +1067,7 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
|
||||
case exmpp_xml:remove_cdata_from_list(SubEl#xmlel.children) of
|
||||
[#xmlel{name = Name, attrs = Attrs, children = Els} | Rest] ->
|
||||
%% Fix bug when owner retrieves his affiliations
|
||||
Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(Attrs, 'node', "")),
|
||||
Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"node">>, "")),
|
||||
case {IQType, Name} of
|
||||
{set, 'create'} ->
|
||||
Config = case Rest of
|
||||
@ -1075,7 +1075,7 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
|
||||
_ -> []
|
||||
end,
|
||||
%% Get the type of the node
|
||||
Type = case exmpp_xml:get_attribute_from_list_as_list(Attrs, 'type', "") of
|
||||
Type = case exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"type">>, "") of
|
||||
[] -> hd(Plugins);
|
||||
T -> T
|
||||
end,
|
||||
@ -1093,7 +1093,7 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
|
||||
{set, 'publish'} ->
|
||||
case exmpp_xml:remove_cdata_from_list(Els) of
|
||||
[#xmlel{name = 'item', attrs = ItemAttrs, children = Payload}] ->
|
||||
ItemId = exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, 'id', ""),
|
||||
ItemId = exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, <<"id">>, ""),
|
||||
publish_item(Host, ServerHost, Node, From, ItemId, Payload);
|
||||
[] ->
|
||||
%% Publisher attempts to publish to persistent node with no item
|
||||
@ -1105,14 +1105,14 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
|
||||
"invalid-payload")}
|
||||
end;
|
||||
{set, 'retract'} ->
|
||||
ForceNotify = case exmpp_xml:get_attribute_from_list_as_list(Attrs, 'notify', "") of
|
||||
ForceNotify = case exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"notify">>, "") of
|
||||
"1" -> true;
|
||||
"true" -> true;
|
||||
_ -> false
|
||||
end,
|
||||
case exmpp_xml:remove_cdata_from_list(Els) of
|
||||
[#xmlel{name = 'item', attrs = ItemAttrs}] ->
|
||||
ItemId = exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, 'id', ""),
|
||||
ItemId = exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, <<"id">>, ""),
|
||||
delete_item(Host, Node, From, ItemId, ForceNotify);
|
||||
_ ->
|
||||
%% Request does not specify an item
|
||||
@ -1124,18 +1124,18 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
|
||||
[#xmlel{name = 'options', children = C}] -> C;
|
||||
_ -> []
|
||||
end,
|
||||
JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
|
||||
JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"jid">>, ""),
|
||||
subscribe_node(Host, Node, From, JID, Config);
|
||||
{set, 'unsubscribe'} ->
|
||||
JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
|
||||
JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"jid">>, ""),
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"subid">>, ""),
|
||||
unsubscribe_node(Host, Node, From, JID, SubId);
|
||||
{get, 'items'} ->
|
||||
MaxItems = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'max_items', ""),
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
|
||||
MaxItems = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"max_items">>, ""),
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"subid">>, ""),
|
||||
ItemIds = lists:foldl(fun
|
||||
(#xmlel{name = 'item', attrs = ItemAttrs}, Acc) ->
|
||||
case exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, 'id', "") of
|
||||
case exmpp_xml:get_attribute_from_list_as_list(ItemAttrs, <<"id">>, "") of
|
||||
"" -> Acc;
|
||||
ItemId -> [ItemId|Acc]
|
||||
end;
|
||||
@ -1148,12 +1148,12 @@ iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) ->
|
||||
{get, 'affiliations'} ->
|
||||
get_affiliations(Host, From, Plugins);
|
||||
{get, 'options'} ->
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
|
||||
JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"subid">>, ""),
|
||||
JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"jid">>, ""),
|
||||
get_options(Host, Node, JID, SubId, Lang);
|
||||
{set, 'options'} ->
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subid', ""),
|
||||
JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, 'jid', ""),
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"subid">>, ""),
|
||||
JID = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"jid">>, ""),
|
||||
set_options(Host, Node, JID, SubId, Els);
|
||||
_ ->
|
||||
{error, 'feature-not-implemented'}
|
||||
@ -1168,7 +1168,7 @@ iq_pubsub_owner(Host, ServerHost, From, IQType, SubEl, Lang) ->
|
||||
Action = exmpp_xml:remove_cdata_from_list(SubEls),
|
||||
case Action of
|
||||
[#xmlel{name = Name, attrs = Attrs, children = Els}] ->
|
||||
Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(Attrs, 'node', "")),
|
||||
Node = string_to_node(exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"node">>, "")),
|
||||
case {IQType, Name} of
|
||||
{get, 'configure'} ->
|
||||
get_configure(Host, ServerHost, Node, From, Lang);
|
||||
@ -1280,11 +1280,11 @@ send_pending_node_form(Host, Owner, _Lang, Plugins) ->
|
||||
children = [
|
||||
exmpp_xml:cdata(node_to_string(Node))]}]}
|
||||
end, get_pending_nodes(Host, Owner, Ps)),
|
||||
XForm = #xmlel{ns = ?NS_DATA_FORMS, name ='x', attrs = [?XMLATTR('type', <<"form">>)],
|
||||
XForm = #xmlel{ns = ?NS_DATA_FORMS, name ='x', attrs = [?XMLATTR(<<"type">>, <<"form">>)],
|
||||
children = [
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field',
|
||||
attrs = [?XMLATTR('type', <<"list-single">>),
|
||||
?XMLATTR('var', <<"pubsub#node">>)],
|
||||
attrs = [?XMLATTR(<<"type">>, <<"list-single">>),
|
||||
?XMLATTR(<<"var">>, <<"pubsub#node">>)],
|
||||
children = lists:usort(XOpts)}]},
|
||||
#adhoc_response{status = executing,
|
||||
defaultaction = "execute",
|
||||
@ -1348,28 +1348,28 @@ send_authorization_request(#pubsub_node{id = {Host, Node}, type = Type, idx = Ni
|
||||
Lang = <<"en">>, %% TODO fix
|
||||
{U, S, R} = Subscriber,
|
||||
Stanza = #xmlel{ns = ?NS_JABBER_CLIENT, name = 'message', children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "PubSub subscriber request"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'instructions', children =
|
||||
[#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Choose whether to approve this entity's subscription."))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"FORM_TYPE">>), ?XMLATTR('type', <<"hidden">>)], children =
|
||||
[?XMLATTR(<<"var">>, <<"FORM_TYPE">>), ?XMLATTR(<<"type">>, <<"hidden">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(?NS_PUBSUB_SUBSCRIBE_AUTH_s)}]}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"pubsub#node">>), ?XMLATTR('type', <<"text-single">>),
|
||||
?XMLATTR('label', translate:translate(Lang, "Node ID"))], children =
|
||||
[?XMLATTR(<<"var">>, <<"pubsub#node">>), ?XMLATTR(<<"type">>, <<"text-single">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, "Node ID"))], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
[#xmlcdata{cdata = Node}]}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('var', <<"pubsub#subscriber_jid">>),
|
||||
?XMLATTR('type', <<"jid-single">>),
|
||||
?XMLATTR('label', translate:translate(Lang, "Subscriber Address"))], children =
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"var">>, <<"pubsub#subscriber_jid">>),
|
||||
?XMLATTR(<<"type">>, <<"jid-single">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, "Subscriber Address"))], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
[#xmlcdata{cdata = exmpp_jid:to_binary(U, S, R)}]}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"pubsub#allow">>),
|
||||
?XMLATTR('type', <<"boolean">>),
|
||||
?XMLATTR('label', translate:translate(Lang, "Allow this Jabber ID to subscribe to this pubsub node?"))], children =
|
||||
[?XMLATTR(<<"var">>, <<"pubsub#allow">>),
|
||||
?XMLATTR(<<"type">>, <<"boolean">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, "Allow this Jabber ID to subscribe to this pubsub node?"))], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = <<"false">>}]}]}]}]},
|
||||
lists:foreach(fun(Owner) ->
|
||||
{U, S, R} = Owner,
|
||||
@ -1379,7 +1379,7 @@ send_authorization_request(#pubsub_node{id = {Host, Node}, type = Type, idx = Ni
|
||||
find_authorization_response(Packet) ->
|
||||
Els = Packet#xmlel.children,
|
||||
XData1 = lists:map(fun(#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = XAttrs} = XEl) ->
|
||||
case exmpp_xml:get_attribute_from_list_as_list(XAttrs, 'type', "") of
|
||||
case exmpp_xml:get_attribute_from_list_as_list(XAttrs, <<"type">>, "") of
|
||||
"cancel" ->
|
||||
none;
|
||||
_ ->
|
||||
@ -1410,13 +1410,13 @@ find_authorization_response(Packet) ->
|
||||
%% @doc Send a message to JID with the supplied Subscription
|
||||
send_authorization_approval(Host, JID, SNode, Subscription) ->
|
||||
SubAttrs = case Subscription of
|
||||
{S, SID} -> [?XMLATTR('subscription', subscription_to_string(S)),
|
||||
?XMLATTR('subid', SID)];
|
||||
S -> [?XMLATTR('subscription', subscription_to_string(S))]
|
||||
{S, SID} -> [?XMLATTR(<<"subscription">>, subscription_to_string(S)),
|
||||
?XMLATTR(<<"subid">>, SID)];
|
||||
S -> [?XMLATTR(<<"subscription">>, subscription_to_string(S))]
|
||||
end,
|
||||
Stanza = event_stanza(
|
||||
[#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'subscription', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(JID)) | nodeAttr(SNode)] ++ SubAttrs
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(JID)) | nodeAttr(SNode)] ++ SubAttrs
|
||||
}]),
|
||||
ejabberd_router:route(service_jid(Host), JID, Stanza).
|
||||
|
||||
@ -1481,9 +1481,9 @@ update_auth(Host, Node, Type, Nidx, Subscriber,
|
||||
end.
|
||||
|
||||
-define(XFIELD(Type, Label, Var, Val),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)], children =
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children = [#xmlcdata{cdata = list_to_binary(Val)}]}]}).
|
||||
|
||||
-define(BOOLXFIELD(Label, Var, Val),
|
||||
@ -1499,17 +1499,17 @@ update_auth(Host, Node, Type, Nidx, Subscriber,
|
||||
-define(STRINGMXFIELD(Label, Var, Vals),
|
||||
#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'field',
|
||||
attrs = [?XMLATTR('type', <<"text-multi">>),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)
|
||||
attrs = [?XMLATTR(<<"type">>, <<"text-multi">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)
|
||||
],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS, name = 'value',
|
||||
children = [?XMLCDATA(V)]} || V <- Vals]}).
|
||||
|
||||
-define(XFIELDOPT(Type, Label, Var, Val, Opts),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', Type),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)], children =
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)], children =
|
||||
lists:map(fun(Opt) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
@ -1521,9 +1521,9 @@ update_auth(Host, Node, Type, Nidx, Subscriber,
|
||||
?XFIELDOPT("list-single", Label, Var, Val, Opts)).
|
||||
|
||||
-define(LISTMXFIELD(Label, Var, Vals, Opts),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR('type', <<"list-multi">>),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)], children =
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs = [?XMLATTR(<<"type">>, <<"list-multi">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)], children =
|
||||
lists:map(fun(Opt) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'option', children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
@ -1783,13 +1783,13 @@ subscribe_node(Host, Node, From, JID, Configuration) ->
|
||||
%% TODO, this is subscription-notification, should depends on node features
|
||||
SubAttrs = case Subscription of
|
||||
{subscribed, SubId} ->
|
||||
[?XMLATTR("subscription", subscription_to_string(subscribed)),
|
||||
?XMLATTR("subid", SubId)];
|
||||
[?XMLATTR(<<"subscription">>, subscription_to_string(subscribed)),
|
||||
?XMLATTR(<<"subid">>, SubId)];
|
||||
Other ->
|
||||
[?XMLATTR("subscription", subscription_to_string(Other))]
|
||||
[?XMLATTR(<<"subscription">>, subscription_to_string(Other))]
|
||||
end,
|
||||
Fields =
|
||||
[ ?XMLATTR('jid', JID) | SubAttrs],
|
||||
[ ?XMLATTR(<<"jid">>, JID) | SubAttrs],
|
||||
#xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs = Fields}]}
|
||||
end,
|
||||
@ -2271,8 +2271,8 @@ get_affiliations(Host, JID, Plugins) when is_list(Plugins) ->
|
||||
fun({_, none}) -> [];
|
||||
({#pubsub_node{id = {_, Node}}, Affiliation}) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'affiliation', attrs =
|
||||
[?XMLATTR('node', node_to_string(Node)),
|
||||
?XMLATTR('affiliation', affiliation_to_string(Affiliation))]}]
|
||||
[?XMLATTR(<<"node">>, node_to_string(Node)),
|
||||
?XMLATTR(<<"affiliation">>, affiliation_to_string(Affiliation))]}]
|
||||
end, lists:usort(lists:flatten(Affiliations))),
|
||||
{result, #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children =
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'affiliations', children =
|
||||
@ -2302,8 +2302,8 @@ get_affiliations(Host, Node, JID) ->
|
||||
fun({_, none}) -> [];
|
||||
({{AU, AS, AR}, Affiliation}) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'affiliation', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR('affiliation', affiliation_to_string(Affiliation))]}]
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR(<<"affiliation">>, affiliation_to_string(Affiliation))]}]
|
||||
end, Affiliations),
|
||||
{result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'affiliations', attrs = nodeAttr(Node), children =
|
||||
@ -2325,12 +2325,12 @@ set_affiliations(Host, Node, From, EntitiesEls) ->
|
||||
#xmlel{name = 'affiliation', attrs = Attrs} ->
|
||||
JID = try
|
||||
exmpp_jid:parse(
|
||||
exmpp_xml:get_attribute_from_list(Attrs, 'jid', ""))
|
||||
exmpp_xml:get_attribute_from_list(Attrs, <<"jid">>, ""))
|
||||
catch
|
||||
_:_ -> error
|
||||
end,
|
||||
Affiliation = string_to_affiliation(
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, 'affiliation', "")),
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"affiliation">>, "")),
|
||||
if
|
||||
(JID == error) or
|
||||
(Affiliation == false) ->
|
||||
@ -2418,8 +2418,8 @@ read_sub(Subscriber, Node, NodeId, SubId, Lang) ->
|
||||
{result, #pubsub_subscription{options = Options}} ->
|
||||
{result, XdataEl} = pubsub_subscription_odbc:get_options_xform(Lang, Options),
|
||||
OptionsEl = #xmlel{ns = ?NS_PUBSUB, name = 'options',
|
||||
attrs = [ ?XMLATTR('jid', exmpp_jid:to_binary(Subscriber)),
|
||||
?XMLATTR('subid', SubId) | nodeAttr(Node)],
|
||||
attrs = [ ?XMLATTR(<<"jid">>, exmpp_jid:to_binary(Subscriber)),
|
||||
?XMLATTR(<<"subid">>, SubId) | nodeAttr(Node)],
|
||||
children = [XdataEl]},
|
||||
PubsubEl = #xmlel{ns = ?NS_PUBSUB, name = 'pubsub', children = [OptionsEl]},
|
||||
{result, PubsubEl}
|
||||
@ -2512,11 +2512,11 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
|
||||
case Node of
|
||||
<<>> ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
|
||||
[?XMLATTR('node', node_to_string(SubsNode)),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
[?XMLATTR(<<"node">>, node_to_string(SubsNode)),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
SubsNode ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
|
||||
[?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
[?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
_ ->
|
||||
[]
|
||||
end;
|
||||
@ -2526,14 +2526,14 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
|
||||
case Node of
|
||||
<<>> ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name='subscription',
|
||||
attrs = [?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR('subid', SubId),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription)) | nodeAttr(SubsNode)]}];
|
||||
attrs = [?XMLATTR(<<"jid">>, exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR(<<"subid">>, SubId),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription)) | nodeAttr(SubsNode)]}];
|
||||
SubsNode ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription',
|
||||
attrs = [?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR('subid', SubId),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
attrs = [?XMLATTR(<<"jid">>, exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR(<<"subid">>, SubId),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
_ ->
|
||||
[]
|
||||
end;
|
||||
@ -2541,13 +2541,13 @@ get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) ->
|
||||
case Node of
|
||||
<<>> ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
|
||||
[?XMLATTR('node', node_to_string(SubsNode)),
|
||||
?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
[?XMLATTR(<<"node">>, node_to_string(SubsNode)),
|
||||
?XMLATTR(<<"jid">>, exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
SubsNode ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name = 'subscription', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(SubJID)),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
_ ->
|
||||
[]
|
||||
end
|
||||
@ -2584,13 +2584,13 @@ get_subscriptions(Host, Node, JID) ->
|
||||
({_, pending, _}) -> [];
|
||||
({{AU, AS, AR}, Subscription}) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscription', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription))]}];
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription))]}];
|
||||
({{AU, AS, AR}, Subscription, SubId}) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscription', attrs =
|
||||
[?XMLATTR('jid', exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR('subscription', subscription_to_string(Subscription)),
|
||||
?XMLATTR('subid', SubId)]}]
|
||||
[?XMLATTR(<<"jid">>, exmpp_jid:to_binary(AU, AS, AR)),
|
||||
?XMLATTR(<<"subscription">>, subscription_to_string(Subscription)),
|
||||
?XMLATTR(<<"subid">>, SubId)]}]
|
||||
end, Subscriptions),
|
||||
{result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'subscriptions', attrs = nodeAttr(Node), children =
|
||||
@ -2612,14 +2612,14 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
|
||||
#xmlel{name = 'subscription', attrs = Attrs} ->
|
||||
JID = try
|
||||
exmpp_jid:parse(
|
||||
exmpp_xml:get_attribute_from_list(Attrs, 'jid', ""))
|
||||
exmpp_xml:get_attribute_from_list(Attrs, <<"jid">>, ""))
|
||||
catch
|
||||
_:_ ->
|
||||
error
|
||||
end,
|
||||
Subscription = string_to_subscription(
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, 'subscription', false)),
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, "subid", false),
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"subscription">>, false)),
|
||||
SubId = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"subid">>, false),
|
||||
if
|
||||
(JID == error) or
|
||||
(Subscription == false) ->
|
||||
@ -2643,8 +2643,8 @@ set_subscriptions(Host, Node, From, EntitiesEls) ->
|
||||
children =
|
||||
[#xmlel{ns = ?NS_PUBSUB,
|
||||
name = 'subscription',
|
||||
attrs = [?XMLATTR('jid', exmpp_jid:to_binary(JID)),
|
||||
?XMLATTR('subsription', subscription_to_string(Sub)) | nodeAttr(Node)]}]}]},
|
||||
attrs = [?XMLATTR(<<"jid">>, exmpp_jid:to_binary(JID)),
|
||||
?XMLATTR(<<"subsription">>, subscription_to_string(Sub)) | nodeAttr(Node)]}]}]},
|
||||
ejabberd_router:route(service_jid(Host), JID, Stanza)
|
||||
end,
|
||||
Action = fun(#pubsub_node{type = Type, idx = Nidx}) ->
|
||||
@ -2973,14 +2973,14 @@ broadcast_config_notification(Host, Node, NodeId, Type, NodeOptions, Lang) ->
|
||||
SubsByDepth when is_list(SubsByDepth) ->
|
||||
Content = case get_option(NodeOptions, deliver_payloads) of
|
||||
true ->
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
get_configure_xfields(Type, NodeOptions, Lang, [])}];
|
||||
false ->
|
||||
[]
|
||||
end,
|
||||
Stanza = event_stanza(
|
||||
[#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'items', attrs = nodeAttr(Node), children =
|
||||
[#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'item', attrs = [?XMLATTR('id', <<"configuration">>)], children =
|
||||
[#xmlel{ns = ?NS_PUBSUB_EVENT, name = 'item', attrs = [?XMLATTR(<<"id">>, <<"configuration">>)], children =
|
||||
Content}]}]),
|
||||
broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza, false),
|
||||
{result, true};
|
||||
@ -3191,7 +3191,7 @@ get_configure(Host, ServerHost, Node, From, Lang) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'configure', attrs =
|
||||
nodeAttr(Node), children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
|
||||
[?XMLATTR('type', <<"form">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
get_configure_xfields(Type, Options, Lang, Groups)
|
||||
}]}]}};
|
||||
_ ->
|
||||
@ -3208,7 +3208,7 @@ get_default(Host, Node, _From, Lang) ->
|
||||
Options = node_options(Type),
|
||||
{result, #xmlel{ns = ?NS_PUBSUB_OWNER, name = 'pubsub', children =
|
||||
[#xmlel{ns = ?NS_PUBSUB_OWNER, name = 'default', children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
get_configure_xfields(Type, Options, Lang, [])
|
||||
}]}]}}.
|
||||
|
||||
@ -3359,7 +3359,7 @@ get_configure_xfields(_Type, Options, Lang, Groups) ->
|
||||
set_configure(Host, Node, From, Els, Lang) ->
|
||||
case exmpp_xml:remove_cdata_from_list(Els) of
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'x'} = XEl] ->
|
||||
case exmpp_xml:get_attribute_as_list(XEl, 'type', undefined) of
|
||||
case exmpp_xml:get_attribute_as_list(XEl, <<"type">>, undefined) of
|
||||
"cancel" ->
|
||||
{result, []};
|
||||
"submit" ->
|
||||
@ -3761,7 +3761,7 @@ extended_error(Error, Ext) ->
|
||||
extended_error(Error, Ext, []).
|
||||
extended_error(Error, unsupported, Feature) ->
|
||||
extended_error(Error, unsupported,
|
||||
[?XMLATTR('feature', Feature)]);
|
||||
[?XMLATTR(<<"feature">>, Feature)]);
|
||||
extended_error(Error, Ext, ExtAttrs) ->
|
||||
Pubsub_Err = #xmlel{ns = ?NS_PUBSUB_ERRORS, name = Ext, attrs = ExtAttrs},
|
||||
exmpp_xml:append_child(exmpp_stanza:error(?NS_JABBER_CLIENT, Error),
|
||||
@ -3774,13 +3774,13 @@ uniqid() ->
|
||||
|
||||
% node attributes
|
||||
nodeAttr(Node) when is_list(Node) ->
|
||||
[?XMLATTR('node', Node)];
|
||||
[?XMLATTR(<<"node">>, Node)];
|
||||
nodeAttr(Node) ->
|
||||
[?XMLATTR('node', node_to_string(Node))].
|
||||
[?XMLATTR(<<"node">>, node_to_string(Node))].
|
||||
|
||||
% item attributes
|
||||
itemAttr([]) -> [];
|
||||
itemAttr(ItemId) -> [?XMLATTR('id', ItemId)].
|
||||
itemAttr(ItemId) -> [?XMLATTR(<<"id">>, ItemId)].
|
||||
|
||||
% build item elements from item list
|
||||
itemsEls(Items) ->
|
||||
@ -3821,19 +3821,19 @@ add_headers(#xmlel{children = Els} = Stanza, HeaderName, HeaderNS, HeaderEls) ->
|
||||
%% identifier of the collection".
|
||||
collection_shim(Node) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name ='header',
|
||||
attrs = [?XMLATTR('name', <<"Collection">>)],
|
||||
attrs = [?XMLATTR(<<"name">>, <<"Collection">>)],
|
||||
children = [?XMLCDATA(node_to_string(Node))]}].
|
||||
|
||||
subid_shim(SubIds) ->
|
||||
[#xmlel{ns = ?NS_PUBSUB, name ='header',
|
||||
attrs = [?XMLATTR('name', <<"SubId">>)],
|
||||
attrs = [?XMLATTR(<<"name">>, <<"SubId">>)],
|
||||
children = [?XMLCDATA(SubId)]}
|
||||
|| SubId <- SubIds].
|
||||
|
||||
|
||||
extended_headers(JIDs) ->
|
||||
[#xmlel{ns = ?NS_ADDRESS, name = 'address',
|
||||
attrs = [?XMLATTR('type', <<"replyto">>), ?XMLATTR('jid', JID)]}
|
||||
attrs = [?XMLATTR(<<"type">>, <<"replyto">>), ?XMLATTR(<<"jid">>, JID)]}
|
||||
|| JID <- JIDs].
|
||||
|
||||
feature_check_packet(allow, _User, Server, Pres, {From, _To, El}, in) ->
|
||||
@ -3846,7 +3846,7 @@ feature_check_packet(allow, _User, Server, Pres, {From, _To, El}, in) ->
|
||||
case exmpp_xml:get_element(El, 'event') of
|
||||
#xmlel{name = 'event', ns = ?NS_PUBSUB_EVENT} = Event ->
|
||||
Items = exmpp_xml:get_element(Event, ?NS_PUBSUB_EVENT, 'items'),
|
||||
Feature = exmpp_xml:get_attribute_as_list(Items, "node", ""),
|
||||
Feature = exmpp_xml:get_attribute_as_list(Items, <<"node">>, ""),
|
||||
case is_feature_supported(Pres, Feature) of
|
||||
true -> allow;
|
||||
false -> deny
|
||||
@ -3937,9 +3937,9 @@ notify_owners(true, JID, Host, Node, Owners, State) ->
|
||||
Message = #xmlel{name = 'message', ns = ?NS_JABBER_CLIENT,
|
||||
children = [#xmlel{name = 'pubsub', ns = ?NS_PUBSUB,
|
||||
children = [#xmlel{name = 'subscription', ns = ?NS_PUBSUB,
|
||||
attrs = [?XMLATTR('node', Node),
|
||||
?XMLATTR('jid', exmpp_jid:prep_to_binary(exmpp_jid:make(JID))),
|
||||
?XMLATTR('subscription', State)]}]}]},
|
||||
attrs = [?XMLATTR(<<"node">>, Node),
|
||||
?XMLATTR(<<"jid">>, exmpp_jid:prep_to_binary(exmpp_jid:make(JID))),
|
||||
?XMLATTR(<<"subscription">>, State)]}]}]},
|
||||
lists:foreach(
|
||||
fun(Owner) ->
|
||||
ejabberd_router:route(exmpp_jid:make(Host), exmpp_jid:make(Owner), Message)
|
||||
|
@ -276,7 +276,7 @@
|
||||
if (SubJID == LJID) or (SubJID == BJID) ->
|
||||
@@ -616,7 +422,8 @@
|
||||
[#xmlel{name = 'identity', ns = ?NS_DISCO_INFO,
|
||||
attrs = [?XMLATTR('category', <<"pubsub">>), ?XMLATTR('type', <<"pep">>)]}];
|
||||
attrs = [?XMLATTR(<<"category">>, <<"pubsub">>), ?XMLATTR('type', <<"pep">>)]}];
|
||||
disco_identity(Host, Node, From) ->
|
||||
- Action = fun(#pubsub_node{idx = Nidx, type = Type, options = Options, owners = Owners}) ->
|
||||
+ Action = fun(#pubsub_node{idx = Nidx, type = Type, options = Options}) ->
|
||||
@ -360,24 +360,24 @@
|
||||
@@ -1106,8 +917,9 @@
|
||||
[];
|
||||
true ->
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s)]} |
|
||||
[#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_s)]} |
|
||||
- lists:map(fun(T) ->
|
||||
- #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++T)]}
|
||||
- #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_s++"#"++T)]}
|
||||
+ lists:map(fun
|
||||
+ ("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_RSM_s)]};
|
||||
+ (T) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++T)]}
|
||||
+ ("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_RSM_s)]};
|
||||
+ (T) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_s++"#"++T)]}
|
||||
end, features(Type))]
|
||||
end,
|
||||
%% TODO: add meta-data info (spec section 5.4)
|
||||
@@ -1136,8 +948,9 @@
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_ADHOC_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_VCARD_s)]}] ++
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_ADHOC_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_VCARD_s)]}] ++
|
||||
- lists:map(fun(Feature) ->
|
||||
- #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++Feature)]}
|
||||
- #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_s++"#"++Feature)]}
|
||||
+ lists:map(fun
|
||||
+ ("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_RSM_s)]};
|
||||
+ (Feature) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR('var', ?NS_PUBSUB_s++"#"++Feature)]}
|
||||
+ ("rsm") -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_RSM_s)]};
|
||||
+ (Feature) -> #xmlel{ns = ?NS_DISCO_INFO, name = 'feature', attrs = [?XMLATTR(<<"var">>, ?NS_PUBSUB_s++"#"++Feature)]}
|
||||
end, features(Host, Node))};
|
||||
?NS_ADHOC_b ->
|
||||
command_disco_info(Host, Node, From);
|
||||
@ -400,7 +400,7 @@
|
||||
CommandItems = [
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item',
|
||||
@@ -1173,19 +986,20 @@
|
||||
?XMLATTR('name', "Get Pending")
|
||||
?XMLATTR(<<"name">>, "Get Pending")
|
||||
]}],
|
||||
{result, CommandItems};
|
||||
-iq_disco_items(_Host, ?NS_PUBSUB_GET_PENDING, _From) ->
|
||||
@ -427,7 +427,7 @@
|
||||
fun(#pubsub_node{id = {_, SubNode}, options = SubOptions}) ->
|
||||
@@ -1203,7 +1017,7 @@
|
||||
{result, Name} = node_call(Type, get_item_name, [Host, Node, RN]),
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR('jid', Host), ?XMLATTR('name', Name)]}
|
||||
#xmlel{ns = ?NS_DISCO_ITEMS, name = 'item', attrs = [?XMLATTR(<<"jid">>, Host), ?XMLATTR('name', Name)]}
|
||||
end, NodeItems),
|
||||
- {result, Nodes ++ Items}
|
||||
+ {result, Nodes ++ Items ++ jlib:rsm_encode(RsmOut)}
|
||||
@ -680,8 +680,8 @@
|
||||
- {result, XdataEl} = pubsub_subscription:get_options_xform(Lang, Options),
|
||||
+ {result, XdataEl} = pubsub_subscription_odbc:get_options_xform(Lang, Options),
|
||||
OptionsEl = #xmlel{ns = ?NS_PUBSUB, name = 'options',
|
||||
attrs = [ ?XMLATTR('jid', exmpp_jid:to_binary(Subscriber)),
|
||||
?XMLATTR('subid', SubId) | nodeAttr(Node)],
|
||||
attrs = [ ?XMLATTR(<<"jid">>, exmpp_jid:to_binary(Subscriber)),
|
||||
?XMLATTR(<<"subid">>, SubId) | nodeAttr(Node)],
|
||||
@@ -2623,7 +2443,7 @@
|
||||
end.
|
||||
|
||||
@ -701,7 +701,7 @@
|
||||
{error, extended_error('not-acceptable', "invalid-subid")};
|
||||
{result, _} ->
|
||||
@@ -2827,8 +2647,8 @@
|
||||
?XMLATTR('subsription', subscription_to_string(Sub)) | nodeAttr(Node)]}]}]},
|
||||
?XMLATTR(<<"subsription">>, subscription_to_string(Sub)) | nodeAttr(Node)]}]}]},
|
||||
ejabberd_router:route(service_jid(Host), JID, Stanza)
|
||||
end,
|
||||
- Action = fun(#pubsub_node{owners = Owners, type = Type, idx = Nidx}) ->
|
||||
|
@ -170,10 +170,10 @@ get_options_xform(Lang, Options) ->
|
||||
Keys = [deliver, digest, digest_frequency, expire, include_body, show_values, subscription_type, subscription_depth],
|
||||
XFields = [get_option_xfield(Lang, Key, Options) || Key <- Keys],
|
||||
|
||||
{result, #xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR('type', <<"form">>)], children =
|
||||
{result, #xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs = [?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'field',
|
||||
attrs = [?XMLATTR('var', <<"FORM_TYPE">>), ?XMLATTR('type', <<"hidden">>)],
|
||||
attrs = [?XMLATTR(<<"var">>, <<"FORM_TYPE">>), ?XMLATTR(<<"type">>, <<"hidden">>)],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'value',
|
||||
children = [?XMLCDATA(?NS_PUBSUB_SUBSCRIBE_OPTIONS_s)]}]}] ++ XFields}}.
|
||||
@ -349,7 +349,7 @@ get_option_xfield(Lang, Key, Options) ->
|
||||
end,
|
||||
#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'field',
|
||||
attrs = [?XMLATTR('var', Var), ?XMLATTR('type', Type), ?XMLATTR('label', translate:translate(Lang, Label))],
|
||||
attrs = [?XMLATTR(<<"var">>, Var), ?XMLATTR(<<"type">>, Type), ?XMLATTR(<<"label">>, translate:translate(Lang, Label))],
|
||||
children = OptEls ++ Vals}.
|
||||
|
||||
%% TODO : check input type data
|
||||
@ -362,7 +362,7 @@ type_and_options(Type, _Lang) ->
|
||||
tr_xfield_options({Value, Label}, Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'option',
|
||||
attrs = [?XMLATTR('label', translate:translate(Lang, Label))],
|
||||
attrs = [?XMLATTR(<<"label">>, translate:translate(Lang, Label))],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'value',
|
||||
children = [?XMLCDATA(Value)]}]}.
|
||||
|
@ -125,7 +125,7 @@ get_options_xform(Lang, Options) ->
|
||||
{result, #xmlel{ns = ?NS_DATA_FORMS, name = 'x', children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'field',
|
||||
attrs = [?XMLATTR('var', <<"FORM_TYPE">>), ?XMLATTR('type', <<"hidden">>)],
|
||||
attrs = [?XMLATTR(<<"var">>, <<"FORM_TYPE">>), ?XMLATTR(<<"type">>, <<"hidden">>)],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'value',
|
||||
children = [?XMLCDATA(?NS_PUBSUB_SUBSCRIBE_OPTIONS_s)]}]}] ++ XFields}}.
|
||||
@ -226,7 +226,7 @@ get_option_xfield(Lang, Key, Options) ->
|
||||
end,
|
||||
#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'field',
|
||||
attrs = [?XMLATTR('var', Var), ?XMLATTR('type', Type), ?XMLATTR('label', translate:translate(Lang, Label))],
|
||||
attrs = [?XMLATTR(<<"var">>, Var), ?XMLATTR(<<"type">>, Type), ?XMLATTR('label', translate:translate(Lang, Label))],
|
||||
children = OptEls ++ Vals}.
|
||||
|
||||
type_and_options({Type, Options}, Lang) ->
|
||||
@ -237,7 +237,7 @@ type_and_options(Type, _Lang) ->
|
||||
tr_xfield_options({Value, Label}, Lang) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'option',
|
||||
attrs = [?XMLATTR('label', translate:translate(Lang, Label))],
|
||||
attrs = [?XMLATTR(<<"label">>, translate:translate(Lang, Label))],
|
||||
children = [#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'value',
|
||||
children = [?XMLCDATA(Value)]}]}.
|
||||
|
@ -221,16 +221,16 @@ process_iq(From, To,
|
||||
"Choose a username and password "
|
||||
"to register with this server"))}]},
|
||||
UField = #xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"username">>),
|
||||
?XMLATTR('type', <<"text-single">>),
|
||||
?XMLATTR('label', translate:translate(Lang, "User"))],
|
||||
[?XMLATTR(<<"var">>, <<"username">>),
|
||||
?XMLATTR(<<"type">>, <<"text-single">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, "User"))],
|
||||
children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}]},
|
||||
PField =
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', <<"password">>),
|
||||
?XMLATTR('type', <<"text-private">>),
|
||||
?XMLATTR('label', translate:translate(Lang, "Password"))],
|
||||
[?XMLATTR(<<"var">>, <<"password">>),
|
||||
?XMLATTR(<<"type">>, <<"text-private">>),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, "Password"))],
|
||||
children = [
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'required'}
|
||||
]
|
||||
|
@ -291,7 +291,7 @@ process_iq_get(From, To, IQ_Rec) ->
|
||||
US = {_, LServer} = {exmpp_jid:prep_node(From), exmpp_jid:prep_domain(From)},
|
||||
try
|
||||
{ItemsToSend, VersionToSend} =
|
||||
case {exmpp_xml:get_attribute_as_list(exmpp_iq:get_request(IQ_Rec), ver, not_found),
|
||||
case {exmpp_xml:get_attribute_as_list(exmpp_iq:get_request(IQ_Rec), <<"ver">>, not_found),
|
||||
roster_versioning_enabled(LServer),
|
||||
roster_version_on_db(LServer)} of
|
||||
{not_found, _ , _} ->
|
||||
@ -332,7 +332,7 @@ process_iq_get(From, To, IQ_Rec) ->
|
||||
{Items, false} ->
|
||||
exmpp_iq:result(IQ_Rec, exmpp_xml:element(?NS_ROSTER, 'query', [] , Items));
|
||||
{Items, Version} ->
|
||||
exmpp_iq:result(IQ_Rec, exmpp_xml:element(?NS_ROSTER, 'query', [?XMLATTR('ver', Version)], Items))
|
||||
exmpp_iq:result(IQ_Rec, exmpp_xml:element(?NS_ROSTER, 'query', [?XMLATTR(<<"ver">>, Version)], Items))
|
||||
end
|
||||
catch
|
||||
_:_ ->
|
||||
@ -408,22 +408,22 @@ convert_to_string(A) when is_list(A) -> A.
|
||||
item_to_xml(Item) ->
|
||||
{U, S, R} = Item#roster.jid,
|
||||
Attrs1 = exmpp_xml:set_attribute_in_list([],
|
||||
'jid', exmpp_jid:to_binary(U, S, R)),
|
||||
<<"jid">>, exmpp_jid:to_binary(U, S, R)),
|
||||
Attrs2 = case Item#roster.name of
|
||||
<<>> ->
|
||||
Attrs1;
|
||||
Name ->
|
||||
exmpp_xml:set_attribute_in_list(Attrs1, 'name', Name)
|
||||
exmpp_xml:set_attribute_in_list(Attrs1, <<"name">>, Name)
|
||||
end,
|
||||
Attrs3 = exmpp_xml:set_attribute_in_list(Attrs2,
|
||||
'subscription', Item#roster.subscription),
|
||||
<<"subscription">>, Item#roster.subscription),
|
||||
Attrs4 = case ask_to_pending(Item#roster.ask) of
|
||||
out ->
|
||||
exmpp_xml:set_attribute_in_list(Attrs3,
|
||||
'ask', <<"subscribe">>);
|
||||
<<"ask">>, <<"subscribe">>);
|
||||
both ->
|
||||
exmpp_xml:set_attribute_in_list(Attrs3,
|
||||
'ask', <<"subscribe">>);
|
||||
<<"ask">>, <<"subscribe">>);
|
||||
_ ->
|
||||
Attrs3
|
||||
end,
|
||||
@ -466,7 +466,7 @@ try_process_iq_set(From, To, IQ) ->
|
||||
|
||||
process_item_set(From, To, #xmlel{} = El) ->
|
||||
try
|
||||
JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_binary(El, 'jid', <<>>)),
|
||||
JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_binary(El, <<"jid">>, <<>>)),
|
||||
User = exmpp_jid:node(From),
|
||||
LUser = exmpp_jid:prep_node(From),
|
||||
LServer = exmpp_jid:prep_domain(From),
|
||||
@ -577,9 +577,9 @@ process_item_set(_From, _To, _) ->
|
||||
|
||||
process_item_attrs(Item, [#xmlattr{name = Attr, value = Val} | Attrs]) ->
|
||||
case Attr of
|
||||
'name' ->
|
||||
<<"name">> ->
|
||||
process_item_attrs(Item#roster{name = Val}, Attrs);
|
||||
'subscription' ->
|
||||
<<"subscription">> ->
|
||||
case Val of
|
||||
<<"remove">> ->
|
||||
process_item_attrs(Item#roster{subscription = remove},
|
||||
@ -587,7 +587,7 @@ process_item_attrs(Item, [#xmlattr{name = Attr, value = Val} | Attrs]) ->
|
||||
_ ->
|
||||
process_item_attrs(Item, Attrs)
|
||||
end;
|
||||
'ask' ->
|
||||
<<"ask">> ->
|
||||
process_item_attrs(Item, Attrs);
|
||||
_ ->
|
||||
process_item_attrs(Item, Attrs)
|
||||
@ -631,10 +631,10 @@ push_item(User, Server, From, Item)
|
||||
ejabberd_sm:route(exmpp_jid:make(),
|
||||
exmpp_jid:make(User, Server),
|
||||
#xmlel{name = 'broadcast', ns = roster_item, attrs =
|
||||
[exmpp_xml:attribute(u, U),
|
||||
exmpp_xml:attribute(s, S),
|
||||
exmpp_xml:attribute(r, R),
|
||||
exmpp_xml:attribute(subs, Item#roster.subscription)]}),
|
||||
[?XMLATTR(<<"u">>, U),
|
||||
?XMLATTR(<<"s">>, S),
|
||||
?XMLATTR(<<"r">>, R),
|
||||
?XMLATTR(<<"subs">>, Item#roster.subscription)]}),
|
||||
|
||||
case roster_versioning_enabled(Server) of
|
||||
true ->
|
||||
@ -673,7 +673,7 @@ push_item_version(Server, User, From, Item, RosterVersion) ->
|
||||
end, ejabberd_sm:get_user_resources(User, Server)).
|
||||
|
||||
push_item_version(User, Server, Resource, From, Item, RosterVersion) ->
|
||||
Request = #xmlel{ns = ?NS_ROSTER, name = 'query', attrs = [?XMLATTR('ver', RosterVersion)],
|
||||
Request = #xmlel{ns = ?NS_ROSTER, name = 'query', attrs = [?XMLATTR(<<"ver">>, RosterVersion)],
|
||||
children = [mod_roster:item_to_xml(Item)]},
|
||||
ResIQ = exmpp_iq:set(?NS_JABBER_CLIENT, Request,
|
||||
"push" ++ randoms:get_string()),
|
||||
@ -1053,7 +1053,7 @@ set_items(User, Server, #xmlel{children = Els})
|
||||
|
||||
process_item_set_t(LUser, LServer, #xmlel{} = El) ->
|
||||
try
|
||||
JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_list(El, 'jid', <<>>)),
|
||||
JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_list(El, <<"jid">>, <<>>)),
|
||||
JID = jlib:short_jid(JID1),
|
||||
LJID = jlib:short_prepd_jid(JID1),
|
||||
Item = #roster{usj = {LUser, LServer, LJID},
|
||||
@ -1097,9 +1097,9 @@ process_item_set_t(_LUser, _LServer, _) ->
|
||||
|
||||
process_item_attrs_ws(Item, [#xmlattr{name = Attr, value = Val} | Attrs]) ->
|
||||
case Attr of
|
||||
'name' ->
|
||||
<<"name">> ->
|
||||
process_item_attrs_ws(Item#roster{name = Val}, Attrs);
|
||||
'subscription' ->
|
||||
<<"subscription">> ->
|
||||
case Val of
|
||||
<<"remove">> ->
|
||||
process_item_attrs_ws(Item#roster{subscription = remove},
|
||||
@ -1119,7 +1119,7 @@ process_item_attrs_ws(Item, [#xmlattr{name = Attr, value = Val} | Attrs]) ->
|
||||
_ ->
|
||||
process_item_attrs_ws(Item, Attrs)
|
||||
end;
|
||||
'ask' ->
|
||||
<<"ask">> ->
|
||||
process_item_attrs_ws(Item, Attrs);
|
||||
_ ->
|
||||
process_item_attrs_ws(Item, Attrs)
|
||||
@ -1363,16 +1363,16 @@ user_roster(User, Server, Query, Lang) ->
|
||||
TDJID = build_contact_jid_td(R#roster.jid),
|
||||
?XE("tr",
|
||||
[TDJID,
|
||||
?XAC("td", [?XMLATTR('class', <<"valign">>)],
|
||||
?XAC("td", [?XMLATTR(<<"class">>, <<"valign">>)],
|
||||
R#roster.name),
|
||||
?XAC("td", [?XMLATTR('class', <<"valign">>)],
|
||||
?XAC("td", [?XMLATTR(<<"class">>, <<"valign">>)],
|
||||
atom_to_list(R#roster.subscription)),
|
||||
?XAC("td", [?XMLATTR('class', <<"valign">>)],
|
||||
?XAC("td", [?XMLATTR(<<"class">>, <<"valign">>)],
|
||||
atom_to_list(Pending)),
|
||||
?XAE("td", [?XMLATTR('class', <<"valign">>)], Groups),
|
||||
?XAE("td", [?XMLATTR(<<"class">>, <<"valign">>)], Groups),
|
||||
if
|
||||
Pending == in ->
|
||||
?XAE("td", [?XMLATTR('class', <<"valign">>)],
|
||||
?XAE("td", [?XMLATTR(<<"class">>, <<"valign">>)],
|
||||
[?INPUTT("submit",
|
||||
"validate" ++
|
||||
ejabberd_web_admin:term_to_id(R#roster.jid),
|
||||
@ -1380,7 +1380,7 @@ user_roster(User, Server, Query, Lang) ->
|
||||
true ->
|
||||
?X("td")
|
||||
end,
|
||||
?XAE("td", [?XMLATTR('class', <<"valign">>)],
|
||||
?XAE("td", [?XMLATTR(<<"class">>, <<"valign">>)],
|
||||
[?INPUTT("submit",
|
||||
"remove" ++
|
||||
ejabberd_web_admin:term_to_id(R#roster.jid),
|
||||
@ -1393,7 +1393,7 @@ user_roster(User, Server, Query, Lang) ->
|
||||
error -> [?XREST("Bad format")];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE("form", [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
FItems ++
|
||||
[?P,
|
||||
?INPUT("text", "newjid", ""), ?C(" "),
|
||||
@ -1403,7 +1403,7 @@ user_roster(User, Server, Query, Lang) ->
|
||||
_ ->
|
||||
[?XC("h1", ?T("Roster of ") ++ us_to_list({User, Server}))] ++
|
||||
[?CT("Bad format"), ?P] ++
|
||||
[?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE("form", [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?P,
|
||||
?INPUT("text", "newjid", ""), ?C(" "),
|
||||
?INPUTT("submit", "addjid", "Add Jabber ID")
|
||||
@ -1429,9 +1429,9 @@ build_contact_jid_td({U, S, R}) ->
|
||||
end,
|
||||
case JIDURI of
|
||||
[] ->
|
||||
?XAC('td', [?XMLATTR('class', <<"valign">>)], exmpp_jid:to_list(ContactJID));
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"valign">>)], exmpp_jid:to_list(ContactJID));
|
||||
URI when is_list(URI) ->
|
||||
?XAE('td', [?XMLATTR('class', <<"valign">>)], [?AC(JIDURI, exmpp_jid:to_list(ContactJID))])
|
||||
?XAE('td', [?XMLATTR(<<"class">>, <<"valign">>)], [?AC(JIDURI, exmpp_jid:to_list(ContactJID))])
|
||||
end.
|
||||
|
||||
%% @spec (User, Server, Items, Query) -> ok | nothing | error
|
||||
@ -1509,9 +1509,9 @@ user_roster_item_parse_query(User, Server, Items, Query) ->
|
||||
{U, S, R} = JID,
|
||||
UJID = exmpp_jid:make(User, Server),
|
||||
Attrs1 = exmpp_xml:set_attribute_in_list([],
|
||||
'jid', exmpp_jid:to_list(U, S, R)),
|
||||
<<"jid">>, exmpp_jid:to_list(U, S, R)),
|
||||
Attrs2 = exmpp_xml:set_attribute_in_list(Attrs1,
|
||||
'subscription', "remove"),
|
||||
<<"subscription">>, "remove"),
|
||||
Item = #xmlel{ns = ?NS_ROSTER, name = 'item',
|
||||
attrs = Attrs2},
|
||||
Request = #xmlel{
|
||||
|
@ -178,7 +178,7 @@ process_iq_get(From, To, IQ_Rec) ->
|
||||
US = {LUser, LServer} = {exmpp_jid:prep_node(From), exmpp_jid:prep_domain(From)},
|
||||
try
|
||||
{ItemsToSend, VersionToSend} =
|
||||
case {exmpp_xml:get_attribute_as_list(exmpp_iq:get_request(IQ_Rec), ver, not_found),
|
||||
case {exmpp_xml:get_attribute_as_list(exmpp_iq:get_request(IQ_Rec), <<"ver">>, not_found),
|
||||
roster_versioning_enabled(LServer),
|
||||
roster_version_on_db(LServer)} of
|
||||
{not_found, _ , _} ->
|
||||
@ -222,7 +222,7 @@ process_iq_get(From, To, IQ_Rec) ->
|
||||
{Items, false} ->
|
||||
exmpp_iq:result(IQ_Rec, exmpp_xml:element(?NS_ROSTER, 'query', [] , Items));
|
||||
{Items, Version} ->
|
||||
exmpp_iq:result(IQ_Rec, exmpp_xml:element(?NS_ROSTER, 'query', [?XMLATTR('ver', Version)], Items))
|
||||
exmpp_iq:result(IQ_Rec, exmpp_xml:element(?NS_ROSTER, 'query', [?XMLATTR(<<"ver">>, Version)], Items))
|
||||
end
|
||||
catch
|
||||
_:_ ->
|
||||
@ -278,22 +278,22 @@ get_roster(LUser, LServer) when is_binary(LUser), is_binary(LServer)->
|
||||
item_to_xml(Item) ->
|
||||
{U, S, R} = Item#roster.jid,
|
||||
Attrs1 = exmpp_xml:set_attribute_in_list([],
|
||||
'jid', exmpp_jid:to_binary(U, S, R)),
|
||||
<<"jid">>, exmpp_jid:to_binary(U, S, R)),
|
||||
Attrs2 = case Item#roster.name of
|
||||
<<>> ->
|
||||
Attrs1;
|
||||
Name ->
|
||||
exmpp_xml:set_attribute_in_list(Attrs1, 'name', Name)
|
||||
exmpp_xml:set_attribute_in_list(Attrs1, <<"name">>, Name)
|
||||
end,
|
||||
Attrs3 = exmpp_xml:set_attribute_in_list(Attrs2,
|
||||
'subscription', Item#roster.subscription),
|
||||
<<"subscription">>, Item#roster.subscription),
|
||||
Attrs = case ask_to_pending(Item#roster.ask) of
|
||||
out ->
|
||||
exmpp_xml:set_attribute_in_list(Attrs3,
|
||||
'ask', <<"subscribe">>);
|
||||
<<"ask">>, <<"subscribe">>);
|
||||
both ->
|
||||
exmpp_xml:set_attribute_in_list(Attrs3,
|
||||
'ask', <<"subscribe">>);
|
||||
<<"ask">>, <<"subscribe">>);
|
||||
_ ->
|
||||
Attrs3
|
||||
end,
|
||||
@ -315,7 +315,7 @@ process_iq_set(From, To, #iq{payload = Request} = IQ_Rec) ->
|
||||
|
||||
process_item_set(From, To, #xmlel{} = El) ->
|
||||
try
|
||||
JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_binary(El, 'jid', <<>>)),
|
||||
JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_binary(El, <<"jid">>, <<>>)),
|
||||
User = exmpp_jid:prep_node(From),
|
||||
Server = exmpp_jid:prep_domain(From),
|
||||
LServer = binary_to_list(Server),
|
||||
@ -416,9 +416,9 @@ process_item_set(_From, _To, _) ->
|
||||
|
||||
process_item_attrs(Item, [#xmlattr{name = Attr, value = Val} | Attrs]) ->
|
||||
case Attr of
|
||||
'name' ->
|
||||
<<"name">> ->
|
||||
process_item_attrs(Item#roster{name = Val}, Attrs);
|
||||
'subscription' ->
|
||||
<<"subscription">> ->
|
||||
case Val of
|
||||
<<"remove">> ->
|
||||
process_item_attrs(Item#roster{subscription = remove},
|
||||
@ -426,7 +426,7 @@ process_item_attrs(Item, [#xmlattr{name = Attr, value = Val} | Attrs]) ->
|
||||
_ ->
|
||||
process_item_attrs(Item, Attrs)
|
||||
end;
|
||||
'ask' ->
|
||||
<<"ask">> ->
|
||||
process_item_attrs(Item, Attrs);
|
||||
_ ->
|
||||
process_item_attrs(Item, Attrs)
|
||||
@ -454,10 +454,10 @@ push_item(User, Server, From, Item) when is_binary(User), is_binary(Server) ->
|
||||
ejabberd_sm:route(exmpp_jid:make(),
|
||||
exmpp_jid:make(User, Server),
|
||||
#xmlel{name = 'broadcast', ns = roster_item, attrs =
|
||||
[exmpp_xml:attribute(u, U),
|
||||
exmpp_xml:attribute(s, S),
|
||||
exmpp_xml:attribute(r, R),
|
||||
exmpp_xml:attribute(subs, Item#roster.subscription)]}),
|
||||
[?XMLATTR(<<"u">>, U),
|
||||
?XMLATTR(<<"s">>, S),
|
||||
?XMLATTR(<<"r">>, R),
|
||||
?XMLATTR(<<"subs">>, Item#roster.subscription)]}),
|
||||
case roster_versioning_enabled(Server) of
|
||||
true ->
|
||||
push_item_version(Server, User, From, Item, roster_version(Server, User));
|
||||
@ -487,7 +487,7 @@ push_item_version(Server, User, From, Item, RosterVersion) ->
|
||||
end, ejabberd_sm:get_user_resources(User, Server)).
|
||||
|
||||
push_item_version(User, Server, Resource, From, Item, RosterVersion) ->
|
||||
Request = #xmlel{ns = ?NS_ROSTER, name = 'query', attrs = [?XMLATTR('ver', RosterVersion)],
|
||||
Request = #xmlel{ns = ?NS_ROSTER, name = 'query', attrs = [?XMLATTR(<<"ver">>, RosterVersion)],
|
||||
children = [mod_roster:item_to_xml(Item)]},
|
||||
ResIQ = exmpp_iq:set(?NS_JABBER_CLIENT, Request,
|
||||
"push" ++ randoms:get_string()),
|
||||
@ -827,7 +827,7 @@ set_items(User, Server, #xmlel{children = Els}) when is_binary(User), is_binary(
|
||||
|
||||
process_item_set_t(LUser, LServer, #xmlel{} = El) ->
|
||||
try
|
||||
JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_binary(El, 'jid', <<>>)),
|
||||
JID1 = exmpp_jid:parse(exmpp_xml:get_attribute_as_binary(El, <<"jid">>, <<>>)),
|
||||
{U0, S0, R0} = LJID = jlib:short_prepd_jid(JID1),
|
||||
Username = ejabberd_odbc:escape(LUser),
|
||||
SJID = ejabberd_odbc:escape(exmpp_jid:to_binary(U0, S0, R0)),
|
||||
@ -853,9 +853,9 @@ process_item_set_t(_LUser, _LServer, _) ->
|
||||
|
||||
process_item_attrs_ws(Item, [#xmlattr{name = Attr, value = Val} | Attrs]) ->
|
||||
case Attr of
|
||||
'name' ->
|
||||
<<"name">> ->
|
||||
process_item_attrs_ws(Item#roster{name = Val}, Attrs);
|
||||
'subscription' ->
|
||||
<<"subscription">> ->
|
||||
case Val of
|
||||
<<"remove">> ->
|
||||
process_item_attrs_ws(Item#roster{subscription = remove},
|
||||
@ -1103,16 +1103,16 @@ user_roster(User, Server, Query, Lang) ->
|
||||
TDJID = build_contact_jid_td(R#roster.jid),
|
||||
?XE("tr",
|
||||
[TDJID,
|
||||
?XAC("td", [?XMLATTR('class', <<"valign">>)],
|
||||
?XAC("td", [?XMLATTR(<<"class">>, <<"valign">>)],
|
||||
binary_to_list(R#roster.name)),
|
||||
?XAC("td", [?XMLATTR('class', <<"valign">>)],
|
||||
?XAC("td", [?XMLATTR(<<"class">>, <<"valign">>)],
|
||||
atom_to_list(R#roster.subscription)),
|
||||
?XAC("td", [?XMLATTR('class', <<"valign">>)],
|
||||
?XAC("td", [?XMLATTR(<<"class">>, <<"valign">>)],
|
||||
atom_to_list(Pending)),
|
||||
?XAE("td", [?XMLATTR('class', <<"valign">>)], Groups),
|
||||
?XAE("td", [?XMLATTR(<<"class">>, <<"valign">>)], Groups),
|
||||
if
|
||||
Pending == in ->
|
||||
?XAE("td", [?XMLATTR('class', <<"valign">>)],
|
||||
?XAE("td", [?XMLATTR(<<"class">>, <<"valign">>)],
|
||||
[?INPUTT("submit",
|
||||
"validate" ++
|
||||
ejabberd_web_admin:term_to_id(R#roster.jid),
|
||||
@ -1120,7 +1120,7 @@ user_roster(User, Server, Query, Lang) ->
|
||||
true ->
|
||||
?X("td")
|
||||
end,
|
||||
?XAE("td", [?XMLATTR('class', <<"valign">>)],
|
||||
?XAE("td", [?XMLATTR(<<"class">>, <<"valign">>)],
|
||||
[?INPUTT("submit",
|
||||
"remove" ++
|
||||
ejabberd_web_admin:term_to_id(R#roster.jid),
|
||||
@ -1133,7 +1133,7 @@ user_roster(User, Server, Query, Lang) ->
|
||||
error -> [?XREST("Bad format")];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE("form", [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
FItems ++
|
||||
[?P,
|
||||
?INPUT("text", "newjid", ""), ?C(" "),
|
||||
@ -1143,7 +1143,7 @@ user_roster(User, Server, Query, Lang) ->
|
||||
_ ->
|
||||
[?XC("h1", ?T("Roster of ") ++ us_to_list({User, Server}))] ++
|
||||
[?CT("Bad format"), ?P] ++
|
||||
[?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE("form", [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?P,
|
||||
?INPUT("text", "newjid", ""), ?C(" "),
|
||||
?INPUTT("submit", "addjid", "Add Jabber ID")
|
||||
@ -1165,9 +1165,9 @@ build_contact_jid_td({U, S, R}) ->
|
||||
end,
|
||||
case JIDURI of
|
||||
[] ->
|
||||
?XAC('td', [?XMLATTR('class', <<"valign">>)], exmpp_jid:to_list(ContactJID));
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"valign">>)], exmpp_jid:to_list(ContactJID));
|
||||
URI when is_list(URI) ->
|
||||
?XAE('td', [?XMLATTR('class', <<"valign">>)], [?AC(JIDURI, exmpp_jid:to_list(ContactJID))])
|
||||
?XAE('td', [?XMLATTR(<<"class">>, <<"valign">>)], [?AC(JIDURI, exmpp_jid:to_list(ContactJID))])
|
||||
end.
|
||||
|
||||
user_roster_parse_query(User, Server, Items, Query) ->
|
||||
@ -1228,9 +1228,9 @@ user_roster_item_parse_query(User, Server, Items, Query) ->
|
||||
{value, _} ->
|
||||
UJID = exmpp_jid:make(User, Server),
|
||||
Attrs1 = exmpp_xml:set_attribute_in_list([],
|
||||
'jid', exmpp_jid:to_list(JID)),
|
||||
<<"jid">>, exmpp_jid:to_list(JID)),
|
||||
Attrs2 = exmpp_xml:set_attribute_in_list(Attrs1,
|
||||
'subscription', "remove"),
|
||||
<<"subscription">>, "remove"),
|
||||
Item = #xmlel{ns = ?NS_ROSTER, name = 'item',
|
||||
attrs = Attrs2},
|
||||
Request = #xmlel{
|
||||
|
@ -740,10 +740,10 @@ push_item(User, Server, From, Item) ->
|
||||
{U, S, R} = Item#roster.jid,
|
||||
ejabberd_sm:route(From, exmpp_jid:make(User, Server),
|
||||
#xmlel{name = 'broadcast', ns = roster_item, attrs =
|
||||
[exmpp_xml:attribute(u, U),
|
||||
exmpp_xml:attribute(s, S),
|
||||
exmpp_xml:attribute(r, R),
|
||||
exmpp_xml:attribute(subs, Item#roster.subscription)]}),
|
||||
[?XMLATTR(<<"u">>, U),
|
||||
?XMLATTR(<<"s">>, S),
|
||||
?XMLATTR(<<"r">>, R),
|
||||
?XMLATTR(<<"subs">>, Item#roster.subscription)]}),
|
||||
Request = #xmlel{ns = ?NS_ROSTER, name = 'query',
|
||||
children = [mod_roster:item_to_xml(Item)]},
|
||||
Stanza = exmpp_iq:set(?NS_JABBER_CLIENT, Request,
|
||||
@ -817,7 +817,7 @@ list_shared_roster_groups(Host, Query, Lang) ->
|
||||
error -> [?XREST("Bad format")];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE("form", [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[FGroups,
|
||||
?BR,
|
||||
?INPUTT("submit", "delete", "Delete Selected")
|
||||
@ -879,7 +879,7 @@ shared_roster_group(Host, Group, Query, Lang) ->
|
||||
FDisplayedGroups = [[DG, $\n] || DG <- DisplayedGroups],
|
||||
DescNL = length(re:split(Description, "\n", [{return, list}])),
|
||||
FGroup =
|
||||
?XAE("table", [?XMLATTR('class', <<"withtextareas">>)],
|
||||
?XAE("table", [?XMLATTR(<<"class">>, <<"withtextareas">>)],
|
||||
[?XE("tbody",
|
||||
[?XE("tr",
|
||||
[?XCT("td", "Group ID:"),
|
||||
@ -923,7 +923,7 @@ shared_roster_group(Host, Group, Query, Lang) ->
|
||||
error -> [?XREST("Bad format")];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE("form", [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE("form", [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[FGroup,
|
||||
?BR,
|
||||
?INPUTT("submit", "submit", "Submit")
|
||||
|
@ -46,7 +46,7 @@ stop(Host) ->
|
||||
|
||||
process_local_iq(_From, To, #iq{type = get,
|
||||
ns = XMLNS, payload = SubEl} = IQ_Rec) ->
|
||||
Node = string:tokens(exmpp_xml:get_attribute_as_list(SubEl, 'node', ""), "/"),
|
||||
Node = string:tokens(exmpp_xml:get_attribute_as_list(SubEl, <<"node">>, ""), "/"),
|
||||
Names = get_names(exmpp_xml:get_child_elements(SubEl), []),
|
||||
|
||||
case get_local_stats(exmpp_jid:domain(To), Node, Names) of
|
||||
@ -63,7 +63,7 @@ process_local_iq(_From, _To, #iq{type = set} = IQ_Rec) ->
|
||||
get_names([], Res) ->
|
||||
Res;
|
||||
get_names([#xmlel{name = "stat", attrs = Attrs} | Els], Res) ->
|
||||
Name = exmpp_xml:get_attribute_from_list_as_binary(Attrs, 'name', <<>>),
|
||||
Name = exmpp_xml:get_attribute_from_list_as_binary(Attrs, <<"name">>, <<>>),
|
||||
case Name of
|
||||
<<>> ->
|
||||
get_names(Els, Res);
|
||||
@ -74,7 +74,7 @@ get_names([_ | Els], Res) ->
|
||||
get_names(Els, Res).
|
||||
|
||||
|
||||
-define(STAT(Name), #xmlel{ns = ?NS_STATS_s, name = 'stat', attrs = [?XMLATTR('name', Name)]}).
|
||||
-define(STAT(Name), #xmlel{ns = ?NS_STATS_s, name = 'stat', attrs = [?XMLATTR(<<"name">>, Name)]}).
|
||||
|
||||
get_local_stats(_Server, [], []) ->
|
||||
{result,
|
||||
@ -116,16 +116,16 @@ get_local_stats(_Server, _, _) ->
|
||||
|
||||
-define(STATVAL(Val, Unit),
|
||||
#xmlel{ns = ?NS_STATS_s, name = 'stat', attrs =
|
||||
[?XMLATTR('name', Name),
|
||||
?XMLATTR('units', Unit),
|
||||
?XMLATTR('value', Val)
|
||||
[?XMLATTR(<<"name">>, Name),
|
||||
?XMLATTR(<<"units">>, Unit),
|
||||
?XMLATTR(<<"value">>, Val)
|
||||
]}).
|
||||
|
||||
-define(STATERR(Code, Desc),
|
||||
#xmlel{ns = ?NS_STATS_s, name = 'stat', attrs=
|
||||
[?XMLATTR('name', Name)], children =
|
||||
[?XMLATTR(<<"name">>, Name)], children =
|
||||
[#xmlel{ns = ?NS_STATS_s, name = 'error', attrs =
|
||||
[?XMLATTR('code', Code)], children =
|
||||
[?XMLATTR(<<"code">>, Code)], children =
|
||||
[#xmlcdata{cdata = Desc}]}]}).
|
||||
|
||||
|
||||
|
@ -339,16 +339,16 @@ set_vcard(User, LServer, LServerB, VCARD) ->
|
||||
|
||||
-define(TLFIELD(Type, Label, Var),
|
||||
#xmlel{ns = ?NS_VCARD, name = 'field', attrs = [
|
||||
?XMLATTR('type', Type),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)]}).
|
||||
?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)]}).
|
||||
|
||||
|
||||
-define(FORM(JID),
|
||||
[#xmlel{ns = ?NS_SEARCH, name = 'instructions', children =
|
||||
[#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "You need an x:data capable client to search"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
|
||||
[?XMLATTR('type', <<"form">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Search users in ") ++ exmpp_jid:to_list(JID))}]},
|
||||
#xmlel{ns = ?NS_SEARCH, name = 'instructions', children =
|
||||
@ -410,7 +410,7 @@ do_route(ServerHost, From, To, Packet) ->
|
||||
children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'x',
|
||||
attrs = [?XMLATTR('type',
|
||||
attrs = [?XMLATTR(<<"type">>,
|
||||
<<"result">>)],
|
||||
children = search_result(Lang,
|
||||
To, ServerHost, XData)}]},
|
||||
@ -439,19 +439,19 @@ do_route(ServerHost, From, To, Packet) ->
|
||||
children = Info ++ [
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'identity',
|
||||
attrs = [
|
||||
?XMLATTR('category', <<"directory">>),
|
||||
?XMLATTR('type', <<"user">>),
|
||||
?XMLATTR('name', translate:translate(Lang,
|
||||
?XMLATTR(<<"category">>, <<"directory">>),
|
||||
?XMLATTR(<<"type">>, <<"user">>),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang,
|
||||
"vCard User Search"))]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
|
||||
attrs = [
|
||||
?XMLATTR('var', ?NS_DISCO_INFO_s)]},
|
||||
?XMLATTR(<<"var">>, ?NS_DISCO_INFO_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
|
||||
attrs = [
|
||||
?XMLATTR('var', ?NS_SEARCH_s)]},
|
||||
?XMLATTR(<<"var">>, ?NS_SEARCH_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
|
||||
attrs = [
|
||||
?XMLATTR('var', ?NS_VCARD_s)]}
|
||||
?XMLATTR(<<"var">>, ?NS_VCARD_s)]}
|
||||
]},
|
||||
ResIQ = exmpp_iq:result(Packet, Result),
|
||||
ejabberd_router:route(To,
|
||||
@ -528,7 +528,7 @@ search_result(Lang, JID, ServerHost, Data) ->
|
||||
|
||||
-define(FIELD(Var, Val),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', Var)], children =
|
||||
[?XMLATTR(<<"var">>, Var)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
[#xmlcdata{cdata = Val}]}]}).
|
||||
|
||||
@ -862,9 +862,9 @@ user_vcard(User, Server, Query, Lang) ->
|
||||
{error, M} -> [?XREST(M)];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE('form', [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?XCT('h3', "vCard Photo:"),
|
||||
?XAE('img', [?XMLATTR('src', <<"photo">>), ?XMLATTR('border', <<"1px">>)], []),
|
||||
?XAE('img', [?XMLATTR(<<"src">>, <<"photo">>), ?XMLATTR(<<"border">>, <<"1px">>)], []),
|
||||
?XC('h3', ?T("vCard")++":"),
|
||||
?XE('pre', [?C(VcardString)]),
|
||||
?INPUTT("submit", "removevcard", "Remove vCard")
|
||||
|
@ -387,15 +387,15 @@ ldap_attribute_to_vcard(_, _) ->
|
||||
|
||||
-define(TLFIELD(Type, Label, Var),
|
||||
#xmlel{ns = ?NS_VCARD, name = 'field', attrs = [
|
||||
?XMLATTR('type', Type),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)]}).
|
||||
?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)]}).
|
||||
|
||||
-define(FORM(JID, SearchFields),
|
||||
[#xmlel{ns = ?NS_SEARCH, name = 'instructions', children =
|
||||
[#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "You need an x:data capable client to search"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
|
||||
[?XMLATTR('type', <<"form">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Search users in ") ++
|
||||
exmpp_jid:to_list(JID))}]},
|
||||
@ -442,7 +442,7 @@ route(State, From, To, Packet) ->
|
||||
children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'x',
|
||||
attrs = [?XMLATTR('type',
|
||||
attrs = [?XMLATTR(<<"type">>,
|
||||
<<"result">>)],
|
||||
children = search_result(Lang, To, State, XData)}]},
|
||||
ResIQ = exmpp_iq:result(Packet,
|
||||
@ -471,16 +471,16 @@ route(State, From, To, Packet) ->
|
||||
children = Info ++ [
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'identity',
|
||||
attrs = [
|
||||
?XMLATTR('category', <<"directory">>),
|
||||
?XMLATTR('type', <<"user">>),
|
||||
?XMLATTR('name', translate:translate(Lang,
|
||||
?XMLATTR(<<"category">>, <<"directory">>),
|
||||
?XMLATTR(<<"type">>, <<"user">>),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang,
|
||||
"vCard User Search"))]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
|
||||
attrs = [
|
||||
?XMLATTR('var', ?NS_SEARCH_s)]},
|
||||
?XMLATTR(<<"var">>, ?NS_SEARCH_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
|
||||
attrs = [
|
||||
?XMLATTR('var', ?NS_VCARD_s)]}
|
||||
?XMLATTR(<<"var">>, ?NS_VCARD_s)]}
|
||||
]},
|
||||
ResIQ = exmpp_iq:result(Packet, Result),
|
||||
ejabberd_router:route(To,
|
||||
@ -545,7 +545,7 @@ search_result(Lang, JID, State, Data) ->
|
||||
|
||||
-define(FIELD(Var, Val),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', Var)], children =
|
||||
[?XMLATTR(<<"var">>, Var)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
[#xmlcdata{cdata = Val}]}]}).
|
||||
|
||||
|
@ -138,7 +138,7 @@ process_sm_iq(_From, To, #iq{type = get} = IQ_Rec) ->
|
||||
{selected, ["vcard"], [{SVCARD}]} ->
|
||||
try exmpp_xml:parse_document(SVCARD,
|
||||
[names_as_atom, {check_elems, xmpp},
|
||||
{check_nss,xmpp}, {check_attrs,xmpp}]) of
|
||||
{check_nss,xmpp} ]) of
|
||||
[VCARD] ->
|
||||
exmpp_iq:result(IQ_Rec, VCARD)
|
||||
catch
|
||||
@ -253,16 +253,16 @@ set_vcard(User, LServer, VCARD) ->
|
||||
|
||||
-define(TLFIELD(Type, Label, Var),
|
||||
#xmlel{ns = ?NS_VCARD, name = 'field', attrs = [
|
||||
?XMLATTR('type', Type),
|
||||
?XMLATTR('label', translate:translate(Lang, Label)),
|
||||
?XMLATTR('var', Var)]}).
|
||||
?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"label">>, translate:translate(Lang, Label)),
|
||||
?XMLATTR(<<"var">>, Var)]}).
|
||||
|
||||
|
||||
-define(FORM(JID),
|
||||
[#xmlel{ns = ?NS_SEARCH, name = 'instructions', children =
|
||||
[#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "You need an x:data capable client to search"))}]},
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'x', attrs =
|
||||
[?XMLATTR('type', <<"form">>)], children =
|
||||
[?XMLATTR(<<"type">>, <<"form">>)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'title', children =
|
||||
[#xmlcdata{cdata = list_to_binary(translate:translate(Lang, "Search users in ") ++ exmpp_jid:to_list(JID))}]},
|
||||
#xmlel{ns = ?NS_SEARCH, name = 'instructions', children =
|
||||
@ -321,7 +321,7 @@ do_route(ServerHost, From, To, Packet) ->
|
||||
#xmlel{ns = ?NS_DATA_FORMS,
|
||||
name = 'x',
|
||||
attrs = [
|
||||
?XMLATTR('type',
|
||||
?XMLATTR(<<"type">>,
|
||||
<<"result">>)],
|
||||
children = search_result(Lang,
|
||||
To, ServerHost, XData)}]},
|
||||
@ -349,16 +349,16 @@ do_route(ServerHost, From, To, Packet) ->
|
||||
children = Info ++ [
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'identity',
|
||||
attrs = [
|
||||
?XMLATTR('category', <<"directory">>),
|
||||
?XMLATTR('type', <<"user">>),
|
||||
?XMLATTR('name', translate:translate(Lang,
|
||||
?XMLATTR(<<"category">>, <<"directory">>),
|
||||
?XMLATTR(<<"type">>, <<"user">>),
|
||||
?XMLATTR(<<"name">>, translate:translate(Lang,
|
||||
"vCard User Search"))]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
|
||||
attrs = [
|
||||
?XMLATTR('var', ?NS_SEARCH_s)]},
|
||||
?XMLATTR(<<"var">>, ?NS_SEARCH_s)]},
|
||||
#xmlel{ns = ?NS_DISCO_INFO, name = 'feature',
|
||||
attrs = [
|
||||
?XMLATTR('var', ?NS_VCARD_s)]}
|
||||
?XMLATTR(<<"var">>, ?NS_VCARD_s)]}
|
||||
]},
|
||||
ResIQ = exmpp_iq:result(Packet, Result),
|
||||
ejabberd_router:route(To,
|
||||
@ -436,7 +436,7 @@ search_result(Lang, JID, ServerHost, Data) ->
|
||||
|
||||
-define(FIELD(Var, Val),
|
||||
#xmlel{ns = ?NS_DATA_FORMS, name = 'field', attrs =
|
||||
[?XMLATTR('var', Var)], children =
|
||||
[?XMLATTR(<<"var">>, Var)], children =
|
||||
[#xmlel{ns = ?NS_DATA_FORMS, name = 'value', children =
|
||||
[#xmlcdata{cdata = Val}]}]}).
|
||||
|
||||
|
@ -51,7 +51,7 @@ stop(Host) ->
|
||||
|
||||
update_presence(Packet, User, Host) ->
|
||||
case exmpp_presence:is_presence(Packet) andalso
|
||||
exmpp_xml:get_attribute_as_binary(Packet, type, undefined)
|
||||
exmpp_xml:get_attribute_as_binary(Packet, <<"type">>, undefined)
|
||||
== undefined of
|
||||
true ->
|
||||
presence_with_xupdate(Packet, User, Host);
|
||||
|
@ -207,7 +207,7 @@ process_request(Data, IP) ->
|
||||
case catch parse_request(Data, PayloadSize, MaxStanzaSize) of
|
||||
%% No existing session:
|
||||
{ok, {"", Rid, Attrs, Payload}} ->
|
||||
case exmpp_xml:get_attribute_from_list_as_list(Attrs, "to", "") of
|
||||
case exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"to">>, "") of
|
||||
"" ->
|
||||
?DEBUG("Session not created (Improper addressing)", []),
|
||||
{200, ?HEADER, "<body type='terminate' "
|
||||
@ -231,13 +231,13 @@ process_request(Data, IP) ->
|
||||
%% Existing session
|
||||
{ok, {Sid, Rid, Attrs, Payload1}} ->
|
||||
StreamStart =
|
||||
case exmpp_xml:get_attribute_from_list_as_list(Attrs, ?NS_BOSH, restart, "") of
|
||||
case exmpp_xml:get_attribute_from_list_as_list(Attrs, ?NS_BOSH, <<"restart">>, "") of
|
||||
"true" ->
|
||||
true;
|
||||
_ ->
|
||||
false
|
||||
end,
|
||||
Payload2 = case exmpp_xml:get_attribute_from_list_as_list(Attrs, "type", "") of
|
||||
Payload2 = case exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"type">>, "") of
|
||||
"terminate" ->
|
||||
%% close stream
|
||||
Payload1 ++ [{xmlstreamend, "stream:stream"}];
|
||||
@ -264,7 +264,7 @@ process_request(Data, IP) ->
|
||||
handle_session_start(Pid, XmppDomain, Sid, Rid, Attrs,
|
||||
Payload, PayloadSize, IP) ->
|
||||
?DEBUG("got pid: ~p", [Pid]),
|
||||
Wait = case string:to_integer(exmpp_xml:get_attribute_from_list_as_list(Attrs, "wait", "")) of
|
||||
Wait = case string:to_integer(exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"wait">>, "")) of
|
||||
{error, _} ->
|
||||
?MAX_WAIT;
|
||||
{CWait, _} ->
|
||||
@ -275,7 +275,7 @@ handle_session_start(Pid, XmppDomain, Sid, Rid, Attrs,
|
||||
CWait
|
||||
end
|
||||
end,
|
||||
Hold = case string:to_integer(exmpp_xml:get_attribute_from_list_as_list(Attrs, "hold", "")) of
|
||||
Hold = case string:to_integer(exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"hold">>, "")) of
|
||||
{error, _} ->
|
||||
(?MAX_REQUESTS - 1);
|
||||
{CHold, _} ->
|
||||
@ -286,7 +286,7 @@ handle_session_start(Pid, XmppDomain, Sid, Rid, Attrs,
|
||||
CHold
|
||||
end
|
||||
end,
|
||||
Pdelay = case string:to_integer(exmpp_xml:get_attribute_from_list_as_list(Attrs, "process-delay", "")) of
|
||||
Pdelay = case string:to_integer(exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"process-delay">>, "")) of
|
||||
{error, _} ->
|
||||
?PROCESS_DELAY_DEFAULT;
|
||||
{CPdelay, _} when
|
||||
@ -298,11 +298,11 @@ handle_session_start(Pid, XmppDomain, Sid, Rid, Attrs,
|
||||
end,
|
||||
Version =
|
||||
case catch list_to_float(
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, "ver", "")) of
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"ver">>, "")) of
|
||||
{'EXIT', _} -> 0.0;
|
||||
V -> V
|
||||
end,
|
||||
XmppVersion = exmpp_xml:get_attribute_from_list_as_list(Attrs, ?NS_BOSH, version, ""),
|
||||
XmppVersion = exmpp_xml:get_attribute_from_list_as_list(Attrs, ?NS_BOSH, <<"version">>, ""),
|
||||
?DEBUG("Create session: ~p", [Sid]),
|
||||
mnesia:async_dirty(
|
||||
fun() ->
|
||||
@ -638,8 +638,8 @@ process_http_put(#http_put{rid = Rid, attrs = Attrs, payload = Payload,
|
||||
StateName, StateData, RidAllow) ->
|
||||
?DEBUG("Actually processing request: ~p", [Request]),
|
||||
%% Check if key valid
|
||||
Key = exmpp_xml:get_attribute_from_list_as_list(Attrs, "key", ""),
|
||||
NewKey = exmpp_xml:get_attribute_from_list_as_list(Attrs, "newkey", ""),
|
||||
Key = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"key">>, ""),
|
||||
NewKey = exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"newkey">>, ""),
|
||||
KeyAllow =
|
||||
case RidAllow of
|
||||
repeat ->
|
||||
@ -746,7 +746,7 @@ process_http_put(#http_put{rid = Rid, attrs = Attrs, payload = Payload,
|
||||
{To, ""} ->
|
||||
DecNs = [{?NS_XMPP, "stream"},
|
||||
{?NS_JABBER_CLIENT, none}],
|
||||
StreamAttrs = [#xmlattr{name = 'to', value = list_to_binary(To)}],
|
||||
StreamAttrs = [#xmlattr{name = <<"to">>, value = list_to_binary(To)}],
|
||||
StreamEl = #xmlel{name = stream, ns = ?NS_XMPP, declared_ns = DecNs,
|
||||
attrs = StreamAttrs},
|
||||
gen_fsm:send_event(
|
||||
@ -755,8 +755,8 @@ process_http_put(#http_put{rid = Rid, attrs = Attrs, payload = Payload,
|
||||
{To, Version} ->
|
||||
DecNs = [{?NS_XMPP, "stream"},
|
||||
{?NS_JABBER_CLIENT, none}],
|
||||
StreamAttrs = [#xmlattr{name = 'to', value = list_to_binary(To)},
|
||||
#xmlattr{name = 'version', value = list_to_binary(Version)}],
|
||||
StreamAttrs = [?XMLATTR(<<"to">>, list_to_binary(To)),
|
||||
?XMLATTR(<<"version">>, list_to_binary(Version))],
|
||||
StreamEl = #xmlel{name = stream, ns = ?NS_XMPP, declared_ns = DecNs,
|
||||
attrs = StreamAttrs},
|
||||
gen_fsm:send_event(
|
||||
@ -869,11 +869,11 @@ handle_http_put_error(Reason, #http_bind{pid=FsmRef, version=Version})
|
||||
#xmlel{name = 'body',
|
||||
ns = ?NS_HTTP_BIND_s,
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
ns = ?NS_HTTP_BIND_s,
|
||||
value = <<"terminate">>
|
||||
},
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
ns = ?NS_HTTP_BIND_s,
|
||||
value = <<"item-not-found">>
|
||||
}
|
||||
@ -885,11 +885,11 @@ handle_http_put_error(Reason, #http_bind{pid=FsmRef, version=Version})
|
||||
#xmlel{name = 'body',
|
||||
ns = ?NS_HTTP_BIND_s,
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
ns = ?NS_HTTP_BIND_s,
|
||||
value = <<"terminate">>
|
||||
},
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
ns = ?NS_HTTP_BIND_s,
|
||||
value = <<"item-not-found">>
|
||||
}
|
||||
@ -901,11 +901,11 @@ handle_http_put_error(Reason, #http_bind{pid=FsmRef, version=Version})
|
||||
#xmlel{name = 'body',
|
||||
ns = ?NS_HTTP_BIND_s,
|
||||
attrs = [
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
ns = ?NS_HTTP_BIND_s,
|
||||
value = <<"terminate">>
|
||||
},
|
||||
#xmlattr{name = 'type',
|
||||
#xmlattr{name = <<"type">>,
|
||||
ns = ?NS_HTTP_BIND_s,
|
||||
value = <<"policy-violation">>
|
||||
}
|
||||
@ -936,7 +936,7 @@ rid_allow(OldRid, NewRid, Attrs, Hold, MaxPause) ->
|
||||
%% We did not miss any packet, we can process it immediately:
|
||||
NewRid == OldRid + 1 ->
|
||||
case catch list_to_integer(
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, "pause", "")) of
|
||||
exmpp_xml:get_attribute_from_list_as_list(Attrs, <<"pause">>, "")) of
|
||||
{'EXIT', _} ->
|
||||
{true, 0};
|
||||
Pause1 when Pause1 =< MaxPause ->
|
||||
@ -1004,9 +1004,9 @@ prepare_outpacket_response(#http_bind{id=Sid, wait=Wait,
|
||||
Rid, OutPacket, true) ->
|
||||
case OutPacket of
|
||||
[{xmlstreamstart, _, OutAttrs} | Els] ->
|
||||
AuthID = exmpp_xml:get_attribute_from_list_as_list(OutAttrs, "id", ""),
|
||||
FromB = exmpp_xml:get_attribute_from_list_as_binary(OutAttrs, "from", ""),
|
||||
Version = exmpp_xml:get_attribute_from_list_as_list(OutAttrs, "version", ""),
|
||||
AuthID = exmpp_xml:get_attribute_from_list_as_list(OutAttrs, <<"id">>, ""),
|
||||
FromB = exmpp_xml:get_attribute_from_list_as_binary(OutAttrs, <<"from">>, <<>>),
|
||||
Version = exmpp_xml:get_attribute_from_list_as_list(OutAttrs, <<"version">>, ""),
|
||||
OutEls =
|
||||
case Els of
|
||||
[] ->
|
||||
@ -1045,9 +1045,9 @@ prepare_outpacket_response(#http_bind{id=Sid, wait=Wait,
|
||||
"xmlns='"++?NS_HTTP_BIND_s++"'/>"};
|
||||
_ ->
|
||||
BOSH_attribs =
|
||||
[#xmlattr{name = 'authid', value = list_to_binary(AuthID)},
|
||||
#xmlattr{name = 'xmlns:stream', value = ?NS_XMPP_b}] ++
|
||||
[#xmlattr{name = 'version', ns = ?NS_BOSH_s, value = list_to_binary(Version)}],
|
||||
[#xmlattr{name = <<"authid">>, value = list_to_binary(AuthID)},
|
||||
#xmlattr{name = <<"xmlns:stream">>, value = ?NS_XMPP_b}] ++
|
||||
[#xmlattr{name = <<"version">>, ns = ?NS_BOSH_s, value = list_to_binary(Version)}],
|
||||
MaxInactivity = get_max_inactivity(To, ?MAX_INACTIVITY),
|
||||
MaxPause = get_max_pause(To),
|
||||
{200, ?HEADER,
|
||||
@ -1056,31 +1056,31 @@ prepare_outpacket_response(#http_bind{id=Sid, wait=Wait,
|
||||
ns = ?NS_HTTP_BIND_s,
|
||||
declared_ns = [{?NS_XBOSH_s, ?NS_XBOSH_pfx}],
|
||||
attrs = [
|
||||
#xmlattr{name = 'sid',
|
||||
#xmlattr{name = <<"sid">>,
|
||||
value = list_to_binary(Sid)
|
||||
},
|
||||
#xmlattr{name = 'wait',
|
||||
#xmlattr{name = <<"wait">>,
|
||||
value = list_to_binary(integer_to_list(Wait))
|
||||
},
|
||||
#xmlattr{name = 'requests',
|
||||
#xmlattr{name = <<"requests">>,
|
||||
value = list_to_binary(integer_to_list(Hold+1))
|
||||
},
|
||||
#xmlattr{name = 'inactivity',
|
||||
#xmlattr{name = <<"inactivity">>,
|
||||
value = list_to_binary(integer_to_list(trunc(MaxInactivity/1000)))
|
||||
},
|
||||
#xmlattr{name = 'maxpause',
|
||||
#xmlattr{name = <<"maxpause">>,
|
||||
value = list_to_binary(integer_to_list(MaxPause))
|
||||
},
|
||||
#xmlattr{name = 'polling',
|
||||
#xmlattr{name = <<"polling">>,
|
||||
value = list_to_binary(integer_to_list(trunc(?MIN_POLLING/1000000)))
|
||||
},
|
||||
#xmlattr{name = 'ver',
|
||||
#xmlattr{name = <<"ver">>,
|
||||
value = ?BOSH_VERSION_b
|
||||
},
|
||||
#xmlattr{name = 'from',
|
||||
#xmlattr{name = <<"from">>,
|
||||
value = FromB
|
||||
},
|
||||
#xmlattr{name = 'secure',
|
||||
#xmlattr{name = <<"secure">>,
|
||||
value = <<"true">>
|
||||
}
|
||||
] ++ BOSH_attribs,
|
||||
@ -1252,7 +1252,7 @@ parse_request(Data, PayloadSize, MaxStanzaSize) ->
|
||||
{error, bad_request};
|
||||
true ->
|
||||
%case catch list_to_integer(xml:get_attr_s("rid", Attrs)) of
|
||||
case catch list_to_integer(exmpp_xml:get_attribute_as_list(Xml, "rid", "")) of
|
||||
case catch list_to_integer(exmpp_xml:get_attribute_as_list(Xml, <<"rid">>, "")) of
|
||||
|
||||
{'EXIT', _} ->
|
||||
{error, bad_request};
|
||||
@ -1269,7 +1269,7 @@ parse_request(Data, PayloadSize, MaxStanzaSize) ->
|
||||
false
|
||||
end
|
||||
end, Els),
|
||||
Sid = exmpp_xml:get_attribute_as_list(Xml, "sid", ""),
|
||||
Sid = exmpp_xml:get_attribute_as_list(Xml, <<"sid">>, ""),
|
||||
if
|
||||
PayloadSize =< MaxStanzaSize ->
|
||||
{ok, {Sid, Rid, Attrs, FixedEls}};
|
||||
|
@ -173,7 +173,7 @@ get_human_html_xmlel() ->
|
||||
Par1 = #xmlel{name = p, children =
|
||||
[#xmlcdata{cdata = <<"An implementation of ">>},
|
||||
#xmlel{name = a,
|
||||
attrs = [#xmlattr{name=href, value = <<"http://xmpp.org/extensions/xep-0025.html">>}],
|
||||
attrs = [#xmlattr{name = <<"href">>, value = <<"http://xmpp.org/extensions/xep-0025.html">>}],
|
||||
children = [#xmlcdata{cdata = <<"Jabber HTTP Polling (XEP-0025)">>}]
|
||||
}
|
||||
]},
|
||||
@ -182,7 +182,7 @@ get_human_html_xmlel() ->
|
||||
"To use HTTP-Poll you need a Jabber/XMPP client that supports it.">>}
|
||||
]},
|
||||
#xmlel{name = html,
|
||||
attrs = [#xmlattr{name = xmlns, value= <<"http://www.w3.org/1999/xhtml">>}],
|
||||
attrs = [#xmlattr{name = <<"xmlns">>, value= <<"http://www.w3.org/1999/xhtml">>}],
|
||||
children =
|
||||
[#xmlel{name = head, children = [#xmlel{name = title, children = [#xmlcdata{cdata = Heading}]}]},
|
||||
#xmlel{name = body, children = [H, Par1, Par2]}]}.
|
||||
|
@ -48,12 +48,12 @@ make_xhtml(Els) ->
|
||||
|
||||
make_xhtml(HeadEls, Els) ->
|
||||
#xmlel{ns = ?NS_XHTML, name = 'html', attrs = [
|
||||
exmpp_xml:attribute(?NS_XML, 'lang', <<"en">>),
|
||||
?XMLATTR('lang', <<"en">>)], children = [
|
||||
exmpp_xml:attribute(?NS_XML, <<"lang">>, <<"en">>),
|
||||
?XMLATTR(<<"lang">>, <<"en">>)], children = [
|
||||
#xmlel{ns = ?NS_XHTML, name = 'head', children = [
|
||||
#xmlel{ns = ?NS_XHTML, name = 'meta', attrs = [
|
||||
?XMLATTR('http-equiv', <<"Content-Type">>),
|
||||
?XMLATTR('content', <<"text/html; charset=utf-8">>)
|
||||
?XMLATTR(<<"http-equiv">>, <<"Content-Type">>),
|
||||
?XMLATTR(<<"content">>, <<"text/html; charset=utf-8">>)
|
||||
]}
|
||||
| HeadEls
|
||||
]},
|
||||
@ -71,14 +71,14 @@ make_xhtml(HeadEls, Els) ->
|
||||
-define(XAC(Name, Attrs, Text), ?XAE(Name, Attrs, [?C(Text)])).
|
||||
|
||||
-define(LI(Els), ?XE('li', Els)).
|
||||
-define(A(URL, Els), ?XAE('a', [?XMLATTR('href', URL)], Els)).
|
||||
-define(A(URL, Els), ?XAE('a', [?XMLATTR(<<"href">>, URL)], Els)).
|
||||
-define(AC(URL, Text), ?A(URL, [?C(Text)])).
|
||||
-define(P, ?X('p')).
|
||||
-define(BR, ?X('br')).
|
||||
-define(INPUT(Type, Name, Value),
|
||||
?XA('input', [?XMLATTR('type', Type),
|
||||
?XMLATTR('name', Name),
|
||||
?XMLATTR('value', Value)])).
|
||||
?XA('input', [?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"name">>, Name),
|
||||
?XMLATTR(<<"value">>, Value)])).
|
||||
|
||||
error(not_found) ->
|
||||
{404, [], make_xhtml([?XC('h1', "404 Not Found")])};
|
||||
|
@ -43,9 +43,9 @@
|
||||
|
||||
-define(INPUTATTRS(Type, Name, Value, Attrs),
|
||||
?XA("input", Attrs ++
|
||||
[?XMLATTR('type', Type),
|
||||
?XMLATTR('name', Name),
|
||||
?XMLATTR('value', Value)])).
|
||||
[?XMLATTR(<<"type">>, Type),
|
||||
?XMLATTR(<<"name">>, Name),
|
||||
?XMLATTR(<<"value">>, Value)])).
|
||||
|
||||
%%%==================================
|
||||
%%%% get_acl_access
|
||||
@ -274,50 +274,50 @@ make_xhtml(Els, Host, Node, Lang, JID) ->
|
||||
MenuItems = make_navigation(Host, Node, Lang, JID),
|
||||
{200, [html],
|
||||
#xmlel{ns = ?NS_XHTML, name = 'html', attrs = [
|
||||
exmpp_xml:attribute(?NS_XML, 'lang', Lang),
|
||||
?XMLATTR('lang', Lang)], children =
|
||||
exmpp_xml:attribute(?NS_XML, <<"lang">>, Lang),
|
||||
?XMLATTR(<<"lang">>, Lang)], children =
|
||||
[#xmlel{ns = ?NS_XHTML, name = 'head', children =
|
||||
[?XCT('title', "ejabberd Web Admin"),
|
||||
#xmlel{ns = ?NS_XHTML, name = 'meta', attrs = [
|
||||
?XMLATTR('http-equiv', <<"Content-Type">>),
|
||||
?XMLATTR('content', <<"text/html; charset=utf-8">>)]},
|
||||
?XMLATTR(<<"http-equiv">>, <<"Content-Type">>),
|
||||
?XMLATTR(<<"content">>, <<"text/html; charset=utf-8">>)]},
|
||||
#xmlel{ns = ?NS_XHTML, name = 'script',
|
||||
%% This children is to ensure exmpp puts: <script ...></script>
|
||||
children = [?C(".")],
|
||||
attrs = [
|
||||
?XMLATTR('src', Base ++ "additions.js"),
|
||||
?XMLATTR('type', <<"text/javascript">>)]},
|
||||
?XMLATTR(<<"src">>, Base ++ "additions.js"),
|
||||
?XMLATTR(<<"type">>, <<"text/javascript">>)]},
|
||||
#xmlel{ns = ?NS_XHTML, name = 'link', attrs = [
|
||||
?XMLATTR('href', Base ++ "favicon.ico"),
|
||||
?XMLATTR('type', <<"image/x-icon">>),
|
||||
?XMLATTR('rel', <<"shortcut icon">>)]},
|
||||
?XMLATTR(<<"href">>, Base ++ "favicon.ico"),
|
||||
?XMLATTR(<<"type">>, <<"image/x-icon">>),
|
||||
?XMLATTR(<<"rel">>, <<"shortcut icon">>)]},
|
||||
#xmlel{ns = ?NS_XHTML, name = 'link', attrs = [
|
||||
?XMLATTR('href', Base ++ "style.css"),
|
||||
?XMLATTR('type', <<"text/css">>),
|
||||
?XMLATTR('rel', <<"stylesheet">>)]}]},
|
||||
?XMLATTR(<<"href">>, Base ++ "style.css"),
|
||||
?XMLATTR(<<"type">>, <<"text/css">>),
|
||||
?XMLATTR(<<"rel">>, <<"stylesheet">>)]}]},
|
||||
?XE('body',
|
||||
[?XAE('div',
|
||||
[?XMLATTR('id', <<"container">>)],
|
||||
[?XMLATTR(<<"id">>, <<"container">>)],
|
||||
[?XAE('div',
|
||||
[?XMLATTR('id', <<"header">>)],
|
||||
[?XMLATTR(<<"id">>, <<"header">>)],
|
||||
[?XE('h1',
|
||||
[?ACT("/admin/", "ejabberd Web Admin")]
|
||||
)]),
|
||||
?XAE('div',
|
||||
[?XMLATTR('id', <<"navigation">>)],
|
||||
[?XMLATTR(<<"id">>, <<"navigation">>)],
|
||||
[?XE('ul',
|
||||
MenuItems
|
||||
)]),
|
||||
?XAE('div',
|
||||
[?XMLATTR('id', <<"content">>)],
|
||||
[?XMLATTR(<<"id">>, <<"content">>)],
|
||||
Els),
|
||||
?XAE('div',
|
||||
[?XMLATTR('id', <<"clearcopyright">>)],
|
||||
[?XMLATTR(<<"id">>, <<"clearcopyright">>)],
|
||||
[#xmlcdata{cdata = <<>>}])]),
|
||||
?XAE('div',
|
||||
[?XMLATTR('id', <<"copyrightouter">>)],
|
||||
[?XMLATTR(<<"id">>, <<"copyrightouter">>)],
|
||||
[?XAE('div',
|
||||
[?XMLATTR('id', <<"copyright">>)],
|
||||
[?XMLATTR(<<"id">>, <<"copyright">>)],
|
||||
[?XC('p',
|
||||
"ejabberd (c) 2002-2010 ProcessOne")
|
||||
])])])
|
||||
@ -837,7 +837,7 @@ process_admin(Host,
|
||||
error -> [?XREST("Bad format")];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?TEXTAREA("acls", integer_to_list(lists:max([16, NumLines])), "80", ACLsP++"."),
|
||||
?BR,
|
||||
?INPUTT("submit", "submit", "Submit")
|
||||
@ -879,7 +879,7 @@ process_admin(Host,
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XE('p', [?ACT("../acls-raw/", "Raw")])] ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[acls_to_xhtml(ACLs),
|
||||
?BR,
|
||||
?INPUTT("submit", "delete", "Delete Selected"),
|
||||
@ -946,7 +946,7 @@ process_admin(Host,
|
||||
error -> [?XREST("Bad format")];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?TEXTAREA("access", integer_to_list(lists:max([16, NumLines])), "80", AccessP++"."),
|
||||
?BR,
|
||||
?INPUTT("submit", "submit", "Submit")
|
||||
@ -983,7 +983,7 @@ process_admin(Host,
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XE('p', [?ACT("../access-raw/", "Raw")])] ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[access_rules_to_xhtml(AccessRules, Lang),
|
||||
?BR,
|
||||
?INPUTT("submit", "delete", "Delete Selected")
|
||||
@ -1023,7 +1023,7 @@ process_admin(Host,
|
||||
error -> [?XREST("Bad format")];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[access_rule_to_xhtml(Rules),
|
||||
?BR,
|
||||
?INPUTT("submit", "submit", "Submit")
|
||||
@ -1079,17 +1079,17 @@ process_admin(Host,
|
||||
list_last_activity(Host, Lang, true, Month)
|
||||
end,
|
||||
make_xhtml([?XCT('h1', "Users Last Activity")] ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?CT("Period: "),
|
||||
?XAE('select', [?XMLATTR('name', <<"period">>)],
|
||||
?XAE('select', [?XMLATTR(<<"name">>, <<"period">>)],
|
||||
lists:map(
|
||||
fun({O, V}) ->
|
||||
Sel = if
|
||||
O == Month -> [?XMLATTR('selected', <<"selected">>)];
|
||||
O == Month -> [?XMLATTR(<<"selected">>, <<"selected">>)];
|
||||
true -> []
|
||||
end,
|
||||
?XAC('option',
|
||||
Sel ++ [?XMLATTR('value', O)], V)
|
||||
Sel ++ [?XMLATTR(<<"value">>, O)], V)
|
||||
end, [{"month", ?T("Last month")},
|
||||
{"year", ?T("Last year")},
|
||||
{"all", ?T("All activity")}])),
|
||||
@ -1245,15 +1245,15 @@ acl_spec_to_xhtml(ID, Spec) ->
|
||||
|
||||
acl_spec_select(ID, Opt) ->
|
||||
?XE('td',
|
||||
[?XAE('select', [?XMLATTR('name', "type" ++ ID)],
|
||||
[?XAE('select', [?XMLATTR(<<"name">>, "type" ++ ID)],
|
||||
lists:map(
|
||||
fun(O) ->
|
||||
Sel = if
|
||||
O == Opt -> [?XMLATTR('selected', <<"selected">>)];
|
||||
O == Opt -> [?XMLATTR(<<"selected">>, <<"selected">>)];
|
||||
true -> []
|
||||
end,
|
||||
?XAC('option',
|
||||
Sel ++ [?XMLATTR('value', O)],
|
||||
Sel ++ [?XMLATTR(<<"value">>, O)],
|
||||
atom_to_list(O))
|
||||
end, [user, server, user_regexp, server_regexp,
|
||||
node_regexp, user_glob, server_glob, node_glob, all, raw]))]).
|
||||
@ -1454,9 +1454,9 @@ access_rule_to_xhtml(Rules) ->
|
||||
SACL = atom_to_list(ACL),
|
||||
SAccess ++ "\s\t" ++ SACL ++ "\n"
|
||||
end, Rules),
|
||||
?XAC('textarea', [?XMLATTR('name', <<"rules">>),
|
||||
?XMLATTR('rows', <<"16">>),
|
||||
?XMLATTR('cols', <<"80">>)],
|
||||
?XAC('textarea', [?XMLATTR(<<"name">>, <<"rules">>),
|
||||
?XMLATTR(<<"rows">>, <<"16">>),
|
||||
?XMLATTR(<<"cols">>, <<"80">>)],
|
||||
Text).
|
||||
|
||||
parse_access_rule(Text) ->
|
||||
@ -1546,7 +1546,7 @@ list_users(Host, Query, Lang, URLFunc) ->
|
||||
error -> [?XREST("Bad format")];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?XE('table',
|
||||
[?XE('tr',
|
||||
[?XC('td', ?T("User") ++ ":"),
|
||||
@ -1560,7 +1560,7 @@ list_users(Host, Query, Lang, URLFunc) ->
|
||||
]),
|
||||
?XE('tr',
|
||||
[?X('td'),
|
||||
?XAE('td', [?XMLATTR('class', <<"alignright">>)],
|
||||
?XAE('td', [?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
[?INPUTT("submit", "addnewuser", "Add User")]),
|
||||
?X('td')
|
||||
])]),
|
||||
@ -1796,7 +1796,7 @@ user_info(User, Server, Query, Lang) ->
|
||||
error -> [?XREST("Bad format")];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?XCT('h3', "Connected Resources:")] ++ FResources ++
|
||||
[?XCT('h3', "Password:")] ++ FPassword ++
|
||||
[?XCT('h3', "Last Activity")] ++ [?C(LastActivity)] ++
|
||||
@ -1876,9 +1876,9 @@ list_last_activity(Host, Lang, Integral, Period) ->
|
||||
end,
|
||||
Max = lists:max(Hist),
|
||||
[?XAE('ol',
|
||||
[?XMLATTR('id', <<"lastactivity">>), ?XMLATTR('start', <<"0">>)],
|
||||
[?XMLATTR(<<"id">>, <<"lastactivity">>), ?XMLATTR(<<"start">>, <<"0">>)],
|
||||
[?XAE('li',
|
||||
[?XMLATTR('style',
|
||||
[?XMLATTR(<<"style">>,
|
||||
"width:" ++ integer_to_list(
|
||||
trunc(90 * V / Max)) ++ "%;")],
|
||||
[#xmlcdata{cdata = list_to_binary(pretty_string_int(V))}])
|
||||
@ -1934,13 +1934,13 @@ get_miscopts(Lang, Method, Query) ->
|
||||
end ++
|
||||
[
|
||||
?XCT("h2", "Global"),
|
||||
?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[options_to_xhtml("global", GlobalOptions, Lang),
|
||||
?BR,
|
||||
?INPUTT("submit", "deleteglobal", "Delete Selected")
|
||||
]),
|
||||
?XCT("h2", "Local"),
|
||||
?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[options_to_xhtml("local", LocalOptions, Lang),
|
||||
?BR,
|
||||
?INPUTT("submit", "deletelocal", "Delete Selected")
|
||||
@ -2076,7 +2076,7 @@ get_miscopt(Lang, Query, SType, OldSKey) ->
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XCT("h2", UpSType),
|
||||
?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?TEXTAREA("miscopt", integer_to_list(lists:max([16, NumLines])),
|
||||
"80", SOpt++"."),
|
||||
?BR,
|
||||
@ -2163,7 +2163,7 @@ get_node(global, Node, [], Query, Lang) ->
|
||||
?LI([?ACT(Base ++ "stats/", "Statistics")]),
|
||||
?LI([?ACT(Base ++ "update/", "Update")])
|
||||
] ++ MenuItems2),
|
||||
?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?INPUTT('submit', "restart", "Restart"),
|
||||
?C(" "),
|
||||
?INPUTT('submit', "stop", "Stop")])
|
||||
@ -2215,15 +2215,15 @@ get_node(global, Node, ["db"], Query, Lang) ->
|
||||
[?XC('td', STable),
|
||||
?XE('td', [db_storage_select(
|
||||
STable, Type, Lang)]),
|
||||
?XAC('td', [?XMLATTR('class', <<"alignright">>)],
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
pretty_string_int(Size)),
|
||||
?XAC('td', [?XMLATTR('class', <<"alignright">>)],
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
pretty_string_int(Memory))
|
||||
])
|
||||
end, STables),
|
||||
[?XC('h1', ?T("Database Tables at ") ++ atom_to_list(Node))] ++
|
||||
ResS ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?XAE('table', [],
|
||||
[?XE('thead',
|
||||
[?XE('tr',
|
||||
@ -2235,8 +2235,8 @@ get_node(global, Node, ["db"], Query, Lang) ->
|
||||
?XE('tbody',
|
||||
Rows ++
|
||||
[?XE('tr',
|
||||
[?XAE('td', [?XMLATTR('colspan', <<"4">>),
|
||||
?XMLATTR('class', <<"alignright">>)],
|
||||
[?XAE('td', [?XMLATTR(<<"colspan">>, <<"4">>),
|
||||
?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
[?INPUTT("submit", "submit",
|
||||
"Submit")])
|
||||
])]
|
||||
@ -2258,7 +2258,7 @@ get_node(global, Node, ["backup"], Query, Lang) ->
|
||||
[?XC('h1', ?T("Backup of ") ++ atom_to_list(Node))] ++
|
||||
ResS ++
|
||||
[?XCT('p', "Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately."),
|
||||
?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[?XAE('table', [],
|
||||
[?XE('tbody',
|
||||
[?XE('tr',
|
||||
@ -2351,7 +2351,7 @@ get_node(global, Node, ["pid"], _Query, Lang) ->
|
||||
?XAE('table', [],
|
||||
[?XE('tbody',
|
||||
[?XE('tr', [?XCT('td', "Number of processes:"),
|
||||
?XAC('td', [?XMLATTR('class', <<"alignright">>)],
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
pretty_string_int(ProcessesNumber))])
|
||||
])
|
||||
]),
|
||||
@ -2426,7 +2426,7 @@ get_node(global, Node, ["ports"], Query, Lang) ->
|
||||
{error, ReasonT} -> [?XRES(?T("Error") ++ ": " ++ ReasonT)];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[node_ports_to_xhtml(NewPorts, Lang)])
|
||||
];
|
||||
|
||||
@ -2450,7 +2450,7 @@ get_node(Host, Node, ["modules"], Query, Lang) when is_list(Host) ->
|
||||
error -> [?XREST("Bad format")];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[node_modules_to_xhtml(NewModules, Lang)])
|
||||
];
|
||||
|
||||
@ -2473,25 +2473,25 @@ get_node(global, Node, ["stats"], _Query, Lang) ->
|
||||
?XAE('table', [],
|
||||
[?XE('tbody',
|
||||
[?XE('tr', [?XCT('td', "Uptime:"),
|
||||
?XAC('td', [?XMLATTR('class', <<"alignright">>)],
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
UpTimeS)]),
|
||||
?XE('tr', [?XCT('td', "CPU Time:"),
|
||||
?XAC('td', [?XMLATTR('class', <<"alignright">>)],
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
CPUTimeS)]),
|
||||
?XE('tr', [?XCT('td', "Online Users:"),
|
||||
?XAC('td', [?XMLATTR('class', <<"alignright">>)],
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
pretty_string_int(OnlineUsers))]),
|
||||
?XE('tr', [?XCT('td', "Transactions Committed:"),
|
||||
?XAC('td', [?XMLATTR('class', <<"alignright">>)],
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
pretty_string_int(TransactionsCommitted))]),
|
||||
?XE('tr', [?XCT('td', "Transactions Aborted:"),
|
||||
?XAC('td', [?XMLATTR('class', <<"alignright">>)],
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
pretty_string_int(TransactionsAborted))]),
|
||||
?XE('tr', [?XCT('td', "Transactions Restarted:"),
|
||||
?XAC('td', [?XMLATTR('class', <<"alignright">>)],
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
pretty_string_int(TransactionsRestarted))]),
|
||||
?XE('tr', [?XCT('td', "Transactions Logged:"),
|
||||
?XAC('td', [?XMLATTR('class', <<"alignright">>)],
|
||||
?XAC('td', [?XMLATTR(<<"class">>, <<"alignright">>)],
|
||||
pretty_string_int(TransactionsLogged))])
|
||||
])
|
||||
])];
|
||||
@ -2525,13 +2525,13 @@ get_node(global, Node, ["update"], Query, Lang) ->
|
||||
[?BR,
|
||||
?INPUTATTRS(<<"button">>, <<"selectall">>,
|
||||
<<"Select All">>,
|
||||
[?XMLATTR('onClick', <<"selectAll()">>)]),
|
||||
[?XMLATTR(<<"onClick">>, <<"selectAll()">>)]),
|
||||
?C(" "),
|
||||
?INPUTATTRS(<<"button">>, <<"unselectall">>,
|
||||
<<"Unselect All">>,
|
||||
[?XMLATTR('onClick', <<"unSelectAll()">>)])],
|
||||
[?XMLATTR(<<"onClick">>, <<"unSelectAll()">>)])],
|
||||
%%?XE("ul", BeamsLis)
|
||||
?XAE('ul', [?XMLATTR('class', <<"noliststyle">>)],
|
||||
?XAE('ul', [?XMLATTR(<<"class">>, <<"noliststyle">>)],
|
||||
BeamsLis ++ SelectButtons)
|
||||
end,
|
||||
FmtScript = ?XC('pre', io_lib:format("~p", [Script])),
|
||||
@ -2542,7 +2542,7 @@ get_node(global, Node, ["update"], Query, Lang) ->
|
||||
{error, ErrorText} -> [?XREST("Error: " ++ ErrorText)];
|
||||
nothing -> []
|
||||
end ++
|
||||
[?XAE('form', [?XMLATTR('action', <<>>), ?XMLATTR('method', <<"post">>)],
|
||||
[?XAE('form', [?XMLATTR(<<"action">>, <<>>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[
|
||||
?XCT('h2', "Update plan"),
|
||||
?XCT('h3', "Modified modules"), Mods,
|
||||
@ -2592,15 +2592,15 @@ node_parse_query(Node, Query) ->
|
||||
|
||||
|
||||
db_storage_select(ID, Opt, Lang) ->
|
||||
?XAE('select', [?XMLATTR('name', "table" ++ ID)],
|
||||
?XAE('select', [?XMLATTR(<<"name">>, "table" ++ ID)],
|
||||
lists:map(
|
||||
fun({O, Desc}) ->
|
||||
Sel = if
|
||||
O == Opt -> [?XMLATTR('selected', <<"selected">>)];
|
||||
O == Opt -> [?XMLATTR(<<"selected">>, <<"selected">>)];
|
||||
true -> []
|
||||
end,
|
||||
?XACT('option',
|
||||
Sel ++ [?XMLATTR('value', O)],
|
||||
Sel ++ [?XMLATTR(<<"value">>, O)],
|
||||
Desc)
|
||||
end, [{ram_copies, "RAM copy"},
|
||||
{disc_copies, "RAM and disc copy"},
|
||||
@ -2713,7 +2713,7 @@ node_backup_parse_query(Node, Query) ->
|
||||
"import_piefxis_file", "export_piefxis_dir", "export_piefxis_host_dir"]).
|
||||
|
||||
node_ports_to_xhtml(Ports, Lang) ->
|
||||
?XAE('table', [?XMLATTR('class', <<"withtextareas">>)],
|
||||
?XAE('table', [?XMLATTR(<<"class">>, <<"withtextareas">>)],
|
||||
[?XE('thead',
|
||||
[?XE('tr',
|
||||
[?XCT('td', "Port"),
|
||||
@ -2731,9 +2731,9 @@ node_ports_to_xhtml(Ports, Lang) ->
|
||||
{NumLines, SOptsClean} = term_to_paragraph(OptsClean, 40),
|
||||
%%ID = term_to_id(E),
|
||||
?XE('tr',
|
||||
[?XAE('td', [?XMLATTR('size', <<"6">>)], [?C(SPort)]),
|
||||
?XAE('td', [?XMLATTR('size', <<"15">>)], [?C(SIP)]),
|
||||
?XAE('td', [?XMLATTR('size', <<"4">>)], [?C(atom_to_list(NetProt))]),
|
||||
[?XAE('td', [?XMLATTR(<<"size">>, <<"6">>)], [?C(SPort)]),
|
||||
?XAE('td', [?XMLATTR(<<"size">>, <<"15">>)], [?C(SIP)]),
|
||||
?XAE('td', [?XMLATTR(<<"size">>, <<"4">>)], [?C(atom_to_list(NetProt))]),
|
||||
?XE('td', [?INPUTS("text", "module" ++ SSPort,
|
||||
SModule, "15")]),
|
||||
?XE('td', [?TEXTAREA("opts" ++ SSPort, integer_to_list(NumLines), "35", SOptsClean)]),
|
||||
@ -2750,22 +2750,22 @@ node_ports_to_xhtml(Ports, Lang) ->
|
||||
?XE("td", [make_netprot_html("tcp")]),
|
||||
?XE('td', [?INPUTS("text", "modulenew", "", "15")]),
|
||||
?XE('td', [?TEXTAREA("optsnew", "2", "35", "[]")]),
|
||||
?XAE('td', [?XMLATTR("colspan", "2")],
|
||||
?XAE('td', [?XMLATTR(<<"colspan">>, "2")],
|
||||
[?INPUTT("submit", "addnew", "Add New")])
|
||||
]
|
||||
)]
|
||||
)]).
|
||||
|
||||
make_netprot_html(NetProt) ->
|
||||
?XAE('select', [?XMLATTR('name', "netprotnew")],
|
||||
?XAE('select', [?XMLATTR(<<"name">>, "netprotnew")],
|
||||
lists:map(
|
||||
fun(O) ->
|
||||
Sel = if
|
||||
O == NetProt -> [?XMLATTR('selected', <<"selected">>)];
|
||||
O == NetProt -> [?XMLATTR(<<"selected">>, <<"selected">>)];
|
||||
true -> []
|
||||
end,
|
||||
?XAC('option',
|
||||
Sel ++ [?XMLATTR('value', O)],
|
||||
Sel ++ [?XMLATTR(<<"value">>, O)],
|
||||
O)
|
||||
end, ["tcp", "udp"])).
|
||||
|
||||
@ -2843,7 +2843,7 @@ node_ports_parse_query(Node, Ports, Query) ->
|
||||
end.
|
||||
|
||||
node_modules_to_xhtml(Modules, Lang) ->
|
||||
?XAE('table', [?XMLATTR('class', <<"withtextareas">>)],
|
||||
?XAE('table', [?XMLATTR(<<"class">>, <<"withtextareas">>)],
|
||||
[?XE('thead',
|
||||
[?XE('tr',
|
||||
[?XCT('td', "Module"),
|
||||
@ -2868,7 +2868,7 @@ node_modules_to_xhtml(Modules, Lang) ->
|
||||
[?XE('tr',
|
||||
[?XE('td', [?INPUT("text", "modulenew", "")]),
|
||||
?XE('td', [?TEXTAREA("optsnew", "2", "40", "[]")]),
|
||||
?XAE('td', [?XMLATTR("colspan", "2")],
|
||||
?XAE('td', [?XMLATTR(<<"colspan">>, "2")],
|
||||
[?INPUTT("submit", "start", "Start")])
|
||||
]
|
||||
)]
|
||||
@ -3103,17 +3103,17 @@ make_menu_items2(Lang, Deep, {MURI, MName, [Item | Items]}, Res) ->
|
||||
make_menu_items2(Lang, Deep, {MURI, MName, Items}, Res2).
|
||||
|
||||
make_menu_item(header, 1, URI, Name, _Lang) ->
|
||||
?LI([?XAE('div', [?XMLATTR('id', <<"navhead">>)], [?AC(URI, Name)] )]);
|
||||
?LI([?XAE('div', [?XMLATTR(<<"id">>, <<"navhead">>)], [?AC(URI, Name)] )]);
|
||||
make_menu_item(header, 2, URI, Name, _Lang) ->
|
||||
?LI([?XAE('div', [?XMLATTR('id', <<"navheadsub">>)], [?AC(URI, Name)] )]);
|
||||
?LI([?XAE('div', [?XMLATTR(<<"id">>, <<"navheadsub">>)], [?AC(URI, Name)] )]);
|
||||
make_menu_item(header, 3, URI, Name, _Lang) ->
|
||||
?LI([?XAE('div', [?XMLATTR('id', <<"navheadsubsub">>)], [?AC(URI, Name)] )]);
|
||||
?LI([?XAE('div', [?XMLATTR(<<"id">>, <<"navheadsubsub">>)], [?AC(URI, Name)] )]);
|
||||
make_menu_item(item, 1, URI, Name, Lang) ->
|
||||
?LI([?XAE('div', [?XMLATTR('id', <<"navitem">>)], [?ACT(URI, Name)] )]);
|
||||
?LI([?XAE('div', [?XMLATTR(<<"id">>, <<"navitem">>)], [?ACT(URI, Name)] )]);
|
||||
make_menu_item(item, 2, URI, Name, Lang) ->
|
||||
?LI([?XAE('div', [?XMLATTR('id', <<"navitemsub">>)], [?ACT(URI, Name)] )]);
|
||||
?LI([?XAE('div', [?XMLATTR(<<"id">>, <<"navitemsub">>)], [?ACT(URI, Name)] )]);
|
||||
make_menu_item(item, 3, URI, Name, Lang) ->
|
||||
?LI([?XAE('div', [?XMLATTR('id', <<"navitemsubsub">>)], [?ACT(URI, Name)] )]).
|
||||
?LI([?XAE('div', [?XMLATTR(<<"id">>, <<"navitemsubsub">>)], [?ACT(URI, Name)] )]).
|
||||
|
||||
%%%==================================
|
||||
|
||||
|
@ -86,7 +86,7 @@ get_human_html_xmlel() ->
|
||||
Par1 = #xmlel{name = p, children =
|
||||
[#xmlcdata{cdata = <<"An implementation of ">>},
|
||||
#xmlel{name = a,
|
||||
attrs = [#xmlattr{name=href, value = <<"http://xmpp.org/extensions/xep-0206.html">>}],
|
||||
attrs = [#xmlattr{name = <<"href">>, value = <<"http://xmpp.org/extensions/xep-0206.html">>}],
|
||||
children = [#xmlcdata{cdata = <<"XMPP over BOSH (XEP-0206)">>}]
|
||||
}
|
||||
]},
|
||||
@ -95,7 +95,7 @@ get_human_html_xmlel() ->
|
||||
"To use HTTP-Bind you need a Jabber/XMPP client that supports it.">>}
|
||||
]},
|
||||
#xmlel{name = html,
|
||||
attrs = [#xmlattr{name = xmlns, value= <<"http://www.w3.org/1999/xhtml">>}],
|
||||
attrs = [#xmlattr{name = <<"xmlns">>, value= <<"http://www.w3.org/1999/xhtml">>}],
|
||||
children =
|
||||
[#xmlel{name = head, children = [#xmlel{name = title, children = [#xmlcdata{cdata = Heading}]}]},
|
||||
#xmlel{name = body, children = [H, Par1, Par2]}]}.
|
||||
|
@ -159,13 +159,13 @@ css() ->
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
make_xa_link_css() ->
|
||||
?XA('link', [?XMLATTR('href', <<"/register/register.css">>),
|
||||
?XMLATTR('type', <<"text/css">>),
|
||||
?XMLATTR('rel', <<"stylesheet">>)]).
|
||||
?XA('link', [?XMLATTR(<<"href">>, <<"/register/register.css">>),
|
||||
?XMLATTR(<<"type">>, <<"text/css">>),
|
||||
?XMLATTR(<<"rel">>, <<"stylesheet">>)]).
|
||||
|
||||
make_h1_title(TextString, Lang) ->
|
||||
?XACT('h1',
|
||||
[?XMLATTR('class', <<"title">>), ?XMLATTR('style', <<"text-align:center;">>)],
|
||||
[?XMLATTR(<<"class">>, <<"title">>), ?XMLATTR(<<"style">>, <<"text-align:center;">>)],
|
||||
TextString).
|
||||
|
||||
index_page(Lang) ->
|
||||
@ -205,7 +205,7 @@ form_new_get(Host, Lang) ->
|
||||
"Please read carefully the instructions to fill correctly the fields."),
|
||||
%% <!-- JID's take the form of 'username@server.com'. For example, my JID is 'kirjava@jabber.org'.
|
||||
%% The maximum length for a JID is 255 characters. -->
|
||||
?XAE('form', [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
?XAE('form', [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[
|
||||
?XE('ol', [
|
||||
?XE('li', [
|
||||
@ -364,7 +364,7 @@ form_changepass_get(Host, Lang) ->
|
||||
],
|
||||
Els=[
|
||||
make_h1_title("Change Password", Lang),
|
||||
?XAE('form', [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
?XAE('form', [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[
|
||||
?XE('ol', [
|
||||
?XE('li', [
|
||||
@ -482,7 +482,7 @@ form_del_get(Host, Lang) ->
|
||||
make_h1_title("Unregister a Jabber account", Lang),
|
||||
?XCT('p',
|
||||
"This page allows to unregister a Jabber account in this Jabber server."),
|
||||
?XAE('form', [?XMLATTR('action', <<"">>), ?XMLATTR('method', <<"post">>)],
|
||||
?XAE('form', [?XMLATTR(<<"action">>, <<"">>), ?XMLATTR(<<"method">>, <<"post">>)],
|
||||
[
|
||||
?XE('ol', [
|
||||
?XE('li', [
|
||||
|
Loading…
Reference in New Issue
Block a user