aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2003-08-03 19:09:40 +0000
committerAlexey Shchepin <alexey@process-one.net>2003-08-03 19:09:40 +0000
commitd0f38de9e1d24b918f4616191c0ed85de8e76397 (patch)
tree8464e6190e62d687bfe2c2b5bdcd161bd5f2ffcb /src
parent* src/mod_pubsub/mod_pubsub.erl (create_new_node): Bugfix (diff)
* src/mod_privacy.erl: Privacy rules support
* src/ejabberd_c2s.erl: Likewise * src/mod_roster.erl: Likewise SVN Revision: 128
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd.cfg1
-rw-r--r--src/ejabberd_c2s.erl89
-rw-r--r--src/mod_roster.erl18
3 files changed, 102 insertions, 6 deletions
diff --git a/src/ejabberd.cfg b/src/ejabberd.cfg
index 8e82f2748..7c4bf9cd2 100644
--- a/src/ejabberd.cfg
+++ b/src/ejabberd.cfg
@@ -54,6 +54,7 @@
{modules, [
{mod_register, []},
{mod_roster, []},
+ {mod_privacy, []},
{mod_configure, []},
{mod_disco, []},
{mod_stats, []},
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 103fc1d3d..a444e6028 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -52,7 +52,8 @@
pres_i = ?SETS:new(),
pres_last, pres_pri,
pres_timestamp,
- pres_invis = false}).
+ pres_invis = false,
+ privacy_list = none}).
%-define(DBGFSM, true).
@@ -210,11 +211,17 @@ wait_for_auth({xmlstreamelement, El}, StateData) ->
send_element(StateData, Res),
change_shaper(StateData, JID),
{Fs, Ts} = mod_roster:get_subscription_lists(U),
+ PrivList =
+ case catch mod_privacy:get_user_list(U) of
+ {'EXIT', _} -> none;
+ PL -> PL
+ end,
{next_state, session_established,
StateData#state{user = U,
resource = R,
pres_f = ?SETS:from_list(Fs),
- pres_t = ?SETS:from_list(Ts)}};
+ pres_t = ?SETS:from_list(Ts),
+ privacy_list = PrivList}};
_ ->
Err = jlib:make_error_reply(
El, ?ERR_FORBIDDEN),
@@ -398,9 +405,15 @@ wait_for_session({xmlstreamelement, El}, StateData) ->
send_element(StateData, Res),
change_shaper(StateData, JID),
{Fs, Ts} = mod_roster:get_subscription_lists(U),
+ PrivList =
+ case catch mod_privacy:get_user_list(U) of
+ {'EXIT', _} -> none;
+ PL -> PL
+ end,
{next_state, session_established,
StateData#state{pres_f = ?SETS:from_list(Fs),
- pres_t = ?SETS:from_list(Ts)}};
+ pres_t = ?SETS:from_list(Ts),
+ privacy_list = PrivList}};
_ ->
Err = jlib:make_error_reply(El, ?ERR_NOT_ALLOWED),
send_element(StateData, Err),
@@ -465,8 +478,25 @@ session_established({xmlstreamelement, El}, StateData) ->
_ ->
presence_track(FromJID, ToJID, El, StateData)
end;
- _ ->
+ "iq" ->
+ case StateData#state.privacy_list of
+ none ->
+ ejabberd_router:route(FromJID, ToJID, El),
+ StateData;
+ PrivList ->
+ case jlib:iq_query_info(El) of
+ {iq, ID, Type, ?NS_PRIVACY = XMLNS, SubEl} = IQ ->
+ process_privacy_iq(
+ FromJID, ToJID, IQ, StateData);
+ _ ->
+ ejabberd_router:route(FromJID, ToJID, El),
+ StateData
+ end
+ end;
+ "message" ->
ejabberd_router:route(FromJID, ToJID, El),
+ StateData;
+ _ ->
StateData
end
end,
@@ -564,7 +594,7 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
{true, Attrs, StateData}
end;
"broadcast" ->
- ?DEBUG("broadcast!!!!!!!!!!!~n~p~n", [Els]),
+ ?DEBUG("broadcast~n~p~n", [Els]),
NewSt = case Els of
[{item, IJID, ISubscription}] ->
{false, Attrs,
@@ -572,6 +602,16 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
StateData)};
[{exit, Reason}] ->
{exit, Attrs, Reason};
+ [{privacy_list, PrivList}] ->
+ {false, Attrs,
+ case catch mod_privacy:updated_list(
+ StateData#state.privacy_list,
+ PrivList) of
+ {'EXIT', _} ->
+ {false, Attrs, StateData};
+ NewPL ->
+ StateData#state{privacy_list = NewPL}
+ end};
_ ->
{false, Attrs, StateData}
end;
@@ -979,3 +1019,42 @@ update_priority(El, StateData) ->
StateData#state.resource,
Pri).
+
+
+process_privacy_iq(From, To, {iq, ID, Type, XMLNS, SubEl} = IQ, StateData) ->
+ {Res, NewStateData} =
+ case Type of
+ get ->
+ case catch
+ mod_privacy:process_iq_get(
+ From, To, IQ,
+ StateData#state.privacy_list) of
+ {'EXIT', _} ->
+ {{error, ?ERR_FEATURE_NOT_IMPLEMENTED}, StateData};
+ R -> {R, StateData}
+ end;
+ set ->
+ case catch
+ mod_privacy:process_iq_set(
+ From, To, IQ) of
+ {'EXIT', _} ->
+ {{error, ?ERR_FEATURE_NOT_IMPLEMENTED}, StateData};
+ {result, R, NewPrivList} ->
+ {{result, R},
+ StateData#state{privacy_list = NewPrivList}};
+ R -> {R, StateData}
+ end
+ end,
+ IQRes =
+ case Res of
+ {result, Result} ->
+ {iq, ID, result, XMLNS, Result};
+ {error, Error} ->
+ {iq, ID, error, XMLNS,
+ [SubEl, Error]}
+ end,
+ ejabberd_router:route(
+ To, From, jlib:iq_to_xml(IQRes)),
+ NewStateData.
+
+
diff --git a/src/mod_roster.erl b/src/mod_roster.erl
index 502c1f3d2..bfe76cca5 100644
--- a/src/mod_roster.erl
+++ b/src/mod_roster.erl
@@ -19,7 +19,8 @@
in_subscription/3,
out_subscription/3,
set_items/2,
- remove_user/1]).
+ remove_user/1,
+ get_jid_info/2]).
-include_lib("mnemosyne/include/mnemosyne.hrl").
-include("ejabberd.hrl").
@@ -542,3 +543,18 @@ process_item_attrs_ws(Item, [{Attr, Val} | Attrs]) ->
end;
process_item_attrs_ws(Item, []) ->
Item.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+get_jid_info(User, JID) ->
+ LUser = jlib:tolower(User),
+ LJID = jlib:jid_tolower(JID),
+ case catch mnesia:dirty_read(roster, {LUser, LJID}) of
+ [#roster{subscription = Subscription, groups = Groups}] ->
+ {Subscription, Groups};
+ _ ->
+ {none, []}
+ end.
+
+