aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2005-08-25 20:48:45 +0000
committerAlexey Shchepin <alexey@process-one.net>2005-08-25 20:48:45 +0000
commita884ba4e8a8447799ab5fbaa2cf490d83639add0 (patch)
treeff991dc08a4cecd119db4498607b8245f5997dd1 /src
parent* src/cyrsasl_digest.erl: Fixed challenge/response parsing (thanks (diff)
* src/mod_vcard_ldap.erl: Bugfix
* src/mod_vcard.erl: Bugfix * src/ejabberd_auth_odbc.erl: Bugfix * doc/dev.tex: Updated SVN Revision: 406
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_auth_odbc.erl5
-rw-r--r--src/mod_vcard.erl32
-rw-r--r--src/mod_vcard_ldap.erl68
3 files changed, 56 insertions, 49 deletions
diff --git a/src/ejabberd_auth_odbc.erl b/src/ejabberd_auth_odbc.erl
index a51683df8..a634691d3 100644
--- a/src/ejabberd_auth_odbc.erl
+++ b/src/ejabberd_auth_odbc.erl
@@ -122,11 +122,12 @@ dirty_get_registered_users() ->
get_vh_registered_users(?MYNAME).
get_vh_registered_users(Server) ->
+ LServer = jlib:nameprep(Server),
case catch ejabberd_odbc:sql_query(
- jlib:nameprep(Server),
+ LServer,
"select username from users") of
{selected, ["username"], Res} ->
- [U || {U} <- Res];
+ [{U, LServer} || {U} <- Res];
_ ->
[]
end.
diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl
index ff24eb995..137ace03e 100644
--- a/src/mod_vcard.erl
+++ b/src/mod_vcard.erl
@@ -12,7 +12,7 @@
-behaviour(gen_mod).
--export([start/2, init/2, stop/1,
+-export([start/2, init/3, stop/1,
process_local_iq/3,
process_sm_iq/3,
reindex_vcards/0,
@@ -70,36 +70,36 @@ start(Host, Opts) ->
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_VCARD,
?MODULE, process_sm_iq, IQDisc),
catch mod_disco:register_sm_feature(Host, ?NS_VCARD),
- Hosts = gen_mod:get_hosts(Opts, "vjud."),
+ MyHost = gen_mod:get_opt(host, Opts, "vjud." ++ Host),
Search = gen_mod:get_opt(search, Opts, true),
register(gen_mod:get_module_proc(Host, ?PROCNAME),
- spawn(?MODULE, init, [Hosts, Search])).
+ spawn(?MODULE, init, [MyHost, Host, Search])).
-init(Hosts, Search) ->
+init(Host, ServerHost, Search) ->
case Search of
false ->
- loop(Hosts);
+ loop(Host, ServerHost);
_ ->
- ejabberd_router:register_routes(Hosts),
- loop(Hosts)
+ ejabberd_router:register_route(Host),
+ loop(Host, ServerHost)
end.
-loop(Hosts) ->
+loop(Host, ServerHost) ->
receive
{route, From, To, Packet} ->
- case catch do_route(From, To, Packet) of
+ case catch do_route(ServerHost, From, To, Packet) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
_ ->
ok
end,
- loop(Hosts);
+ loop(Host, ServerHost);
stop ->
- catch ejabberd_router:unregister_routes(Hosts),
+ ejabberd_router:unregister_route(Host),
ok;
_ ->
- loop(Hosts)
+ loop(Host, ServerHost)
end.
stop(Host) ->
@@ -272,7 +272,7 @@ set_vcard(User, LServer, VCARD) ->
-do_route(From, To, Packet) ->
+do_route(ServerHost, From, To, Packet) ->
#jid{user = User, resource = Resource} = To,
if
(User /= "") or (Resource /= "") ->
@@ -310,7 +310,7 @@ do_route(From, To, Packet) ->
[{xmlelement, "x",
[{"xmlns", ?NS_XDATA},
{"type", "result"}],
- search_result(Lang, To, XData)
+ search_result(Lang, To, ServerHost, XData)
}]}]},
ejabberd_router:route(
To, From, jlib:iq_to_xml(ResIQ))
@@ -420,7 +420,7 @@ find_xdata_el1([_ | Els]) ->
{xmlelement, "field", [{"label", translate:translate(Lang, Label)},
{"var", Var}], []}).
-search_result(Lang, JID, Data) ->
+search_result(Lang, JID, ServerHost, Data) ->
[{xmlelement, "title", [],
[{xmlcdata, translate:translate(Lang, "Results of search in ") ++
jlib:jid_to_string(JID)}]},
@@ -437,7 +437,7 @@ search_result(Lang, JID, Data) ->
?LFIELD("email", "email"),
?LFIELD("Organization Name", "orgname"),
?LFIELD("Organization Unit", "orgunit")
- ]}] ++ lists:map(fun record_to_item/1, search(JID#jid.lserver, Data)).
+ ]}] ++ lists:map(fun record_to_item/1, search(ServerHost, Data)).
-define(FIELD(Var, Val),
{xmlelement, "field", [{"var", Var}],
diff --git a/src/mod_vcard_ldap.erl b/src/mod_vcard_ldap.erl
index 9c8149cf6..c2bbeb298 100644
--- a/src/mod_vcard_ldap.erl
+++ b/src/mod_vcard_ldap.erl
@@ -12,7 +12,7 @@
-behaviour(gen_mod).
--export([start/2, init/2, stop/1,
+-export([start/2, init/3, stop/1,
process_local_iq/3,
process_sm_iq/3,
remove_user/1]).
@@ -21,6 +21,7 @@
-include("eldap/eldap.hrl").
-include("jlib.hrl").
+-define(PROCNAME, ejabberd_mod_vcard_ldap).
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
@@ -28,45 +29,47 @@ start(Host, Opts) ->
?MODULE, process_local_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_VCARD,
?MODULE, process_sm_iq, IQDisc),
- LDAPServers = ejabberd_config:get_local_option(ldap_servers),
- RootDN = ejabberd_config:get_local_option(ldap_rootdn),
- Password = ejabberd_config:get_local_option(ldap_password),
+ LDAPServers = ejabberd_config:get_local_option({ldap_servers, Host}),
+ RootDN = ejabberd_config:get_local_option({ldap_rootdn, Host}),
+ Password = ejabberd_config:get_local_option({ldap_password, Host}),
eldap:start_link("mod_vcard_ldap", LDAPServers, 389, RootDN, Password),
- Host = gen_mod:get_opt(host, Opts, "vjud." ++ ?MYNAME),
+ MyHost = gen_mod:get_opt(host, Opts, "vjud." ++ Host),
Search = gen_mod:get_opt(search, Opts, true),
- register(ejabberd_mod_vcard_ldap, spawn(?MODULE, init, [Host, Search])).
+ register(gen_mod:get_module_proc(Host, ?PROCNAME),
+ spawn(?MODULE, init, [MyHost, Host, Search])).
-init(Host, Search) ->
+init(Host, ServerHost, Search) ->
case Search of
false ->
- loop(Host);
+ loop(Host, ServerHost);
_ ->
ejabberd_router:register_route(Host),
- loop(Host)
+ loop(Host, ServerHost)
end.
-loop(Host) ->
+loop(Host, ServerHost) ->
receive
{route, From, To, Packet} ->
- case catch do_route(From, To, Packet) of
+ case catch do_route(ServerHost, From, To, Packet) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
_ ->
ok
end,
- loop(Host);
+ loop(Host, ServerHost);
stop ->
- catch ejabberd_router:unregister_route(Host),
+ ejabberd_router:unregister_route(Host),
ok;
_ ->
- loop(Host)
+ loop(Host, ServerHost)
end.
stop(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_VCARD),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_VCARD),
- ejabberd_mod_vcard_ldap ! stop,
- ok.
+ Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
+ Proc ! stop,
+ {wait, Proc}.
process_local_iq(_From, _To, #iq{type = Type, lang = Lang, sub_el = SubEl} = IQ) ->
case Type of
@@ -92,10 +95,10 @@ process_local_iq(_From, _To, #iq{type = Type, lang = Lang, sub_el = SubEl} = IQ)
]}]}
end.
-find_ldap_user(User) ->
- Attr = ejabberd_config:get_local_option(ldap_uidattr),
+find_ldap_user(Host, User) ->
+ Attr = ejabberd_config:get_local_option({ldap_uidattr, Host}),
Filter = eldap:equalityMatch(Attr, User),
- Base = ejabberd_config:get_local_option(ldap_base),
+ Base = ejabberd_config:get_local_option({ldap_base, Host}),
case eldap:search("mod_vcard_ldap", [{base, Base},
{filter, Filter},
{attributes, []}]) of
@@ -192,12 +195,13 @@ process_sm_iq(From, To, #iq{type = Type, sub_el = SubEl} = IQ) ->
set ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
get ->
- #jid{luser = LUser} = To,
- case find_ldap_user(LUser) of
+ #jid{luser = LUser, lserver = LServer} = To,
+ case find_ldap_user(LServer, LUser) of
#eldap_entry{attributes = Attributes} ->
Vcard = ldap_attributes_to_vcard(Attributes,From,To),
IQ#iq{type = result, sub_el = Vcard};
- _ -> IQ#iq{type = result, sub_el = []}
+ _ ->
+ IQ#iq{type = result, sub_el = []}
end
end.
@@ -234,7 +238,7 @@ process_sm_iq(From, To, #iq{type = Type, sub_el = SubEl} = IQ) ->
-do_route(From, To, Packet) ->
+do_route(ServerHost, From, To, Packet) ->
#jid{user = User, resource = Resource} = To,
if
(User /= "") or (Resource /= "") ->
@@ -272,7 +276,7 @@ do_route(From, To, Packet) ->
[{xmlelement, "x",
[{"xmlns", ?NS_XDATA},
{"type", "result"}],
- search_result(Lang, To, XData)
+ search_result(Lang, To, ServerHost, XData)
}]}]},
ejabberd_router:route(
To, From, jlib:iq_to_xml(ResIQ))
@@ -382,7 +386,7 @@ find_xdata_el1([_ | Els]) ->
{xmlelement, "field", [{"label", translate:translate(Lang, Label)},
{"var", Var}], []}).
-search_result(Lang, JID, Data) ->
+search_result(Lang, JID, ServerHost, Data) ->
[{xmlelement, "title", [],
[{xmlcdata, translate:translate(Lang, "Results of search in ") ++
jlib:jid_to_string(JID)}]},
@@ -401,7 +405,7 @@ search_result(Lang, JID, Data) ->
?LFIELD("Organization Unit", "orgunit")
]}] ++ lists:map(fun(E) ->
record_to_item(E#eldap_entry.attributes)
- end, search(JID#jid.lserver, Data)).
+ end, search(ServerHost, Data)).
-define(FIELD(Var, Val),
{xmlelement, "field", [{"var", Var}],
@@ -491,8 +495,8 @@ record_to_item(Attributes) ->
search(LServer, Data) ->
Filter = make_filter(Data),
- Base = ejabberd_config:get_local_option(ldap_base),
- UIDAttr = ejabberd_config:get_local_option(ldap_uidattr),
+ Base = ejabberd_config:get_local_option({ldap_base, LServer}),
+ UIDAttr = ejabberd_config:get_local_option({ldap_uidattr, LServer}),
case eldap:search("mod_vcard_ldap",[{base, Base},
{filter, Filter},
{attributes, []}]) of
@@ -500,15 +504,17 @@ search(LServer, Data) ->
[X || X <- E,
ejabberd_auth:is_user_exists(
ldap_get_value(X, UIDAttr), LServer)];
- _ ->
- ?ERROR_MSG("~p", ["Bad search"])
+ Err ->
+ ?ERROR_MSG("Bad search: ~p", [[LServer, {base, Base},
+ {filter, Filter},
+ {attributes, []}]])
end.
make_filter(Data) ->
Filter = [X || X <- lists:map(fun(R) ->
make_assertion(R)
- end,Data),
+ end, Data),
X /= none ],
case Filter of
[F] ->