+2008-04-25 Badlop <badlop@process-one.net>
+
+ * src/ejabberd_c2s.erl: Added forbidden_session_hook
+
+ * src/acl.erl: New access types: resource, resource_regexp and
+ resource_glob
+ * doc/guide.tex: Likewise
+
2008-04-23 Alexey Shchepin <alexey@process-one.net>
* src/treap.erl: Bugfix
\begin{verbatim}
{acl, exampleorg, {server, "example.org"}}.
\end{verbatim}
+\titem{\{resource, <resource>\}} Matches any JID with a resource
+ \term{<resource>}. Example:
+\begin{verbatim}
+{acl, mucklres, {resource, "muckl"}}.
+\end{verbatim}
\titem{\{user\_regexp, <regexp>\}} Matches any local user with a name that
matches \term{<regexp>} on local virtual hosts. Example:
\begin{verbatim}
\begin{verbatim}
{acl, icq, {server_regexp, "^icq\\."}}.
\end{verbatim}
+\titem{\{resource\_regexp, <regexp>\}} Matches any JID with a resource that
+ matches \term{<regexp>}. Example:
+\begin{verbatim}
+{acl, icq, {resource_regexp, "^laptop\\."}}.
+\end{verbatim}
\titem{\{node\_regexp, <user\_regexp>, <server\_regexp>\}} Matches any user
with a name that matches \term{<user\_regexp>} at any server that matches
\term{<server\_regexp>}. Example:
\titem{\{user\_glob, <glob>\}}
\titem{\{user\_glob, <glob>, <server>\}}
\titem{\{server\_glob, <glob>\}}
+\titem{\{resource\_glob, <glob>\}}
\titem{\{node\_glob, <user\_glob>, <server\_glob>\}} This is the same as
above. However, it uses shell glob patterns instead of regexp. These patterns
can have the following special characters:
all -> true;
none -> false;
_ ->
- {User, Server, _Resource} = jlib:jid_tolower(JID),
+ {User, Server, Resource} = jlib:jid_tolower(JID),
lists:any(fun(#acl{aclspec = Spec}) ->
case Spec of
all ->
(U == User) andalso (S == Server);
{server, S} ->
S == Server;
+ {resource, R} ->
+ R == Resource;
{user_regexp, UR} ->
((Host == Server) orelse
((Host == global) andalso
is_regexp_match(User, UR);
{server_regexp, SR} ->
is_regexp_match(Server, SR);
+ {resource_regexp, RR} ->
+ is_regexp_match(Resource, RR);
{node_regexp, UR, SR} ->
is_regexp_match(Server, SR) andalso
is_regexp_match(User, UR);
is_glob_match(User, UR);
{server_glob, SR} ->
is_glob_match(Server, SR);
+ {resource_glob, RR} ->
+ is_glob_match(Resource, RR);
{node_glob, UR, SR} ->
is_glob_match(Server, SR) andalso
is_glob_match(User, UR);
pres_t = ?SETS:from_list(Ts1),
privacy_list = PrivList});
_ ->
+ ejabberd_hooks:run(forbidden_session_hook,
+ StateData#state.server, [JID]),
?INFO_MSG("(~w) Forbidden session for ~s",
[StateData#state.socket,
jlib:jid_to_string(JID)]),