diff --git a/ChangeLog b/ChangeLog index 68a913c1e..d972b2587 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2003-10-19 Alexey Shchepin + + * src/ejabberd_local.erl: Added support for announce/online + messages + + * src/ejabberd.cfg.example: Updated + + * src/mod_register.erl: Added support for sending registration + notifications + 2003-10-18 Alexey Shchepin * src/ejabberd_service.erl: Added supports for multiple hosts per diff --git a/doc/guide.tex b/doc/guide.tex index 703ee3ee8..d5e490585 100644 --- a/doc/guide.tex +++ b/doc/guide.tex @@ -452,7 +452,7 @@ except admins have traffic limit 1000\,b/s. {ssl, [{certfile, "/path/to/ssl.pem"}]}]}, {5269, ejabberd_s2s_in, []}, {8888, ejabberd_service, - [{host, "conference.example.org", [{password, "secret"}]}]} + [{hosts, ["conference.example.org"], [{password, "secret"}]}]} ]}. \end{verbatim} diff --git a/src/ejabberd.cfg.example b/src/ejabberd.cfg.example index b2d90b773..f1d915c4e 100644 --- a/src/ejabberd.cfg.example +++ b/src/ejabberd.cfg.example @@ -33,6 +33,13 @@ % Replace them with 'none' if you don't want to send such message: %{welcome_message, none}. +% List of people who will get notifications about registered users +%{registration_watchers, ["admin1@localhost", +% "admin2@localhost"]}. + +% Only admins can send announcement messages: +{access, announce, [{allow, admin}]}. + % Only non-blocked users can use c2s connections: {access, c2s, [{deny, blocked}, @@ -58,12 +65,13 @@ {5223, ejabberd_c2s, [{access, c2s}, {ssl, [{certfile, "./ssl.pem"}]}]}, {5269, ejabberd_s2s_in, []}, - {8888, ejabberd_service, [{host, - "conference.e.localhost", - [{password, "asdqwe"}]}]} + {8888, ejabberd_service, [{hosts, + ["conference.e.localhost", + "muc.e.localhost"], + [{password, "secret"}]}]} ]}. -% If SRV lookup fails, then port 5269 used to communicate with other servers +% If SRV lookup fails, then port 5269 is used to communicate with remote server {outgoing_s2s_port, 5269}. diff --git a/src/ejabberd_local.erl b/src/ejabberd_local.erl index d4517f35b..039389a02 100644 --- a/src/ejabberd_local.erl +++ b/src/ejabberd_local.erl @@ -72,7 +72,7 @@ do_route(State, From, To, Packet) -> [From, To, Packet, 8]), case To of #jid{luser = "", lresource = ""} -> - {xmlelement, Name, Attrs, Els} = Packet, + {xmlelement, Name, Attrs, _Els} = Packet, case Name of "iq" -> process_iq(State, From, To, Packet); @@ -83,15 +83,20 @@ do_route(State, From, To, Packet) -> _ -> ok end; - #jid{luser = ""} -> - {xmlelement, _Name, Attrs, _Els} = Packet, + #jid{luser = "", lresource = Res} -> + {xmlelement, Name, Attrs, _Els} = Packet, case xml:get_attr_s("type", Attrs) of "error" -> ok; "result" -> ok; _ -> - Err = jlib:make_error_reply(Packet, ?ERR_ITEM_NOT_FOUND), - ejabberd_router:route( - jlib:make_jid("", State#state.mydomain, ""), From, Err) + case {Res, Name} of + {"announce/online", "message"} -> + announce_online(From, To, Packet); + _ -> + Err = jlib:make_error_reply( + Packet, ?ERR_ITEM_NOT_FOUND), + ejabberd_router:route(To, From, Err) + end end; _ -> ejabberd_sm ! {route, From, To, Packet} @@ -100,7 +105,7 @@ do_route(State, From, To, Packet) -> process_iq(State, From, To, Packet) -> IQ = jlib:iq_query_info(Packet), case IQ of - {iq, ID, Type, XMLNS, SubEl} -> + {iq, _ID, Type, XMLNS, _SubEl} -> case jlib:is_iq_request_type(Type) of true -> case ets:lookup(State#state.iqtable, XMLNS) of @@ -121,10 +126,7 @@ process_iq(State, From, To, Packet) -> [] -> Err = jlib:make_error_reply( Packet, ?ERR_FEATURE_NOT_IMPLEMENTED), - ejabberd_router ! {route, - {"", State#state.mydomain, ""}, - From, - Err} + ejabberd_router:route(To, From, Err) end; _ -> ok @@ -133,8 +135,7 @@ process_iq(State, From, To, Packet) -> ok; _ -> Err = jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST), - ejabberd_router ! {route, - {"", State#state.mydomain, ""}, From, Err}, + ejabberd_router:route(To, From, Err), ok end. @@ -147,3 +148,18 @@ register_iq_handler(XMLNS, Module, Fun, Opts) -> unregister_iq_handler(XMLNS) -> ejabberd_local ! {unregister_iq_handler, XMLNS}. + +announce_online(From, To, Packet) -> + case acl:match_rule(announce, From) of + deny -> + Err = jlib:make_error_reply(Packet, ?ERR_NOT_ALLOWED), + ejabberd_router:route(To, From, Err); + allow -> + Local = jlib:make_jid("", ?MYNAME, ""), + lists:foreach( + fun({U, R}) -> + Dest = jlib:make_jid(U, ?MYNAME, R), + ejabberd_router:route(Local, Dest, Packet) + end, ejabberd_sm:dirty_get_sessions_list()) + end. + diff --git a/src/mod_register.erl b/src/mod_register.erl index f19a608a3..298464378 100644 --- a/src/mod_register.erl +++ b/src/mod_register.erl @@ -28,7 +28,7 @@ start(Opts) -> init() -> ok. -process_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) -> +process_iq(From, _To, {iq, ID, Type, XMLNS, SubEl}) -> case Type of set -> UTag = xml:get_subtag(SubEl, "username"), @@ -124,6 +124,7 @@ try_register(User, Password) -> case ejabberd_auth:try_register(User, Password) of {atomic, ok} -> send_welcome_message(JID), + send_registration_notifications(JID), ok; {atomic, exists} -> {error, ?ERR_CONFLICT}; @@ -149,3 +150,28 @@ send_welcome_message(JID) -> ok end. +send_registration_notifications(UJID) -> + case ejabberd_config:get_local_option(registration_watchers) of + [] -> ok; + JIDs when is_list(JIDs) -> + Body = lists:flatten( + io_lib:format( + "The user '~s' was just created on node ~w.", + [jlib:jid_to_string(UJID), node()])), + lists:foreach( + fun(S) -> + case jlib:string_to_jid(S) of + error -> ok; + JID -> + ejabberd_router:route( + jlib:make_jid("", ?MYNAME, ""), + JID, + {xmlelement, "message", [{"type", "chat"}], + [{xmlelement, "body", [], + [{xmlcdata, Body}]}]}) + end + end, JIDs); + _ -> + ok + end. +