aboutsummaryrefslogtreecommitdiff
path: root/src/mod_muc_log.erl
diff options
context:
space:
mode:
authorEvgeny Khramtsov <ekhramtsov@process-one.net>2019-06-14 12:33:26 +0300
committerEvgeny Khramtsov <ekhramtsov@process-one.net>2019-06-14 12:33:26 +0300
commita02cff0e780bb735531594c4ece81e8628f79782 (patch)
tree6fe7d8219d14f58183be1741fcea262c216db447 /src/mod_muc_log.erl
parentReturn jid_malformed error when sending presence without nick to conference (diff)
Use new configuration validator
Diffstat (limited to '')
-rw-r--r--src/mod_muc_log.erl124
1 files changed, 55 insertions, 69 deletions
diff --git a/src/mod_muc_log.erl b/src/mod_muc_log.erl
index 3e4f67247..0e2ff6984 100644
--- a/src/mod_muc_log.erl
+++ b/src/mod_muc_log.erl
@@ -34,7 +34,7 @@
-behaviour(gen_mod).
%% API
--export([start/2, stop/1, reload/3, transform_module_options/1,
+-export([start/2, stop/1, reload/3,
check_access_log/2, add_to_log/5]).
-export([init/1, handle_call/3, handle_cast/2,
@@ -91,14 +91,6 @@ check_access_log(Host, From) ->
Res -> Res
end.
-transform_module_options(Opts) ->
- lists:map(
- fun({top_link, {S1, S2}}) ->
- {top_link, [{S1, S2}]};
- (Opt) ->
- Opt
- end, Opts).
-
depends(_Host, _Opts) ->
[{mod_muc, hard}].
@@ -137,17 +129,17 @@ code_change(_OldVsn, State, _Extra) -> {ok, State}.
%%% Internal functions
%%--------------------------------------------------------------------
init_state(Host, Opts) ->
- OutDir = gen_mod:get_opt(outdir, Opts),
- DirType = gen_mod:get_opt(dirtype, Opts),
- DirName = gen_mod:get_opt(dirname, Opts),
- FileFormat = gen_mod:get_opt(file_format, Opts),
- FilePermissions = gen_mod:get_opt(file_permissions, Opts),
- CSSFile = gen_mod:get_opt(cssfile, Opts),
- AccessLog = gen_mod:get_opt(access_log, Opts),
- Timezone = gen_mod:get_opt(timezone, Opts),
- Top_link = gen_mod:get_opt(top_link, Opts),
- NoFollow = gen_mod:get_opt(spam_prevention, Opts),
- Lang = ejabberd_config:get_lang(Host),
+ OutDir = mod_muc_log_opt:outdir(Opts),
+ DirType = mod_muc_log_opt:dirtype(Opts),
+ DirName = mod_muc_log_opt:dirname(Opts),
+ FileFormat = mod_muc_log_opt:file_format(Opts),
+ FilePermissions = mod_muc_log_opt:file_permissions(Opts),
+ CSSFile = mod_muc_log_opt:cssfile(Opts),
+ AccessLog = mod_muc_log_opt:access_log(Opts),
+ Timezone = mod_muc_log_opt:timezone(Opts),
+ Top_link = mod_muc_log_opt:top_link(Opts),
+ NoFollow = mod_muc_log_opt:spam_prevention(Opts),
+ Lang = ejabberd_option:language(Host),
#logstate{host = Host, out_dir = OutDir,
dir_type = DirType, dir_name = DirName,
file_format = FileFormat, css_file = CSSFile,
@@ -885,26 +877,30 @@ get_room_occupants(RoomJIDString) ->
RoomJID = jid:decode(RoomJIDString),
RoomName = RoomJID#jid.luser,
MucService = RoomJID#jid.lserver,
- StateData = get_room_state(RoomName, MucService),
- [{U#user.jid, U#user.nick, U#user.role}
- || U <- maps:values(StateData#state.users)].
+ case get_room_state(RoomName, MucService) of
+ {ok, StateData} ->
+ [{U#user.jid, U#user.nick, U#user.role}
+ || U <- maps:values(StateData#state.users)];
+ error ->
+ []
+ end.
--spec get_room_state(binary(), binary()) -> mod_muc_room:state().
+-spec get_room_state(binary(), binary()) -> {ok, mod_muc_room:state()} | error.
get_room_state(RoomName, MucService) ->
case mod_muc:find_online_room(RoomName, MucService) of
{ok, RoomPid} ->
- get_room_state(RoomPid);
+ get_room_state(RoomPid);
error ->
- #state{}
+ error
end.
--spec get_room_state(pid()) -> mod_muc_room:state().
+-spec get_room_state(pid()) -> {ok, mod_muc_room:state()} | error.
get_room_state(RoomPid) ->
- {ok, R} = p1_fsm:sync_send_all_state_event(RoomPid,
- get_state),
- R.
+ try p1_fsm:sync_send_all_state_event(RoomPid, get_state)
+ catch _:_ -> error
+ end.
get_proc_name(Host) ->
gen_mod:get_module_proc(Host, ?MODULE).
@@ -929,58 +925,48 @@ has_no_permanent_store_hint(Packet) ->
xmpp:has_subtag(Packet, #hint{type = 'no-permanent-storage'}).
mod_opt_type(access_log) ->
- fun acl:access_rules_validator/1;
+ econf:acl();
mod_opt_type(cssfile) ->
- fun(S) ->
- case str:to_lower(S) of
- <<"http:/", _/binary>> -> {url, misc:try_url(S)};
- <<"https:/", _/binary>> -> {url, misc:try_url(S)};
- _ -> {file, misc:try_read_file(S)}
- end
- end;
+ econf:url_or_file();
mod_opt_type(dirname) ->
- fun (room_jid) -> room_jid;
- (room_name) -> room_name
- end;
+ econf:enum([room_jid, room_name]);
mod_opt_type(dirtype) ->
- fun (subdirs) -> subdirs;
- (plain) -> plain
- end;
+ econf:enum([subdirs, plain]);
mod_opt_type(file_format) ->
- fun (html) -> html;
- (plaintext) -> plaintext
- end;
+ econf:enum([html, plaintext]);
mod_opt_type(file_permissions) ->
- fun (SubOpts) ->
- {proplists:get_value(mode, SubOpts, 644),
- proplists:get_value(group, SubOpts, 33)}
- end;
-mod_opt_type({file_permissions, mode}) ->
- fun(I) when is_integer(I), I>=0 -> I end;
-mod_opt_type({file_permissions, group}) ->
- fun(I) when is_integer(I), I>=0 -> I end;
-mod_opt_type(outdir) -> fun iolist_to_binary/1;
+ econf:and_then(
+ econf:options(
+ #{mode => econf:non_neg_int(),
+ group => econf:non_neg_int()}),
+ fun(Opts) ->
+ {proplists:get_value(mode, Opts, 644),
+ proplists:get_value(group, Opts, 33)}
+ end);
+mod_opt_type(outdir) ->
+ econf:directory(write);
mod_opt_type(spam_prevention) ->
- fun (B) when is_boolean(B) -> B end;
+ econf:bool();
mod_opt_type(timezone) ->
- fun (local) -> local;
- (universal) -> universal
- end;
+ econf:enum([local, universal]);
mod_opt_type(top_link) ->
- fun ([{S1, S2}]) ->
- {iolist_to_binary(S1), iolist_to_binary(S2)}
- end.
-
+ econf:and_then(
+ econf:non_empty(
+ econf:map(econf:binary(), econf:binary())),
+ fun hd/1).
+
+-spec mod_options(binary()) -> [{top_link, {binary(), binary()}} |
+ {file_permissions,
+ {non_neg_integer(), non_neg_integer()}} |
+ {atom(), any()}].
mod_options(_) ->
[{access_log, muc_admin},
- {cssfile, filename:join(misc:css_dir(), "muc.css")},
+ {cssfile, filename:join(misc:css_dir(), <<"muc.css">>)},
{dirname, room_jid},
{dirtype, subdirs},
{file_format, html},
- {file_permissions,
- [{mode, 644},
- {group, 33}]},
+ {file_permissions, {644, 33}},
{outdir, <<"www/muc">>},
{spam_prevention, true},
{timezone, local},
- {top_link, [{<<"/">>, <<"Home">>}]}].
+ {top_link, {<<"/">>, <<"Home">>}}].