From 6bdabb0c3ba9b2a2755fffc27ed3795a9968556d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Fri, 22 Sep 2006 07:13:42 +0000 Subject: Bugfixes coming from trunk (SVN #599): * src/mod_shared_roster.erl: Bugfix * src/mod_roster_odbc.erl: Bugfix SVN Revision: 609 --- src/mod_roster_odbc.erl | 9 ++++----- src/mod_shared_roster.erl | 3 ++- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/mod_roster_odbc.erl b/src/mod_roster_odbc.erl index cc94d10c6..9509cc68c 100644 --- a/src/mod_roster_odbc.erl +++ b/src/mod_roster_odbc.erl @@ -141,11 +141,10 @@ get_user_roster(Acc, {LUser, LServer}) -> R -> SJID = jlib:jid_to_string(R#roster.jid), Groups = lists:flatmap( - fun({S, G}) -> - case jlib:jid_tolower(S) of - SJID -> [G]; - _ -> [] - end + fun({S, G}) when S == SJID -> + [G]; + (_) -> + [] end, JIDGroups), [R#roster{groups = Groups}] end diff --git a/src/mod_shared_roster.erl b/src/mod_shared_roster.erl index 6a438e673..a0160b959 100644 --- a/src/mod_shared_roster.erl +++ b/src/mod_shared_roster.erl @@ -332,7 +332,8 @@ get_user_displayed_groups(US) -> [Group || Group <- DisplayedGroups1, is_group_enabled(Host, Group)]. is_user_in_group(US, Group, Host) -> - case mnesia:match_object(#sr_user{us=US, group_host={Group, Host}}) of + case catch mnesia:dirty_match_object( + #sr_user{us=US, group_host={Group, Host}}) of [] -> false; _ -> true end. -- cgit v1.2.3 From 42115402722e1eb238a472964851dd60f7b39b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Fri, 22 Sep 2006 07:25:18 +0000 Subject: Improvement coming from trunk (SVN #601): * src/mod_muc/mod_muc.erl: It is now possible to configure the MUC room history feature. A new option has been added in ejabberd muc module configuration (history_size) to define the size of the history. 0 is used to disable the feature. * src/mod_muc/mod_muc_room.erl: Likewise. * doc/guide.tex: Likewise. SVN Revision: 610 --- src/mod_muc/mod_muc.erl | 26 ++++++++++++++++---------- src/mod_muc/mod_muc_room.erl | 34 ++++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc/mod_muc.erl index 6e40d0bdf..196181f3f 100644 --- a/src/mod_muc/mod_muc.erl +++ b/src/mod_muc/mod_muc.erl @@ -36,7 +36,7 @@ -record(muc_online_room, {name_host, pid}). -record(muc_registered, {us_host, nick}). --record(state, {host, server_host, access}). +-record(state, {host, server_host, access, history_size}). -define(PROCNAME, ejabberd_mod_muc). @@ -148,14 +148,17 @@ init([Host, Opts]) -> Access = gen_mod:get_opt(access, Opts, all), AccessCreate = gen_mod:get_opt(access_create, Opts, all), AccessAdmin = gen_mod:get_opt(access_admin, Opts, none), + HistorySize = gen_mod:get_opt(history_size, Opts, 20), catch ets:new(muc_online_room, [named_table, public, {keypos, #muc_online_room.name_host}]), ejabberd_router:register_route(MyHost), - load_permanent_rooms(MyHost, Host, {Access, AccessCreate, AccessAdmin}), + load_permanent_rooms(MyHost, Host, {Access, AccessCreate, AccessAdmin}, + HistorySize), {ok, #state{host = MyHost, server_host = Host, - access = {Access, AccessCreate, AccessAdmin}}}. + access = {Access, AccessCreate, AccessAdmin}, + history_size = HistorySize}}. %%-------------------------------------------------------------------- %% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} | @@ -187,8 +190,9 @@ handle_cast(_Msg, State) -> handle_info({route, From, To, Packet}, #state{host = Host, server_host = ServerHost, - access = Access} = State) -> - case catch do_route(Host, ServerHost, Access, From, To, Packet) of + access = Access, + history_size = HistorySize} = State) -> + case catch do_route(Host, ServerHost, Access, HistorySize, From, To, Packet) of {'EXIT', Reason} -> ?ERROR_MSG("~p", [Reason]); _ -> @@ -239,11 +243,11 @@ stop_supervisor(Host) -> supervisor:terminate_child(ejabberd_sup, Proc), supervisor:delete_child(ejabberd_sup, Proc). -do_route(Host, ServerHost, Access, From, To, Packet) -> +do_route(Host, ServerHost, Access, HistorySize, From, To, Packet) -> {AccessRoute, _AccessCreate, _AccessAdmin} = Access, case acl:match_rule(ServerHost, AccessRoute, From) of allow -> - do_route1(Host, ServerHost, Access, From, To, Packet); + do_route1(Host, ServerHost, Access, HistorySize, From, To, Packet); _ -> {xmlelement, _Name, Attrs, _Els} = Packet, Lang = xml:get_attr_s("xml:lang", Attrs), @@ -254,7 +258,7 @@ do_route(Host, ServerHost, Access, From, To, Packet) -> end. -do_route1(Host, ServerHost, Access, From, To, Packet) -> +do_route1(Host, ServerHost, Access, HistorySize, From, To, Packet) -> {_AccessRoute, AccessCreate, AccessAdmin} = Access, {Room, _, Nick} = jlib:jid_tolower(To), {xmlelement, Name, Attrs, _Els} = Packet, @@ -379,7 +383,8 @@ do_route1(Host, ServerHost, Access, From, To, Packet) -> ?DEBUG("MUC: open new room '~s'~n", [Room]), {ok, Pid} = mod_muc_room:start( Host, ServerHost, Access, - Room, From, Nick), + Room, HistorySize, From, + Nick), ets:insert( muc_online_room, #muc_online_room{name_host = {Room, Host}, @@ -411,7 +416,7 @@ do_route1(Host, ServerHost, Access, From, To, Packet) -> -load_permanent_rooms(Host, ServerHost, Access) -> +load_permanent_rooms(Host, ServerHost, Access, HistorySize) -> case catch mnesia:dirty_select( muc_room, [{#muc_room{name_host = {'_', Host}, _ = '_'}, [], @@ -427,6 +432,7 @@ load_permanent_rooms(Host, ServerHost, Access) -> ServerHost, Access, Room, + HistorySize, R#muc_room.opts), ets:insert( muc_online_room, diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index 3ae1934ac..44eceb476 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc/mod_muc_room.erl @@ -14,10 +14,10 @@ %% External exports --export([start_link/6, - start_link/5, +-export([start_link/7, + start_link/6, + start/7, start/6, - start/5, route/4]). %% gen_fsm callbacks @@ -85,22 +85,22 @@ %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- -start(Host, ServerHost, Access, Room, Creator, Nick) -> +start(Host, ServerHost, Access, Room, HistorySize, Creator, Nick) -> Supervisor = gen_mod:get_module_proc(ServerHost, ejabberd_mod_muc_sup), supervisor:start_child( - Supervisor, [Host, ServerHost, Access, Room, Creator, Nick]). + Supervisor, [Host, ServerHost, Access, Room, HistorySize, Creator, Nick]). -start(Host, ServerHost, Access, Room, Opts) -> +start(Host, ServerHost, Access, Room, HistorySize, Opts) -> Supervisor = gen_mod:get_module_proc(ServerHost, ejabberd_mod_muc_sup), supervisor:start_child( - Supervisor, [Host, ServerHost, Access, Room, Opts]). + Supervisor, [Host, ServerHost, Access, Room, HistorySize, Opts]). -start_link(Host, ServerHost, Access, Room, Creator, Nick) -> - gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, Creator, Nick], +start_link(Host, ServerHost, Access, Room, HistorySize, Creator, Nick) -> + gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, HistorySize, Creator, Nick], ?FSMOPTS). -start_link(Host, ServerHost, Access, Room, Opts) -> - gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, Opts], +start_link(Host, ServerHost, Access, Room, HistorySize, Opts) -> + gen_fsm:start_link(?MODULE, [Host, ServerHost, Access, Room, HistorySize, Opts], ?FSMOPTS). %%%---------------------------------------------------------------------- @@ -114,20 +114,22 @@ start_link(Host, ServerHost, Access, Room, Opts) -> %% ignore | %% {stop, StopReason} %%---------------------------------------------------------------------- -init([Host, ServerHost, Access, Room, Creator, _Nick]) -> +init([Host, ServerHost, Access, Room, HistorySize, Creator, _Nick]) -> State = set_affiliation(Creator, owner, #state{host = Host, server_host = ServerHost, access = Access, room = Room, + history = lqueue_new(HistorySize), jid = jlib:make_jid(Room, Host, ""), just_created = true}), {ok, normal_state, State}; -init([Host, ServerHost, Access, Room, Opts]) -> +init([Host, ServerHost, Access, Room, HistorySize, Opts]) -> State = set_opts(Opts, #state{host = Host, server_host = ServerHost, access = Access, room = Room, + history = lqueue_new(HistorySize), jid = jlib:make_jid(Room, Host, "")}), {ok, normal_state, State}. @@ -1372,7 +1374,11 @@ lqueue_new(Max) -> len = 0, max = Max}. -lqueue_in(Item, #lqueue{queue = Q1, len = Len, max = Max}) -> +%% If the message queue limit is set to 0, do not store messages. +lqueue_in(Item, LQ = #lqueue{max = 0}) -> + LQ; +%% Otherwise, rotate messages in the queue store. +lqueue_in(Item, LQ = #lqueue{queue = Q1, len = Len, max = Max}) -> Q2 = queue:in(Item, Q1), if Len >= Max -> -- cgit v1.2.3 From 8c8c7b1e3f7c46369e805796965d5e3b7419fb04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Fri, 22 Sep 2006 07:35:55 +0000 Subject: Improvement coming from trunk (SVN #602): * src/mod_muc/mod_muc_log.erl: Fixed html special characters escaping, added new image buttons, chatroom titles now point to xmpp: URIs (thanks to Badlop) SVN Revision: 611 --- src/mod_muc/mod_muc_log.erl | 215 ++++++++++++++++++++++++++++++++++++++----- src/mod_muc/mod_muc_room.erl | 4 +- 2 files changed, 194 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/mod_muc/mod_muc_log.erl b/src/mod_muc/mod_muc_log.erl index 1888562fc..15afd6350 100644 --- a/src/mod_muc/mod_muc_log.erl +++ b/src/mod_muc/mod_muc_log.erl @@ -179,10 +179,10 @@ add_to_log2(text, {Nick, Packet}, Room, Opts, State) -> {false, false} -> ok; {false, SubEl} -> - Message = {body, htmlize(xml:get_tag_cdata(SubEl))}, + Message = {body, xml:get_tag_cdata(SubEl)}, add_message_to_log(Nick, Message, Room, Opts, State); {SubEl, _} -> - Message = {subject, htmlize(xml:get_tag_cdata(SubEl))}, + Message = {subject, xml:get_tag_cdata(SubEl)}, add_message_to_log(Nick, Message, Room, Opts, State) end; @@ -238,16 +238,24 @@ get_timestamp_daydiff(TimeStamp, Daydiff) -> {Date2, HMS}. % Try to close the previous day log, if it exists -close_previous_log(Fn) -> +close_previous_log(Fn, Images_dir) -> case file:read_file_info(Fn) of {ok, _} -> {ok, F} = file:open(Fn, [append]), - fw(F, "
ejabberd/mod_muc log\"Valid \"Valid
"), + %fw(F, "
ejabberd/mod_muc log"), + fw(F, "
"), + fw(F, " \"Powered", [Images_dir]), + fw(F, " \"Powered", [Images_dir]), + fw(F, ""), + fw(F, " \"Valid", [Images_dir]), + fw(F, " \"Valid", [Images_dir]), + fw(F, "
"), file:close(F); _ -> ok end. -add_message_to_log(Nick, Message, RoomJID, Opts, State) -> +add_message_to_log(Nick1, Message, RoomJID, Opts, State) -> + Nick = htmlize(Nick1), #state{out_dir = OutDir, dir_type = DirType, css_file = CSSFile, @@ -286,7 +294,14 @@ add_message_to_log(Nick, Message, RoomJID, Opts, State) -> put_header(F, Room, Datestring, CSSFile, Lang, HourOffset, DatePrev, DateNext, TopLink), - close_previous_log(FnYesterday) + Images_dir = filename:join([OutDir, "images"]), + file:make_dir(Images_dir), + create_image_files(Images_dir), + Images_url = case DirType of + subdirs -> "../../../images"; + plain -> "../images" + end, + close_previous_log(FnYesterday, Images_url) end, % Build message @@ -304,33 +319,33 @@ add_message_to_log(Nick, Message, RoomJID, Opts, State) -> [Nick, ?T("leaves the room")]); {leave, Reason} -> io_lib:format("~s ~s: ~s
", - [Nick, ?T("leaves the room"), Reason]); + [Nick, ?T("leaves the room"), htmlize(Reason)]); {kickban, "307", ""} -> io_lib:format("~s ~s
", [Nick, ?T("has been kicked")]); {kickban, "307", Reason} -> io_lib:format("~s ~s: ~s
", - [Nick, ?T("has been kicked"), Reason]); + [Nick, ?T("has been kicked"), htmlize(Reason)]); {kickban, "301", ""} -> io_lib:format("~s ~s
", [Nick, ?T("has been banned")]); {kickban, "301", Reason} -> io_lib:format("~s ~s: ~s
", - [Nick, ?T("has been banned"), Reason]); + [Nick, ?T("has been banned"), htmlize(Reason)]); {nickchange, OldNick} -> io_lib:format("~s ~s ~s
", [OldNick, ?T("is now known as"), Nick]); {subject, T} -> io_lib:format("~s~s~s
", - [Nick, ?T(" has set the subject to: "), T]); + [Nick, ?T(" has set the subject to: "), htmlize(T)]); {body, T} -> case regexp:first_match(T, "^/me\s") of {match, _, _} -> io_lib:format("~s ~s
", - [Nick, string:substr(T, 5)]); + [Nick, string:substr(htmlize(T), 5)]); nomatch -> io_lib:format("<~s> ~s
", - [Nick, T]) + [Nick, htmlize(T)]) end end, {Hour, Minute, Second} = Time, @@ -391,6 +406,160 @@ make_dir_rec(Dir) -> file:make_dir(Dir) end. + +% {ok, F1}=file:open("valid-xhtml10.png", [read]). +% {ok, F1b}=file:read(F1, 1000000). +% c("../../ejabberd/src/jlib.erl"). +% jlib:encode_base64(F1b). + +image_base64("powered-by-erlang.png") -> + "iVBORw0KGgoAAAANSUhEUgAAAGUAAAAfCAYAAAD+xQNoAAADN0lEQVRo3u1a" + "P0waURz+rjGRRQ+nUyRCYmJyDPTapDARaSIbTUjt1gVSh8ZW69aBAR0cWLSx" + "CXWp59LR1jbdqKnGxoQuRZZrSYyHEVM6iZMbHewROA7u3fHvkr5vOn737vcu" + "33ffu9/vcQz+gef5Cij6CkmSGABgFEH29r5SVvqIsTEOHo8HkiQxDBXEOjg9" + "PcHc3BxuUSqsI8jR0REAUFGsCCoKFYWCBAN6AxyO0Z7cyMXFb6oGqSgAsIrJ" + "ut9hMQlvdNbUhKWshLd3HtTF4jihShgVpRaBxKKmIGX5HL920/hz/BM2+zAm" + "pn2YioQaxnECj0BiEYcrG0Tzzc8/rfudSm02jaVSm9Vr1MdG8rSKKXlJ7lHr" + "fjouCut2IrC82BDPbe/gc+xlXez7KxEz63H4lmIN473Rh8Si1BKhRY6aEJI8" + "pLmbjSPN0xOnBBILmg5RC6Lg28preKOzsNmHG8R1Bf0o7GdMucUslDy1pJLG" + "2sndVVG0lq3c9vum4zmBR1kuwiYMN5ybmCYXxQg57ThFOTYznzpPO+IQi+IK" + "+jXjg/YhuIJ+cIIHg+wQJoJ+2N3jYN3Olvk4ge/IU98spne+FfGtlslm16nn" + "a8fduntfDscoVjGJqUgIjz686ViFUdjP4N39x9Xq638viZVtlq2tLXKncLf5" + "ticuZSWU5XOUshJKxxKtfdtdvs4OyNb/68urKvlluYizgwwu5SLK8jllu1t9" + "ihYOlzdwdpBBKSvh+vKKzHkCj1JW3y1m+hSj13WjqOiJKK0qpXKhSFxJAYBv" + "KYaZ9TjWRu4SiWi2LyDtb6wghGmn5HfTml16ILGA/G5al2DW7URYTFYrOU7g" + "icQ020sYqYDM9CbdgqFd4vzHL03JfvLjk6ZgADAVCSEsJvHsdL+utNYrm2uf" + "ZDVZSkzPKaQkW8kthpyS297BvRdRzR6DdTurJbPy9Ov1K6xr3HBPQuIMowR3" + "asegUyDuU9SuUG+dmIGyZ0b7FBN9St3WunyC5yMsrVv7uXzRP58s/qKn6C4q" + "lQoVxVIvd4YBwzBUFKs6ZaD27U9hEdcAN98Sx2IxykafIYrizbfESoB+dd9/" + "KF/d/wX3cJvREzl1vAAAAABJRU5ErkJggg=="; + +image_base64("valid-xhtml10.png") -> + "iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAAEjEcpEAAACiFBMVEUAAADe" + "5+fOezmtra3ejEKlhELvvWO9WlrehELOe3vepaWclHvetVLGc3PerVKcCAj3" + "vVqUjHOUe1JjlL0xOUpjjL2UAAC91ueMrc7vrVKlvdbW3u+EpcbO3ufO1ucY" + "WpSMKQi9SiF7e3taWkoQEAiMczkQSoxaUkpzc3O1lEoICACEazEhGAgIAACE" + "YzFra2utjELWcznGnEr/7+9jY2POazHOYzGta2NShLVrlL05OUqctdacCADG" + "a2ucAADGpVqUtc61ORg5OTmlUikYGAiUezl7YzEYEAiUczkxMTG9nEqtIRDe" + "3t4AMXu9lEoQCACMazEAKXspKSmljFrW1ta1jELOzs7n7/fGxsa9pVqEOSkp" + "Y5xznL29tZxahLXOpVr/99ZrY1L/79ZjUiljSikAOYTvxmMAMYScezmchFqU" + "czGtlFp7c2utjFqUlJStxt73///39/9Ce61CSkq9xsZznMbW5+9Cc62MjIxC" + "Qkrv9/fv7/fOzsbnlErWjIz/3mtCORhza1IpIRBzWjH/1mtCMRhzY1L/zmvn" + "vVpSQiHOpVJrUinntVr3zmOEc1L3xmNaWlq1nFo5QkrGWim1lFoISpRSUlK1" + "zt4hWpwASoz///////8xa6WUaykAQoxKe61KSkp7nMbWtWPe5+9jWlL39/f3" + "9/fWrWNCQkLera3nvWPv7+85MRjntWPetVp7c1IxKRCUlHtKORh7a1IxIRCU" + "jHtaSiHWrVIpIQhzWinvvVpaQiH/1mPWpVKMe1L/zmP/xmNrUiGErc4YGBj/" + "73PG1ucQWpT/53O9nFoQUpS1SiEQEBC9zt69vb05c6UISoxSUko5a6UICAhS" + "SkohUpS1tbXetWMAQoSUgD+kAAAA2HRSTlP/////////iP9sSf//dP//////" + "//////////////////////////////////////////8M////////////ef//" + "////////////////////////////////////////////////////////////" + "//////////////////////9d////////////////////////////////////" + "AP//////////////CP//RP//////////////////////////////////////" + "//////////////////////9xPp1gAAAFvUlEQVR42pVWi18URRwfy7vsYUba" + "iqBRBFmICUQGVKcZckQeaRJQUCLeycMSfKGH0uo5NELpIvGQGzokvTTA85VH" + "KTpbRoeJnPno/p1+M7t3txj20e/Nzu7Ofve7v/k9Zg4Vc+wRQMW0eyLx1ZSA" + "NeBDxVmxZZSwEUYkGAewm1eIBOMRvhv1UA+q8KXIVuxGdCelFYwxAnxOrxgb" + "Y8Ti1t4VA0QHYz4x3FnVC8OVLXv9fkKGSWDoW/4lG6VbdtBblesOs+MjmEmz" + "JKNIJWFEfEQTCWNPFKvcKEymjLO1b8bwYQd1hCiiDCl5KsrDCIlhj4fSuvcp" + "fSpgJmyv6dzeZv+nMPx3dhbt94II07/JZliEtm1N2RIYPkTYshwYm245a/zk" + "WjJwcyFh6ZIcYxxmqiaDSYxhOhFUsqngi3Fzcj3ljdYDNE9uzA1YD/5MhnzW" + "1KRqF7mYG8jFYXLcfLpjOe2LA0fuGqQrQHl10sdK0sFcFSOSlzF0BgXQH9h3" + "QZDBI0ccNEhftjXuippBDD2/eMRiETmwwNEYHyqhdDyo22w+3QHuNbdve5a7" + "eOkHmDVJ0ixNmfbz1h0qo/Q6GuSB2wQJQbpOjOQAl7woWSRJ0m2ewhvAOUiY" + "YtZtaZL0CZZmtmVOQttLfr/dbveLZodrfrL7W75wG/JjqkQxoNTtNsTKELQp" + "QL6/D5loaSmyTT8TUhsmi8iFA0hZiyltf7OiNKdarRm5w2So2lTNdPLuIzR+" + "AiLj8VTRJaj0LmX4VhJ27f/VJV/yycilWPOrk8NkXi7Qqmj5bHqVZlJKZIRk" + "1wFzKrt0WUbnXMPJ1fk4TJ5oWBA61p1V76DeIs0MX+s3GxRlA1vtw83KhgNp" + "hc1nyErLO5zcvbOsrq+scbZnpzc6QVFPenLwGxmC+BOfYI+DN55QYddh4Q/N" + "E/yGYYj4TOGNngQavAZnzzTovEA+kcMJ+247uYexNA+4Fsvjmuv662jsWxPZ" + "x2xg890bYMYnTgya7bjmCiEY0qgJ0vMF3c+NoFdPyzxz6V3Uxs3AOWCDchRv" + "OsQtBrbFsrT2fhHEc7ByGzu/dA4IO0A3HdfeP9yMqAwP6NPEb6cbwn0PWVU1" + "7/FDBQh/CPIrbfcg027IZrsAT/Bf3FNWyn9RSR4cvvwn3e4HFmYPDl/thYcR" + "Vi8qPEoXVUWBl6FTBFTtnqmKKg5wnlF4wZ1yeLv7TiwXKektE+iDBNicWEyL" + "pnFhfDkpJc3q2khSPyQBbE0dMJnOoDzTwGsI7cdyMkL5gWqUjCF6Txst/twx" + "Cv1WzzHoy21ZDQ1xnuDzdPDWR4knr14v0tYn3IxaMFFdiMOlEOJHw1jOQ4sW" + "t5rQopRkXZhMEi7pmeDCVWBlfUKwhMZ7rsF6elKsvbwiKxgxIdewa3ErsaYo" + "mCVZFYJb0GUu3JqGUNoplBxYiYby8vLBFWef+Cri4/I1sbQ/1OtYTrNtdXS+" + "rSe7kQ52eSObL99/iErCWUjCy5W4JLygmCouGfG9x9fmx17XhBuDCaOerbt5" + "38erta7TFktLvdHghZcCbcPQO33zIJG9kxF5hoVXnzTzRz0r5js8oTj6uyPk" + "GRf346HOLcasgFexueNUWFPtuFKzjoSFYYedhwVlhsRVYWWJpltv1XPQT1Rl" + "0bjZIBlb1XujVDzY/Kj4k6Ku3+Z0jo1owjVzDpFTXe1juvBSWNFmNWGZy8Lv" + "zUl5PN4JCwyNDzbQ0aAj4Zrjz0FatGJJYhvq4j7mGSpvytGFlZtHf2C4o/28" + "Zu8z7wo7eYPfXysnF0i9NnPh1t1zR7VBb9GqaOXhtTmHQdgMFXE+Z608cnpO" + "DdZdjL+TuDY44Q38kJXHhccWLoOd9uv1AwwvO+48uu+faCSJPJ1bmy6Thyvp" + "ivBmYWgjxPDPAp7JTemY/yGKFEiRt/jG/2P79s8KCwoLCgoLC/khUBA5F0Sf" + "QZ+RYfpNE/4Xosmq7jsZAJsAAAAASUVORK5CYII="; + +image_base64("vcss.png") -> + "iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAABUFvrSAAABKVBMVEUAAAAj" + "Ix8MR51ZVUqAdlmdnZ3ejEWLDAuNjY1kiMG0n2d9fX19Ghfrp1FtbW3y39+3" + "Ph6lIRNdXV2qJBFcVUhcVUhPT0/dsmpUfLr57+/u7u4/PDWZAACZAADOp1Gd" + "GxG+SyTgvnNdSySzk16+mkuxw+BOS0BOS0DOzs7MzMy4T09RRDwsJBG+vr73" + "wV6fkG6eCQRFcLSurq6/X1+ht9nXfz5sepHuwV59ZTHetFjQ2+wMCQQ2ZK5t" + "WCsmWajsz8+Sq9NMPh4hVaY8MRj///////////////////////9MTEyOp9Lu" + "8vhXU1A8PDyjOSTBz+YLRJ2rLy8sLCwXTaKujEUcHByDn82dfz7/zGafDw+f" + "Dw+zRSlzlMcMDAyNcji1tbXf5vIcFgvATJOjAAAAY3RSTlP/8///////////" + "//////8A//////P/////ov//8//////////////z///T//////////+i////" + "//////////8w/////6IA/xAgMP//////////8/////////8w0/////////+z" + "ehebAAACkUlEQVR42u2VfVPTQBDG19VqC6LY+lKrRIxFQaFSBPuSvhBPF8SI" + "UZK2J5Yav/+HcO8uZdLqTCsU/nKnyWwvk1/unnt2D9ZmH+8/cMAaTRFy+ng6" + "9/yiwC/+gy8R3McGv5zHvGJEGAdR4eBgi1IbZwevIEZE24pFtBtzG1Q4AoD5" + "zvw5pEDcJvIQV/TE3/l+H9GnNJwcdABS5wAbFQLMqI98/UReoAaOTlaJsp0z" + "aHx7LwZvY0BUR2xpWTzqam0gzY8KGzG4MhBCNGucha4QbpETy+Yk/BP85nt7" + "34AjpQLTsE4ZFpf/dnkUCglXVNYB+OfUZJHvAqAoa45OeuPgm4+Xjtv7xm4N" + "7PMV4C61+Mrz3H2WImm3ATiWrAiwZRWcUA5Ej4dgIEMxDv6yxHHcNuAutnjv" + "2HZ1NeuycoVPh0mwC834zZC9Ao5dkZZKwLVGwT+WdLw0YOZ1saEkUDoT+QGW" + "KZ0E2xpcrPakVW2KXwyUtYEtlEAj3GXD/fYwrryAdeiyGqidQSw1eqtJcA8c" + "Zq4zXqhPuCBYE1fKJjh/5X6MwRm9c2xf7WVdLf5oSdt64esVIwVAKC1HJ2ol" + "i8vj3L0YzC4zjkMagt+arDAs6bApbL1RVlWIqrJbreqKZmh4y6VR7rAJeUYD" + "VRj9VqRXkErpJ9lbEwtE83KlIfeG4p52t7zWIMO1XcaGz54uUyet+hBM7BXX" + "DS8Xc5+8Gmmbu1xwSoGIokA3oTptQecQ4Iimm/Ew7jwbPfMi3TM91T9XVIGo" + "+W9xC8oWpugVCXLuwXijjxJ3r/6PjX7nlFua8QmyM+TO/Gja2TTc2Z95C5ua" + "ewGH6cJi6bJO6Z+TY276eH3tbgy+/3ly3Js+rj66osG/AV5htgaQ9SeRAAAA" + "AElFTkSuQmCC"; + +image_base64("powered-by-ejabberd.png") -> + "iVBORw0KGgoAAAANSUhEUgAAAGUAAAAfCAMAAADJG/NaAAAAw1BMVEUAAAAj" + "BgYtBAM5AwFCAAAYGAJNAABcAABIDQ5qAAAoJRV7AACFAAAoKSdJHByLAAAw" + "Lwk1NQA1MzFJKyo4NxtDQQBEQT5KSCxSTgBSUBlgQ0JYSEpZWQJPUU5hYABb" + "W0ZiYClcW1poaCVwbQRpaDhzYWNsakhuZ2VrbFZ8dwCEgAB3dnd4d2+OjACD" + "hYKcmACJi4iQkpWspgCYmJm5swCmqazEwACwsbS4ub3X0QLExsPLyszW1Nnc" + "3ODm5ugMBwAWAwPHm1IFAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJ" + "cEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfVCRQOBA7VBkCMAAACcElEQVRI" + "x72WjXKiMBSFQalIFbNiy1pdrJZaRVYR5deGwPs/VRNBSBB2OjvQO0oYjPfj" + "5J6bCcdx8i2UldxKcDhk1HbIPwFBF/kHKJfjPSVAyIRHF9rRZ4sUX3EDdWOv" + "1+u2tESaavpnYTbv9zvd0WwDy3/QcGQXlH5uTxB1l07MJlRpsUei0JF6Qi+O" + "HyGK7ijXxPklHe/umIllim3iUBMJDIEULxxPP0TVWhhKJoN9fUpdmQLteV8a" + "DgEAg9gIcTjL4F4L+r4WVKEF+rbJdwYYAoQHY+oQjnGootyKwxapoi73WkyF" + "FySQBv988naEEp4+YMMec5VUCQDJTscEy7Kc0HsLmqNE7rovDjMpIHHGYeid" + "Xn4TQcaxMYqP3RV3C8oCl2WvrlSPaNpGZadRnmPGCk8ylM2okAJ4i9TEe1Ke" + "rsXxSl6jUt5uayiIodirtcKLOaWblj50wiyMv1F9lm9TUDArGAD0FmEpvCUs" + "VoZy6dW81Fg0aDaHogQa36ekAPG5DDGsbdZrGsrzZUnzvBo1I2tLmuL69kSi" + "tAweyHKN9b3leDfQMnu3nIIKWfmXnqGVKedJT6QpICbJvf2f8aOsvn68v+k7" + "/cwUQdPoxaMoRTnKFHNlKsKQphCTOa84u64vpi8bH31CqsbF6lSONRTkTyQG" + "Arq49/fEvjBwz4eDS2/JpaXRNOoXRD/VmOrDVTJJRIZCTLav3VrqbPvP3vdd" + "uGEhQJzilncbpSA4F3vsihErO+dayv/sY5/yRE0GDEXCu2VoNiMlo5i+P2Kl" + "gMEvTNk2eYa5XEyh12Ex17Z8vzQUR3KEPbYd6XG87eC4Ly75RneS5ZYHAAAA" + "AElFTkSuQmCC". + +create_image_files(Images_dir) -> + Filenames = [ + "powered-by-ejabberd.png", + "powered-by-erlang.png", + "valid-xhtml10.png", + "vcss.png" + ], + lists:foreach( + fun(Filename) -> + Filename_full = filename:join([Images_dir, Filename]), + {ok, F} = file:open(Filename_full, [write]), + Image = jlib:decode_base64(image_base64(Filename)), + io:format(F, "~s", [Image]), + file:close(F) + end, + Filenames), + ok. + fw(F, S, O) -> io:format(F, S ++ "~n", O). fw(F, S) -> fw(F, S, []). @@ -399,19 +568,19 @@ put_header(F, Room, Date, CSSFile, Lang, Hour_offset, Date_prev, Date_next, Top_ fw(F, "", [Lang, Lang]), fw(F, ""), fw(F, ""), - fw(F, "~s - ~s", [Room#room.title, Date]), + fw(F, "~s - ~s", [htmlize(Room#room.title), Date]), put_header_css(F, CSSFile), put_header_script(F), fw(F, ""), fw(F, ""), {Top_url, Top_text} = Top_link, fw(F, "", [Top_url, Top_text]), - fw(F, "", [Room#room.jid, Room#room.title]), + fw(F, "
~s
", [htmlize(Room#room.title)]), fw(F, "~s", [Room#room.jid, Room#room.jid]), fw(F, "
~s< ^ >
", [Date, Date_prev, Date_next]), - case {Room#room.subject_author, Room#room.subject} of + case {htmlize(Room#room.subject_author), htmlize(Room#room.subject)} of {"", ""} -> ok; - {SuA, Su} -> fw(F, "
~s~s~s
", [SuA, ?T(" has set the subject to: "), htmlize(Su)]) + {SuA, Su} -> fw(F, "
~s~s~s
", [SuA, ?T(" has set the subject to: "), Su]) end, RoomConfig = roomconfig_to_string(Room#room.config, Lang), put_room_config(F, RoomConfig, Lang), @@ -436,7 +605,7 @@ put_header_css(F, false) -> fw(F, ".mne {color: #AA0099;}"), fw(F, "a.nav {color: #AAAAAA; font-family: monospace; letter-spacing: 3px; text-decoration: none;}"), fw(F, "div.roomtitle {border-bottom: #224466 solid 3pt; margin-left: 20pt;}"), - fw(F, "a.roomtitle {color: #336699; font-size: 24px; font-weight: bold; font-family: sans-serif; letter-spacing: 3px; text-decoration: none;}"), + fw(F, "div.roomtitle {color: #336699; font-size: 24px; font-weight: bold; font-family: sans-serif; letter-spacing: 3px; text-decoration: none;}"), fw(F, "a.roomjid {color: #336699; font-size: 24px; font-weight: bold; font-family: sans-serif; letter-spacing: 3px; margin-left: 20pt; text-decoration: none;}"), fw(F, "div.logdate {color: #663399; font-size: 20px; font-weight: bold; font-family: sans-serif; letter-spacing: 2px; border-bottom: #224466 solid 1pt; margin-left:80pt; margin-top:20px;}"), fw(F, "div.roomsubject {color: #336699; font-size: 18px; font-family: sans-serif; margin-left: 80pt; margin-bottom: 10px;}"), @@ -485,11 +654,11 @@ htmlize(S1) -> S2_list). htmlize2(S1) -> - S2 = element(2, regexp:gsub(S1, "<", "\\<")), - S3 = element(2, regexp:gsub(S2, ">", "\\>")), - S4 = element(2, regexp:gsub(S3, "(http|ftp)://.[^ ]*", "&")), - %element(2, regexp:gsub(S4, " ", "\\ ")). - S4. + S2 = element(2, regexp:gsub(S1, "\\&", "\\&")), + S3 = element(2, regexp:gsub(S2, "<", "\\<")), + S4 = element(2, regexp:gsub(S3, ">", "\\>")), + S5 = element(2, regexp:gsub(S4, "(http|ftp)://.[^ ]*", "&")), + S6. get_room_info(RoomJID, Opts) -> Title = @@ -544,7 +713,7 @@ roomconfig_to_string(Options, Lang) -> T -> case Opt of password -> "
" ++ OptText ++ "
"; - title -> "
" ++ ?T("Room title") ++ ": \"" ++ T ++ "\"
"; + title -> "
" ++ ?T("Room title") ++ ": \"" ++ htmlize(T) ++ "\"
"; _ -> "\"" ++ T ++ "\"" end end, diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index 44eceb476..6c895d30b 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc/mod_muc_room.erl @@ -1375,10 +1375,10 @@ lqueue_new(Max) -> max = Max}. %% If the message queue limit is set to 0, do not store messages. -lqueue_in(Item, LQ = #lqueue{max = 0}) -> +lqueue_in(_Item, LQ = #lqueue{max = 0}) -> LQ; %% Otherwise, rotate messages in the queue store. -lqueue_in(Item, LQ = #lqueue{queue = Q1, len = Len, max = Max}) -> +lqueue_in(Item, #lqueue{queue = Q1, len = Len, max = Max}) -> Q2 = queue:in(Item, Q1), if Len >= Max -> -- cgit v1.2.3 From 0b660a42f4da3162dff48ff4146fefb519ffbc08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Fri, 22 Sep 2006 07:58:58 +0000 Subject: Bugfixes coming from trunk (SVN #603): * src/mod_muc/mod_muc_log.erl: bugfix. SVN Revision: 612 --- src/mod_muc/mod_muc_log.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/mod_muc/mod_muc_log.erl b/src/mod_muc/mod_muc_log.erl index 15afd6350..1ba731e7c 100644 --- a/src/mod_muc/mod_muc_log.erl +++ b/src/mod_muc/mod_muc_log.erl @@ -658,7 +658,7 @@ htmlize2(S1) -> S3 = element(2, regexp:gsub(S2, "<", "\\<")), S4 = element(2, regexp:gsub(S3, ">", "\\>")), S5 = element(2, regexp:gsub(S4, "(http|ftp)://.[^ ]*", "&")), - S6. + S5. get_room_info(RoomJID, Opts) -> Title = -- cgit v1.2.3 From ec668cd85a5dbd726aa3d5e4a48fad3d1674f7df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Fri, 22 Sep 2006 08:05:50 +0000 Subject: Update coming from trunk (SVN #604): * src/ejd2odbc.erl: Updated SVN Revision: 613 --- src/ejd2odbc.erl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/ejd2odbc.erl b/src/ejd2odbc.erl index a03af9d33..8a7f6ada0 100644 --- a/src/ejd2odbc.erl +++ b/src/ejd2odbc.erl @@ -74,7 +74,7 @@ export_roster(Server, Output) -> " and jid='", SJID, "';" "insert into rosterusers(" " username, jid, nick, " - " subscription, ask, " + " subscription, ask, askmessage, " " server, subscribe, type) " " values ", ItemVals, ";" "delete from rostergroups " @@ -271,7 +271,8 @@ output(LServer, IO, SQL) -> record_to_string(#roster{usj = {User, Server, JID}, name = Name, subscription = Subscription, - ask = Ask}) -> + ask = Ask, + askmessage = AskMessage}) -> Username = ejabberd_odbc:escape(User), SJID = ejabberd_odbc:escape(jlib:jid_to_string(JID)), Nick = ejabberd_odbc:escape(Name), @@ -295,6 +296,7 @@ record_to_string(#roster{usj = {User, Server, JID}, "'", Nick, "'," "'", SSubscription, "'," "'", SAsk, "'," + "'", AskMessage, "'," "'N', '', 'item')"]. groups_to_string(#roster{usj = {User, Server, JID}, -- cgit v1.2.3 From 677a6004cf5e2dc6f3e73f9cda4a31d890b9b8f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Fri, 22 Sep 2006 08:08:37 +0000 Subject: Improvement coming from trunk (SVN #605): * src/odbc/mssql.sql: Removed unused fields. SVN Revision: 614 --- src/odbc/mssql.sql | 2 -- 1 file changed, 2 deletions(-) (limited to 'src') diff --git a/src/odbc/mssql.sql b/src/odbc/mssql.sql index 6a8a298d9..49fcd218c 100644 --- a/src/odbc/mssql.sql +++ b/src/odbc/mssql.sql @@ -88,7 +88,6 @@ CREATE TABLE [dbo].[last] ( [username] [varchar] (250) NOT NULL , [seconds] [varchar] (50) NOT NULL , [state] [varchar] (100) NULL , - [Modify_Date] [datetime] NULL ) ON [PRIMARY] GO @@ -118,7 +117,6 @@ CREATE TABLE [dbo].[spool] ( [xml] [text] NULL , [notifyprocessed] [bit] NULL , [created] [datetime] NULL , - [MustDelete] [bit] NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO -- cgit v1.2.3 From 23b78b0f0c871183a56f40b05fc25e20b4c75a7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Fri, 22 Sep 2006 08:36:09 +0000 Subject: Improvement coming from trunk (SVN #606): * doc/guide.tex: Updated (thanks to Evgeniy Khramtsov) * src/ejabberd_auth_ldap.erl: Better LDAP support (thanks to Evgeniy Khramtsov) * src/mod_vcard_ldap.erl: Likewise * src/eldap/eldap_filter.erl: Likewise SVN Revision: 615 --- src/ejabberd_auth_ldap.erl | 353 ++++++++++++++---- src/eldap/Makefile.in | 3 +- src/eldap/Makefile.win32 | 3 +- src/mod_vcard_ldap.erl | 877 ++++++++++++++++++++++++++++----------------- 4 files changed, 842 insertions(+), 394 deletions(-) (limited to 'src') diff --git a/src/ejabberd_auth_ldap.erl b/src/ejabberd_auth_ldap.erl index 6e454cb80..a1ce74609 100644 --- a/src/ejabberd_auth_ldap.erl +++ b/src/ejabberd_auth_ldap.erl @@ -10,8 +10,21 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). +-behaviour(gen_server). + +%% gen_server callbacks +-export([init/1, + handle_info/2, + handle_call/3, + handle_cast/2, + terminate/2, + code_change/3 + ]). + %% External exports -export([start/1, + stop/1, + start_link/1, set_password/3, check_password/3, check_password/5, @@ -29,39 +42,84 @@ -include("ejabberd.hrl"). -include("eldap/eldap.hrl"). +-record(state, {host, + eldap_id, + servers, + port, + dn, + password, + base, + uidattr, + uidattr_format, + ufilter, + sfilter, + dn_filter, + dn_filter_attrs + }). + +%% Unused callbacks. +handle_cast(_Request, State) -> + {noreply, State}. +code_change(_OldVsn, State, _Extra) -> + {ok, State}. +handle_info(_Info, State) -> + {noreply, State}. +%% ----- + %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- + start(Host) -> - 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(get_eldap_id(Host, ejabberd), - LDAPServers, 389, RootDN, Password), - eldap:start_link(get_eldap_id(Host, ejabberd_bind), - LDAPServers, 389, RootDN, Password), + Proc = gen_mod:get_module_proc(Host, ?MODULE), + ChildSpec = { + Proc, {?MODULE, start_link, [Host]}, + permanent, 1000, worker, [?MODULE] + }, + supervisor:start_child(ejabberd_sup, ChildSpec). + +stop(Host) -> + Proc = gen_mod:get_module_proc(Host, ?MODULE), + gen_server:call(Proc, stop), + supervisor:terminate_child(ejabberd_sup, Proc), + supervisor:delete_child(ejabberd_sup, Proc). + +start_link(Host) -> + Proc = gen_mod:get_module_proc(Host, ?MODULE), + gen_server:start_link({local, Proc}, ?MODULE, Host, []). + +terminate(_Reason, State) -> + ejabberd_ctl:unregister_commands( + State#state.host, + [{"registered-users", "list all registered users"}], + ejabberd_auth, ctl_process_get_registered). + +init(Host) -> + State = parse_options(Host), + eldap:start_link(State#state.eldap_id, + State#state.servers, + State#state.port, + State#state.dn, + State#state.password), ejabberd_ctl:register_commands( Host, [{"registered-users", "list all registered users"}], ejabberd_auth, ctl_process_get_registered), - ok. + {ok, State}. + +-define(REPLY_TIMEOUT, 10000). plain_password_required() -> true. check_password(User, Server, Password) -> - case find_user_dn(User, Server) of - false -> + Proc = gen_mod:get_module_proc(Server, ?MODULE), + case catch gen_server:call(Proc, + {check_pass, User, Password}, ?REPLY_TIMEOUT) of + {'EXIT', _} -> false; - DN -> - LServer = jlib:nameprep(Server), - case eldap:bind(get_eldap_id(LServer, ejabberd_bind), - DN, Password) of - ok -> - true; - _ -> - false - end + Result -> + Result end. check_password(User, Server, Password, _StreamID, _Digest) -> @@ -77,31 +135,13 @@ dirty_get_registered_users() -> get_vh_registered_users(?MYNAME). get_vh_registered_users(Server) -> - LServer = jlib:nameprep(Server), - Attr = ejabberd_config:get_local_option({ldap_uidattr, LServer}), - Filter = eldap:present(Attr), - Base = ejabberd_config:get_local_option({ldap_base, LServer}), - case eldap:search(get_eldap_id(LServer, ejabberd), - [{base, Base}, - {filter, Filter}, - {attributes, [Attr]}]) of - #eldap_search_result{entries = Es} -> - lists:flatmap( - fun(E) -> - case lists:keysearch(Attr, 1, E#eldap_entry.attributes) of - {value, {_, [U]}} -> - case jlib:nodeprep(U) of - error -> - []; - LU -> - [{LU, LServer}] - end; - _ -> - [] - end - end, Es); - _ -> - [] + Proc = gen_mod:get_module_proc(Server, ?MODULE), + case catch gen_server:call(Proc, + get_vh_registered_users, ?REPLY_TIMEOUT) of + {'EXIT', _} -> + []; + Result -> + Result end. get_password(_User, _Server) -> @@ -111,11 +151,13 @@ get_password_s(_User, _Server) -> "". is_user_exists(User, Server) -> - case find_user_dn(User, Server) of - false -> + Proc = gen_mod:get_module_proc(Server, ?MODULE), + case catch gen_server:call(Proc, + {is_user_exists, User}, ?REPLY_TIMEOUT) of + {'EXIT', _} -> false; - _DN -> - true + Result -> + Result end. remove_user(_User, _Server) -> @@ -124,25 +166,212 @@ remove_user(_User, _Server) -> remove_user(_User, _Server, _Password) -> not_allowed. - %%%---------------------------------------------------------------------- %%% Internal functions %%%---------------------------------------------------------------------- +handle_call({check_pass, User, Password}, _From, State) -> + Reply = case find_user_dn(User, State) of + false -> + false; + DN -> + case eldap:bind(State#state.eldap_id, DN, Password) of + ok -> true; + _ -> false + end + end, + {reply, Reply, State}; + +handle_call(get_vh_registered_users, _From, State) -> + UA = State#state.uidattr, + UAF = State#state.uidattr_format, + Eldap_ID = State#state.eldap_id, + Server = State#state.host, + SortedDNAttrs = usort_attrs(State#state.dn_filter_attrs), + Reply = case eldap_filter:parse(State#state.sfilter) of + {ok, EldapFilter} -> + case eldap:search(Eldap_ID, [{base, State#state.base}, + {filter, EldapFilter}, + {attributes, SortedDNAttrs}]) of + #eldap_search_result{entries = Entries} -> + lists:flatmap( + fun(#eldap_entry{attributes = Attrs, + object_name = DN}) -> + case is_valid_dn(DN, Attrs, State) of + false -> []; + _ -> + case get_ldap_attr(UA, Attrs) of + "" -> []; + User -> + case get_user_part(User, UAF) of + {ok, U} -> + case jlib:nodeprep(U) of + error -> []; + LU -> [{LU, jlib:nameprep(Server)}] + end; + _ -> [] + end + end + end + end, Entries); + _ -> + [] + end; + _ -> + [] + end, + {reply, Reply, State}; + +handle_call({is_user_exists, User}, _From, State) -> + Reply = case find_user_dn(User, State) of + false -> false; + _DN -> true + end, + {reply, Reply, State}; + +handle_call(stop, _From, State) -> + {stop, normal, ok, State}; -find_user_dn(User, Server) -> - LServer = jlib:nameprep(Server), - Attr = ejabberd_config:get_local_option({ldap_uidattr, LServer}), - Filter = eldap:equalityMatch(Attr, User), - Base = ejabberd_config:get_local_option({ldap_base, LServer}), - case eldap:search(get_eldap_id(LServer, ejabberd), - [{base, Base}, - {filter, Filter}, - {attributes, []}]) of - #eldap_search_result{entries = [E | _]} -> - E#eldap_entry.object_name; +handle_call(_Request, _From, State) -> + {reply, bad_request, State}. + +find_user_dn(User, State) -> + DNAttrs = usort_attrs(State#state.dn_filter_attrs), + case eldap_filter:parse(State#state.ufilter, [{"%u", User}]) of + {ok, Filter} -> + case eldap:search(State#state.eldap_id, [{base, State#state.base}, + {filter, Filter}, + {attributes, DNAttrs}]) of + #eldap_search_result{entries = [#eldap_entry{attributes = Attrs, + object_name = DN} | _]} -> + is_valid_dn(DN, Attrs, State); + _ -> + false + end; _ -> false end. -get_eldap_id(Host, Name) -> - atom_to_list(gen_mod:get_module_proc(Host, Name)). +is_valid_dn(DN, _, #state{dn_filter = undefined}) -> + DN; + +is_valid_dn(DN, Attrs, State) -> + DNAttrs = State#state.dn_filter_attrs, + UA = State#state.uidattr, + UAF = State#state.uidattr_format, + Values = [{"%s", get_ldap_attr(Attr, Attrs), 1} || Attr <- DNAttrs], + SubstValues = case get_ldap_attr(UA, Attrs) of + "" -> Values; + S -> + case get_user_part(S, UAF) of + {ok, U} -> [{"%u", U} | Values]; + _ -> Values + end + end ++ [{"%d", State#state.host}, {"%D", DN}], + case eldap_filter:parse(State#state.dn_filter, SubstValues) of + {ok, EldapFilter} -> + case eldap:search(State#state.eldap_id, [ + {base, State#state.base}, + {filter, EldapFilter}, + {attributes, ["dn"]}]) of + #eldap_search_result{entries = [_|_]} -> + DN; + _ -> + false + end; + _ -> + false + end. + +%%%---------------------------------------------------------------------- +%%% Auxiliary functions +%%%---------------------------------------------------------------------- +get_user_part(String, Pattern) -> + F = fun(S, P) -> + First = string:str(P, "%u"), + TailLength = length(P) - (First+1), + string:sub_string(S, First, length(S) - TailLength) + end, + case catch F(String, Pattern) of + {'EXIT', _} -> + {error, badmatch}; + Result -> + case regexp:sub(Pattern, "%u", Result) of + {ok, String, _} -> {ok, Result}; + _ -> {error, badmatch} + end + end. + +case_insensitive_match(X, Y) -> + X1 = stringprep:tolower(X), + Y1 = stringprep:tolower(Y), + if + X1 == Y1 -> true; + true -> false + end. + +get_ldap_attr(LDAPAttr, Attributes) -> + Res = lists:filter( + fun({Name, _}) -> + case_insensitive_match(Name, LDAPAttr) + end, Attributes), + case Res of + [{_, [Value|_]}] -> Value; + _ -> "" + end. + +usort_attrs(Attrs) when is_list(Attrs) -> + lists:usort(Attrs); + +usort_attrs(_) -> + []. + +parse_options(Host) -> + Eldap_ID = atom_to_list(gen_mod:get_module_proc(Host, ?MODULE)), + LDAPServers = ejabberd_config:get_local_option({ldap_servers, Host}), + LDAPPort = case ejabberd_config:get_local_option({ldap_port, Host}) of + undefined -> 389; + P -> P + end, + RootDN = case ejabberd_config:get_local_option({ldap_rootdn, Host}) of + undefined -> ""; + RDN -> RDN + end, + Password = case ejabberd_config:get_local_option({ldap_password, Host}) of + undefined -> ""; + Pass -> Pass + end, + UIDAttr = case ejabberd_config:get_local_option({ldap_uidattr, Host}) of + undefined -> "uid"; + UA -> UA + end, + UIDAttrFormat = case ejabberd_config:get_local_option({ldap_uidattr_format, Host}) of + undefined -> "%u"; + UAF -> UAF + end, + SubFilter = "(" ++ UIDAttr ++ "=" ++ UIDAttrFormat ++ ")", + UserFilter = case ejabberd_config:get_local_option({ldap_filter, Host}) of + undefined -> SubFilter; + "" -> SubFilter; + F -> "(&" ++ SubFilter ++ F ++ ")" + end, + SearchFilter = eldap_filter:do_sub(UserFilter, [{"%u", "*"}]), + LDAPBase = ejabberd_config:get_local_option({ldap_base, Host}), + {DNFilter, DNFilterAttrs} = + case ejabberd_config:get_local_option({ldap_dn_filter, Host}) of + undefined -> {undefined, undefined}; + {DNF, DNFA} -> {DNF, DNFA} + end, + #state{host = Host, + eldap_id = Eldap_ID, + servers = LDAPServers, + port = LDAPPort, + dn = RootDN, + password = Password, + base = LDAPBase, + uidattr = UIDAttr, + uidattr_format = UIDAttrFormat, + ufilter = UserFilter, + sfilter = SearchFilter, + dn_filter = DNFilter, + dn_filter_attrs = DNFilterAttrs + }. diff --git a/src/eldap/Makefile.in b/src/eldap/Makefile.in index 91384b328..72e7b4632 100644 --- a/src/eldap/Makefile.in +++ b/src/eldap/Makefile.in @@ -12,7 +12,8 @@ OUTDIR = .. EFLAGS = -I .. -pz .. OBJS = \ $(OUTDIR)/eldap.beam \ - $(OUTDIR)/ELDAPv3.beam + $(OUTDIR)/ELDAPv3.beam \ + $(OUTDIR)/eldap_filter.beam all: $(OBJS) diff --git a/src/eldap/Makefile.win32 b/src/eldap/Makefile.win32 index 6feda635c..5d737d05a 100644 --- a/src/eldap/Makefile.win32 +++ b/src/eldap/Makefile.win32 @@ -6,7 +6,8 @@ EFLAGS = -I .. -pz .. OBJS = \ $(OUTDIR)\eldap.beam \ - $(OUTDIR)\ELDAPv3.beam + $(OUTDIR)\ELDAPv3.beam \ + $(OUTDIR)\eldap_filter.beam ALL : $(OBJS) diff --git a/src/mod_vcard_ldap.erl b/src/mod_vcard_ldap.erl index 68e1fc8a2..4389e4bce 100644 --- a/src/mod_vcard_ldap.erl +++ b/src/mod_vcard_ldap.erl @@ -1,8 +1,7 @@ - %%%---------------------------------------------------------------------- %%% File : mod_vcard_ldap.erl %%% Author : Alexey Shchepin -%%% Purpose : +%%% Purpose : Support for VCards from LDAP storage. %%% Created : 2 Jan 2003 by Alexey Shchepin %%% Id : $Id$ %%%---------------------------------------------------------------------- @@ -11,13 +10,26 @@ -author('alexey@sevcom.net'). -vsn('$Revision$ '). +-behaviour(gen_server). -behaviour(gen_mod). --export([start/2, init/3, stop/1, - get_sm_features/5, +%% gen_server callbacks. +-export([init/1, + handle_info/2, + handle_call/3, + handle_cast/2, + terminate/2, + code_change/3 + ]). + +-export([start/2, + start_link/2, + stop/1, + get_sm_features/5, process_local_iq/3, process_sm_iq/3, - remove_user/1]). + remove_user/1 + ]). -include("ejabberd.hrl"). -include("eldap/eldap.hrl"). @@ -25,69 +37,164 @@ -define(PROCNAME, ejabberd_mod_vcard_ldap). +-record(state, {serverhost, + myhost, + eldap_id, + search, + servers, + port, + dn, + base, + password, + uid, + uid_format, + vcard_map, + vcard_map_attrs, + user_filter, + search_filter, + search_fields, + search_reported, + search_reported_attrs + }). + +-define(VCARD_MAP, + [{"NICKNAME", "%u", []}, + {"FN", "%s", ["displayName"]}, + {"FAMILY", "%s", ["sn"]}, + {"GIVEN", "%s", ["givenName"]}, + {"MIDDLE", "%s", ["initials"]}, + {"ORGNAME", "%s", ["o"]}, + {"ORGUNIT", "%s", ["ou"]}, + {"CTRY", "%s", ["c"]}, + {"LOCALITY", "%s", ["l"]}, + {"STREET", "%s", ["street"]}, + {"REGION", "%s", ["st"]}, + {"PCODE", "%s", ["postalCode"]}, + {"TITLE", "%s", ["title"]}, + {"URL", "%s", ["labeleduri"]}, + {"DESC", "%s", ["description"]}, + {"TEL", "%s", ["telephoneNumber"]}, + {"EMAIL", "%s", ["mail"]}, + {"BDAY", "%s", ["birthDay"]}, + {"ROLE", "%s", ["employeeType"]}, + {"PHOTO", "%s", ["jpegPhoto"]} + ]). + +-define(SEARCH_FIELDS, + [{"User", "%u"}, + {"Full Name", "displayName"}, + {"Given Name", "givenName"}, + {"Middle Name", "initials"}, + {"Family Name", "sn"}, + {"Nickname", "%u"}, + {"Birthday", "birthDay"}, + {"Country", "c"}, + {"City", "l"}, + {"Email", "mail"}, + {"Organization Name", "o"}, + {"Organization Unit", "ou"} + ]). + +-define(SEARCH_REPORTED, + [{"Full Name", "FN"}, + {"Given Name", "GIVEN"}, + {"Middle Name", "MIDDLE"}, + {"Family Name", "FAMILY"}, + {"Nickname", "NICKNAME"}, + {"Birthday", "BDAY"}, + {"Country", "CTRY"}, + {"City", "LOCALITY"}, + {"Email", "EMAIL"}, + {"Organization Name", "ORGNAME"}, + {"Organization Unit", "ORGUNIT"} + ]). + +%% Unused callbacks. +handle_cast(_Request, State) -> + {noreply, State}. +code_change(_OldVsn, State, _Extra) -> + {ok, State}. +%% ----- + + start(Host, Opts) -> + Proc = gen_mod:get_module_proc(Host, ?PROCNAME), + ChildSpec = { + Proc, {?MODULE, start_link, [Host, Opts]}, + permanent, 1000, worker, [?MODULE] + }, + supervisor:start_child(ejabberd_sup, ChildSpec). + +stop(Host) -> + Proc = gen_mod:get_module_proc(Host, ?PROCNAME), + gen_server:call(Proc, stop), + supervisor:terminate_child(ejabberd_sup, Proc), + supervisor:delete_child(ejabberd_sup, Proc). + +terminate(_Reason, State) -> + Host = State#state.serverhost, + gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_VCARD), + gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_VCARD), + ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 50), + case State#state.search of + true -> + ejabberd_router:unregister_route(State#state.myhost); + _ -> + ok + end. + +start_link(Host, Opts) -> + Proc = gen_mod:get_module_proc(Host, ?PROCNAME), + gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []). + +init([Host, Opts]) -> + State = parse_options(Host, Opts), IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VCARD, ?MODULE, process_local_iq, IQDisc), gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_VCARD, ?MODULE, process_sm_iq, IQDisc), ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 50), - 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), - 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, [MyHost, Host, Search])). - -init(Host, ServerHost, Search) -> - case Search of - false -> - loop(Host, ServerHost); + eldap:start_link(State#state.eldap_id, + State#state.servers, + State#state.port, + State#state.dn, + State#state.password), + case State#state.search of + true -> + ejabberd_router:register_route(State#state.myhost); _ -> - ejabberd_router:register_route(Host), - loop(Host, ServerHost) - end. - -loop(Host, ServerHost) -> - receive - {route, From, To, Packet} -> - case catch do_route(ServerHost, From, To, Packet) of - {'EXIT', Reason} -> - ?ERROR_MSG("~p", [Reason]); - _ -> - ok - end, - loop(Host, ServerHost); - stop -> - ejabberd_router:unregister_route(Host), - ok; + ok + end, + {ok, State}. + +handle_info({route, From, To, Packet}, State) -> + case catch do_route(State, From, To, Packet) of + {'EXIT', Reason} -> + Err = jlib:make_error_reply(Packet, ?ERR_INTERNAL_SERVER_ERROR), + ejabberd_router:route(To, From, Err), + %% Fail-Stop. Let the supervisor restarts us + {stop, Reason, State}; _ -> - loop(Host, ServerHost) - end. + {noreply, State} + 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_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 50), - Proc = gen_mod:get_module_proc(Host, ?PROCNAME), - Proc ! stop, - {wait, Proc}. +handle_info(_Info, State) -> + {noreply, State}. get_sm_features({error, _Error} = Acc, _From, _To, _Node, _Lang) -> Acc; get_sm_features(Acc, _From, _To, Node, _Lang) -> case Node of - [] -> - case Acc of - {result, Features} -> - {result, [?NS_VCARD | Features]}; - empty -> - {result, [?NS_VCARD]} - end; - _ -> - Acc + [] -> + case Acc of + {result, Features} -> + {result, [?NS_VCARD | Features]}; + empty -> + {result, [?NS_VCARD]} + end; + _ -> + Acc end. process_local_iq(_From, _To, #iq{type = Type, lang = Lang, sub_el = SubEl} = IQ) -> @@ -102,7 +209,7 @@ process_local_iq(_From, _To, #iq{type = Type, lang = Lang, sub_el = SubEl} = IQ) [{xmlcdata, "ejabberd"}]}, {xmlelement, "URL", [], [{xmlcdata, - "http://ejabberd.jabberstudio.org/"}]}, + "http://ejabberd.jabber.ru/"}]}, {xmlelement, "DESC", [], [{xmlcdata, translate:translate( @@ -114,113 +221,165 @@ process_local_iq(_From, _To, #iq{type = Type, lang = Lang, sub_el = SubEl} = IQ) ]}]} end. -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, Host}), - case eldap:search("mod_vcard_ldap", [{base, Base}, - {filter, Filter}, - {attributes, []}]) of - #eldap_search_result{entries = [E | _]} -> - E; - _ -> - false +-define(SM_IQ_TIMEOUT, 20000). + +process_sm_iq(From, #jid{lserver=LServer} = To, #iq{sub_el = SubEl} = IQ) -> + Proc = gen_mod:get_module_proc(LServer, ?PROCNAME), + case catch gen_server:call(Proc, + {process_sm_iq, From, To, IQ}, ?SM_IQ_TIMEOUT) of + {'EXIT', Reason} -> + case Reason of + {timeout, _} -> + IQ#iq{type = error, + sub_el = [SubEl, ?ERR_REMOTE_SERVER_TIMEOUT]}; + _ -> + IQ#iq{type = error, + sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]} + end; + Other -> + Other end. -is_attribute_read_allowed(Name,From,To) -> - true. - -ldap_attribute_to_vcard(Prefix,{Name,Values},From,To) -> - case is_attribute_read_allowed(Name,From,To) of - true -> - ldap_lca_to_vcard(Prefix,stringprep:tolower(Name),Values); +handle_call({process_sm_iq, _From, To, IQ}, _FromPid, State) -> + #iq{type = Type, sub_el = SubEl} = IQ, + Reply = case Type of + set -> + IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}; + get -> + #jid{luser = LUser} = To, + LServer = State#state.serverhost, + case ejabberd_auth:is_user_exists(LUser, LServer) of + true -> + VCardMap = State#state.vcard_map, + case find_ldap_user(LUser, State) of + #eldap_entry{attributes = Attributes} -> + Vcard = ldap_attributes_to_vcard(Attributes, VCardMap, {LUser, LServer}), + IQ#iq{type = result, sub_el = Vcard}; + _ -> + IQ#iq{type = result, sub_el = []} + end; + _ -> + IQ#iq{type = result, sub_el = []} + end + end, + {reply, Reply, State}; + +handle_call(stop, _From, State) -> + {stop, normal, ok, State}; + +handle_call(_Request, _From, State) -> + {reply, bad_request, State}. + +find_ldap_user(User, State) -> + Base = State#state.base, + RFC2254_Filter = State#state.user_filter, + Eldap_ID = State#state.eldap_id, + VCardAttrs = State#state.vcard_map_attrs, + case eldap_filter:parse(RFC2254_Filter, [{"%u", User}]) of + {ok, EldapFilter} -> + case eldap:search(Eldap_ID, [{base, Base}, + {filter, EldapFilter}, + {attributes, VCardAttrs}]) of + #eldap_search_result{entries = [E | _]} -> + E; + _ -> + false + end; _ -> - none + false end. -ldap_lca_to_vcard(vCard,"displayname",[Value|_]) -> +ldap_attributes_to_vcard(Attributes, VCardMap, UD) -> + Attrs = lists:map( + fun({VCardName, _, _}) -> + {stringprep:tolower(VCardName), + map_vcard_attr(VCardName, Attributes, VCardMap, UD)} + end, VCardMap), + Elts = [ldap_attribute_to_vcard(vCard, Attr) || Attr <- Attrs], + NElts = [ldap_attribute_to_vcard(vCardN, Attr) || Attr <- Attrs], + OElts = [ldap_attribute_to_vcard(vCardO, Attr) || Attr <- Attrs], + AElts = [ldap_attribute_to_vcard(vCardA, Attr) || Attr <- Attrs], + [{xmlelement, "vCard", [{"xmlns", ?NS_VCARD}], + lists:append([X || X <- Elts, X /= none], + [{xmlelement,"N",[], [X || X <- NElts, X /= none]}, + {xmlelement,"ORG",[], [X || X <- OElts, X /= none]}, + {xmlelement,"ADR",[], [X || X <- AElts, X /= none]}]) + }]. + +ldap_attribute_to_vcard(vCard, {"fn", Value}) -> {xmlelement,"FN",[],[{xmlcdata,Value}]}; -ldap_lca_to_vcard(vCard,"uid",[Value|_]) -> +ldap_attribute_to_vcard(vCard, {"nickname", Value}) -> {xmlelement,"NICKNAME",[],[{xmlcdata,Value}]}; -ldap_lca_to_vcard(vCard,"title",[Value|_]) -> +ldap_attribute_to_vcard(vCard, {"title", Value}) -> {xmlelement,"TITLE",[],[{xmlcdata,Value}]}; -ldap_lca_to_vcard(vCard,"labeleduri",[Value|_]) -> +ldap_attribute_to_vcard(vCard, {"bday", Value}) -> + {xmlelement,"BDAY",[],[{xmlcdata,Value}]}; + +ldap_attribute_to_vcard(vCard, {"url", Value}) -> {xmlelement,"URL",[],[{xmlcdata,Value}]}; -ldap_lca_to_vcard(vCard,"description",[Value|_]) -> +ldap_attribute_to_vcard(vCard, {"desc", Value}) -> {xmlelement,"DESC",[],[{xmlcdata,Value}]}; -ldap_lca_to_vcard(vCard,"telephonenumber",[Value|_]) -> +ldap_attribute_to_vcard(vCard, {"role", Value}) -> + {xmlelement,"ROLE",[],[{xmlcdata,Value}]}; + +ldap_attribute_to_vcard(vCard, {"tel", Value}) -> {xmlelement,"TEL",[],[{xmlelement,"VOICE",[],[]}, {xmlelement,"WORK",[],[]}, {xmlelement,"NUMBER",[],[{xmlcdata,Value}]}]}; -ldap_lca_to_vcard(vCard,"mail",[Value|_]) -> +ldap_attribute_to_vcard(vCard, {"email", Value}) -> {xmlelement,"EMAIL",[],[{xmlelement,"INTERNET",[],[]}, {xmlelement,"PREF",[],[]}, {xmlelement,"USERID",[],[{xmlcdata,Value}]}]}; -ldap_lca_to_vcard(vCardN,"sn",[Value|_]) -> +ldap_attribute_to_vcard(vCard, {"photo", Value}) -> + {xmlelement,"PHOTO",[],[ + {xmlelement,"BINVAL",[],[{xmlcdata, jlib:encode_base64(Value)}]}]}; + +ldap_attribute_to_vcard(vCardN, {"family", Value}) -> {xmlelement,"FAMILY",[],[{xmlcdata,Value}]}; -ldap_lca_to_vcard(vCardN,"givenname",[Value|_]) -> +ldap_attribute_to_vcard(vCardN, {"given", Value}) -> {xmlelement,"GIVEN",[],[{xmlcdata,Value}]}; -ldap_lca_to_vcard(vCardN,"initials",[Value|_]) -> +ldap_attribute_to_vcard(vCardN, {"middle", Value}) -> {xmlelement,"MIDDLE",[],[{xmlcdata,Value}]}; -ldap_lca_to_vcard(vCardO,"o",[Value|_]) -> +ldap_attribute_to_vcard(vCardO, {"orgname", Value}) -> {xmlelement,"ORGNAME",[],[{xmlcdata,Value}]}; -ldap_lca_to_vcard(vCardO,"ou",[Value|_]) -> +ldap_attribute_to_vcard(vCardO, {"orgunit", Value}) -> {xmlelement,"ORGUNIT",[],[{xmlcdata,Value}]}; -ldap_lca_to_vcard(_,_,_) -> none. - -ldap_attributes_to_vcard(Attributes,From,To) -> - Elts = lists:map(fun(Attr) -> - ldap_attribute_to_vcard(vCard,Attr,From,To) - end,Attributes), - FElts = [ X || X <- Elts, X /= none ], - NElts = lists:map(fun(Attr) -> - ldap_attribute_to_vcard(vCardN,Attr,From,To) - end,Attributes), - FNElts = [ X || X <- NElts, X /= none ], - OElts = lists:map(fun(Attr) -> - ldap_attribute_to_vcard(vCardO,Attr,From,To) - end,Attributes), - FOElts = [ X || X <- OElts, X /= none ], - [{xmlelement, "vCard", [{"xmlns", ?NS_VCARD}], - lists:append(FElts, - [{xmlelement,"N",[],FNElts}, - {xmlelement,"ORG",[],FOElts}]) - }]. +ldap_attribute_to_vcard(vCardA, {"locality", Value}) -> + {xmlelement,"LOCALITY",[],[{xmlcdata,Value}]}; -process_sm_iq(From, To, #iq{type = Type, sub_el = SubEl} = IQ) -> - case Type of - set -> - IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}; - get -> - #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 = []} - end - end. +ldap_attribute_to_vcard(vCardA, {"street", Value}) -> + {xmlelement,"STREET",[],[{xmlcdata,Value}]}; + +ldap_attribute_to_vcard(vCardA, {"ctry", Value}) -> + {xmlelement,"CTRY",[],[{xmlcdata,Value}]}; + +ldap_attribute_to_vcard(vCardA, {"region", Value}) -> + {xmlelement,"REGION",[],[{xmlcdata,Value}]}; + +ldap_attribute_to_vcard(vCardA, {"pcode", Value}) -> + {xmlelement,"PCODE",[],[{xmlcdata,Value}]}; + +ldap_attribute_to_vcard(_, _) -> + none. -define(TLFIELD(Type, Label, Var), {xmlelement, "field", [{"type", Type}, {"label", translate:translate(Lang, Label)}, {"var", Var}], []}). - --define(FORM(JID), +-define(FORM(JID, SearchFields), [{xmlelement, "instructions", [], [{xmlcdata, translate:translate(Lang, "You need an x:data capable client to search")}]}, {xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "form"}], @@ -229,30 +388,15 @@ process_sm_iq(From, To, #iq{type = Type, sub_el = SubEl} = IQ) -> jlib:jid_to_string(JID)}]}, {xmlelement, "instructions", [], [{xmlcdata, translate:translate(Lang, "Fill in fields to search " - "for any matching Jabber User")}]}, - ?TLFIELD("text-single", "User", "user"), - ?TLFIELD("text-single", "Full Name", "fn"), - ?TLFIELD("text-single", "Given Name", "given"), - ?TLFIELD("text-single", "Middle Name", "middle"), - ?TLFIELD("text-single", "Family Name", "family"), - ?TLFIELD("text-single", "Nickname", "nickname"), - ?TLFIELD("text-single", "Birthday", "bday"), - ?TLFIELD("text-single", "Country", "ctry"), - ?TLFIELD("text-single", "City", "locality"), - ?TLFIELD("text-single", "Email", "email"), - ?TLFIELD("text-single", "Organization Name", "orgname"), - ?TLFIELD("text-single", "Organization Unit", "orgunit") - ]}]). - + "for any matching Jabber User")}]} + ] ++ lists:map(fun({X,Y}) -> ?TLFIELD("text-single", X, Y) end, SearchFields)}]). - - -do_route(ServerHost, From, To, Packet) -> +do_route(State, From, To, Packet) -> #jid{user = User, resource = Resource} = To, if (User /= "") or (Resource /= "") -> Err = jlib:make_error_reply(Packet, ?ERR_SERVICE_UNAVAILABLE), - ejabberd_router ! {route, To, From, Err}; + ejabberd_router:route(To, From, Err); true -> IQ = jlib:iq_query_info(Packet), case IQ of @@ -285,24 +429,25 @@ do_route(ServerHost, From, To, Packet) -> [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "result"}], - search_result(Lang, To, ServerHost, XData) + search_result(Lang, To, State, XData) }]}]}, ejabberd_router:route( To, From, jlib:iq_to_xml(ResIQ)) end end; get -> + SearchFields = State#state.search_fields, ResIQ = IQ#iq{type = result, sub_el = [{xmlelement, "query", [{"xmlns", ?NS_SEARCH}], - ?FORM(To) + ?FORM(To, SearchFields) }]}, ejabberd_router:route(To, From, jlib:iq_to_xml(ResIQ)) end; - #iq{type = Type, xmlns = ?NS_DISCO_INFO, sub_el = SubEl} -> + #iq{type = Type, xmlns = ?NS_DISCO_INFO} -> case Type of set -> Err = jlib:make_error_reply( @@ -330,7 +475,7 @@ do_route(ServerHost, From, To, Packet) -> From, jlib:iq_to_xml(ResIQ)) end; - #iq{type = Type, xmlns = ?NS_DISCO_ITEMS, sub_el = SubEl} -> + #iq{type = Type, xmlns = ?NS_DISCO_ITEMS} -> case Type of set -> Err = jlib:make_error_reply( @@ -369,223 +514,295 @@ iq_get_vcard(Lang) -> [{xmlcdata, "ejabberd/mod_vcard"}]}, {xmlelement, "URL", [], [{xmlcdata, - "http://ejabberd.jabberstudio.org/"}]}, + "http://ejabberd.jabber.ru/"}]}, {xmlelement, "DESC", [], [{xmlcdata, translate:translate( Lang, "ejabberd vCard module\n" "Copyright (c) 2003-2006 Alexey Shchepin")}]}]. -find_xdata_el({xmlelement, _Name, _Attrs, SubEls}) -> - find_xdata_el1(SubEls). - -find_xdata_el1([]) -> - false; -find_xdata_el1([{xmlelement, Name, Attrs, SubEls} | Els]) -> - case xml:get_attr_s("xmlns", Attrs) of - ?NS_XDATA -> - {xmlelement, Name, Attrs, SubEls}; - _ -> - find_xdata_el1(Els) - end; -find_xdata_el1([_ | Els]) -> - find_xdata_el1(Els). - -define(LFIELD(Label, Var), {xmlelement, "field", [{"label", translate:translate(Lang, Label)}, {"var", Var}], []}). -search_result(Lang, JID, ServerHost, Data) -> - [{xmlelement, "title", [], - [{xmlcdata, translate:translate(Lang, "Search Results for ") ++ - jlib:jid_to_string(JID)}]}, - {xmlelement, "reported", [], - [?LFIELD("Jabber ID", "jid"), - ?LFIELD("Full Name", "fn"), - ?LFIELD("Given Name", "given"), - ?LFIELD("Middle Name", "middle"), - ?LFIELD("Family Name", "family"), - ?LFIELD("Nickname", "nickname"), - ?LFIELD("Birthday", "bday"), - ?LFIELD("Country", "ctry"), - ?LFIELD("City", "locality"), - ?LFIELD("Email", "email"), - ?LFIELD("Organization Name", "orgname"), - ?LFIELD("Organization Unit", "orgunit") - ]}] ++ lists:map(fun(E) -> - record_to_item(E#eldap_entry.attributes) - end, search(ServerHost, Data)). +search_result(Lang, JID, State, Data) -> + SearchReported = State#state.search_reported, + Header = [{xmlelement, "title", [], + [{xmlcdata, translate:translate(Lang, "Search Results for ") ++ + jlib:jid_to_string(JID)}]}, + {xmlelement, "reported", [], + [?LFIELD("Jabber ID", "jid")] ++ + lists:map( + fun({Name, Value}) -> ?LFIELD(Name, Value) end, + SearchReported) + }], + case search(State, Data) of + error -> + Header; + Result -> + Header ++ Result + end. -define(FIELD(Var, Val), {xmlelement, "field", [{"var", Var}], [{xmlelement, "value", [], [{xmlcdata, Val}]}]}). -case_exact_compare(none,_) -> - false; -case_exact_compare(_,none) -> - false; -case_exact_compare(X,Y) -> - X > Y. - -ldap_sort_entries(L) -> - lists:sort(fun(E1,E2) -> - case_exact_compare(ldap_get_value(E1,"cn"),ldap_get_value(E2,"cn")) - end,L). - -ldap_get_value(E,Attribute) -> - #eldap_entry{attributes = Attributes} = E, - case lists:filter(fun({A,_}) -> - string:equal(A,Attribute) - end,Attributes) of - [{Attr,[Value|_]}] -> - Value; - _ -> - none - end. - - -ldap_attribute_to_item("uid",Value) -> - [ - ?FIELD("jid",Value ++ "@" ++ ?MYNAME), - ?FIELD("uid",Value), - ?FIELD("nickname",Value) - ]; - -ldap_attribute_to_item("displayname",Value) -> - [ - ?FIELD("fn",Value) - ]; - -ldap_attribute_to_item("sn",Value) -> - [ - ?FIELD("family",Value) - ]; - -ldap_attribute_to_item("displayname",Value) -> - [ - ?FIELD("fn",Value) - ]; - -ldap_attribute_to_item("givenname",Value) -> - [ - ?FIELD("given",Value) - ]; - -ldap_attribute_to_item("initials",Value) -> - [ - ?FIELD("middle",Value) - ]; - -ldap_attribute_to_item("mail",Value) -> - [ - ?FIELD("email",Value) - ]; - -ldap_attribute_to_item("o",Value) -> - [ - ?FIELD("orgname",Value) - ]; - -ldap_attribute_to_item("ou",Value) -> - [ - ?FIELD("orgunit",Value) - ]; - -ldap_attribute_to_item(_,_) -> - [none]. - -record_to_item(Attributes) -> - List = lists:append(lists:map(fun({Attr,[Value|_]}) -> - ldap_attribute_to_item(stringprep:tolower(Attr),Value) - end,Attributes)), - FList = [X || X <- List, X /= none], - {xmlelement, "item", [],FList}. - -search(LServer, Data) -> - Filter = make_filter(Data), - 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 +search(State, Data) -> + Base = State#state.base, + SearchFilter = State#state.search_filter, + Eldap_ID = State#state.eldap_id, + UA = State#state.uid, + UAF = State#state.uid_format, + ReportedAttrs = State#state.search_reported_attrs, + Filter = eldap:'and'([SearchFilter, make_filter(Data, UA, UAF)]), + case eldap:search(Eldap_ID, [{base, Base}, + {filter, Filter}, + {attributes, ReportedAttrs}]) of #eldap_search_result{entries = E} -> - [X || X <- E, - ejabberd_auth:is_user_exists( - ldap_get_value(X, UIDAttr), LServer)]; - Err -> - ?ERROR_MSG("Bad search: ~p", [[LServer, {base, Base}, - {filter, Filter}, - {attributes, []}]]) + search_items(E, State); + _ -> + error end. - -make_filter(Data) -> - Filter = [X || X <- lists:map(fun(R) -> - make_assertion(R) - end, Data), - X /= none ], +search_items(Entries, State) -> + LServer = State#state.serverhost, + SearchReported = State#state.search_reported, + VCardMap = State#state.vcard_map, + UIDAttr = State#state.uid, + UIDAttrFormat = State#state.uid_format, + Attributes = lists:map( + fun(E) -> + #eldap_entry{attributes = Attrs} = E, + Attrs + end, Entries), + lists:flatmap( + fun(Attrs) -> + U = get_ldap_attr(UIDAttr, Attrs), + case get_user_part(U, UIDAttrFormat) of + {ok, Username} -> + case ejabberd_auth:is_user_exists(Username, LServer) of + true -> + RFields = lists:map( + fun({_, VCardName}) -> + {VCardName, + map_vcard_attr( + VCardName, + Attrs, + VCardMap, + {Username, ?MYNAME})} + end, SearchReported), + Result = [?FIELD("jid", Username ++ "@" ++ LServer)] ++ + [?FIELD(Name, Value) || {Name, Value} <- RFields], + [{xmlelement, "item", [], Result}]; + _ -> + [] + end; + _ -> + [] + end + end, Attributes). + +make_filter(Data, UAttr, UAttrFormat) -> + Filter = lists:flatmap( + fun({Name, [Value | _]}) -> + case Name of + "%u" when Value /= "" -> + {ok, UAF, _} = regexp:sub(UAttrFormat, "%u", "*%u*"), + case eldap_filter:parse( + "("++UAttr++"="++UAF++")", [{"%u", Value}]) of + {ok, F} -> [F]; + _ -> [] + end; + _ when Value /= "" -> + [eldap:substrings(Name, [{any, Value}])]; + _ -> + [] + end + end, Data), case Filter of - [F] -> + [F] -> F; _ -> eldap:'and'(Filter) end. +remove_user(_User) -> + true. -make_assertion("givenName",Value) -> - eldap:substrings("givenName",[{any,Value}]); - -make_assertion("cn",Value) -> - eldap:substrings("cn",[{any,Value}]); - -make_assertion("sn",Value) -> - eldap:substrings("sn",[{any,Value}]); - -make_assertion(Attr, Value) -> - eldap:equalityMatch(Attr,Value). - -make_assertion({SVar, [Val]}) -> - LAttr = ldap_attribute(SVar), - case LAttr of - none -> - none; - _ -> - if - is_list(Val) and (Val /= "") -> - make_assertion(LAttr,Val); - true -> - none +%%%----------------------- +%%% Auxiliary functions. +%%%----------------------- + +get_user_part(String, Pattern) -> + F = fun(S, P) -> + First = string:str(P, "%u"), + TailLength = length(P) - (First+1), + string:sub_string(S, First, length(S) - TailLength) + end, + case catch F(String, Pattern) of + {'EXIT', _} -> + {error, badmatch}; + Result -> + case regexp:sub(Pattern, "%u", Result) of + {ok, String, _} -> {ok, Result}; + _ -> {error, badmatch} end end. -ldap_attribute("user") -> - "uid"; - -ldap_attribute("fn") -> - "cn"; - -ldap_attribute("family") -> - "sn"; - -ldap_attribute("given") -> - "givenName"; - -ldap_attribute("middle") -> - "initials"; - -ldap_attribute("email") -> - "mail"; +case_insensitive_match(X, Y) -> + X1 = stringprep:tolower(X), + Y1 = stringprep:tolower(Y), + if + X1 == Y1 -> true; + true -> false + end. -ldap_attribute("orgname") -> - "o"; +map_vcard_attr(VCardName, Attributes, Pattern, UD) -> + Res = lists:filter( + fun({Name, _, _}) -> + case_insensitive_match(Name, VCardName) + end, Pattern), + case Res of + [{_, Str, Attrs}] -> + process_pattern(Str, UD, + [get_ldap_attr(X, Attributes) || X<-Attrs]); + _ -> "" + end. -ldap_attribute("orgunit") -> - "ou"; +process_pattern(Str, {User, Domain}, Attrs) -> + Res = lists:foldl( + fun(X, Acc) -> + {ok, NewStr, _} = regexp:sub(Acc, "%s", X), + NewStr + end, + Str, Attrs), + eldap_filter:do_sub(Res, [{"%u", User},{"%d", Domain}]). + +get_ldap_attr(LDAPAttr, Attributes) -> + Res = lists:filter( + fun({Name, _}) -> + case_insensitive_match(Name, LDAPAttr) + end, Attributes), + case Res of + [{_, [Value|_]}] -> Value; + _ -> "" + end. -ldap_attribute(_) -> - none. +find_xdata_el({xmlelement, _Name, _Attrs, SubEls}) -> + find_xdata_el1(SubEls). -remove_user(User) -> - true. +find_xdata_el1([]) -> + false; +find_xdata_el1([{xmlelement, Name, Attrs, SubEls} | Els]) -> + case xml:get_attr_s("xmlns", Attrs) of + ?NS_XDATA -> + {xmlelement, Name, Attrs, SubEls}; + _ -> + find_xdata_el1(Els) + end; +find_xdata_el1([_ | Els]) -> + find_xdata_el1(Els). +parse_options(Host, Opts) -> + MyHost = gen_mod:get_opt(host, Opts, "vjud." ++ Host), + Search = gen_mod:get_opt(search, Opts, true), + Eldap_ID = atom_to_list(gen_mod:get_module_proc(Host, ?PROCNAME)), + LDAPServers = case gen_mod:get_opt(ldap_servers, Opts, undefined) of + undefined -> + ejabberd_config:get_local_option({ldap_servers, Host}); + S -> S + end, + LDAPPort = case gen_mod:get_opt(ldap_port, Opts, undefined) of + undefined -> + case ejabberd_config:get_local_option({ldap_port, Host}) of + undefined -> 389; + P -> P + end; + P -> P + end, + LDAPBase = case gen_mod:get_opt(ldap_base, Opts, undefined) of + undefined -> + ejabberd_config:get_local_option({ldap_base, Host}); + B -> B + end, + UIDAttr = case gen_mod:get_opt(ldap_uidattr, Opts, undefined) of + undefined -> + case ejabberd_config:get_local_option({ldap_uidattr, Host}) of + undefined -> "uid"; + UA -> UA + end; + UA -> UA + end, + UIDAttrFormat = case gen_mod:get_opt(ldap_uidattr_format, Opts, undefined) of + undefined -> + case ejabberd_config:get_local_option({ldap_uidattr_format, Host}) of + undefined -> "%u"; + UAF -> UAF + end; + UAF -> UAF + end, + RootDN = case gen_mod:get_opt(ldap_rootdn, Opts, undefined) of + undefined -> + case ejabberd_config:get_local_option({ldap_rootdn, Host}) of + undefined -> ""; + RDN -> RDN + end; + RDN -> RDN + end, + Password = case gen_mod:get_opt(ldap_password, Opts, undefined) of + undefined -> + case ejabberd_config:get_local_option({ldap_password, Host}) of + undefined -> ""; + Pass -> Pass + end; + Pass -> Pass + end, + SubFilter = "("++UIDAttr++"="++UIDAttrFormat++")", + UserFilter = case gen_mod:get_opt(ldap_filter, Opts, undefined) of + undefined -> + case ejabberd_config:get_local_option({ldap_filter, Host}) of + undefined -> SubFilter; + "" -> SubFilter; + F -> "(&" ++ SubFilter ++ F ++ ")" + end; + "" -> SubFilter; + F -> "(&" ++ SubFilter ++ F ++ ")" + end, + {ok, SearchFilter} = eldap_filter:parse( + eldap_filter:do_sub(UserFilter, [{"%u","*"}])), + VCardMap = gen_mod:get_opt(ldap_vcard_map, Opts, ?VCARD_MAP), + SearchFields = gen_mod:get_opt(ldap_search_fields, Opts, ?SEARCH_FIELDS), + SearchReported = gen_mod:get_opt(ldap_search_reported, Opts, ?SEARCH_REPORTED), + %% In search requests we need to fetch only attributes defined + %% in vcard-map and search-reported. In some cases, + %% this will essentially reduce network traffic from an LDAP server. + VCardMapAttrs = lists:usort( + lists:append([A || {_, _, A} <- VCardMap]) ++ [UIDAttr]), + SearchReportedAttrs = + lists:usort(lists:flatmap( + fun({_, N}) -> + case lists:keysearch(N, 1, VCardMap) of + {value, {_, _, L}} -> L; + _ -> [] + end + end, SearchReported) ++ [UIDAttr]), + #state{serverhost = Host, + myhost = MyHost, + eldap_id = Eldap_ID, + search = Search, + servers = LDAPServers, + port = LDAPPort, + dn = RootDN, + base = LDAPBase, + password = Password, + uid = UIDAttr, + uid_format = UIDAttrFormat, + vcard_map = VCardMap, + vcard_map_attrs = VCardMapAttrs, + user_filter = UserFilter, + search_filter = SearchFilter, + search_fields = SearchFields, + search_reported = SearchReported, + search_reported_attrs = SearchReportedAttrs + }. -- cgit v1.2.3 From d31ab5ca13e781ee58e918d5a38a3f8cc56f1c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Fri, 22 Sep 2006 09:25:47 +0000 Subject: * src/msgs/fr.msg: updated French translation. SVN Revision: 619 --- src/msgs/fr.msg | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/msgs/fr.msg b/src/msgs/fr.msg index 03c58cac2..e2486212b 100644 --- a/src/msgs/fr.msg +++ b/src/msgs/fr.msg @@ -74,7 +74,6 @@ % src/mod_vcard_ldap.erl {"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", "Serveur Jabber Erlang\nCopyright (c) 2002-2006 Alexey Shchepin"}. -{"Given Name", "Prénom"}. {"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", "Module vCard ejabberd\nCopyright (c) 2003-2006 Alexey Shchepin"}. {"Email", "Email"}. {"Search Results for ", "Résultats de recherche pour "}. @@ -213,7 +212,6 @@ {"Make room public searchable", "Rendre le salon public"}. {"Make participants list public", "Rendre la liste des participants publique"}. {"Make room password protected", "Protéger le salon par mot de passe"}. -{"Make room semianonymous", "Rendre le salon semi-anonyme"}. {"Make room members-only", "Réserver le salon aux membres uniquement"}. {"Make room moderated", "Rendre le salon modéré"}. {"Default users as participants", "Les utilisateurs sont par défaut participant"}. @@ -224,6 +222,7 @@ {"Enable logging", "Activer l'archivage"}. {"Description", "Description"}. {"Number of occupants", "Nombre d'occupants"}. +{"Who may discover real JIDs?", "Qui peut découvrir les vrais JIDs ?"}. % mod_irc/mod_irc.erl {"ejabberd IRC module\nCopyright (c) 2003-2006 Alexey Shchepin", "Module IRC ejabberd\nCopyright (c) 2003-2006 Alexey Shchepin"}. -- cgit v1.2.3 From 4ea5e493ea96941007f798e497cdc6a9afd8a836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Fri, 22 Sep 2006 17:01:16 +0000 Subject: * src/mod_muc/mod_muc.erl: Component name is now more user friendly (thanks to Badlop). * src/mod_irc/mod_irc.erl: Likewise. * src/mod_pubsub/mod_pubsub.erl: Likewise. SVN Revision: 620 --- src/mod_irc/mod_irc.erl | 2 +- src/mod_muc/mod_muc.erl | 2 +- src/mod_pubsub/mod_pubsub.erl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/mod_irc/mod_irc.erl b/src/mod_irc/mod_irc.erl index e3ce27268..77c2f575d 100644 --- a/src/mod_irc/mod_irc.erl +++ b/src/mod_irc/mod_irc.erl @@ -291,7 +291,7 @@ iq_disco() -> [{xmlelement, "identity", [{"category", "conference"}, {"type", "irc"}, - {"name", "ejabberd/mod_irc"}], []}, + {"name", "IRC Transport"}], []}, {xmlelement, "feature", [{"var", ?NS_MUC}], []}, {xmlelement, "feature", diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc/mod_muc.erl index 196181f3f..d5ecb5b91 100644 --- a/src/mod_muc/mod_muc.erl +++ b/src/mod_muc/mod_muc.erl @@ -446,7 +446,7 @@ iq_disco_info() -> [{xmlelement, "identity", [{"category", "conference"}, {"type", "text"}, - {"name", "ejabberd/mod_muc"}], []}, + {"name", "Chatrooms"}], []}, {xmlelement, "feature", [{"var", ?NS_MUC}], []}, {xmlelement, "feature", [{"var", ?NS_REGISTER}], []}, {xmlelement, "feature", [{"var", ?NS_VCARD}], []}]. diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index afea05cb0..37eb87c17 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -318,7 +318,7 @@ iq_disco_info(SNode) -> [{xmlelement, "identity", [{"category", "pubsub"}, {"type", "generic"}, - {"name", "ejabberd/mod_pubsub"}], []}, + {"name", "Publish-Subscribe"}], []}, {xmlelement, "feature", [{"var", ?NS_PUBSUB}], []}, {xmlelement, "feature", [{"var", ?NS_PUBSUB_EVENT}], []}, {xmlelement, "feature", [{"var", ?NS_PUBSUB_OWNER}], []}, -- cgit v1.2.3 From e734ad16822ec68ded52b8fcff8bc96a481fe5c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Sat, 23 Sep 2006 09:20:19 +0000 Subject: * src/msgs/cs.msg: Added Czech translation (thanks to Milos Svasek). SVN Revision: 622 --- src/msgs/cs.msg | 477 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 477 insertions(+) create mode 100644 src/msgs/cs.msg (limited to 'src') diff --git a/src/msgs/cs.msg b/src/msgs/cs.msg new file mode 100644 index 000000000..0f3e4d4cf --- /dev/null +++ b/src/msgs/cs.msg @@ -0,0 +1,477 @@ +% $Id$ +% Czech translation +% Authors: Milos Svasek [DuxforD] from openheads.net + + +% jlib.hrl +{"No resource provided", "Nebyl poskytnutý žádny zdroj"}. + +% mod_configure.erl +{"Choose storage type of tables", "Vyberte typ úložiště pro tabulky"}. +{"RAM copy", "Kopie RAM"}. +{"RAM and disc copy", "Kopie RAM a disku"}. +{"Disc only copy", "Jen kopie disku"}. +{"Remote copy", "Vzdálená kopie"}. +{"Stop Modules at ", "Zastavit moduly na "}. +{"Choose modules to stop", "Vyberte moduly, které mají být zastavené"}. +{"Start Modules at ", "Spustit moduly na "}. +{"Enter list of {Module, [Options]}", "Vložte seznam modulů {Modul, [Parametre]}"}. +{"List of modules to start", "Seznam modulů, které mají být spuštěné"}. +{"Backup to File at ", "Záloha do souboru na "}. +{"Enter path to backup file", "Zadajte cestu k souboru se zálohou"}. +{"Path to File", "Cesta k souboru"}. +{"Restore Backup from File at ", "Obnovit zálohu ze souboru na "}. +{"Dump Backup to Text File at ", "Uložit zálohu do textového souboru na "}. +{"Enter path to text file", "Zadajte cestu k textovému souboru"}. +{"Import User from File at ", "Importovat uživatele ze souboru na "}. +{"Enter path to jabberd1.4 spool file", "Zadejte cestu k spool souboru jabberd1.4"}. +{"Import Users from Dir at ", "Importovat uživatele z adresáře na "}. +{"Enter path to jabberd1.4 spool dir", "Zadejte cestu k jabberd1.4 spool adresáři"}. +{"Path to Dir", "Cesta k adresáři"}. +{"Hostname Configuration", "Konfigurace jména serveru"}. +{"Choose host name", "Vyberte jméno serveru"}. +{"Host name", "Jméno serveru"}. +{"Access Control List Configuration", "Konfigurace seznamu přístupových práv (ACL)"}. +{"Access control lists", "Seznamy přístupových práv (ACL)"}. +{"Access Configuration", "Konfigurace přístupů"}. +{"Access rules", "Pravidla přístupů"}. +{"Remove Users", "Odstranit uživatele"}. +{"Choose users to remove", "Vybrat uživatele, kteří budou odstraněni"}. +{"Administration of ", "Administrace "}. +{"Action on user", "Akce aplikovaná na uživatele"}. +{"Edit Properties", "Upravit vlastnosti"}. +{"Remove User", "Odstranit uživatele"}. + +% mod_disco.erl +{"Configuration", "Konfigurace"}. +{"Online Users", "Online uživatelé"}. +{"All Users", "Všichni uživatelé"}. +{"Outgoing S2S connections", "Odchozí spojení S2S"}. +{"To ~s", "Pre ~s"}. +{"From ~s", "Od ~s"}. +{"Running Nodes", "Bežící uzly"}. +{"Stopped Nodes", "Zastavené uzly"}. +{"Host Name", "Jméno serveru"}. +{"Access Control Lists", "Seznamy přístupových práv (ACL)"}. +{"Access Rules", "Pravidla přístupů"}. +{"Remove Users", "Odstranit uživatele"}. +{"DB", "DB"}. +{"Modules", "Moduly"}. +{"Start Modules", "Spustit moduly"}. +{"Stop Modules", "Zastavit moduly"}. +{"Backup Management", "Správa zálohování"}. +{"Import users from jabberd1.4 spool files", "Importovat uživatele z jabberd1.4 spool souborů"}. +{"Backup", "Zálohovat"}. +{"Restore", "Obnovit"}. +{"Dump to Text File", "Uložit do textového souboru"}. +{"Import File", "Import souboru"}. +{"Import Directory", "Import adresáře"}. + +% mod_register.erl +{"Choose a username and password to register with this server", + "Zadejte jméno uživatele a heslo pro registraci na tomto serveru"}. + +% mod_vcard.erl +{"You need an x:data capable client to search", + "K vyhledávání potřebujete klienta podporujícího x:data"}. +{"Search users in ", "Hledat uživatele v "}. +{"Fill in fields to search for any matching Jabber User", + "Vyplňte políčka pro vyhledávání Jabber uživatele"}. +{"Results of search in ", "Výsledky vyhledávání v "}. + +{"User", "Uživatel: "}. +{"Full Name", "Celé jméno: "}. +{"Name", "Jméno: "}. +{"Middle Name", "Prostřední jméno: "}. +{"Family Name", "Příjmení: "}. +{"Nickname", "Přezdívka: "}. +{"Birthday", "Datum narození: "}. +{"Country", "Země: "}. +{"City", "Město: "}. +{"email", "E-mail: "}. +{"Organization Name", "Název firmy: "}. +{"Organization Unit", "Oddělení: "}. + +% mod_muc/mod_muc.erl +{"You need an x:data capable client to register nickname", + "K registraci přezdívky potřebujete klienta podporujícího z x:data"}. +{"Nickname Registration at ", "Registrace prezdívky na "}. +{"Enter nickname you want to register", "Zadajte prezdívku, kterou chete zaregistrovat"}. +{"Only service administrators are allowed to send service messages", + "Pouze správci služby mají povolené odesílání servisních zpráv"}. +{"Conference room does not exist", "Konferenční místnost neexistuje"}. +{"Access denied by service policy", "Přístup byl zamítnutý nastavením služby"}. +{"You must fill in field \"nick\" in the form", "Musíte vyplnit políčko \"prezdívka\" ve formuláři"}. +{"Specified nickname is already registered", "Zadaná prezdívka je již registrována"}. + +% mod_muc/mod_muc_room.erl +{" has set the subject to: ", "změnil(a) téma na: "}. +{"You need an x:data capable client to configure room", + "Ke konfiguraci místnosti potřebujete klienta podporujícího z x:data"}. +{"Configuration for ", "Konfigurace pre "}. +{"Room title", "Název místnosti"}. +{"Allow users to change subject?", "Povolit uživatelům menit téma?"}. +{"Allow users to query other users?", + "Povolit uživatelům odesílat požadavky (query) ostatním uživatelům?"}. +{"Allow users to send private messages?", + "Povolit uživatelům odesíelat soukromé zprávy?"}. +{"Make room public searchable?", "Nastavit místnost jako veřejně prohledávatelnou?"}. +{"Make participants list public?", "Nastavit seznam účastníků jako veřejný?"}. +{"Make room persistent?", "Nastavit místnost jako trvalou (persistent)?"}. +{"Make room moderated?", "Nastavit místnost jako moderovanou?"}. +{"Default users as members?", "Uživatelé jsou implicitně členy?"}. +{"Make room members only?", "Nastavit místnost jen pro členy?"}. +{"Allow users to send invites?", "Povolit uživatelům odesíelat pozvánky?"}. +{"Make room password protected?", "Chránit místnost heslem?"}. +{"Password", "Heslo"}. +{"Make room anonymous?", "Nastavit místnost jako anonymní?"}. +{"Enable logging?", "Zapnout ukládání historie?"}. +{"Only moderators and participants are allowed to change subject in this room", + "Jen moderátoři a účastníci mají povoleno měnit téma této místnosti"}. +{"Only moderators are allowed to change subject in this room", + "Jen moderátoři mají povoleno měnit téma místnosti"}. +{"Visitors are not allowed to send messages to all occupants", + "Návštevníci nemají povoleno zsílat zprávy všem přihlášeným do konference"}. +{"Only occupants are allowed to send messages to the conference", + "Jen členové mají povolené zasílat správy do konference"}. +{"It is not allowed to send normal messages to the conference", + "Není povoleno odesílat normální zprávy do konference"}. +{"It is not allowed to send private messages to the conference", + "Není povoleno odesílat soukromé zprávy do konference"}. +{"Improper message type", "Nesprávný typ zprávy"}. +{"Nickname is already in use by another occupant", "Prezdívka je již používána jiným členem"}. +{"Nickname is registered by another person", "Prezdívka je registrována jinou osobou"}. +{"It is not allowed to send private messages of type \"groupchat\"", + "Není dovoleno odeslání soukromé zprávy typu \"Skupinová zpráva\" "}. +{"Recipient is not in the conference room", "Příjemce se nenachází v konferenční místnosti"}. +{"Only occupants are allowed to send queries to the conference", + "Jen členové mohou odesílat požadavky (query) do konference"}. +{"Queries to the conference members are not allowed in this room", + "Požadavky (queries) na členy konference nejsou v této místnosti povolené"}. +{"You have been banned from this room", "Byl jste vyloučen z této místnosti"}. +{"Membership required to enter this room", "Pro vstup do místnosti musíte být členem"}. +{"Password required to enter this room", "Pro vstup do místnosti musíte zadat heslo"}. +{"Incorrect password", "Nesprávne heslo"}. +{"Administrator privileges required", "Jsou potřebná práva administrátora"}. +{"Moderator privileges required", "Jsou potřebná práva moderátora"}. +{"JID ~s is invalid", "JID ~s je neplatné"}. +{"Nickname ~s does not exist in the room", "Prezdívka ~s v místnosti neexistuje"}. +{"Invalid affiliation: ~s", "Neplatné přiřazení: ~s"}. +{"Invalid role: ~s", "Neplatná role: ~s"}. +{"Owner privileges required", "Jsou vyžadována práva vlastníka"}. +{"private, ", "soukromá, "}. + +% mod_irc/mod_irc.erl +{"You need an x:data capable client to configure mod_irc settings", + "Pro konfiguraci mod_irc potřebujete klienta podporujícího x:data"}. +{"Registration in mod_irc for ", "Registrace do mod_irc na "}. +{"Enter username and encodings you wish to use for connecting to IRC servers", + "Vložte jméno uživatele a kódování, které chcete používat při připojení na IRC server"}. +{"IRC Username", "IRC prezdívka"}. +{"Example: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", \"iso8859-1\"}].", + "Příklad: [{\"irc.freenode.net\",\"utf-8\"}, {\irc.freenode.net\", \"iso8859-2\"}]."}. +{"Encodings", "Kódování"}. + +% web/ejabberd_web_admin.erl +{"ejabberd administration", "Administrace Ejabberd"}. +{"Users", "Uživatelé"}. +{"Nodes", "Uzly"}. +{"Statistics", "Statistiky"}. +{"(raw)", "(zdroj)"}. +{"submitted", "odeslané"}. +{"bad format", "nesprávný formát"}. +{"raw", "zdroj"}. +{"ejabberd access control lists configuration", "Konfigurace seznamu přístupových práv (ACL) Ejabberd"}. +{"Delete Selected", "Smazat vybrané"}. +{"Submit", "Odeslat"}. +{"ejabberd access rules configuration", "Konfigurace pravidel přístupů Ejabberd"}. +{"~s access rule configuration", "~s konfigurace pravidla přístupu"}. +{"ejabberd users", "Uživatelé Ejabberd"}. +{"ejabberd stats", "Statistiky Ejabberd"}. +{"Node not found", "Uzel nenalezen"}. +{"Add New", "Přidat nový"}. +{"Registered users", "Registrovaní uživatelé"}. +{"Online users", "Online uživatelé"}. +{"Outgoing S2S servers", "Servery S2S pro odchozí komunikaci"}. +{"Change Password", "Změnit heslo"}. +{"Connected Resources:", "Připojené zdroje:"}. +{"Password:", "Heslo:"}. +{"None", "Nic"}. +{"Node ", "Uzel "}. +{"DB Management", "Správa databáze"}. +{"Listened Ports Management", "Správa otevřených portů"}. +{"Restart", "Restart"}. +{"Stop", "Stop"}. +{"RPC call error", "Chyba RPC volání"}. +{"DB Tables at ", "Databázové tabulky na "}. +{"Name", "Jméno"}. +{"Storage Type", "Typ úložiště"}. +{"Size", "Velikost"}. +{"Memory", "Paměť"}. +{"Backup Management at ", "Správa záloh na "}. +{"Store a backup in a file", "Uložit zálohu do souboru "}. +{"OK", "OK"}. +{"Restore a backup from a file", "Obnovit zálohu ze souboru"}. +{"Install a database fallback from a file", "Instalovat nouzovou (fallback) databázi ze souboru"}. +{"Dump a database in a text file", "Uložit databázi do textového souboru"}. +{"Restore a database from a text file", "Obnovit databázi z textového souboru"}. +{"Listened Ports at ", "Otevřené porty na "}. +{"~p statistics", "~p statistiky"}. +{"Uptime", "Čas běhu"}. +{"CPU Time", "Čas procesoru"}. +{"Transactions commited", "Transakce potvrzena"}. +{"Transactions aborted", "Transakce zrušena"}. +{"Transactions restarted", "Transakce restartována"}. +{"Transactions logged", "Transakce zaznamenána"}. +{"Port", "Port"}. +{"Module", "Modul"}. +{"Options", "Nastavení"}. +{"Update", "Aktualizovat"}. +{"Delete", "Smazat"}. +{"Add User", "Přidat uživatele"}. +{"Offline messages", "Offline zprávy"}. +{"Last Activity", "Poslední aktivita"}. +{"Never", "Nikdy"}. +{"~s offline messages queue", "~s offline zpráv(y)"}. +{"Time", "Čas"}. +{"From", "Od"}. +{"To", "Pro"}. +{"Packet", "Paket"}. +{"Offline messages:", "Offline zprávy:"}. +{"Roster", "Seznam kontaktů"}. +{"Nickname", "Prezdívka"}. +{"Subscription", "Přihlášení"}. +{"Pending", "Čekající"}. +{"Groups", "Skupiny"}. +{"Remove", "Odstranit"}. +{"Add JID", "Přidat JID"}. +{"User ", "Uživatel "}. +{"Roster of ", "Seznam kontaktů "}. +{"Shared Roster", "Sdílený seznam kontaktů"}. +{"Online", "Online"}. +{"Validate", "Ověřit"}. +{"Not found", "Nenalezeno"}. +{"Shared roster groups", "Skupiny pre sdíelený seznam kontaktů"}. +{"Name:", "Jméno:"}. +{"Description:", "Popis:"}. +{"Members:", "Členové:"}. +{"Displayed Groups:", "Zobrazené skupiny:"}. +{"Group ", "Skupina "}. +{"Users last activity", "Poslední aktivita uživatele"}. +{"Period: ", "Čas:"}. +{"Last month", "Poslední měsíc"}. +{"Last year", "Poslední rok"}. +{"All activity", "Všechny aktivity"}. +{"Show Ordinary Table", "Zobrazit bežnou tabulku"}. +{"Show Integral Table", "Zobrazit kompletní tabulku"}. +{"Start", "Start"}. +{"Modules Management", "Správa modulů"}. +{"Modules at ", "Moduly na "}. +{"No data", "Žádná data"}. +{"Virtual Hosts", "Virtuální servery"}. +{"ejabberd virtual hosts", "Ejabberd virtuální servery"}. +{"Host", "Server"}. +{"ejabberd Web Interface", "Ejabberd Web rozhraní"}. + +% mod_vcard_odbc.erl +{"Erlang Jabber Server\nCopyright (c) 2002-2005 Alexey Shchepin", + "Erlang Jabber Server\nCopyright (c) 2002-2005 Alexey Shchepin"}. +{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)", + "Pro vyhledání Jabber uživatele vyplňte formulář (přidejte znak * na konec, pro vyhledání podřetězce)"}. +{"ejabberd vCard module\nCopyright (c) 2003-2005 Alexey Shchepin", "Ejabberd vCard modul\nCopyright (c) 2003-2005 Alexey Shchepin"}. +{"JID", "JID"}. + +% ejabberd_c2s.erl +{"Use of STARTTLS required", "Je vyžadováno STARTTLS."}. +{"Replaced by new connection", "Nahrazeno novým spojením"}. + +% mod_configure.erl +{"DB Tables Configuration at ", "Databázové tabulky s konfigurácí na "}. + +% mod_vcard_ldap.erl +{"Given Name", "Křestní jméno"}. + +% mod_pubsub/mod_pubsub.erl +{"ejabberd pub/sub module\nCopyright (c) 2003-2005 Alexey Shchepin", + "Ejabberd pub/sub modul\nCopyright (c) 2003-2005 Alexey Shchepin"}. +{[], " "}. +{"Node Creator", "Majitel uzlu"}. +{"Deliver payloads with event notifications", "Doručovat náklad s upozorněním na událost"}. +{"Notify subscribers when the node configuration changes", "Upozornit členy na změnu nastavení uzlu"}. +{"Notify subscribers when the node is deleted", "Upozornit členy na smazaní uzlu"}. +{"Notify subscribers when items are removed from the node", "Upozornit členy na odstranění položek z uzlu"}. +{"Persist items to storage", "Uložit položky natrvalo do úložiště"}. +{"Max # of items to persist", "Maximální počet položek, které je možné natrvalo uložit"}. +{"Whether to allow subscriptions", "Povolit přihlašování"}. +{"Specify the subscriber model", "Specifikovat přihlašovací model"}. +{"Specify the publisher model", "Specifikovat model pro publikování"}. +{"Max payload size in bytes", "Maximální náklad v bajtech"}. +{"Send items to new subscribers", "Odeslat položky novým uživatelům"}. +{"Only deliver notifications to available users", "Doručovat upozornení jen aktuálně přihlášeným uživatelům"}. +{"Specify the current subscription approver", "Zadat současného schvalovatele přihlášení "}. + +% web/ejabberd_web_admin.erl +{"ejabberd (c) 2002-2005 Alexey Shchepin, 2004-2005 Process One", + "Ejabberd (c) 2002-2005 Alexey Shchepin, 2004-2005 Process One"}. +{"(raw)", "(zdroj)"}. +{"raw", "zdroj"}. +{"Authenticated users", "Ověření uživatelé"}. + +% mod_irc/mod_irc.erl +{"ejabberd IRC module\nCopyright (c) 2003-2005 Alexey Shchepin", + "Ejabberd IRC module\nCopyright (c) 2003-2005 Alexey Shchepin"}. +{"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.", + "Pokud chcete zadat jiné kódování pro IRC servery, vyplňte seznam s hodnotami ve formátě '{\"irc server\",\"encoding\"}'. Předvolené kódování pro tuto službu je \"~s\"."}. + +% mod_muc/mod_muc.erl +{"Room creation is denied by service policy", "Vytváranie miestnosti nie je povolené"}. +{"ejabberd MUC module\nCopyright (c) 2003-2005 Alexey Shchepin", "Ejabberd MUC modul\nCopyright (c) 2003-2005 Alexey Shchepin"}. + +% Local Variables: +% mode: erlang +% End: + + +% /usr/home/src/ejabberd/ejabberd/src/mod_vcard_odbc.erl +{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", + "Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin"}. +{"Email", "E-mail"}. +{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", + "Ejabberd vCard modul\nCopyright (c) 2003-2006 Alexey Shchepin"}. +{"Search Results for ", "Hledat výsledky pro "}. +{"Jabber ID", "Jabber ID"}. + +% /usr/home/src/ejabberd/ejabberd/src/mod_adhoc.erl +{"Commands", "Příkazy"}. +{"Ping", "Ping"}. +{"Pong", "Pong"}. + +% /usr/home/src/ejabberd/ejabberd/src/ejabberd_c2s.erl +{"Replaced by new connection", "Nahrazeno novým spojením"}. + +% /usr/home/src/ejabberd/ejabberd/src/mod_announce.erl +{"Really delete message of the day?", "Skutečně smazat správu dne?"}. +{"Subject", "Předmět"}. +{"Message body", "Tělo zprávy"}. +{"No body provided for announce message", "Zpráva neobsahuje text"}. +{"Announcements", "Oznámení"}. +{"Send announcement to all users", "Odeslat seznam všech uživatelů"}. +{"Send announcement to all online users", "Odeslat seznam všech online uživatelů"}. +{"Send announcement to all online users on all hosts", "Odeslat seznam všech online uživatelů na všech serverech"}. +{"Set message of the day and send to online users", "Nastavit zprávu dne a odeslat jí online uživatelům"}. +{"Update message of the day (don't send)", "Aktualizovat zprávu dne (neodesíelat)"}. +{"Delete message of the day", "Smazat zprávu dne"}. + +% /usr/home/src/ejabberd/ejabberd/src/mod_configure.erl +{"Database", "Databáze"}. +{"Outgoing s2s Connections", "Odchozí s2s spojení"}. +{"Import Users From jabberd 1.4 Spool Files", "Importovat uživatelů z jabber 1.4 spool souborů"}. +{"Database Tables Configuration at ", "Konfigurace databázových tabulek "}. + +% /usr/home/src/ejabberd/ejabberd/src/mod_pubsub/mod_pubsub.erl +{"ejabberd pub/sub module\nCopyright (c) 2003-2006 Alexey Shchepin", + "ejabberd pub/sub modul\nCopyright (c) 2003-2006 Alexey Shchepin"}. + +% /usr/home/src/ejabberd/ejabberd/src/web/ejabberd_web_admin.erl +{"ejabberd Web Interface", "Ejabberd Web rozhraní"}. +{"Administration", "Administrace"}. +{"ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One", + "Ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One"}. +{"(Raw)", "(Zdroj)"}. +{"Submitted", "Odeslané"}. +{"Bad format", "Nesprávný formát"}. +{"Raw", "Zdroj"}. +{"Users Last Activity", "Poslední aktivita uživatele"}. +{"Registered Users", "Registrovaní uživatelé"}. +{"Offline Messages", "Offline zprávy"}. +{"Registered Users:", "Registrovaní živatelé:"}. +{"Authenticated Users:", "Ověření uživatelé:"}. +{"Online Users:", "Online uživatelé:"}. +{"Outgoing s2s Connections:", "Odchozí s2s spojení:"}. +{"Outgoing s2s Servers:", "Odchozí s2s servery:"}. +{"Offline Messages:", "Offline zprávy"}. +{"~s's Offline Messages Queue", "~s Offline zpráv"}. +{"Add Jabber ID", "Přidat JID"}. +{"No Data", "Žádná data"}. +{"Listened Ports", "Otevřené porty"}. +{"RPC Call Error", "Chyba RPC volání"}. +{"Database Tables at ", "Databázové tabulky na "}. +{"Backup of ", "Záloha na "}. +{"Remark that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.", + "Podotýkáme, že tato nastavení budou zálohované do zabudované databáze Mnesia. Pokud používáte ODBC modul, musíte zálohovat vaší SQL databázi separátně."}. +{"Store binary backup:", "Uložit binární zálohu:"}. +{"Restore binary backup immediately:", "Okamžitě obnovit binární zálohu:"}. +{"Restore binary backup after next ejabberd restart (requires less memory):", + "Obnovit binární zálohu při následujícím restartu Ejabberd (vyžaduje méně paměti)"}. +{"Store plain text backup:", "Uložit zálohu do textového souboru:"}. +{"Restore plain text backup immediately:", "Okamžitě obnovit zálohu z textového souboru:"}. +{"Statistics of ~p", "Statistiky ~p"}. +{"Uptime:", "Čas běhu"}. +{"CPU Time:", "Čas procesoru"}. +{"Transactions Commited:", "Transakce potvrzena"}. +{"Transactions Aborted:", "Transakce zrušena"}. +{"Transactions Restarted:", "Transakce restartována"}. +{"Transactions Logged:", "Transakce zaznamenána"}. +{"Update ", "Aktualizovat "}. +{"Update plan", "Aktualizovat plán"}. +{"Updated modules", "Aktualizované moduly"}. +{"Update script", "Aktualizované skripty"}. +{"Low level update script", "Nízkoúrovňový aktualizační skript"}. +{"Script check", "Kontrola skriptu"}. +{"Not Found", "Nenalezeno"}. +{"Shared Roster Groups", "Skupiny pro zdílený seznam kontaktů"}. + +% /usr/home/src/ejabberd/ejabberd/src/mod_irc/mod_irc.erl +{"ejabberd IRC module\nCopyright (c) 2003-2006 Alexey Shchepin", "Ejabberd IRC modul\nCopyright (c) 2003-2006 Alexey Shchepin"}. + +% /usr/home/src/ejabberd/ejabberd/src/mod_muc/mod_muc_log.erl +{"Chatroom configuration modified", "Nastavení diskuzní místnosti bylo změněno"}. +{"joins the room", "vstoupil(a) do místnosti"}. +{"leaves the room", "opustil(a) místnost"}. +{"has been kicked", "byl(a) vyhozen(á) z místnosti"}. +{"has been banned", "byl(a) zablokován(a)"}. +{"is now known as", "se přejmenoval(a) na"}. +{"Monday", "Pondělí"}. +{"Tuesday", "Úterý"}. +{"Wednesday", "Středa"}. +{"Thursday", "Čtvrtek"}. +{"Friday", "Pátek"}. +{"Saturday", "Sobota"}. +{"Sunday", "Neděle"}. +{"January", "Leden"}. +{"February", "Únor"}. +{"March", "Březen"}. +{"April", "Duben"}. +{"May", "Květen"}. +{"June", "Červen"}. +{"July", "Červenec"}. +{"August", "Srpen"}. +{"September", "Září"}. +{"October", "říjen"}. +{"November", "Listopad"}. +{"December", "Prosinec"}. +{"Room Configuration", "Nastavení místnosti"}. + +% /usr/home/src/ejabberd/ejabberd/src/mod_muc/mod_muc.erl +{"You must fill in field \"Nickname\" in the form", + "Musíte vyplnit políčko \"Prezdívka\" ve formuláři"}. +{"ejabberd MUC module\nCopyright (c) 2003-2006 Alexey Shchepin", + "Ejabberd MUC modul\nCopyright (c) 2003-2006 Alexey Shchepin"}. + +% /usr/home/src/ejabberd/ejabberd/src/mod_muc/mod_muc_room.erl +{"This room is not anonymous", "Tato místnost není anonymní"}. +{"Make room persistent", "Nastavit místnost jako stálou"}. +{"Make room public searchable", "Nastavit místnost jako veřejně prohldávatelnou"}. +{"Make participants list public", "Nastavit seznam účastníků jako veřejný"}. +{"Make room password protected", "Chránit místnost heslem"}. +{"Make room semianonymous", "Nastavit místnost jako částečně anonymní"}. +{"Make room members-only", "Nastavit místnost jen pro členy"}. +{"Make room moderated", "Nastavit místnost jako moderovanou"}. +{"Default users as participants", "Uživatelé jsou implicitně členy"}. +{"Allow users to change subject", "Povolit uživatelům měnit téma této místnosti"}. +{"Allow users to send private messages", "Povolit uživatelům odesíelat soukromé zprávy"}. +{"Allow users to query other users", "Povolit uživatelům odesíela požadavky (query) ostatním uživatelům"}. +{"Allow users to send invites", "povolit uživatelům posíelání pozvánek"}. +{"Enable logging", "Zapnout ukládání historie"}. +{"Description", "Popis"}. +{"Number of occupants", "Počet účastníků"}. -- cgit v1.2.3 From ccfcfa49fad66fa1e571f49140ca48115145c4f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Sat, 23 Sep 2006 09:52:53 +0000 Subject: Improvement coming from trunk (SVN #622): * src/eldap/eldap.erl: Enable the keepalive socket option (thanks to Evgeniy Khramtsov) * src/ejabberd_auth_ldap.erl: Now uses two LDAP connections (thanks to Evgeniy Khramtsov) * src/eldap/eldap_filter.erl: Bugfix (thanks to Evgeniy Khramtsov) * src/mod_vcard_ldap.erl: Likewise SVN Revision: 623 --- src/ejabberd_auth_ldap.erl | 10 +++++++++- src/eldap/eldap.erl | 2 +- src/mod_vcard_ldap.erl | 11 +++-------- 3 files changed, 13 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/ejabberd_auth_ldap.erl b/src/ejabberd_auth_ldap.erl index a1ce74609..d152d0895 100644 --- a/src/ejabberd_auth_ldap.erl +++ b/src/ejabberd_auth_ldap.erl @@ -44,6 +44,7 @@ -record(state, {host, eldap_id, + bind_eldap_id, servers, port, dn, @@ -101,6 +102,11 @@ init(Host) -> State#state.port, State#state.dn, State#state.password), + eldap:start_link(State#state.bind_eldap_id, + State#state.servers, + State#state.port, + State#state.dn, + State#state.password), ejabberd_ctl:register_commands( Host, [{"registered-users", "list all registered users"}], @@ -174,7 +180,7 @@ handle_call({check_pass, User, Password}, _From, State) -> false -> false; DN -> - case eldap:bind(State#state.eldap_id, DN, Password) of + case eldap:bind(State#state.bind_eldap_id, DN, Password) of ok -> true; _ -> false end @@ -327,6 +333,7 @@ usort_attrs(_) -> parse_options(Host) -> Eldap_ID = atom_to_list(gen_mod:get_module_proc(Host, ?MODULE)), + Bind_Eldap_ID = atom_to_list(gen_mod:get_module_proc(Host, bind_ejabberd_auth_ldap)), LDAPServers = ejabberd_config:get_local_option({ldap_servers, Host}), LDAPPort = case ejabberd_config:get_local_option({ldap_port, Host}) of undefined -> 389; @@ -363,6 +370,7 @@ parse_options(Host) -> end, #state{host = Host, eldap_id = Eldap_ID, + bind_eldap_id = Bind_Eldap_ID, servers = LDAPServers, port = LDAPPort, dn = RootDN, diff --git a/src/eldap/eldap.erl b/src/eldap/eldap.erl index a1f320fc1..894982e82 100644 --- a/src/eldap/eldap.erl +++ b/src/eldap/eldap.erl @@ -808,7 +808,7 @@ polish([], Res, Ref) -> %%----------------------------------------------------------------------- connect_bind(S) -> Host = next_host(S#eldap.host, S#eldap.hosts), - TcpOpts = [{packet, asn1}, {active, true}, binary], + TcpOpts = [{packet, asn1}, {active, true}, {keepalive, true}, binary], case gen_tcp:connect(Host, S#eldap.port, TcpOpts) of {ok, Socket} -> case bind_request(Socket, S) of diff --git a/src/mod_vcard_ldap.erl b/src/mod_vcard_ldap.erl index 4389e4bce..0921ce92f 100644 --- a/src/mod_vcard_ldap.erl +++ b/src/mod_vcard_ldap.erl @@ -670,14 +670,9 @@ map_vcard_attr(VCardName, Attributes, Pattern, UD) -> _ -> "" end. -process_pattern(Str, {User, Domain}, Attrs) -> - Res = lists:foldl( - fun(X, Acc) -> - {ok, NewStr, _} = regexp:sub(Acc, "%s", X), - NewStr - end, - Str, Attrs), - eldap_filter:do_sub(Res, [{"%u", User},{"%d", Domain}]). +process_pattern(Str, {User, Domain}, AttrValues) -> + eldap_filter:do_sub(Str, + [{"%s", V, 1} || V <- AttrValues] ++ [{"%u", User},{"%d", Domain}]). get_ldap_attr(LDAPAttr, Attributes) -> Res = lists:filter( -- cgit v1.2.3 From d786782a0f765fceed36d64ad66e0d937c7e1943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Sun, 24 Sep 2006 09:39:04 +0000 Subject: * src/doc/features.html: Added to be consistent (guide.html is in the repository to make Latex optional, but still allow access to the doc). * src/ejabberd.hrl: Updated to version 1.1.2. SVN Revision: 624 --- src/ejabberd.hrl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/ejabberd.hrl b/src/ejabberd.hrl index 90f86d35a..47de8a2c9 100644 --- a/src/ejabberd.hrl +++ b/src/ejabberd.hrl @@ -6,7 +6,7 @@ %%% Id : $Id$ %%%---------------------------------------------------------------------- --define(VERSION, "1.1.1"). +-define(VERSION, "1.1.2"). %-define(ejabberd_debug, true). %-define(DBGFSM, true). -- cgit v1.2.3 From 79f5d2772ed20cabd09ce3faa223ad59d91560ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Sun, 24 Sep 2006 14:45:12 +0000 Subject: * src/mod_muc/mod_muc_room.erl: Strings update (thanks to Serguei Golovan). * src/msgs/ru.msg: Updated Russian translation (thanks to Serguei Golovan). * src/msgs/uk.msg: Updated Ukrainian translation (thanks to Serguei Golovan). * src/msgs/fr.msg: Update French translation. SVN Revision: 626 --- src/mod_muc/mod_muc_room.erl | 6 +++--- src/msgs/fr.msg | 4 +++- src/msgs/ru.msg | 6 ++++-- src/msgs/uk.msg | 4 +++- 4 files changed, 13 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index 6c895d30b..911175547 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc/mod_muc_room.erl @@ -2137,7 +2137,7 @@ get_config(Lang, StateData, From) -> end), {xmlelement, "field", [{"type", "list-single"}, - {"label", translate:translate(Lang, "Who may discover real JIDs?")}, + {"label", translate:translate(Lang, "Make real JIDs discovered for")}, {"var", "muc#roomconfig_whois"}], [{xmlelement, "value", [], [{xmlcdata, if Config#config.anonymous -> @@ -2145,9 +2145,9 @@ get_config(Lang, StateData, From) -> true -> "anyone" end}]}, - {xmlelement, "option", [{"label", "Moderators only"}], + {xmlelement, "option", [{"label", translate:translate(Lang, "moderators only")}], [{xmlelement, "value", [], [{xmlcdata, "moderators"}]}]}, - {xmlelement, "option", [{"label", "Anyone"}], + {xmlelement, "option", [{"label", translate:translate(Lang, "anyone")}], [{xmlelement, "value", [], [{xmlcdata, "anyone"}]}]}]}, ?BOOLXFIELD("Make room members-only", "muc#roomconfig_membersonly", diff --git a/src/msgs/fr.msg b/src/msgs/fr.msg index e2486212b..ab2c51b6a 100644 --- a/src/msgs/fr.msg +++ b/src/msgs/fr.msg @@ -222,7 +222,9 @@ {"Enable logging", "Activer l'archivage"}. {"Description", "Description"}. {"Number of occupants", "Nombre d'occupants"}. -{"Who may discover real JIDs?", "Qui peut découvrir les vrais JIDs ?"}. +{"Make real JIDs discovered for", "Rendre le JID réel visible pour"}. +{"moderators only", "modérateurs seulement"}. +{"anyone", "tout le monde"}. % mod_irc/mod_irc.erl {"ejabberd IRC module\nCopyright (c) 2003-2006 Alexey Shchepin", "Module IRC ejabberd\nCopyright (c) 2003-2006 Alexey Shchepin"}. diff --git a/src/msgs/ru.msg b/src/msgs/ru.msg index 454f35307..03e62cce5 100644 --- a/src/msgs/ru.msg +++ b/src/msgs/ru.msg @@ -159,7 +159,7 @@ "Вы должны заполнить поле \"Псевдоним\" в форме"}. {"Specified nickname is already registered", "Указанный псевдоним уже зарегистрирован"}. -% /home/sergei/src/ejabberd/ejabberd/src/mod_muc/mod_muc_log.erl +% mod_muc/mod_muc_log.erl {"Chatroom configuration modified", "Конфигурация комнаты изменилась"}. {"joins the room", "вошёл(а) в комнату"}. {"leaves the room", "вышел(а) из комнаты"}. @@ -211,7 +211,9 @@ "Разрешить пользователям посылать приглашения"}. {"Make room password protected", "Сделать комнату защищённой паролем"}. {"Password", "Пароль"}. -{"Make room semianonymous", "Сделать комнату полуанонимной"}. +{"Make real JIDs discovered for", "Сделать реальные JID участников видимыми"}. +{"moderators only", "только модераторам"}. +{"anyone", "всем участникам"}. {"Enable logging", "Включить журналирование"}. {"Only moderators and participants are allowed to change subject in this room", "Только модераторы и участники могут изменять тему в этой комнате"}. diff --git a/src/msgs/uk.msg b/src/msgs/uk.msg index c1cf57d1c..580720df2 100644 --- a/src/msgs/uk.msg +++ b/src/msgs/uk.msg @@ -210,7 +210,9 @@ "Дозволити користувачам надсилати запрошення"}. {"Make room password protected", "Зробити кімнату захищеною паролем"}. {"Password", "Пароль"}. -{"Make room semianonymous", "Зробити кімнату напіванонімною"}. +{"Make real JIDs discovered for", "Зробити реальні JID учасників видимими"}. +{"moderators only", "тільки модераторам"}. +{"anyone", "всім учасникам"}. {"Enable logging", "Включити журнал роботи"}. {"Only moderators and participants are allowed to change subject in this room", "Тільки модератори та учасники можуть змінювати тему в цій кімнаті"}. -- cgit v1.2.3 From 5b9526d99810f0414578603ef3ddd0f7455c3d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Sun, 24 Sep 2006 15:31:21 +0000 Subject: * src/eldap/eldap_filter: Forgot to add eldap_filter.erl in ejabberd-1.1.2 branch SVN Revision: 627 --- src/eldap/eldap_filter.erl | 285 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 src/eldap/eldap_filter.erl (limited to 'src') diff --git a/src/eldap/eldap_filter.erl b/src/eldap/eldap_filter.erl new file mode 100644 index 000000000..a93205295 --- /dev/null +++ b/src/eldap/eldap_filter.erl @@ -0,0 +1,285 @@ +%%%==================================================== +%%% File: eldap_filter.erl +%%% Purpose: Converts String Representation of +%%% LDAP Search Filter (RFC 2254) +%%% to eldap's representation of filter +%%% Author: Evgeniy Khramtsov +%%% License: GPL +%%%==================================================== + +-module(eldap_filter). +-author('xram@jabber.ru'). + +%%%====================== +%%% Export functions +%%%====================== + +-export([parse/1, + parse/2, + do_sub/2 + ]). + +%%%------------------------------------------------------------------------- +%%% Arity: parse/1 +%%% Function: parse(RFC2254_Filter) -> {ok, EldapFilter} | +%%% {error, bad_filter} +%%% +%%% RFC2254_Filter = string(). +%%% +%%% Description: Converts String Representation of LDAP Search Filter (RFC 2254) +%%% to eldap's representation of filter. +%%% +%%% Example: +%%% > eldap_filter:parse("(&(!(uid<=100))(mail=*))"). +%%% +%%% {ok,{'and',[{'not',{lessOrEqual,{'AttributeValueAssertion',"uid","100"}}}, +%%% {present,"mail"}]}} +%%%------------------------------------------------------------------------- +parse(RFC2254_Filter) -> + parse(RFC2254_Filter, []). + +%%%------------------------------------------------------------------------- +%%% Arity: parse/2 +%%% Function: parse(RFC2254_Filter, [SubstValue |...]) -> +%%% {ok, EldapFilter} | +%%% {error, bad_filter} | +%%% {error, bad_regexp} | +%%% {error, max_substitute_recursion} +%%% +%%% SubstValue = {RegExp, Value} | {RegExp, Value, N}, +%%% RFC2254_Filter = RegExp = Value = string(), +%%% N = integer(). +%%% +%%% Description: The same as parse/1, but substitutes N or all occurences +%%% of RegExp with Value *after* parsing. +%%% +%%% Example: +%%% > eldap_filter:parse( +%%% "(|(mail=%u@%d)(jid=%u@%d))", +%%% [{"%u", "xramtsov"},{"%d","gmail.com"}]). +%%% +%%% {ok,{'or',[{equalityMatch,{'AttributeValueAssertion', +%%% "mail", +%%% "xramtsov@gmail.com"}}, +%%% {equalityMatch,{'AttributeValueAssertion', +%%% "jid", +%%% "xramtsov@gmail.com"}}]}} +%%%-------------------------------------------------------------------------- +parse(RFC2254_Filter, ListOfSubValues) -> + case catch convert_filter(parse_filter(RFC2254_Filter), ListOfSubValues) of + [EldapFilter] when is_tuple(EldapFilter) -> + {ok, EldapFilter}; + {regexp, Error} -> + {error, Error}; + _ -> + {error, bad_filter} + end. + +%%%========================== +%%% Internal functions +%%%========================== + +%%%---------------------- +%%% split/1,4 +%%%---------------------- +split(Filter) -> + split(Filter, 0, [], []). + +split([], _, _, Result) -> + Result; + +split([H|T], Num, Rest, Result) -> + NewNum = case H of + $( -> Num + 1; + $) -> Num - 1; + _ -> Num + end, + if + NewNum == 0 -> + X = Rest++[H], + LenX = length(X), + if + LenX > 2 -> + split(T, 0, [], Result ++ [lists:sublist(X, 2, LenX-2)]); + true -> + split(T, 0, Rest, Result) + end; + true -> + split(T, NewNum, Rest++[H], Result) + end. + +%%%----------------------- +%%% parse_filter/1 +%%%----------------------- +parse_filter(Filter) -> + case Filter of + [$! | T] -> + {'not', parse_filter(T)}; + [$| | T] -> + {'or', parse_filter(T)}; + [$& | T] -> + {'and', parse_filter(T)}; + [$( | _] -> + parse_filter(split(Filter)); + [List | _] when is_list(List) -> + [parse_filter(X) || X <- Filter]; + _ -> + Filter + end. + +%%%-------------------- +%%% convert_filter/2 +%%%-------------------- +convert_filter({'not', [Val | _]}, Replace) -> + eldap:'not'(convert_filter(Val, Replace)); + +convert_filter({'or', Vals}, Replace) -> + eldap:'or'([convert_filter(X, Replace) || X <- Vals]); + +convert_filter({'and', Vals}, Replace) -> + eldap:'and'([convert_filter(X, Replace) || X <- Vals]); + +convert_filter([H|_] = Filter, Replace) when is_integer(H) -> + parse_attr(Filter, Replace); + +convert_filter(Filter, Replace) when is_list(Filter) -> + [convert_filter(X, Replace) || X <- Filter]. + +%%%----------------- +%%% parse_attr/2,3 +%%%----------------- +parse_attr(Attr, ListOfSubValues) -> + {Action, [_|_] = Name, [_|_] = Value} = split_attribute(Attr), + parse_attr(Action, {Name, Value}, ListOfSubValues). + +parse_attr(approx, {Name, Value}, ListOfSubValues) -> + NewValue = do_sub(Value, ListOfSubValues), + eldap:approxMatch(Name, NewValue); + +parse_attr(greater, {Name, Value}, ListOfSubValues) -> + NewValue = do_sub(Value, ListOfSubValues), + eldap:greaterOrEqual(Name, NewValue); + +parse_attr(less, {Name, Value}, ListOfSubValues) -> + NewValue = do_sub(Value, ListOfSubValues), + eldap:lessOrEqual(Name, NewValue); + +parse_attr(equal, {Name, Value}, ListOfSubValues) -> + {ok, RegSList} = regexp:split(remove_extra_asterisks(Value), "[*]"), + Pattern = case [do_sub(X, ListOfSubValues) || X <- RegSList] of + [Head | Tail] when Tail /= [] -> + {Head, lists:sublist(Tail, length(Tail)-1), lists:last(Tail)}; + R -> + R + end, + case Pattern of + [V] -> + eldap:equalityMatch(Name, V); + {[], [], []} -> + eldap:present(Name); + {"", Any, ""} -> + eldap:substrings(Name, [{any, X} || X<-Any]); + {H, Any, ""} -> + eldap:substrings(Name, [{initial, H}]++[{any, X} || X<-Any]); + {"", Any, T} -> + eldap:substrings(Name, [{any, X} || X<-Any]++[{final, T}]); + {H, Any, T} -> + eldap:substrings(Name, [{initial, H}]++[{any, X} || X<-Any]++[{final, T}]) + end; + +parse_attr(_, _, _) -> + false. + +%%%-------------------- +%%% do_sub/2,3 +%%%-------------------- + +-define(MAX_RECURSION, 100). + +do_sub(S, []) -> + S; + +do_sub([], _) -> + []; + +do_sub(S, [{RegExp, New} | T]) -> + Result = do_sub(S, {RegExp, replace_amps(New)}, 1), + do_sub(Result, T); + +do_sub(S, [{RegExp, New, Times} | T]) -> + Result = do_sub(S, {RegExp, replace_amps(New), Times}, 1), + do_sub(Result, T). + +do_sub(S, {RegExp, New}, Iter) -> + case regexp:sub(S, RegExp, New) of + {ok, NewS, 0} -> + NewS; + {ok, NewS, _} when Iter =< ?MAX_RECURSION -> + do_sub(NewS, {RegExp, New}, Iter+1); + {ok, _, _} when Iter > ?MAX_RECURSION -> + throw({regexp, max_substitute_recursion}); + _ -> + throw({regexp, bad_regexp}) + end; + +do_sub(S, {_, _, N}, _) when N<1 -> + S; + +do_sub(S, {RegExp, New, Times}, Iter) -> + case regexp:sub(S, RegExp, New) of + {ok, NewS, 0} -> + NewS; + {ok, NewS, _} when Iter < Times -> + do_sub(NewS, {RegExp, New, Times}, Iter+1); + {ok, NewS, _} -> + NewS; + _ -> + throw({regexp, bad_regexp}) + end. + +remove_extra_asterisks(String) -> + {Res, _} = lists:foldl( + fun(X, {Acc, Last}) -> + case X of + $* when Last==$* -> + {Acc, X}; + _ -> + {Acc ++ [X], X} + end + end, + {"", ""}, String), + Res. + +replace_amps(String) -> + lists:foldl( + fun(X, Acc) -> + if + X == $& -> + Acc ++ "\\&"; + true -> + Acc ++ [X] + end + end, + "", String). + +split_attribute(String) -> + split_attribute(String, "", $0). + +split_attribute([], _, _) -> + {error, "", ""}; + +split_attribute([H|Tail], Acc, Last) -> + case H of + $= when Last==$> -> + {greater, lists:sublist(Acc, 1, length(Acc)-1), Tail}; + $= when Last==$< -> + {less, lists:sublist(Acc, 1, length(Acc)-1), Tail}; + $= when Last==$~ -> + {approx, lists:sublist(Acc, 1, length(Acc)-1), Tail}; + $= when Last==$: -> + {equal, lists:sublist(Acc, 1, length(Acc)-1), Tail}; + $= -> + {equal, Acc, Tail}; + _ -> + split_attribute(Tail, Acc++[H], H) + end. -- cgit v1.2.3 From d574757de4847a69233e67eade4d2240ea8935e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Sun, 24 Sep 2006 15:44:24 +0000 Subject: * src/msgs/es.msg: Updated Spanish translation (thanks to Badlop). SVN Revision: 628 --- src/msgs/es.msg | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/msgs/es.msg b/src/msgs/es.msg index e97fea818..92bc47caf 100644 --- a/src/msgs/es.msg +++ b/src/msgs/es.msg @@ -135,7 +135,7 @@ {"Make participants list public", "La lista de participantes es pública"}. {"Make room persistent", "Sala permanente"}. {"Make room moderated", "Sala moderada"}. -{"Default users as participants", "Los usuarios on participantes por defecto"}. +{"Default users as participants", "Los usuarios son participantes por defecto"}. {"Make room members-only", "Sala sólo para miembros"}. {"Allow users to send invites", "Permitir a los usuarios enviar invitaciones"}. {"Make room password protected", "Proteger la sala con contraseña"}. @@ -167,9 +167,11 @@ {"Invalid role: ~s", "Rol no válido: ~s"}. {"Owner privileges required", "Se requieren privilegios de propietario de la sala"}. {"private, ", "privado"}. -{"Make room semianonymous", "Hacer la sala semianónima"}. {"Description", "Descripción"}. {"Number of occupants", "Número de ocupantes"}. +{"Make real JIDs discovered for", "Los JID reales pueden verlos"}. +{"moderators only", "solo moderadores"}. +{"anyone", "cualquiera"}. % mod_muc/mod_muc_log.erl {"Chatroom configuration modified", "Configuración de la sala modificada"}. @@ -320,7 +322,6 @@ {"Replaced by new connection", "Reemplazado por una nueva conexión"}. % mod_vcard_ldap.erl -{"Given Name", "Nombre dado"}. {"Fill in fields to search for any matching Jabber User", "Rellena campos para buscar usuarios Jabber que concuerden"}. % mod_adhoc.erl -- cgit v1.2.3 From 5d4093b8ac4efe405ca8ec145468717ce3206ed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Mon, 25 Sep 2006 10:47:52 +0000 Subject: * src/msgs/cs.msg: Updated Czech translation and removed unused strings. SVN Revision: 632 --- src/msgs/cs.msg | 98 ++++++--------------------------------------------------- 1 file changed, 9 insertions(+), 89 deletions(-) (limited to 'src') diff --git a/src/msgs/cs.msg b/src/msgs/cs.msg index 0f3e4d4cf..48eb8c21e 100644 --- a/src/msgs/cs.msg +++ b/src/msgs/cs.msg @@ -46,7 +46,6 @@ {"Configuration", "Konfigurace"}. {"Online Users", "Online uživatelé"}. {"All Users", "Všichni uživatelé"}. -{"Outgoing S2S connections", "Odchozí spojení S2S"}. {"To ~s", "Pre ~s"}. {"From ~s", "Od ~s"}. {"Running Nodes", "Bežící uzly"}. @@ -55,12 +54,10 @@ {"Access Control Lists", "Seznamy přístupových práv (ACL)"}. {"Access Rules", "Pravidla přístupů"}. {"Remove Users", "Odstranit uživatele"}. -{"DB", "DB"}. {"Modules", "Moduly"}. {"Start Modules", "Spustit moduly"}. {"Stop Modules", "Zastavit moduly"}. {"Backup Management", "Správa zálohování"}. -{"Import users from jabberd1.4 spool files", "Importovat uživatele z jabberd1.4 spool souborů"}. {"Backup", "Zálohovat"}. {"Restore", "Obnovit"}. {"Dump to Text File", "Uložit do textového souboru"}. @@ -77,7 +74,6 @@ {"Search users in ", "Hledat uživatele v "}. {"Fill in fields to search for any matching Jabber User", "Vyplňte políčka pro vyhledávání Jabber uživatele"}. -{"Results of search in ", "Výsledky vyhledávání v "}. {"User", "Uživatel: "}. {"Full Name", "Celé jméno: "}. @@ -88,7 +84,6 @@ {"Birthday", "Datum narození: "}. {"Country", "Země: "}. {"City", "Město: "}. -{"email", "E-mail: "}. {"Organization Name", "Název firmy: "}. {"Organization Unit", "Oddělení: "}. @@ -101,7 +96,6 @@ "Pouze správci služby mají povolené odesílání servisních zpráv"}. {"Conference room does not exist", "Konferenční místnost neexistuje"}. {"Access denied by service policy", "Přístup byl zamítnutý nastavením služby"}. -{"You must fill in field \"nick\" in the form", "Musíte vyplnit políčko \"prezdívka\" ve formuláři"}. {"Specified nickname is already registered", "Zadaná prezdívka je již registrována"}. % mod_muc/mod_muc_room.erl @@ -110,22 +104,7 @@ "Ke konfiguraci místnosti potřebujete klienta podporujícího z x:data"}. {"Configuration for ", "Konfigurace pre "}. {"Room title", "Název místnosti"}. -{"Allow users to change subject?", "Povolit uživatelům menit téma?"}. -{"Allow users to query other users?", - "Povolit uživatelům odesílat požadavky (query) ostatním uživatelům?"}. -{"Allow users to send private messages?", - "Povolit uživatelům odesíelat soukromé zprávy?"}. -{"Make room public searchable?", "Nastavit místnost jako veřejně prohledávatelnou?"}. -{"Make participants list public?", "Nastavit seznam účastníků jako veřejný?"}. -{"Make room persistent?", "Nastavit místnost jako trvalou (persistent)?"}. -{"Make room moderated?", "Nastavit místnost jako moderovanou?"}. -{"Default users as members?", "Uživatelé jsou implicitně členy?"}. -{"Make room members only?", "Nastavit místnost jen pro členy?"}. -{"Allow users to send invites?", "Povolit uživatelům odesíelat pozvánky?"}. -{"Make room password protected?", "Chránit místnost heslem?"}. {"Password", "Heslo"}. -{"Make room anonymous?", "Nastavit místnost jako anonymní?"}. -{"Enable logging?", "Zapnout ukládání historie?"}. {"Only moderators and participants are allowed to change subject in this room", "Jen moderátoři a účastníci mají povoleno měnit téma této místnosti"}. {"Only moderators are allowed to change subject in this room", @@ -160,6 +139,9 @@ {"Invalid role: ~s", "Neplatná role: ~s"}. {"Owner privileges required", "Jsou vyžadována práva vlastníka"}. {"private, ", "soukromá, "}. +{"Make real JIDs discovered for", "Zjisti skutečné JIDy pro"}. +{"moderators only", "pouze pro moderátory"}. +{"anyone", "každý"}. % mod_irc/mod_irc.erl {"You need an x:data capable client to configure mod_irc settings", @@ -173,91 +155,57 @@ {"Encodings", "Kódování"}. % web/ejabberd_web_admin.erl -{"ejabberd administration", "Administrace Ejabberd"}. {"Users", "Uživatelé"}. {"Nodes", "Uzly"}. {"Statistics", "Statistiky"}. -{"(raw)", "(zdroj)"}. -{"submitted", "odeslané"}. -{"bad format", "nesprávný formát"}. -{"raw", "zdroj"}. -{"ejabberd access control lists configuration", "Konfigurace seznamu přístupových práv (ACL) Ejabberd"}. +{"Submitted", "Odeslané"}. +{"CPU Time:", "Čas procesoru"}. {"Delete Selected", "Smazat vybrané"}. {"Submit", "Odeslat"}. -{"ejabberd access rules configuration", "Konfigurace pravidel přístupů Ejabberd"}. {"~s access rule configuration", "~s konfigurace pravidla přístupu"}. -{"ejabberd users", "Uživatelé Ejabberd"}. -{"ejabberd stats", "Statistiky Ejabberd"}. {"Node not found", "Uzel nenalezen"}. {"Add New", "Přidat nový"}. -{"Registered users", "Registrovaní uživatelé"}. -{"Online users", "Online uživatelé"}. -{"Outgoing S2S servers", "Servery S2S pro odchozí komunikaci"}. {"Change Password", "Změnit heslo"}. {"Connected Resources:", "Připojené zdroje:"}. {"Password:", "Heslo:"}. {"None", "Nic"}. {"Node ", "Uzel "}. -{"DB Management", "Správa databáze"}. -{"Listened Ports Management", "Správa otevřených portů"}. {"Restart", "Restart"}. {"Stop", "Stop"}. -{"RPC call error", "Chyba RPC volání"}. -{"DB Tables at ", "Databázové tabulky na "}. {"Name", "Jméno"}. {"Storage Type", "Typ úložiště"}. {"Size", "Velikost"}. {"Memory", "Paměť"}. -{"Backup Management at ", "Správa záloh na "}. -{"Store a backup in a file", "Uložit zálohu do souboru "}. {"OK", "OK"}. -{"Restore a backup from a file", "Obnovit zálohu ze souboru"}. -{"Install a database fallback from a file", "Instalovat nouzovou (fallback) databázi ze souboru"}. -{"Dump a database in a text file", "Uložit databázi do textového souboru"}. -{"Restore a database from a text file", "Obnovit databázi z textového souboru"}. {"Listened Ports at ", "Otevřené porty na "}. -{"~p statistics", "~p statistiky"}. -{"Uptime", "Čas běhu"}. -{"CPU Time", "Čas procesoru"}. -{"Transactions commited", "Transakce potvrzena"}. -{"Transactions aborted", "Transakce zrušena"}. -{"Transactions restarted", "Transakce restartována"}. -{"Transactions logged", "Transakce zaznamenána"}. {"Port", "Port"}. {"Module", "Modul"}. {"Options", "Nastavení"}. {"Update", "Aktualizovat"}. {"Delete", "Smazat"}. {"Add User", "Přidat uživatele"}. -{"Offline messages", "Offline zprávy"}. {"Last Activity", "Poslední aktivita"}. {"Never", "Nikdy"}. -{"~s offline messages queue", "~s offline zpráv(y)"}. {"Time", "Čas"}. {"From", "Od"}. {"To", "Pro"}. {"Packet", "Paket"}. -{"Offline messages:", "Offline zprávy:"}. {"Roster", "Seznam kontaktů"}. {"Nickname", "Prezdívka"}. {"Subscription", "Přihlášení"}. {"Pending", "Čekající"}. {"Groups", "Skupiny"}. {"Remove", "Odstranit"}. -{"Add JID", "Přidat JID"}. {"User ", "Uživatel "}. {"Roster of ", "Seznam kontaktů "}. {"Shared Roster", "Sdílený seznam kontaktů"}. {"Online", "Online"}. {"Validate", "Ověřit"}. -{"Not found", "Nenalezeno"}. -{"Shared roster groups", "Skupiny pre sdíelený seznam kontaktů"}. {"Name:", "Jméno:"}. {"Description:", "Popis:"}. {"Members:", "Členové:"}. {"Displayed Groups:", "Zobrazené skupiny:"}. {"Group ", "Skupina "}. -{"Users last activity", "Poslední aktivita uživatele"}. {"Period: ", "Čas:"}. {"Last month", "Poslední měsíc"}. {"Last year", "Poslední rok"}. @@ -265,35 +213,21 @@ {"Show Ordinary Table", "Zobrazit bežnou tabulku"}. {"Show Integral Table", "Zobrazit kompletní tabulku"}. {"Start", "Start"}. -{"Modules Management", "Správa modulů"}. {"Modules at ", "Moduly na "}. -{"No data", "Žádná data"}. {"Virtual Hosts", "Virtuální servery"}. {"ejabberd virtual hosts", "Ejabberd virtuální servery"}. {"Host", "Server"}. {"ejabberd Web Interface", "Ejabberd Web rozhraní"}. % mod_vcard_odbc.erl -{"Erlang Jabber Server\nCopyright (c) 2002-2005 Alexey Shchepin", - "Erlang Jabber Server\nCopyright (c) 2002-2005 Alexey Shchepin"}. {"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)", "Pro vyhledání Jabber uživatele vyplňte formulář (přidejte znak * na konec, pro vyhledání podřetězce)"}. -{"ejabberd vCard module\nCopyright (c) 2003-2005 Alexey Shchepin", "Ejabberd vCard modul\nCopyright (c) 2003-2005 Alexey Shchepin"}. -{"JID", "JID"}. % ejabberd_c2s.erl {"Use of STARTTLS required", "Je vyžadováno STARTTLS."}. {"Replaced by new connection", "Nahrazeno novým spojením"}. -% mod_configure.erl -{"DB Tables Configuration at ", "Databázové tabulky s konfigurácí na "}. - -% mod_vcard_ldap.erl -{"Given Name", "Křestní jméno"}. - % mod_pubsub/mod_pubsub.erl -{"ejabberd pub/sub module\nCopyright (c) 2003-2005 Alexey Shchepin", - "Ejabberd pub/sub modul\nCopyright (c) 2003-2005 Alexey Shchepin"}. {[], " "}. {"Node Creator", "Majitel uzlu"}. {"Deliver payloads with event notifications", "Doručovat náklad s upozorněním na událost"}. @@ -310,27 +244,12 @@ {"Only deliver notifications to available users", "Doručovat upozornení jen aktuálně přihlášeným uživatelům"}. {"Specify the current subscription approver", "Zadat současného schvalovatele přihlášení "}. -% web/ejabberd_web_admin.erl -{"ejabberd (c) 2002-2005 Alexey Shchepin, 2004-2005 Process One", - "Ejabberd (c) 2002-2005 Alexey Shchepin, 2004-2005 Process One"}. -{"(raw)", "(zdroj)"}. -{"raw", "zdroj"}. -{"Authenticated users", "Ověření uživatelé"}. - % mod_irc/mod_irc.erl -{"ejabberd IRC module\nCopyright (c) 2003-2005 Alexey Shchepin", - "Ejabberd IRC module\nCopyright (c) 2003-2005 Alexey Shchepin"}. {"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.", "Pokud chcete zadat jiné kódování pro IRC servery, vyplňte seznam s hodnotami ve formátě '{\"irc server\",\"encoding\"}'. Předvolené kódování pro tuto službu je \"~s\"."}. % mod_muc/mod_muc.erl {"Room creation is denied by service policy", "Vytváranie miestnosti nie je povolené"}. -{"ejabberd MUC module\nCopyright (c) 2003-2005 Alexey Shchepin", "Ejabberd MUC modul\nCopyright (c) 2003-2005 Alexey Shchepin"}. - -% Local Variables: -% mode: erlang -% End: - % /usr/home/src/ejabberd/ejabberd/src/mod_vcard_odbc.erl {"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", @@ -378,7 +297,6 @@ {"ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One", "Ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One"}. {"(Raw)", "(Zdroj)"}. -{"Submitted", "Odeslané"}. {"Bad format", "Nesprávný formát"}. {"Raw", "Zdroj"}. {"Users Last Activity", "Poslední aktivita uživatele"}. @@ -407,7 +325,6 @@ {"Restore plain text backup immediately:", "Okamžitě obnovit zálohu z textového souboru:"}. {"Statistics of ~p", "Statistiky ~p"}. {"Uptime:", "Čas běhu"}. -{"CPU Time:", "Čas procesoru"}. {"Transactions Commited:", "Transakce potvrzena"}. {"Transactions Aborted:", "Transakce zrušena"}. {"Transactions Restarted:", "Transakce restartována"}. @@ -464,7 +381,6 @@ {"Make room public searchable", "Nastavit místnost jako veřejně prohldávatelnou"}. {"Make participants list public", "Nastavit seznam účastníků jako veřejný"}. {"Make room password protected", "Chránit místnost heslem"}. -{"Make room semianonymous", "Nastavit místnost jako částečně anonymní"}. {"Make room members-only", "Nastavit místnost jen pro členy"}. {"Make room moderated", "Nastavit místnost jako moderovanou"}. {"Default users as participants", "Uživatelé jsou implicitně členy"}. @@ -475,3 +391,7 @@ {"Enable logging", "Zapnout ukládání historie"}. {"Description", "Popis"}. {"Number of occupants", "Počet účastníků"}. + +% Local Variables: +% mode: erlang +% End: -- cgit v1.2.3 From b2acdac5fa9e04556bd8dc8812b17de3f55ed895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Mon, 25 Sep 2006 14:30:44 +0000 Subject: * src/msgs/nl.msg: Updated Dutch translation (thanks to Sander Devrieze). SVN Revision: 634 --- src/msgs/nl.msg | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/msgs/nl.msg b/src/msgs/nl.msg index 7b2025b46..4359313b6 100644 --- a/src/msgs/nl.msg +++ b/src/msgs/nl.msg @@ -7,7 +7,6 @@ {"Fill in fields to search for any matching Jabber User", "Vul de velden in om te zoeken naar Jabber-gebruikers op deze server"}. {"User", "Gebruiker"}. {"Full Name", "Volledige naam"}. -{"Given Name", "Voornaam"}. {"Middle Name", "Tussennaam"}. {"Family Name", "Achternaam"}. {"Nickname", "Bijnaam"}. @@ -168,7 +167,6 @@ {"Make room public searchable", "Chatruimte doorzoekbaar maken"}. {"Make participants list public", "Deelnemerslijst publiek maken"}. {"Make room password protected", "Chatruimte beveiligen met een wachtwoord"}. -{"Make room semianonymous", "Chatruimte gedeeltelijk anoniem maken"}. {"Make room members-only", "Chatruimte enkel toegankelijk maken voor leden"}. {"Make room moderated", "Chatruimte gemodereerd maken"}. {"Default users as participants", "Gebruikers standaard instellen als deelnemers"}. @@ -180,6 +178,9 @@ {"You need an x:data capable client to configure room", "U hebt een client nodig die x:data ondersteunt om deze chatruimte in te stellen"}. {"Description", "Beschrijving"}. {"Number of occupants", "Aantal aanwezigen"}. +{"Make real JIDs discovered for", "Jabber ID's kunnen achterhaald worden door"}. +{"moderators only", "moderators"}. +{"anyone", "iedereen"}. % mod_irc/mod_irc.erl {"ejabberd IRC module\nCopyright (c) 2003-2006 Alexey Shchepin", "ejabberd's IRC-module\nCopyright (c) 2003-2006 Alexey Shchepin"}. -- cgit v1.2.3 From 9d7006dfa24d611315a09de3a94d6b473346b809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Mon, 25 Sep 2006 14:41:33 +0000 Subject: * src/msgs/de.msg: Updated German translation (thanks to Marvin Preuss). SVN Revision: 635 --- src/msgs/de.msg | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/msgs/de.msg b/src/msgs/de.msg index 405d54fdc..a482d1fd3 100644 --- a/src/msgs/de.msg +++ b/src/msgs/de.msg @@ -236,9 +236,6 @@ {"Group ", "Gruppe "}. {"ejabberd Web Interface", "ejabberd Web Interface"}. -% mod_vcard_ldap.erl -{"Given Name", "Vorname"}. - % ejabberd_c2s.erl {"Use of STARTTLS required", "Verwendung von STARTTLS erforderlich"}. {"Replaced by new connection", "Durch neue Verbindung ersetzt"}. @@ -352,7 +349,6 @@ {"Make room public searchable", "Raum öffentlich durchsuchbar machen"}. {"Make participants list public", "Teilnehmerliste öffentlich machen"}. {"Make room password protected", "Raum passwortgeschützt machen"}. -{"Make room semianonymous", "Raum semi-anonym machen"}. {"Make room members-only", "Raum members-only machen"}. {"Make room moderated", "Raum modieriert machen"}. {"Default users as participants", "Standartbenutzer als Teilnehmer"}. @@ -363,6 +359,10 @@ {"Enable logging", "Log-Funktion aktivieren"}. {"Description", "Beschreibung"}. {"Number of occupants", "Anzahl der Teilnehmer"}. +{"Make real JIDs discovered for", "Jabber IDs können eingesehen werden +für"}. +{"moderators only", "Nur Moderatoren"}. +{"anyone", "Jeder"}. % Local Variables: % mode: erlang -- cgit v1.2.3 From 37f56859e7e187427fd03d2ca32476d507a102c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Mon, 25 Sep 2006 15:19:09 +0000 Subject: * src/msgs/pl.msg: Updated German translation (thanks to Zbyszek Zolkiewski). SVN Revision: 636 --- src/msgs/pl.msg | 107 ++++++++++---------------------------------------------- 1 file changed, 18 insertions(+), 89 deletions(-) (limited to 'src') diff --git a/src/msgs/pl.msg b/src/msgs/pl.msg index 5dc0e1a1a..e14b53b21 100644 --- a/src/msgs/pl.msg +++ b/src/msgs/pl.msg @@ -43,7 +43,6 @@ {"Configuration", "Konfiguracja"}. {"Online Users", "Użytkownicy zalogowani"}. {"All Users", "Wszyscy użytkownicy"}. -{"Outgoing S2S connections", "Wychodzące połączenia S2S"}. {"To ~s", "Do ~s"}. {"From ~s", "Z ~s"}. {"Running Nodes", "Uruchomione gałęzie"}. @@ -52,12 +51,10 @@ {"Access Control Lists", "Lista dostępowa"}. {"Access Rules", "Zasady dostępu"}. {"Remove Users", "Usuń użytkowników"}. -{"DB", "DB"}. {"Modules", "Moduły"}. {"Start Modules", "Uruchom moduły"}. {"Stop Modules", "Zatrzymaj moduły"}. {"Backup Management", "Zarządzanie kopiami zapasowymi"}. -{"Import users from jabberd1.4 spool files", "Importowanie użytkowników z plikow spoool serwera jabberd1.4"}. {"Backup", "Tworzenie kopii"}. {"Restore", "Odtwarzanie kopii"}. {"Dump to Text File", "Zrzucanie do pliku tekstowego"}. @@ -74,7 +71,6 @@ {"Search users in ", "Wyszukaj użytkowników w "}. {"Fill in fields to search for any matching Jabber User", "Wypełnij pola aby znaleźdź pasujących użytkowników Jabbera"}. -{"Results of search in ", "Wyniki wyszukiwania w "}. {"User", "Użytkownik: "}. {"Full Name", "Pełna nazwa: "}. @@ -85,7 +81,6 @@ {"Birthday", "Data urodzenia: "}. {"Country", "Państwo: "}. {"City", "Miasto: "}. -{"email", "E-Mail: "}. {"Organization Name", "Nazwa organizacji: "}. {"Organization Unit", "Dział: "}. @@ -98,7 +93,6 @@ "Jedynie administrator może wysyłać wiadomości serwisowe"}. {"Conference room does not exist", "Pokój konferencyjny nie istnieje"}. {"Access denied by service policy", "Dostęp zabroniony przez zabezpieczenia serwera"}. -{"You must fill in field \"nick\" in the form", "Musisz wypełnić pole \"nick\" w formularzu"}. {"Specified nickname is already registered", "Podany nick jest już zarejestrowany"}. % mod_muc/mod_muc_room.erl @@ -107,25 +101,7 @@ "Potrzebujesz klienta kompatybilnego z x:data aby skonfigurować pokój"}. {"Configuration for ", "Konfiguracja dla "}. {"Room title", "Tytuł pokoju"}. -{"Allow users to change subject?", "Zezwolić użytkownikom na zmianę tematu?"}. -{"Allow users to query other users?", - "Zezwolić użytkownikom na zapraszanie innych użytkowników?"}. -{"Allow users to send private messages?", - "Zezwolić użytkownikom na wysyłanie prywatnych wiadomości?"}. -{"Make room public searchable?", "Uczynić pokój wyszukiwalnym publicznie?"}. -{"Make participants list public?", "Uczynic obecnych wyszukiwalnymi publicznie?"}. -{"Make room persistent?", "Uczynić pokój trwałym?"}. -{"Make room moderated?", "Uczynić pokój moderowanym?"}. -{"Default users as members?", - "Domyślni użytkownicy jako członkowie?"}. -{"Make room members only?", - "Uczynić pokój tylko dla członków?"}. -{"Allow users to send invites?", - "Pozwolić użytkownikom na wysyłanie zaproszeń?"}. -{"Make room password protected?", "Czy zabezpieczyć pokój hasłem?"}. {"Password", "Hasło"}. -{"Make room anonymous?", "Uczynić pokój anonimowym?"}. -{"Enable logging?", "Włączyć logowanie?"}. {"Only moderators and participants are allowed to change subject in this room", "Tylko moderatorzy i wlasciciele mogą zmienić temat tego pokoju"}. {"Only moderators are allowed to change subject in this room", @@ -160,6 +136,9 @@ {"Invalid role: ~s", "Nieprawidłowa rola: ~s"}. {"Owner privileges required", "Wymagane uprawnienia właściciela "}. {"private, ", "prywatny, "}. +{"Make real JIDs discovered for", "Kto może widzieć prawdziwe JIDy?"}. +{"moderators only", "tylko moderatorzy"}. +{"anyone", "każdy"}. % mod_irc/mod_irc.erl {"You need an x:data capable client to configure mod_irc settings", @@ -173,91 +152,55 @@ {"Encodings", "Kodowania"}. % web/ejabberd_web_admin.erl -{"ejabberd administration", "Administracja serwerem Ejabberd"}. {"Users", "Użytkownicy"}. {"Nodes", "Gałęzie"}. {"Statistics", "Statystyki"}. -{"(raw)", "(raw)"}. -{"submitted", "przesłane"}. -{"bad format", "zły format"}. -{"raw", "raw"}. -{"ejabberd access control lists configuration", "Lista konfiguracyjna dostępu do serwera EJabberd"}. {"Delete Selected", "Usuń zaznaczone"}. {"Submit", "Wprowadź"}. -{"ejabberd access rules configuration", "Konfiguracja zasad dostępu do serwera EJabberd"}. {"~s access rule configuration", "~s konfiguracja zasad dostępu"}. -{"ejabberd users", "Użytkownicy EJabberd"}. -{"ejabberd stats", "Statystyki EJabberd"}. {"Node not found", "Gałąź nie znaleziona"}. {"Add New", "Dodaj nowe"}. -{"Registered users", "Zarejestrowani użytkownicy"}. -{"Online users", "Użytkownicy online"}. -{"Outgoing S2S servers", "Sewery zewnętrzne S2S"}. {"Change Password", "Zmień hasło"}. {"Connected Resources:", "Zasoby podłączone"}. {"Password:", "Hasło:"}. {"None", "Brak"}. {"Node ", "Gałąź "}. -{"DB Management", "Zarządzanie bazą danych"}. -{"Listened Ports Management", "Zarządzanie portami nasłuchującymi"}. {"Restart", "Restart"}. {"Stop", "Stop"}. -{"RPC call error", "Błąd RPC"}. -{"DB Tables at ", "Tabele bazy danych "}. {"Name", "Nazwa"}. {"Storage Type", "Typ bazy"}. {"Size", "Wielkość"}. {"Memory", "Pamięć"}. -{"Backup Management at ", "Zarządzanie kopiami zapasowymi "}. -{"Store a backup in a file", "Zachowaj kopie zapasowa w pliku "}. {"OK", "OK"}. -{"Restore a backup from a file", "Odtwórz kopię zapasową z pliku"}. -{"Install a database fallback from a file", "Przywróć zapisaną kopię z pliku"}. -{"Dump a database in a text file", "Zrzuć bazę danych do pliku tekstowego"}. -{"Restore a database from a text file", "Odtwórz bazę danych z pliku tekstowego"}. {"Listened Ports at ", "Porty nasłuchujące "}. -{"~p statistics", "~p statystyka"}. -{"Uptime", "Uptime"}. -{"CPU Time", "Czas procesora"}. -{"Transactions commited", "Tarnsakcje rozpoczęte"}. -{"Transactions aborted", "Transakcje anulowane"}. -{"Transactions restarted", "Transakcje zrestartowane"}. -{"Transactions logged", "Transakcje logowane"}. {"Port", "Port"}. {"Module", "Moduł"}. {"Options", "Opcje"}. {"Update", "Aktualizacja"}. {"Delete", "Usuń"}. {"Add User", "Dodaj użytkownika"}. -{"Offline messages", "Wiadomości offline"}. {"Last Activity", "Ostatnia aktywność"}. {"Never", "Nigdy"}. -{"~s offline messages queue", "~s wiadomości offline w kolejce"}. {"Time", "Czas"}. {"From", "Od"}. {"To", "Do"}. {"Packet", "Pakiet "}. -{"Offline messages:", "Wiadomości offline: "}. {"Roster", "Roster "}. {"Nickname", "Nick "}. {"Subscription", "Subskrypcja "}. {"Pending", "Oczekiwanie "}. {"Groups", "Grupy "}. {"Remove", "Usuń "}. -{"Add JID", "Dodaj JID "}. {"User ", "Użytkownik "}. {"Roster of ", "Roster "}. {"Shared Roster", "Roster współdzielony"}. {"Online", "Dostępny"}. {"Validate", "Zatwierdź"}. -{"Not found", "Nie znaleziony"}. -{"Shared roster groups", "Grupy rosterów współdzielonych"}. {"Name:", "Nazwa:"}. {"Description:", "Opis:"}. {"Members:", "Członkowie:"}. {"Displayed Groups:", "Wyświetlane grupy:"}. {"Group ", "Grupa "}. -{"Users last activity", "Ostatnia aktywność użytkowników"}. {"Period: ", "Przedział czasu "}. {"Last month", "Ostatni miesiąc"}. {"Last year", "Ostatni rok"}. @@ -265,32 +208,20 @@ {"Show Ordinary Table", "Pokaż zwykłą tabelę"}. {"Show Integral Table", "Pokaż tabelę całkowitą"}. {"Start", "Start"}. -{"Modules Management", "Zarządzanie modułami"}. {"Modules at ", "Moduły na "}. -{"No data", "Brak danych"}. {"Virtual Hosts", "Wirtualne hosty"}. {"ejabberd virtual hosts", "wirtualne hosty ejabberda"}. {"Host", "Host"}. {"ejabberd Web Interface", ""}. % mod_vcard_odbc.erl -{"Erlang Jabber Server\nCopyright (c) 2002-2005 Alexey Shchepin", "Erlang Jabber Server\nCopyright (c) 2002-2005 Alexey Shchepin"}. {"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)", "Wypełnij formularz aby wyszukać pasujących użytkowników Jabbera (dodaj * na koniec pola aby dopasować)"}. -{"ejabberd vCard module\nCopyright (c) 2003-2005 Alexey Shchepin", "ejabberd vCard module\nCopyright (c) 2003-2005 Alexey Shchepin"}. -{"JID", "JID"}. % ejabberd_c2s.erl {"Use of STARTTLS required", "Wymagane użycie STARTTLS"}. {"Replaced by new connection", ""}. -% mod_configure.erl -{"DB Tables Configuration at ", "Konfiguracja tabel bazy dla "}. - -% mod_vcard_ldap.erl -{"Given Name", "Nadana nazwa"}. - % mod_pubsub/mod_pubsub.erl -{"ejabberd pub/sub module\nCopyright (c) 2003-2005 Alexey Shchepin", "ejabberd pub/sub module\nCopyright (c) 2003-2005 Alexey Shchepin"}. {[], " "}. {"Node Creator", "Tworzenie gałęzi"}. {"Deliver payloads with event notifications", "Do?cz zawarto? publikowanego przedmiotu podczas wysy?nia powiadomienia o publikacji"}. @@ -307,31 +238,18 @@ {"Only deliver notifications to available users", "Dostarczaj notyfikacje tylko do osiągalnych użytkowników"}. {"Specify the current subscription approver", "Wyznacz aprobującego obecne subskrypcje "}. -% web/ejabberd_web_admin.erl -{"ejabberd (c) 2002-2005 Alexey Shchepin, 2004-2005 Process One", "ejabberd (c) 2002-2005 Alexey Shchepin, 2004-2005 Process One"}. -{"(raw)", "(raw)"}. -{"raw", "raw"}. -{"Authenticated users", "Użytkownicy zautoryzowani"}. - % mod_irc/mod_irc.erl -{"ejabberd IRC module\nCopyright (c) 2003-2005 Alexey Shchepin", "ejabberd IRC module\nCopyright (c) 2003-2005 Alexey Shchepin"}. {"If you want to specify different encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\"}'. By default this service use \"~s\" encoding.", "Jeśli chcesz ustawić inne kodowanie dla serwerów IRC, wypełnij tą listę wartościami w formacie '{\"irc server\",\"encoding\"}'. Jako domyślne ten serwis używa kodowania \"~s\"."}. % mod_muc/mod_muc.erl {"Room creation is denied by service policy", "Tworzenie pokoju jest zabronione przez polisę"}. -{"ejabberd MUC module\nCopyright (c) 2003-2005 Alexey Shchepin", "ejabberd MUC module\nCopyright (c) 2003-2005 Alexey Shchepin"}. - -% Local Variables: -% mode: erlang -% End: - % /usr/home/src/ejabberd/ejabberd/src/mod_vcard_odbc.erl -{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", ""}. +{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", "Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin"}. {"Email", ""}. -{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", ""}. +{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", "Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin"}. {"Search Results for ", "Wyniki wyszukiwania dla "}. -{"Jabber ID", ""}. +{"Jabber ID", "Jabber ID"}. % /usr/home/src/ejabberd/ejabberd/src/mod_adhoc.erl {"Commands", "Polecenia"}. @@ -450,7 +368,6 @@ {"Make room public searchable", "Pozwól wyszukiwać pokój"}. {"Make participants list public", "Upublicznij listę uczestników"}. {"Make room password protected", "Zabezpiecz pokój hasłem"}. -{"Make room semianonymous", "Utwórz pokój pół-nieznanym"}. {"Make room members-only", "Utwórz pokój tylko dla członków"}. {"Make room moderated", "Moderuj pokój"}. {"Default users as participants", "Domyślni użytkownicy jako uczestnicy"}. @@ -461,3 +378,15 @@ {"Enable logging", "Włącz logowanie"}. {"Description", "Opis"}. {"Number of occupants", "Liczba uczestników"}. + +% mod_vcard_ldap.erl +{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", "Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin"}. +{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", "ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin"}. +{"Jabber ID", "Jabber ID"}. + +% mod_vcard.erl +{"Email", "E-mail"}. + +% Local Variables: +% mode: erlang +% End: -- cgit v1.2.3 From 4646bf818aff80acb3d1c0735fa17c4fa070ea0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Mon, 25 Sep 2006 20:53:55 +0000 Subject: * src/ejabberd.app: Version update for ejabberd 1.1.2. SVN Revision: 638 --- src/ejabberd.app | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/ejabberd.app b/src/ejabberd.app index 234d78819..ea87c9215 100644 --- a/src/ejabberd.app +++ b/src/ejabberd.app @@ -2,7 +2,7 @@ {application, ejabberd, [{description, "ejabberd"}, - {vsn, "1.1.1"}, + {vsn, "1.1.2"}, {modules, [acl, configure, cyrsasl, -- cgit v1.2.3 From 539000bf6248fb3c3591193782755bb218658a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Mon, 25 Sep 2006 22:06:37 +0000 Subject: * src/msgs/de.msg: Updated German translation (thanks to Nikolaus Polak). SVN Revision: 639 --- src/msgs/de.msg | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/msgs/de.msg b/src/msgs/de.msg index a482d1fd3..16853429a 100644 --- a/src/msgs/de.msg +++ b/src/msgs/de.msg @@ -359,10 +359,9 @@ {"Enable logging", "Log-Funktion aktivieren"}. {"Description", "Beschreibung"}. {"Number of occupants", "Anzahl der Teilnehmer"}. -{"Make real JIDs discovered for", "Jabber IDs können eingesehen werden -für"}. -{"moderators only", "Nur Moderatoren"}. -{"anyone", "Jeder"}. +{"Make real JIDs discovered for", "Echte Jabber IDs anzeigen für"}. +{"moderators only", "nur Moderatoren"}. +{"anyone", "jeden"}. % Local Variables: % mode: erlang -- cgit v1.2.3 From d9487135c05bba0f2c77c7a7585f3c49ee735ac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Tue, 26 Sep 2006 10:31:53 +0000 Subject: * src/msgs/pt-br.msg: Updated Brazilian translation (thanks to Renato Botelho) and clean-up. SVN Revision: 640 --- src/msgs/pt-br.msg | 73 +++++------------------------------------------------- 1 file changed, 6 insertions(+), 67 deletions(-) (limited to 'src') diff --git a/src/msgs/pt-br.msg b/src/msgs/pt-br.msg index 371911e44..f63d4cdc7 100644 --- a/src/msgs/pt-br.msg +++ b/src/msgs/pt-br.msg @@ -47,15 +47,12 @@ {"Backup", "Salvar cópia de segurança"}. {"Backup Management", "Gestão de copia de segurança"}. {"Configuration", "Configuração"}. -{"DB", "BD"}. {"Dump to Text File", "Exportar para arquivo de texto"}. {"From ~s", "De ~s"}. {"Import Directory", "Importar diretório"}. {"Import File", "Importar arquivo"}. -{"Import users from jabberd1.4 spool files", "Importar usuários a partir de arquivos da spool do jabberd1.4"}. {"Modules", "Módulos"}. {"Online Users", "Usuários conectados"}. -{"Outgoing S2S connections", "Conexões S2S de saída"}. {"Remove Users", "Remover usuários"}. {"Restore", "Restaurar"}. {"Running Nodes", "Nos em execução"}. @@ -74,7 +71,6 @@ {"City", "Cidade"}. {"Country","País"}. {"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", "Módulo vCard para ejabberd\nCopyright (c) 2002-2006 Alexey Shchepin"}. -{"email", "e-mail"}. {"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", "Servidor Jabber em Erlang\nCopyright (c) 2002-2006 Alexey Shchepin"}. {"Family Name", "Nome de família"}. {"Fill in fields to search for any matching Jabber User", "Preencha os campos para procurar usuários Jabber coincidentes"}. @@ -85,7 +81,6 @@ {"Nickname", "Nick"}. {"Organization Name", "Nome da organização"}. {"Organization Unit", "Unidade da organização"}. -{"Results of search in ", "Resultados da busca em "}. {"Search users in ", "Procurar usuários em "}. {"User", "Usuário"}. {"You need an x:data capable client to search", "Necessitas um cliente com suporte de x:data para poder buscar"}. @@ -110,19 +105,11 @@ {"Whether to allow subscriptions", "Permitir subscrições"}. % mod_muc/mod_muc.erl -{"Allow users to change subject?", "Permitir aos usuários mudar o tópico?"}. -{"Allow users to query other users?", "Permitir aos usuários consultar outros usuários?"}. -{"Allow users to send invites?", "Permitir que os usuários enviem convites?"}. -{"Allow users to send private messages?", "Permitir que os usuários enviem mensagens privadas?"}. -{"Default users as members?", "Os usuários padrão são membros?"}. -{"Enable logging?", "Salvar históricos?"}. {"Access denied by service policy", "Aceso denegado por la política do serviço"}. {"Conference room does not exist", "La sala de conferencias não existe"}. {"ejabberd MUC module\nCopyright (c) 2003-2006 Alexey Shchepin", "Módulo de MUC para ejabbed\nCopyright (c) 2002-2006 Alexey Shchepin"}. {"Enter nickname you want to register", "Introduza o apelido que quer registrar"}. {"Incorrect password", "Senha incorreta"}. -{"Make room anonymous?", "Tornar a sala anônima?"}. -{"Make room password protected?", "Proteger a sala com senha?"}. {"Nickname is already in use by another occupant", "O apelido já está em uso por outro ocupante"}. {"Nickname is registered by another person", "O apelido já está registrado por outra pessoa"}. {"Nickname Registration at ", "Registro do apelido em "}. @@ -131,18 +118,11 @@ {"Password", "Senha"}. {"Room creation is denied by service policy", "Se te a denegado criar la sala por política do serviço"}. {"Specified nickname is already registered", "O apelido especificado já está registrado"}. -{"You must fill in field \"nick\" in the form", "Deve preencher o campo \"apelido\" no formulário"}. {"You need an x:data capable client to register nickname", "Necessitas um cliente com suporte de x:data para poder registrar o nick"}. % mod_muc/mod_muc_room.erl {"Administrator privileges required", "Se necessita privilégios de administrador"}. -{"Allow users to change subject?", "Permitir aos usuários cambiar o assunto"}. -{"Allow users to query other users?", "Permitir aos usuários consultar a outros usuários"}. -{"Allow users to send invites?", "Permitir aos usuários enviar convides"}. -{"Allow users to send private messages?", "Permitir aos usuários enviar mensagens privados"}. {"Configuration for ", "Configuração para "}. -{"Default users as members?", "Os usuários são membros por defeito"}. -{"Enable logging?", "Guardar históricos"}. {" has set the subject to: ", " a posto o assunto: "}. {"Improper message type", "Tipo de mensagem incorreto"}. {"Incorrect password", "Senha incorreta"}. @@ -152,13 +132,6 @@ {"It is not allowed to send private messages of type \"groupchat\"", "No está permitido enviar mensagens privados do tipo \"groupchat\""}. {"It is not allowed to send private messages to the conference", "Impedir o envio de mensagens privados a la sala"}. {"JID ~s is invalid", "O JID ~s não es válido"}. -{"Make participants list public?", "Fazer pública la lista de participantes"}. -{"Make room anonymous?", "Fazer anônima la sala"}. -{"Make room members only?", "Fazer la sala solo para membros"}. -{"Make room moderated?", "Fazer la sala moderada"}. -{"Make room password protected?", "Proteger la sala com senha"}. -{"Make room persistent?", "Fazer la sala permanente"}. -{"Make room public searchable?", "Fazer a sala publicamente visível"}. {"Membership required to enter this room", "Necessitas ser membro de esta sala para poder entrar"}. {"Moderator privileges required", "Se necessita privilégios de moderador"}. {"Nickname is already in use by another occupant", "O nick já está sendo usado por outro ocupante"}. @@ -192,91 +165,57 @@ % web/ejabberd_web_admin.erl -{"Add JID", "Adicionar JID"}. {"Add New", "Adicionar novo"}. {"Add User", "Adicionar usuário"}. {"All activity", "Toda la atividade"}. -{"Backup Management at ", "Gestão de copia de segurança em "}. -{"bad format", "mal formato"}. {"Change Password", "Mudar senha"}. {"Connected Resources:", "Recursos conectados:"}. -{"CPU Time", "Tempo de processador consumido"}. -{"DB Management", "Gestão do BD"}. -{"DB Tables at ", "Tabelas do BD em "}. {"Delete", "Eliminar"}. {"Delete Selected", "Remover os selecionados"}. -{"Dump a database in a text file", "Exportar uma Base de Dados para um arquivo de texto"}. -{"ejabberd access control lists configuration", "Configuração das Listas de Controle de Acesso do ejabberd"}. -{"ejabberd access rules configuration", "Configuração de las Regras de Aceso de ejabberd"}. -{"ejabberd administration", "Administração de ejabberd"}. {"ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One", "ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One"}. -{"ejabberd stats", "Estatísticas de ejabberd"}. -{"ejabberd users", "Usuários do ejabberd"}. {"ejabberd virtual hosts", "Maquinas virtuais de ejabberd"}. {"From", "De"}. {"Group ", "Grupo "}. {"Groups", "Grupos"}. {"Host", "Máquina"}. -{"Install a database fallback from a file", "Instalar uma recuperação de BD a partir de um arquivo"}. -{"JID", "JID"}. {"Last Activity", "Última atividade"}. {"Last month", "Último mês"}. {"Last year", "Último ano"}. {"Listened Ports at ", "Portas de escuta em "}. -{"Listened Ports Management", "Gestão dos portas de escuta"}. {"Members:", "Miembros:"}. {"Memory", "Memória"}. {"Module", "Módulo"}. {"Modules at ", "Módulos em "}. -{"Modules Management", "Gestão de módulos"}. {"Name:", "Nome:"}. {"Name", "Nome"}. {"Never", "Nunca"}. {"Nickname", "Apelido"}. {"Online", "Conectado"}. -{"Online users", "Usuários conectados"}. {"Options", "Opções"}. -{"Outgoing S2S servers", "Servidores conectados"}. {"Packet", "Pacote"}. {"Password:", "Senha:"}. {"Pending", "Pendente"}. {"Period: ", "Período: "}. {"Port", "Porta"}. -{"~p statistics", "Estatísticas de ~p"}. -{"(raw)", "(cru)"}. -{"raw", "cru"}. -{"Registered users", "Usuários registrados"}. {"Remove", "Borrar"}. {"Restart", "Reiniciar"}. -{"Restore a backup from a file", "Recuperar uma cópia de segurança a partir do arquivo"}. -{"Restore a database from a text file", "Restaurar uma Base de Dados a partir de um arquivo de texto"}. {"Roster", "Lista de contatos"}. {"Roster of ", "Lista de contatos de "}. -{"RPC call error", "Erro em la chamada RPC"}. {"~s access rule configuration", "Configuração da Regra de Acesso ~s"}. -{"Shared roster groups", "Grupos compartilhado"}. {"Shared Roster", "Lista de contatos compartilhada"}. {"Show Integral Table", "Mostrar Tabela Integral"}. {"Show Ordinary Table", "Mostrar Tabela Ordinária"}. {"Size", "Tamanho"}. -{"~s offline messages queue", "~s cola de mensagens diferidos"}. {"Start", "Iniciar"}. {"Statistics", "Estatísticas"}. {"Stop", "Parar"}. {"Storage Type", "Tipo de armazenamento"}. -{"Store a backup in a file", "Armazenar uma cópia de segurança no arquivo"}. {"Submit", "Enviar"}. -{"submitted", "enviado"}. {"Subscription", "Subscrição"}. {"Time", "Fecha"}. {"To", "Para"}. -{"Transactions aborted", "Transações abortadas"}. -{"Transactions commited", "Transações realizadas"}. -{"Transactions logged", "Transações armazenadas"}. -{"Transactions restarted", "Transações reiniciadas"}. + {"Update", "Atualizar"}. -{"Uptime", "Tempo de funcionamento"}. -{"Users last activity", "Última atividades dos usuários"}. {"Users", "Usuários"}. {"User ", "Usuário"}. {"Validate", "Validar"}. @@ -288,8 +227,7 @@ % mod_vcard_ldap.erl {"Fill in fields to search for any matching Jabber User", "Preencha campos para buscar usuários Jabber que concordem"}. -{"Given Name", "Nome dado"}. -{"JID", "JID"}. + % mod_adhoc.erl @@ -384,8 +322,6 @@ {"Description:", "Descrição:"}. {"Displayed Groups:", "Grupos Indicados"}. -% mod_irc/mod_irc.erl - % mod_muc/mod_muc_log.erl {"Chatroom configuration modified", "Configuração da sala de bate-papo modificada"}. {"joins the room", "Entrar na sala"}. @@ -424,7 +360,6 @@ {"Make room public searchable", "Tornar sala pública possível de ser encontrada"}. {"Make participants list public", "Tornar pública a lista de participantes"}. {"Make room password protected", "Tornar protegida a senha da sala"}. -{"Make room semianonymous", "Tornar sala semi-anônima"}. {"Make room members-only", "Tornar sala apenas para membros"}. {"Make room moderated", "Tornar a sala moderada"}. {"Default users as participants", "Usuários padrões como participantes"}. @@ -435,6 +370,10 @@ {"Enable logging", "Permitir criação de logs"}. {"Description", "Descrição"}. {"Number of occupants", "Número de participantes"}. +{"Make real JIDs discovered for", "Tornar o JID real visível por"}. +{"moderators only", "apenas moderadores"}. +{"anyone", "qualquer um"}. +{"is now known as", "é agora conhecido como"}. % Local Variables: % mode: erlang -- cgit v1.2.3 From 2a542e9e098349da5044c6fbaebdc73e9b22701f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Tue, 26 Sep 2006 10:48:05 +0000 Subject: * src/mod_muc/mod_muc_room.erl: Minor english update. * src/msgs/pl.msg: Likewise. * src/msgs/uk.msg: Likewise. * src/msgs/pt-br.msg: Likewise. * src/msgs/cs.msg: Likewise. * src/msgs/ru.msg: Likewise. * src/msgs/es.msg: Likewise. * src/msgs/fr.msg: Likewise. * src/msgs/de.msg: Likewise. * src/msgs/nl.msg: Likewise. SVN Revision: 641 --- src/mod_muc/mod_muc_room.erl | 2 +- src/msgs/cs.msg | 2 +- src/msgs/de.msg | 2 +- src/msgs/es.msg | 2 +- src/msgs/fr.msg | 2 +- src/msgs/nl.msg | 2 +- src/msgs/pl.msg | 2 +- src/msgs/pt-br.msg | 2 +- src/msgs/ru.msg | 2 +- src/msgs/uk.msg | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index 911175547..6c4352d17 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc/mod_muc_room.erl @@ -2137,7 +2137,7 @@ get_config(Lang, StateData, From) -> end), {xmlelement, "field", [{"type", "list-single"}, - {"label", translate:translate(Lang, "Make real JIDs discovered for")}, + {"label", translate:translate(Lang, "Present real JIDs to")}, {"var", "muc#roomconfig_whois"}], [{xmlelement, "value", [], [{xmlcdata, if Config#config.anonymous -> diff --git a/src/msgs/cs.msg b/src/msgs/cs.msg index 48eb8c21e..ecfbc5c49 100644 --- a/src/msgs/cs.msg +++ b/src/msgs/cs.msg @@ -139,7 +139,7 @@ {"Invalid role: ~s", "Neplatná role: ~s"}. {"Owner privileges required", "Jsou vyžadována práva vlastníka"}. {"private, ", "soukromá, "}. -{"Make real JIDs discovered for", "Zjisti skutečné JIDy pro"}. +{"Present real JIDs to", "Zjisti skutečné JIDy pro"}. {"moderators only", "pouze pro moderátory"}. {"anyone", "každý"}. diff --git a/src/msgs/de.msg b/src/msgs/de.msg index 16853429a..c47821434 100644 --- a/src/msgs/de.msg +++ b/src/msgs/de.msg @@ -359,7 +359,7 @@ {"Enable logging", "Log-Funktion aktivieren"}. {"Description", "Beschreibung"}. {"Number of occupants", "Anzahl der Teilnehmer"}. -{"Make real JIDs discovered for", "Echte Jabber IDs anzeigen für"}. +{"Present real JIDs to", "Echte Jabber IDs anzeigen für"}. {"moderators only", "nur Moderatoren"}. {"anyone", "jeden"}. diff --git a/src/msgs/es.msg b/src/msgs/es.msg index 92bc47caf..7dfe27b48 100644 --- a/src/msgs/es.msg +++ b/src/msgs/es.msg @@ -169,7 +169,7 @@ {"private, ", "privado"}. {"Description", "Descripción"}. {"Number of occupants", "Número de ocupantes"}. -{"Make real JIDs discovered for", "Los JID reales pueden verlos"}. +{"Present real JIDs to", "Los JID reales pueden verlos"}. {"moderators only", "solo moderadores"}. {"anyone", "cualquiera"}. diff --git a/src/msgs/fr.msg b/src/msgs/fr.msg index ab2c51b6a..f84ab1576 100644 --- a/src/msgs/fr.msg +++ b/src/msgs/fr.msg @@ -222,7 +222,7 @@ {"Enable logging", "Activer l'archivage"}. {"Description", "Description"}. {"Number of occupants", "Nombre d'occupants"}. -{"Make real JIDs discovered for", "Rendre le JID réel visible pour"}. +{"Present real JIDs to", "Rendre le JID réel visible pour"}. {"moderators only", "modérateurs seulement"}. {"anyone", "tout le monde"}. diff --git a/src/msgs/nl.msg b/src/msgs/nl.msg index 4359313b6..c6b87a65e 100644 --- a/src/msgs/nl.msg +++ b/src/msgs/nl.msg @@ -178,7 +178,7 @@ {"You need an x:data capable client to configure room", "U hebt een client nodig die x:data ondersteunt om deze chatruimte in te stellen"}. {"Description", "Beschrijving"}. {"Number of occupants", "Aantal aanwezigen"}. -{"Make real JIDs discovered for", "Jabber ID's kunnen achterhaald worden door"}. +{"Present real JIDs to", "Jabber ID's kunnen achterhaald worden door"}. {"moderators only", "moderators"}. {"anyone", "iedereen"}. diff --git a/src/msgs/pl.msg b/src/msgs/pl.msg index e14b53b21..579008090 100644 --- a/src/msgs/pl.msg +++ b/src/msgs/pl.msg @@ -136,7 +136,7 @@ {"Invalid role: ~s", "Nieprawidłowa rola: ~s"}. {"Owner privileges required", "Wymagane uprawnienia właściciela "}. {"private, ", "prywatny, "}. -{"Make real JIDs discovered for", "Kto może widzieć prawdziwe JIDy?"}. +{"Present real JIDs to", "Kto może widzieć prawdziwe JIDy?"}. {"moderators only", "tylko moderatorzy"}. {"anyone", "każdy"}. diff --git a/src/msgs/pt-br.msg b/src/msgs/pt-br.msg index f63d4cdc7..6cc5f4052 100644 --- a/src/msgs/pt-br.msg +++ b/src/msgs/pt-br.msg @@ -370,7 +370,7 @@ {"Enable logging", "Permitir criação de logs"}. {"Description", "Descrição"}. {"Number of occupants", "Número de participantes"}. -{"Make real JIDs discovered for", "Tornar o JID real visível por"}. +{"Present real JIDs to", "Tornar o JID real visível por"}. {"moderators only", "apenas moderadores"}. {"anyone", "qualquer um"}. {"is now known as", "é agora conhecido como"}. diff --git a/src/msgs/ru.msg b/src/msgs/ru.msg index 03e62cce5..d8a877816 100644 --- a/src/msgs/ru.msg +++ b/src/msgs/ru.msg @@ -211,7 +211,7 @@ "Разрешить пользователям посылать приглашения"}. {"Make room password protected", "Сделать комнату защищённой паролем"}. {"Password", "Пароль"}. -{"Make real JIDs discovered for", "Сделать реальные JID участников видимыми"}. +{"Present real JIDs to", "Сделать реальные JID участников видимыми"}. {"moderators only", "только модераторам"}. {"anyone", "всем участникам"}. {"Enable logging", "Включить журналирование"}. diff --git a/src/msgs/uk.msg b/src/msgs/uk.msg index 580720df2..b14ef23e6 100644 --- a/src/msgs/uk.msg +++ b/src/msgs/uk.msg @@ -210,7 +210,7 @@ "Дозволити користувачам надсилати запрошення"}. {"Make room password protected", "Зробити кімнату захищеною паролем"}. {"Password", "Пароль"}. -{"Make real JIDs discovered for", "Зробити реальні JID учасників видимими"}. +{"Present real JIDs to", "Зробити реальні JID учасників видимими"}. {"moderators only", "тільки модераторам"}. {"anyone", "всім учасникам"}. {"Enable logging", "Включити журнал роботи"}. -- cgit v1.2.3 From 54d05f64bad5a8624a9578704a75d18e6cac4de7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Tue, 26 Sep 2006 11:12:03 +0000 Subject: Improvement coming from trunk (SVN #633): * src/ejabberd_s2s.erl: Added incoming-s2s-number and outgoing-s2s-number ejabberdctl commands SVN Revision: 643 --- src/ejabberd_s2s.erl | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl index f5aac6b8a..9b1177292 100644 --- a/src/ejabberd_s2s.erl +++ b/src/ejabberd_s2s.erl @@ -19,7 +19,9 @@ get_key/1, try_register/1, remove_connection/1, - dirty_get_connections/0]). + dirty_get_connections/0, + ctl_process/2 + ]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, @@ -27,6 +29,7 @@ -include("ejabberd.hrl"). -include("jlib.hrl"). +-include("ejabberd_ctl.hrl"). -record(s2s, {fromto, pid, key}). -record(state, {}). @@ -112,6 +115,10 @@ init([]) -> {attributes, record_info(fields, s2s)}]), mnesia:add_table_copy(s2s, node(), ram_copies), mnesia:subscribe(system), + ejabberd_ctl:register_commands( + [{"incoming-s2s-number", "print number of incoming s2s connections on the node"}, + {"outgoing-s2s-number", "print number of outgoing s2s connections on the node"}], + ?MODULE, ctl_process), {ok, #state{}}. %%-------------------------------------------------------------------- @@ -240,6 +247,17 @@ find_connection(From, To) -> send_element(Pid, El) -> Pid ! {send_element, El}. +ctl_process(_Val, ["incoming-s2s-number"]) -> + N = length(supervisor:which_children(ejabberd_s2s_in_sup)), + io:format("~p~n", [N]), + {stop, ?STATUS_SUCCESS}; +ctl_process(_Val, ["outgoing-s2s-number"]) -> + N = length(supervisor:which_children(ejabberd_s2s_out_sup)), + io:format("~p~n", [N]), + {stop, ?STATUS_SUCCESS}; +ctl_process(Val, _Args) -> + Val. + update_tables() -> case catch mnesia:table_info(s2s, attributes) of [fromto, node, key] -> -- cgit v1.2.3 From 16c2d399e969498d80fe68f77f5c7f51b8149030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20R=C3=A9mond?= Date: Tue, 26 Sep 2006 14:07:35 +0000 Subject: * src/msgs/pl.msg: Updated (thanks to Andrzej Smyk). SVN Revision: 644 --- src/msgs/pl.msg | 53 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/msgs/pl.msg b/src/msgs/pl.msg index 579008090..05dff9f78 100644 --- a/src/msgs/pl.msg +++ b/src/msgs/pl.msg @@ -136,9 +136,10 @@ {"Invalid role: ~s", "Nieprawidłowa rola: ~s"}. {"Owner privileges required", "Wymagane uprawnienia właściciela "}. {"private, ", "prywatny, "}. -{"Present real JIDs to", "Kto może widzieć prawdziwe JIDy?"}. +{"Present real JIDs to", "Kto może widzieć prawdziwe JID-y?"}. {"moderators only", "tylko moderatorzy"}. -{"anyone", "każdy"}. +{"anyone", "wszyscy"}. + % mod_irc/mod_irc.erl {"You need an x:data capable client to configure mod_irc settings", @@ -224,7 +225,7 @@ % mod_pubsub/mod_pubsub.erl {[], " "}. {"Node Creator", "Tworzenie gałęzi"}. -{"Deliver payloads with event notifications", "Do?cz zawarto? publikowanego przedmiotu podczas wysy?nia powiadomienia o publikacji"}. +{"Deliver payloads with event notifications", "Dołącz zawartość publikowanego przedmiotu podczas wysyłania powiadomienia o publikacji"}. {"Notify subscribers when the node configuration changes", "Informuj subskrybentów gdy konfiguracja gałęzi się zmieni"}. {"Notify subscribers when the node is deleted", "Informuj subskrybentów gdy gałąż zostanie wykasowana"}. {"Notify subscribers when items are removed from the node", "Informuj subskrybentów kiedy zostaną z gałęzi usunięte jakieś elementy"}. @@ -233,7 +234,7 @@ {"Whether to allow subscriptions", "Czy pozwolić na subskrypcje"}. {"Specify the subscriber model", "Oznacz model subskrybenta"}. {"Specify the publisher model", "Oznacz model publikującego"}. -{"Max payload size in bytes", "Maksymalna wielko? powiadomienia w bajtach"}. +{"Max payload size in bytes", "Maksymalna wielkość powiadomienia w bajtach"}. {"Send items to new subscribers", "Wysyłaj rzeczy do nowych subskrybentów"}. {"Only deliver notifications to available users", "Dostarczaj notyfikacje tylko do osiągalnych użytkowników"}. {"Specify the current subscription approver", "Wyznacz aprobującego obecne subskrypcje "}. @@ -368,7 +369,7 @@ {"Make room public searchable", "Pozwól wyszukiwać pokój"}. {"Make participants list public", "Upublicznij listę uczestników"}. {"Make room password protected", "Zabezpiecz pokój hasłem"}. -{"Make room members-only", "Utwórz pokój tylko dla członków"}. +{"Make room members-only", "Utwórz pokój tylko dla uczestnikóww"}. {"Make room moderated", "Moderuj pokój"}. {"Default users as participants", "Domyślni użytkownicy jako uczestnicy"}. {"Allow users to change subject", "Pozwól użytkownikom zmienić tytuł pokoju"}. @@ -384,9 +385,41 @@ {"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", "ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin"}. {"Jabber ID", "Jabber ID"}. -% mod_vcard.erl -{"Email", "E-mail"}. +% ./mod_presence.erl +{"You need an x:data capable client to register presence", "Potrzebujesz klinta kompatybilnego z x:data aby zarejestrować widoczność "}. +{"Presence registration at ", "Rejestracja widoczności na "}. +{"What presence features do you want to register?", "Jakie usługi widoczności chcesz zarejestrować?"}. +{"Raw XML", ""}. +{"Specified presence is already registered", "Określona widoczność już jest zarejestrowana"}. +{"You must fill in field \"Xml\" in the form", "Musisz wypełnić w formularzu pole \"XML\""}. +{"You must fill in field \"Icon\" in the form", "Musisz wypełnić w formularzu pole \"Icon\""}. +{"ejabberd presence module\nCopyright (c) 2006 Igor Goryachev", ""}. + +% ./mod_presence/mod_presence.erl +{"Raw XML export", "Eksport XML do raw"}. +{"Allow icon export", "Pozwól na eksport ikon"}. + +% ./mod_stats2file.erl +{"CPUtime", "Czas procesora"}. + +% ./mod_vcard_odbc.erl +{"Erlang Jabber Server\nCopyright (c) 2002-2006 Alexey Shchepin", ""}. +{"Email", ""}. +{"ejabberd vCard module\nCopyright (c) 2003-2006 Alexey Shchepin", ""}. +{"Jabber ID", ""}. + +% ./mod_pubsub/mod_pubsub.erl +{"ejabberd pub/sub module\nCopyright (c) 2003-2006 Alexey Shchepin", ""}. + +% ./web/ejabberd_web_admin.erl +{"ejabberd (c) 2002-2006 Alexey Shchepin, 2004-2006 Process One", ""}. +{"(Raw)", ""}. +{"Raw", ""}. +{"Low level update script", "Skrypt aktualizacyjny niskiego poziomu"}. + +% ./mod_irc/mod_irc.erl +{"ejabberd IRC module\nCopyright (c) 2003-2006 Alexey Shchepin", ""}. + +% ./mod_muc/mod_muc.erl +{"ejabberd MUC module\nCopyright (c) 2003-2006 Alexey Shchepin", ""}. -% Local Variables: -% mode: erlang -% End: -- cgit v1.2.3