summaryrefslogtreecommitdiff
path: root/src/mod_irc/mod_irc.erl
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2004-07-11 20:51:54 +0000
committerAlexey Shchepin <alexey@process-one.net>2004-07-11 20:51:54 +0000
commita846fe815c099d6519818e4fb47ba2e5975c974d (patch)
tree2c5cda9d7280da2cec4bd2be1592771b82589491 /src/mod_irc/mod_irc.erl
parent* src/mod_roster.erl: Removed superfluous include_lib line (diff)
* src/mod_last.erl: Supprot for storing status from latest
unavailable presence (thanks to Sergei Golovan) * src/ejabberd_sm.erl: Likewise * src/ejabberd_c2s.erl: Likewise * src/mod_vcard.erl: Minor update (thanks to Sergei Golovan) * src/mod_register.erl: Added "access" option (thanks to Sergei Golovan) * src/mod_irc/mod_irc.erl: Likewise * src/ejabberd.cfg.example: Updated * src/win32/ejabberd.cfg: Likewise * src/mod_privacy.erl: Fixed module stopping (thanks to Sergei Golovan) * src/mod_private.erl: Likewise * src/gen_mod.erl: Added function get_module_opt/3 (thanks to Sergei Golovan) * src/ejabberd_local.erl: Minor fix (thanks to Sergei Golovan) * doc/guide.tex: Updated (thanks to Sergei Golovan) SVN Revision: 244
Diffstat (limited to '')
-rw-r--r--src/mod_irc/mod_irc.erl32
1 files changed, 23 insertions, 9 deletions
diff --git a/src/mod_irc/mod_irc.erl b/src/mod_irc/mod_irc.erl
index 9cfe26d6..efa3c995 100644
--- a/src/mod_irc/mod_irc.erl
+++ b/src/mod_irc/mod_irc.erl
@@ -12,7 +12,7 @@
-behaviour(gen_mod).
--export([start/1, init/1, stop/0, closed_conection/2,
+-export([start/1, init/2, stop/0, closed_conection/2,
get_user_and_encoding/2]).
-include("ejabberd.hrl").
@@ -29,34 +29,48 @@ start(Opts) ->
[{disc_copies, [node()]},
{attributes, record_info(fields, irc_custom)}]),
Host = gen_mod:get_opt(host, Opts, "irc." ++ ?MYNAME),
- register(ejabberd_mod_irc, spawn(?MODULE, init, [Host])).
+ Access = gen_mod:get_opt(access, Opts, all),
+ register(ejabberd_mod_irc, spawn(?MODULE, init, [Host, Access])).
-init(Host) ->
+init(Host, Access) ->
catch ets:new(irc_connection, [named_table,
public,
{keypos, #irc_connection.userserver}]),
ejabberd_router:register_route(Host),
- loop(Host).
+ loop(Host, Access).
-loop(Host) ->
+loop(Host, Access) ->
receive
{route, From, To, Packet} ->
- case catch do_route(Host, From, To, Packet) of
+ case catch do_route(Host, Access, From, To, Packet) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
_ ->
ok
end,
- loop(Host);
+ loop(Host, Access);
stop ->
ejabberd_router:unregister_global_route(Host),
ok;
_ ->
- loop(Host)
+ loop(Host, Access)
end.
-do_route(Host, From, To, Packet) ->
+do_route(Host, Access, From, To, Packet) ->
+ case acl:match_rule(Access, From) of
+ allow ->
+ do_route1(Host, From, To, Packet);
+ _ ->
+ {xmlelement, _Name, Attrs, _Els} = Packet,
+ Lang = xml:get_attr_s("xml:lang", Attrs),
+ ErrText = "Access denied by service policy",
+ Err = jlib:make_error_reply(Packet,
+ ?ERRT_FORBIDDEN(Lang, ErrText)),
+ ejabberd_router:route(To, From, Err)
+ end.
+
+do_route1(Host, From, To, Packet) ->
#jid{user = ChanServ, resource = Resource} = To,
{xmlelement, _Name, Attrs, _Els} = Packet,
case ChanServ of