ejabberd - Comments for "Ограничение отправки групповых сообщений" https://www.ejabberd.im/node/793 en Все работает, спасибо! https://www.ejabberd.im/node/793#comment-2951 <p>Решил заодно перейти на 1.1.2. Наложил данный патч. Работает прекрасно. </p> <p>Единственное, парочка клиентов сказали, что у них происходило разъединение во время обычного общения.<br /> Возможно это связано с частотой отправки сообщений (не групповых) разным адресатам одним пользователем. </p> <p>В любом случае, спасибо!</p> Sun, 28 Jan 2007 19:02:13 +0000 Citadel comment 2951 at https://www.ejabberd.im Ну, я не https://www.ejabberd.im/node/793#comment-2762 <p>Ну, я не разработчик, а вот мой патч. Кажется, он работает, но попробуйте собственным риском :)</p> <pre> --- orig/src/ejabberd_c2s.erl +++ mod/src/ejabberd_c2s.erl @@ -63,7 +63,8 @@ pres_timestamp, pres_invis = false, privacy_list = none, - lang}). + lang, + last_message = {{0,0,0}, noone, none}}). %when, whom, what %-define(DBGFSM, true). @@ -91,6 +92,13 @@ -define(POLICY_VIOLATION_ERR(Lang, Text), xml:element_to_string(?SERRT_POLICY_VIOLATION(Lang, Text))). +%% Attempt to "disallow" sending group messages. When a user sends +%% two subsequent messages with identical text longer than M bytes and +%% different receivers within less than N seconds, disconnect +%% immediately. Set M and N here: +-define(DONTFLOOD_MIN_SIZE, 10). +-define(DONTFLOOD_INTERVAL, 1). + %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- @@ -816,16 +824,35 @@ end end; "message" -&gt; - ejabberd_hooks:run(user_send_packet, - Server, - [FromJID, ToJID, NewEl]), - ejabberd_router:route(FromJID, ToJID, NewEl), - StateData; + {NewStateData, Flooding} = + check_flooding(StateData, NewEl), + if Flooding -&gt; + flooding; + true -&gt; + ejabberd_hooks:run(user_send_packet, + Server, + [FromJID, ToJID, NewEl]), + ejabberd_router:route(FromJID, ToJID, NewEl), + NewStateData + end; _ -&gt; StateData end end, - {next_state, session_established, NewState}; + case NewState of + flooding -&gt; + ?INFO_MSG("(~w) ~s kicked for flooding", + [StateData#state.socket, + jlib:jid_to_string(StateData#state.jid)]), + send_text(StateData, + ?POLICY_VIOLATION_ERR( + StateData#state.lang, + "Flooding forbidden") ++ + ?STREAM_TRAILER), + {stop, normal, StateData}; + _ -&gt; + {next_state, session_established, NewState} + end; session_established({xmlstreamend, _Name}, StateData) -&gt; send_text(StateData, ?STREAM_TRAILER), @@ -1210,6 +1237,32 @@ send_element(StateData, El) -&gt; send_text(StateData, xml:element_to_string(El)). +check_flooding(StateData, El) -&gt; + %%{NewStateData, Flooding} = + case El of + {xmlelement, "message", _, _} -&gt; + {LastTime, LastReceiver, LastText} = StateData#state.last_message, + %% check time + {LMS, LS, _} = LastTime, + {NMS, NS, _} = now(), + %% check receiver + Receiver = xml:get_tag_attr_s("to", El), + %% check text + Text = xml:get_path_s(El, [{elem, "body"}, cdata]), + {StateData#state{last_message = {now(), Receiver, Text}}, + if NMS &gt; LMS; LS + ?DONTFLOOD_INTERVAL &lt; NS -&gt; + false; + LastReceiver == Receiver -&gt; + false; + Text /= LastText -&gt; + false; + true -&gt; + true + end}; + _ -&gt; + {StateData, false} + end. + new_id() -&gt; randoms:get_string(). </pre> Tue, 19 Dec 2006 13:09:14 +0000 legoscia comment 2762 at https://www.ejabberd.im Как ограничить отправку групповых https://www.ejabberd.im/node/793#comment-2759 <p>Столько времени прошло, а решение так и не найдено... Обидно.<br /> Данная проблема создает много неприятностей.</p> <p>Может все-таки есть у кого-нибудь мысли на этот счет?<br /> Было бы приятно услышать мнение разработчика сервера ejabberd.</p> <p>Заранее спасибо.</p> Tue, 19 Dec 2006 12:05:46 +0000 Citadel comment 2759 at https://www.ejabberd.im Я тоже хочу https://www.ejabberd.im/node/793#comment-2638 <p>Я тоже хочу побороть эту проблему. Но пока никаких результатов.</p> Fri, 01 Dec 2006 13:24:59 +0000 Mr.Cool comment 2638 at https://www.ejabberd.im