aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mod_admin_extra.erl2
-rw-r--r--src/mod_http_upload.erl65
2 files changed, 46 insertions, 21 deletions
diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl
index 141f5f5db..133b2fd29 100644
--- a/src/mod_admin_extra.erl
+++ b/src/mod_admin_extra.erl
@@ -1363,7 +1363,7 @@ get_last(User, Server) ->
%% <aa xmlns='bb'>Cluth</aa>
private_get(Username, Host, Element, Ns) ->
- ElementXml = [{Ns, #xmlel{name = Element, attrs = [{<<"xmlns">>, Ns}]}}],
+ ElementXml = #xmlel{name = Element, attrs = [{<<"xmlns">>, Ns}]},
Els = mod_private:get_data(jid:nodeprep(Username), jid:nameprep(Host),
[{Ns, ElementXml}]),
binary_to_list(fxml:element_to_binary(xmpp:encode(#private{xml_els = Els}))).
diff --git a/src/mod_http_upload.erl b/src/mod_http_upload.erl
index 49893f14a..25138d19a 100644
--- a/src/mod_http_upload.erl
+++ b/src/mod_http_upload.erl
@@ -512,12 +512,31 @@ process_iq(#iq{type = get, lang = Lang, sub_els = [#disco_info{}]} = IQ,
xmpp:make_iq_result(IQ, iq_disco_info(ServerHost, Lang, Name, AddInfo));
process_iq(#iq{type = get, sub_els = [#disco_items{}]} = IQ, _State) ->
xmpp:make_iq_result(IQ, #disco_items{});
-process_iq(#iq{type = get, lang = Lang, from = From,
- sub_els = [#upload_request{filename = File,
- size = Size,
- 'content-type' = CType,
- xmlns = XMLNS}]} = IQ,
- #state{server_host = ServerHost, access = Access} = State) ->
+process_iq(#iq{type = get, sub_els = [#upload_request{filename = File,
+ size = Size,
+ 'content-type' = CType,
+ xmlns = XMLNS}]} = IQ,
+ State) ->
+ process_slot_request(IQ, File, Size, CType, XMLNS, State);
+process_iq(#iq{type = get, sub_els = [#upload_request_0{filename = File,
+ size = Size,
+ 'content-type' = CType,
+ xmlns = XMLNS}]} = IQ,
+ State) ->
+ process_slot_request(IQ, File, Size, CType, XMLNS, State);
+process_iq(#iq{type = T, lang = Lang} = IQ, _State) when T == get; T == set ->
+ Txt = <<"No module is handling this query">>,
+ xmpp:make_error(IQ, xmpp:err_service_unavailable(Txt, Lang));
+process_iq(#iq{}, _State) ->
+ not_request.
+
+-spec process_slot_request(iq(), binary(), pos_integer(), binary(), binary(),
+ state()) -> {iq(), state()} | iq().
+
+process_slot_request(#iq{lang = Lang, from = From} = IQ,
+ File, Size, CType, XMLNS,
+ #state{server_host = ServerHost,
+ access = Access} = State) ->
case acl:match_rule(ServerHost, Access, From) of
allow ->
ContentType = yield_content_type(CType),
@@ -540,12 +559,7 @@ process_iq(#iq{type = get, lang = Lang, from = From,
[jid:encode(From)]),
Txt = <<"Denied by ACL">>,
xmpp:make_error(IQ, xmpp:err_forbidden(Txt, Lang))
- end;
-process_iq(#iq{type = T, lang = Lang} = IQ, _State) when T == get; T == set ->
- Txt = <<"No module is handling this query">>,
- xmpp:make_error(IQ, xmpp:err_service_unavailable(Txt, Lang));
-process_iq(#iq{}, _State) ->
- not_request.
+ end.
-spec create_slot(state(), jid(), binary(), pos_integer(), binary(), binary())
-> {ok, slot()} | {ok, binary(), binary()} | {error, xmlel()}.
@@ -649,6 +663,8 @@ mk_slot(Slot, #state{put_url = PutPrefix, get_url = GetPrefix}, XMLNS) ->
PutURL = str:join([PutPrefix | Slot], <<$/>>),
GetURL = str:join([GetPrefix | Slot], <<$/>>),
mk_slot(PutURL, GetURL, XMLNS);
+mk_slot(PutURL, GetURL, ?NS_HTTP_UPLOAD_0) ->
+ #upload_slot_0{get = GetURL, put = PutURL, xmlns = ?NS_HTTP_UPLOAD_0};
mk_slot(PutURL, GetURL, XMLNS) ->
#upload_slot{get = GetURL, put = PutURL, xmlns = XMLNS}.
@@ -702,18 +718,27 @@ iq_disco_info(Host, Lang, Name, AddInfo) ->
AddInfo;
MaxSize ->
MaxSizeStr = integer_to_binary(MaxSize),
- Fields = [#xdata_field{type = hidden,
- var = <<"FORM_TYPE">>,
- values = [?NS_HTTP_UPLOAD]},
- #xdata_field{var = <<"max-file-size">>,
- values = [MaxSizeStr]}],
- [#xdata{type = result, fields = Fields}|AddInfo]
+ XData = lists:map(
+ fun(NS) ->
+ Fields = [#xdata_field{
+ type = hidden,
+ var = <<"FORM_TYPE">>,
+ values = [NS]},
+ #xdata_field{
+ var = <<"max-file-size">>,
+ values = [MaxSizeStr]}],
+ #xdata{type = result, fields = Fields}
+ end, [?NS_HTTP_UPLOAD, ?NS_HTTP_UPLOAD_0]),
+ XData ++ AddInfo
end,
#disco_info{identities = [#identity{category = <<"store">>,
type = <<"file">>,
name = translate:translate(Lang, Name)}],
- features = [?NS_HTTP_UPLOAD, ?NS_HTTP_UPLOAD_OLD,
- ?NS_DISCO_INFO, ?NS_DISCO_ITEMS],
+ features = [?NS_HTTP_UPLOAD,
+ ?NS_HTTP_UPLOAD_0,
+ ?NS_HTTP_UPLOAD_OLD,
+ ?NS_DISCO_INFO,
+ ?NS_DISCO_ITEMS],
xdata = Form}.
%% HTTP request handling.