From a9e3b76bedf43a66a1a6f69f95afe77fbf2752b6 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Thu, 14 Jul 2005 22:28:21 +0000 Subject: [PATCH] * src/ejabberd_c2s.erl: Processing of jabber:iq:register totally moved to mod_register.erl (thanks to Sergei Golovan) * src/mod_register.erl: Likewise * src/win32/ejabberd.nsi: Added two pictures in installer (thanks to Maxim Ryazanov) * src/win32/ejabberd_header.bmp: Likewise * src/win32/ejabberd_intro.bmp: Likewise * src/web/ejabberd_web_admin.erl: Fixed spelling of word "authentication" * src/ejabberd_c2s.erl: Likewise SVN Revision: 375 --- ChangeLog | 29 +++++++--- src/ejabberd_c2s.erl | 99 +++++++++++++++------------------ src/mod_register.erl | 27 +++++++++ src/web/ejabberd_web_admin.erl | 4 +- src/win32/ejabberd.nsi | 12 +++- src/win32/ejabberd_header.bmp | Bin 0 -> 34254 bytes src/win32/ejabberd_intro.bmp | Bin 0 -> 26494 bytes 7 files changed, 105 insertions(+), 66 deletions(-) create mode 100644 src/win32/ejabberd_header.bmp create mode 100644 src/win32/ejabberd_intro.bmp diff --git a/ChangeLog b/ChangeLog index 2566d47f7..0340e95da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2005-07-15 Alexey Shchepin + + * src/ejabberd_c2s.erl: Processing of jabber:iq:register totally + moved to mod_register.erl (thanks to Sergei Golovan) + * src/mod_register.erl: Likewise + + * src/win32/ejabberd.nsi: Added two pictures in installer (thanks + to Maxim Ryazanov) + * src/win32/ejabberd_header.bmp: Likewise + * src/win32/ejabberd_intro.bmp: Likewise + + * src/web/ejabberd_web_admin.erl: Fixed spelling of word + "authentication" + * src/ejabberd_c2s.erl: Likewise + 2005-07-13 Alexey Shchepin * src/mod_register.erl: Bugfix @@ -745,10 +760,10 @@ 2004-07-30 Alexey Shchepin * examples/extauth/check_pass_null.pl: A reference "null" - implementation of external authentification script (thanks to Leif + implementation of external authentication script (thanks to Leif Johansson) - * src/extauth.erl: Support for external authentification + * src/extauth.erl: Support for external authentication (thanks to Leif Johansson) * src/ejabberd_auth.erl: Likewise @@ -1382,7 +1397,7 @@ * src/ejabberd.cfg.example: Updated - * src/ejabberd_auth.erl: Support for LDAP authentification + * src/ejabberd_auth.erl: Support for LDAP authentication * src/cyrsasl_digest.erl: Likewise * src/mod_register.erl: Likewise * src/ejabberd_c2s.erl: Likewise @@ -1436,7 +1451,7 @@ 2003-11-07 Alexey Shchepin - * src/cyrsasl.erl: Updated SASL authentification + * src/cyrsasl.erl: Updated SASL authentication * src/ejabberd_c2s.erl: Likewise * src/ejabberd_sm.erl: Better resource handling @@ -1470,7 +1485,7 @@ 2003-10-30 Alexey Shchepin - * src/ejabberd_c2s.erl: More strong check for authentificated JID + * src/ejabberd_c2s.erl: More strong check for authenticated JID * src/mod_roster.erl: Bugfix @@ -1628,7 +1643,7 @@ 2003-10-09 Alexey Shchepin - * src/ejabberd_c2s.erl: Added authentification logging + * src/ejabberd_c2s.erl: Added authentication logging * src/ejabberd_listener.erl: Added logging of accepted connections @@ -1715,7 +1730,7 @@ * src/ejabberd_s2s_out.erl: Likewise * src/ejabberd_c2s.erl: Added sending of empty - element after opening of authentificated stream + element after opening of authenticated stream 2003-09-02 Alexey Shchepin diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index fd4107a1d..72c121336 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -49,7 +49,7 @@ tls_required = false, tls_enabled = false, tls_options = [], - authentificated = false, + authenticated = false, jid, user = "", server = ?MYNAME, resource = "", pres_t = ?SETS:new(), @@ -178,7 +178,7 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) -> " version='1.0'", DefaultLang]), send_text(StateData, Header), - case StateData#state.authentificated of + case StateData#state.authenticated of false -> SASLState = cyrsasl:server_new( @@ -223,10 +223,11 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) -> TLSFeature ++ [{xmlelement, "mechanisms", [{"xmlns", ?NS_SASL}], - Mechs}, - {xmlelement, "register", - [{"xmlns", ?NS_FEATURE_IQREGISTER}], - []}]}), + Mechs}] ++ + ejabberd_hooks:run_fold( + c2s_stream_features, + Server, + [], [])}), {next_state, wait_for_feature_request, StateData#state{server = Server, sasl_state = SASLState, @@ -411,21 +412,8 @@ wait_for_auth({xmlstreamelement, El}, StateData) -> end end; _ -> - case jlib:iq_query_info(El) of - #iq{xmlns = ?NS_REGISTER} = IQ -> - ResIQ = mod_register:process_iq( - {"", "", ""}, - jlib:make_jid("", StateData#state.server, ""), - IQ), - Res1 = jlib:replace_from_to({"", StateData#state.server, ""}, - {"", "", ""}, - jlib:iq_to_xml(ResIQ)), - Res = jlib:remove_attr("to", Res1), - send_element(StateData, Res), - {next_state, wait_for_auth, StateData}; - _ -> - {next_state, wait_for_auth, StateData} - end + process_unauthenticated_stanza(StateData, El), + {next_state, wait_for_auth, StateData} end; wait_for_auth({xmlstreamend, _Name}, StateData) -> @@ -463,7 +451,7 @@ wait_for_feature_request({xmlstreamelement, El}, StateData) -> [StateData#state.socket, U]), {next_state, wait_for_stream, StateData#state{streamid = new_id(), - authentificated = true, + authenticated = true, user = U }}; {continue, ServerOut, NewSASLState} -> @@ -506,21 +494,8 @@ wait_for_feature_request({xmlstreamelement, El}, StateData) -> ?STREAM_TRAILER), {stop, normal, StateData}; true -> - case jlib:iq_query_info(El) of - #iq{xmlns = ?NS_REGISTER} = IQ -> - ResIQ = mod_register:process_iq( - {"", "", ""}, - jlib:make_jid("", StateData#state.server, ""), - IQ), - Res1 = jlib:replace_from_to({"", StateData#state.server, ""}, - {"", "", ""}, - jlib:iq_to_xml(ResIQ)), - Res = jlib:remove_attr("to", Res1), - send_element(StateData, Res), - {next_state, wait_for_feature_request, StateData}; - _ -> - {next_state, wait_for_feature_request, StateData} - end + process_unauthenticated_stanza(StateData, El), + {next_state, wait_for_feature_request, StateData} end end; @@ -553,7 +528,7 @@ wait_for_sasl_response({xmlstreamelement, El}, StateData) -> [StateData#state.socket, U]), {next_state, wait_for_stream, StateData#state{streamid = new_id(), - authentificated = true, + authenticated = true, user = U }}; {continue, ServerOut, NewSASLState} -> @@ -572,21 +547,8 @@ wait_for_sasl_response({xmlstreamelement, El}, StateData) -> {next_state, wait_for_feature_request, StateData} end; _ -> - case jlib:iq_query_info(El) of - #iq{xmlns = ?NS_REGISTER} = IQ -> - ResIQ = mod_register:process_iq( - {"", "", ""}, - jlib:make_jid("", StateData#state.server, ""), - IQ), - Res1 = jlib:replace_from_to({"", StateData#state.server, ""}, - {"", "", ""}, - jlib:iq_to_xml(ResIQ)), - Res = jlib:remove_attr("to", Res1), - send_element(StateData, Res), - {next_state, wait_for_feature_request, StateData}; - _ -> - {next_state, wait_for_feature_request, StateData} - end + process_unauthenticated_stanza(StateData, El), + {next_state, wait_for_feature_request, StateData} end; wait_for_sasl_response({xmlstreamend, _Name}, StateData) -> @@ -863,7 +825,7 @@ handle_info({send_text, Text}, StateName, StateData) -> handle_info(replaced, _StateName, StateData) -> % TODO %send_text(StateData#state.sender, Text), - {stop, normal, StateData#state{authentificated = replaced}}; + {stop, normal, StateData#state{authenticated = replaced}}; handle_info({route, From, To, Packet}, StateName, StateData) -> {xmlelement, Name, Attrs, Els} = Packet, {Pass, NewAttrs, NewState} = @@ -1005,7 +967,7 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> terminate(_Reason, StateName, StateData) -> case StateName of session_established -> - case StateData#state.authentificated of + case StateData#state.authenticated of replaced -> ?INFO_MSG("(~w) Replaced session for ~s", [StateData#state.socket, @@ -1568,3 +1530,30 @@ get_statustag(Presence) -> case xml:get_path_s(Presence, [{elem, "status"}, cdata]) of ShowTag -> ShowTag end. + +process_unauthenticated_stanza(StateData, El) -> + case jlib:iq_query_info(El) of + #iq{} = IQ -> + Res = ejabberd_hooks:run_fold(c2s_unauthenticated_iq, + StateData#state.server, + empty, + [StateData#state.server, IQ]), + case Res of + empty -> + % The only reasonable IQ's here are auth and register IQ's + % They contain secrets, so don't include subelements to response + ResIQ = IQ#iq{type = error, + sub_el = [?ERR_FEATURE_NOT_IMPLEMENTED]}, + Res1 = jlib:replace_from_to( + jlib:make_jid("", StateData#state.server, ""), + jlib:make_jid("", "", ""), + jlib:iq_to_xml(ResIQ)), + send_element(StateData, jlib:remove_attr("to", Res1)); + _ -> + send_element(StateData, Res) + end; + _ -> + % Drop any stanza, which isn't IQ stanza + ok + end. + diff --git a/src/mod_register.erl b/src/mod_register.erl index b5f709b97..4d1da09b1 100644 --- a/src/mod_register.erl +++ b/src/mod_register.erl @@ -14,6 +14,8 @@ -export([start/2, stop/1, + stream_feature_register/1, + unauthenticated_iq_register/3, process_iq/3]). -include("ejabberd.hrl"). @@ -25,12 +27,37 @@ start(Host, Opts) -> ?MODULE, process_iq, IQDisc), gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_REGISTER, ?MODULE, process_iq, IQDisc), + ejabberd_hooks:add(c2s_stream_features, Host, + ?MODULE, stream_feature_register, 50), + ejabberd_hooks:add(c2s_unauthenticated_iq, Host, + ?MODULE, unauthenticated_iq_register, 50), ok. stop(Host) -> + ejabberd_hooks:delete(c2s_stream_features, Host, + ?MODULE, stream_feature_register, 50), + ejabberd_hooks:delete(c2s_unauthenticated_iq, Host, + ?MODULE, unauthenticated_iq_register, 50), gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_REGISTER), gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_REGISTER). + +stream_feature_register(Acc) -> + [{xmlelement, "register", + [{"xmlns", ?NS_FEATURE_IQREGISTER}], []} | Acc]. + +unauthenticated_iq_register(_Acc, Server, #iq{xmlns = ?NS_REGISTER} = IQ) -> + ResIQ = process_iq(jlib:make_jid("", "", ""), + jlib:make_jid("", Server, ""), + IQ), + Res1 = jlib:replace_from_to(jlib:make_jid("", Server, ""), + jlib:make_jid("", "", ""), + jlib:iq_to_xml(ResIQ)), + jlib:remove_attr("to", Res1); + +unauthenticated_iq_register(Acc, _Server, _IQ) -> + Acc. + process_iq(From, To, #iq{type = Type, lang = Lang, sub_el = SubEl} = IQ) -> case Type of diff --git a/src/web/ejabberd_web_admin.erl b/src/web/ejabberd_web_admin.erl index 8da73fd5c..cac24c773 100644 --- a/src/web/ejabberd_web_admin.erl +++ b/src/web/ejabberd_web_admin.erl @@ -1332,7 +1332,7 @@ get_stats(global, Lang) -> [?XE("tbody", [?XE("tr", [?XCT("td", "Registered users"), ?XC("td", integer_to_list(RegisteredUsers))]), - ?XE("tr", [?XCT("td", "Authentificated users"), + ?XE("tr", [?XCT("td", "Authenticated users"), ?XC("td", integer_to_list(AuthUsers))]), ?XE("tr", [?XCT("td", "Online users"), ?XC("td", integer_to_list(OnlineUsers))]), @@ -1985,7 +1985,7 @@ get_node(global, Node, ["stats"], Query, Lang) -> ?XE("tr", [?XCT("td", "CPU Time"), ?XAC("td", [{"class", "alignright"}], CPUTimeS)]), - ?XE("tr", [?XCT("td", "Authentificated users"), + ?XE("tr", [?XCT("td", "Authenticated users"), ?XAC("td", [{"class", "alignright"}], integer_to_list(Users))]), ?XE("tr", [?XCT("td", "Transactions commited"), diff --git a/src/win32/ejabberd.nsi b/src/win32/ejabberd.nsi index 63a803cc4..984d4be2e 100644 --- a/src/win32/ejabberd.nsi +++ b/src/win32/ejabberd.nsi @@ -19,6 +19,10 @@ !define MUI_ICON "ejabberd.ico" !define MUI_UNICON "ejabberd.ico" + !define MUI_HEADERIMAGE + !define MUI_HEADERIMAGE_BITMAP "ejabberd_header.bmp" + !define MUI_WELCOMEFINISHPAGE_BITMAP "ejabberd_intro.bmp" + ;-------------------------------- ;Configuration @@ -28,6 +32,10 @@ ;-------------------------------- ;Reserve Files + ReserveFile "ejabberd.ico" + ReserveFile "ejabberd.ico" + ReserveFile "ejabberd_header.bmp" + ReserveFile "ejabberd_intro.bmp" !ifdef HACKED_INSTALLOPTIONS ReserveFile "CheckUserH.ini" ReserveFile "CheckReqs1H.ini" @@ -111,12 +119,12 @@ FunctionEnd !define MUI_ABORTWARNING ;-------------------------------- -;Pages +;Installer/Uninstaller pages !insertmacro MUI_PAGE_WELCOME + !insertmacro MUI_PAGE_LICENSE "..\..\COPYING" Page custom CheckUser LeaveCheckUser Page custom CheckService LeaveCheckService - !insertmacro MUI_PAGE_LICENSE "..\..\COPYING" Page custom CheckReqs LeaveCheckReqs Page custom CheckReqs1 LeaveCheckReqs1 ;!insertmacro MUI_PAGE_COMPONENTS diff --git a/src/win32/ejabberd_header.bmp b/src/win32/ejabberd_header.bmp new file mode 100644 index 0000000000000000000000000000000000000000..14d70ddee5e417ce11bd99f1289a21381f02ce3a GIT binary patch literal 34254 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 literal 0 HcmV?d00001 diff --git a/src/win32/ejabberd_intro.bmp b/src/win32/ejabberd_intro.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7b37b0780a03efdc09477a5fb599f8134ceee40d GIT binary patch literal 26494 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