diff --git a/src/ejabberd_auth_storage.erl b/src/ejabberd_auth_storage.erl index 8ef8d577d..8556faa2d 100644 --- a/src/ejabberd_auth_storage.erl +++ b/src/ejabberd_auth_storage.erl @@ -448,9 +448,7 @@ remove_user(User, Server, Password) -> {atomic, ok} -> ok; {atomic, Res} -> - Res; - _ -> - bad_request + Res end catch _ -> diff --git a/src/ejabberd_config.erl b/src/ejabberd_config.erl index 582bdc3d2..f4a80025b 100644 --- a/src/ejabberd_config.erl +++ b/src/ejabberd_config.erl @@ -194,9 +194,19 @@ normalize_hosts([Host|Hosts], PrepHosts) -> exit("invalid hostname") end. -ensure_localhost_is_first(["localhost" | _] = Hosts) -> - Hosts; +%% @spec (Hosts::[string()]) -> ["localhost" | string()] ensure_localhost_is_first(Hosts) -> + case lists:all(fun is_list/1, Hosts) of + true -> + ensure_localhost_is_first1(Hosts); + false -> + ?ERROR_MSG("This list of hosts is bad formed:~n~p", [Hosts]), + ensure_localhost_is_first1([]) + end. + +ensure_localhost_is_first1(["localhost" | _] = Hosts) -> + Hosts; +ensure_localhost_is_first1(Hosts) -> case lists:member("localhost", Hosts) of true -> ["localhost" | lists:delete("localhost", Hosts)]; diff --git a/src/ejabberd_hosts.erl b/src/ejabberd_hosts.erl index 18bd04af6..8e85f2851 100644 --- a/src/ejabberd_hosts.erl +++ b/src/ejabberd_hosts.erl @@ -84,13 +84,14 @@ register(Host, Config) when is_list(Host), is_list(Config) -> true = exmpp_stringprep:is_node(Host), ID = get_clusterid(), H = #hosts{host = Host, clusterid = ID, config = Config}, - ok = gen_storage:dirty_write(Host, H), + HostB = list_to_binary(Host), + ok = gen_storage:dirty_write(HostB, H), reload(), ok. %% Updates host configuration update_host_conf(Host, Config) when is_list(Host), is_list(Config) -> - true = jlib:is_nodename(Host), + true = exmpp_stringprep:is_node(Host), case registered(Host) of false -> {error, host_process_not_registered}; true -> @@ -103,8 +104,9 @@ update_host_conf(Host, Config) when is_list(Host), is_list(Config) -> remove(Host) when is_list(Host) -> true = exmpp_stringprep:is_node(Host), ID = get_clusterid(), + HostB = list_to_binary(Host), gen_storage:dirty_delete_where( - Host, hosts, + HostB, hosts, [{'andalso', {'==', clusterid, ID}, {'==', host, Host}}]), @@ -207,7 +209,7 @@ handle_info(timeout, State = #state{state=wait_odbc,backend=Backend,odbc_wait_ti {config, text}]}]), %% Now let's add the default vhost: "localhost" - gen_storage:dirty_write(Host, #hosts{host = Host, + gen_storage:dirty_write(HostB, #hosts{host = Host, clusterid = 1, config = ""}), @@ -371,19 +373,10 @@ stop_host(Host) -> get_hosts(ejabberd) -> ?MYHOSTS; get_hosts(odbc) -> ClusterID = get_clusterid(), - case gen_storage:dirty_select(?MYNAME, hosts, [{'=', clusterid, ClusterID}]) of - Hosts when is_list(Hosts) -> - lists:map(fun (#hosts{host = Host}) -> - case exmpp_stringprep:nameprep(Host) of - error -> - erlang:error({bad_vhost_name, Host}); - Name -> - Name - end - end, Hosts); - E -> - erlang:error({get_hosts_error, E}) - end. + Hosts = gen_storage:dirty_select(?MYNAME, hosts, [{'=', clusterid, ClusterID}]), + lists:map(fun (#hosts{host = Host}) -> + exmpp_stringprep:nameprep(Host) + end, Hosts). %% Retreive the text format config for host Host from ODBC and covert %% it into a {host, Host, Config} tuple. diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index 3bf0439ba..be3a6401f 100644 --- a/src/ejabberd_router.erl +++ b/src/ejabberd_router.erl @@ -205,24 +205,20 @@ delete_balanced_route(LDomain, Pid) -> force_unregister_route(Domain) -> - case jlib:nameprep(Domain) of - error -> - erlang:error({invalid_domain, Domain}); - LDomain -> - F = fun() -> - case mnesia:match_object( - #route{domain = LDomain, - _ = '_'}) of - Rs when is_list(Rs) -> - lists:foreach(fun(R) -> - mnesia:delete_object(R) - end, Rs); - _ -> - ok - end - end, - mnesia:transaction(F) - end. + LDomain = exmpp_stringprep:nameprep(Domain), + F = fun() -> + case mnesia:match_object( + #route{domain = LDomain, + _ = '_'}) of + Rs when is_list(Rs) -> + lists:foreach(fun(R) -> + mnesia:delete_object(R) + end, Rs); + _ -> + ok + end + end, + mnesia:transaction(F). unregister_routes(Domains) -> lists:foreach(fun(Domain) -> diff --git a/src/gen_storage.erl b/src/gen_storage.erl index 299c1e9ab..e7de376f4 100644 --- a/src/gen_storage.erl +++ b/src/gen_storage.erl @@ -61,10 +61,9 @@ behaviour_info(_) -> -spec all_table_hosts(atom()) -> [storage_host()]. all_table_hosts(Tab) -> - mnesia:dirty_select(table, [{#table{host_name = '$1', - _ = '_'}, - [{'=:=', {element, 2, '$1'}, {const, Tab}}], - [{element, 1, '$1'}]}]). + mnesia:dirty_select(table, [{{table, {'$1', '$2'}, '_', '_'}, + [{'=:=', '$2', {const, Tab}}], + ['$1']}]). -spec table_info(storage_host, storage_table, atom()) -> any(). @@ -110,7 +109,7 @@ table_info(Host, Tab, InfoKey) -> %% columndef() defaults to text for all unspecified attributes -spec create_table(atom(), storage_host(), storage_table(), #table{}) -> - {atomic, ok}. + tuple(). create_table(mnesia, Host, Tab, Def) -> MDef = filter_mnesia_tabdef(Def), @@ -123,7 +122,7 @@ create_table(odbc, Host, Tab, Def) -> define_table(gen_storage_odbc, Host, Tab, ODef), gen_storage_odbc:create_table(ODef). --spec define_table(atom(), storage_host(), storage_table(), #table{}) -> +-spec define_table(atom(), storage_host(), storage_table(), #mnesia_def{} | tuple()) -> ok. define_table(Backend, Host, Name, Def) -> mnesia:create_table(table, [{attributes, record_info(fields, table)}]), @@ -131,8 +130,10 @@ define_table(Backend, Host, Name, Def) -> backend = Backend, def = Def}). +%% @spec (#table{}) -> [{atom(), any()}] + -spec filter_mnesia_tabdef(#table{}) -> - [{atom(), any()}]. + [any()]. filter_mnesia_tabdef(TabDef) -> lists:filter(fun filter_mnesia_tabdef_/1, TabDef). @@ -531,7 +532,7 @@ write_lock_table(Host, Tab) -> -spec transaction(storage_host(), storage_table(), fun()) -> - {atomic, any()}. + {atomic, any()} | {aborted, string()}. %% Warning: all tabs touched by the transaction must use the same %% storage backend! transaction(Host, Tab, Fun) -> diff --git a/src/gen_storage_migration.erl b/src/gen_storage_migration.erl index 4531e3e40..d965f7450 100644 --- a/src/gen_storage_migration.erl +++ b/src/gen_storage_migration.erl @@ -4,7 +4,7 @@ -include("ejabberd.hrl"). -%% @spec (Host, Table, Migrations) -> any() +%% @spec (Host::storage_host(), Table::atom(), Migrations) -> any() %% Migrations = [{OldTable, OldAttributes, MigrateFun}] migrate_mnesia(Host, Table, Migrations) -> SameTableName = [Migration @@ -33,14 +33,15 @@ migrate_mnesia(Host, Table, Migrations) -> end, DifferentTableName). migrate_mnesia1(Host, Table, {OldTable, OldAttributes, MigrateFun}) -> + HostB = list_to_binary(Host), case (catch mnesia:table_info(OldTable, attributes)) of OldAttributes -> if Table =:= OldTable -> %% TODO: move into transaction TmpTable = list_to_atom(atom_to_list(Table) ++ "_tmp"), - NewRecordName = gen_storage:table_info(Host, Table, record_name), - NewAttributes = gen_storage:table_info(Host, Table, attributes), + NewRecordName = gen_storage:table_info(HostB, Table, record_name), + NewAttributes = gen_storage:table_info(HostB, Table, attributes), ?INFO_MSG("Migrating mnesia table ~p via ~p~nfrom ~p~nto ~p", [Table, TmpTable, OldAttributes, NewAttributes]), @@ -67,15 +68,15 @@ migrate_mnesia1(Host, Table, {OldTable, OldAttributes, MigrateFun}) -> end, {atomic, ok} = mnesia:transaction(F1), mnesia:delete_table(OldTable), - TableInfo = gen_storage:table_info(Host, Table, all), + TableInfo = gen_storage:table_info(HostB, Table, all), {value, {_, Backend}} = lists:keysearch(backend, 1, TableInfo), - gen_storage:create_table(Backend, Host, Table, TableInfo), + gen_storage:create_table(Backend, HostB, Table, TableInfo), F2 = fun() -> mnesia:write_lock_table(Table), mnesia:foldl( fun(NewRecord, _) -> ?DEBUG("~p-~p: ~p~n",[OldTable, Table, NewRecord]), - gen_storage:write(Host, Table, NewRecord, write) + gen_storage:write(HostB, Table, NewRecord, write) end, ok, TmpTable) end, {atomic, ok} = mnesia:transaction(F2), @@ -93,7 +94,7 @@ migrate_mnesia1(Host, Table, {OldTable, OldAttributes, MigrateFun}) -> ?DEBUG("~p-~p: ~p -> ~p~n",[OldTable, Table, OldRecord, NewRecord]), if is_tuple(NewRecord) -> - gen_storage:write(Host, Table, NewRecord, write); + gen_storage:write(HostB, Table, NewRecord, write); true -> ignored end @@ -142,6 +143,7 @@ migrate_odbc1(Host, Tables, {OldTablesColumns, MigrateFun}) -> migrate_odbc2(Host, Tables, OldTable, OldTables, OldColumns, OldColumnsAll, OldTablesA, ColumnsT, MigrateFun) when ColumnsT == OldColumnsAll -> ?INFO_MSG("Migrating ODBC table ~p to gen_storage tables ~p", [OldTable, Tables]), + HostB = list_to_binary(Host), %% rename old tables to *_old lists:foreach(fun(OldTable1) -> @@ -149,13 +151,12 @@ migrate_odbc2(Host, Tables, OldTable, OldTables, OldColumns, OldColumnsAll, OldT ejabberd_odbc:sql_query_t("alter table " ++ OldTable1 ++ " rename to " ++ OldTable1 ++ "_old") end, OldTables), - HostB = list_to_binary(Host), %% recreate new tables lists:foreach(fun(NewTable) -> case lists:member(NewTable, OldTablesA) of true -> TableInfo = - gen_storage:table_info(Host, NewTable, all), + gen_storage:table_info(HostB, NewTable, all), {value, {_, Backend}} = lists:keysearch(backend, 1, TableInfo), gen_storage:create_table(Backend, HostB, diff --git a/src/mod_offline.erl b/src/mod_offline.erl index d66f9c3eb..99834f04e 100644 --- a/src/mod_offline.erl +++ b/src/mod_offline.erl @@ -325,11 +325,7 @@ find_x_expire(TimeStamp, [#xmlel{ns = ?NS_MESSAGE_EXPIRE} = El | _Els]) -> {'EXIT', _} -> 0; Int when Int > 0 -> - {MegaSecs, Secs, MicroSecs} = TimeStamp, - S = MegaSecs * 1000000 + Secs + Int, - MegaSecs1 = S div 1000000, - Secs1 = S rem 1000000, - {MegaSecs1, Secs1, MicroSecs}; + TimeStamp + Int; _ -> 0 end; @@ -450,11 +446,12 @@ remove_old_messages(Days) -> Timestamp = make_timestamp() - 60 * 60 * 24 * Days, lists:foreach( fun(Host) -> + HostB = list_to_binary(Host), F = fun() -> - gen_storage:delete_where(Host, offline_msg, + gen_storage:delete_where(HostB, offline_msg, [{'<', timestamp, Timestamp}]) end, - {atomic, _} = gen_storage:transaction(Host, offline_msg, F) + {atomic, _} = gen_storage:transaction(HostB, offline_msg, F) end, gen_storage:all_table_hosts(offline_msg)). remove_user(User, Server) when is_binary(User), is_binary(Server) -> @@ -494,8 +491,8 @@ update_table(Host, mnesia) -> Expire1 = case Expire of never -> 0; - {MegaSecs, Secs, _MicroSecs} -> - MegaSecs * 1000000 + Secs + Ts -> + Ts end, PacketXmlel = exmpp_xml:xmlelement_to_xmlel( Packet, [?DEFAULT_NS], ?PREFIXED_NS), @@ -680,8 +677,10 @@ user_queue_parse_query(US, Query) -> us_to_list({User, Server}) -> exmpp_jid:to_list(User, Server). +%% @spec (User::string(), Host::string()) -> integer() get_queue_length(User, Host) -> - gen_storage:dirty_count_records(Host, offline_msg, [{'=', user_host, {User, Host}}]). + HostB = list_to_binary(Host), + gen_storage:dirty_count_records(HostB, offline_msg, [{'=', user_host, {User, Host}}]). get_messages_subset(User, Host, MsgsAll) -> Access = gen_mod:get_module_opt(Host, ?MODULE, access_max_user_messages, diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl index d80e4e7d6..e1b882e72 100644 --- a/src/mod_privacy.erl +++ b/src/mod_privacy.erl @@ -804,6 +804,7 @@ updated_list(_, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% update_tables(Host, mnesia) -> + HostB = list_to_binary(Host), gen_storage_migration:migrate_mnesia( Host, privacy_default_list, [{privacy, [us, default, lists], @@ -821,7 +822,7 @@ update_tables(Host, mnesia) -> match_presence_in = MatchPresenceIn, match_presence_out = MatchPresenceOut}) -> ValueBin = convert_value_to_binary(Value), - gen_storage:write(Host, + gen_storage:write(HostB, #privacy_list_data{user_host = US, name = Name, type = Type, @@ -834,7 +835,7 @@ update_tables(Host, mnesia) -> match_presence_in = MatchPresenceIn, match_presence_out = MatchPresenceOut}) end, List), - gen_storage:write(Host, + gen_storage:write(HostB, #privacy_list{user_host = US, name = Name}) end, Lists), diff --git a/src/mod_roster.erl b/src/mod_roster.erl index 39c8c50b9..a0037151c 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -389,7 +389,7 @@ storageroster_to_roster(#rosteritem{user_host_jid = {U, S, JID} = USJ, (_, R) -> R end, [], Rostergroups), - #roster{usj = {US, JID}, + #roster{usj = {U, S, JID}, us = US, jid = JID, name = convert_to_string(Name), @@ -695,12 +695,8 @@ get_subscription_lists(_, User, Server) try LUser = exmpp_stringprep:nodeprep(User), LServer = exmpp_stringprep:nameprep(Server), - case gen_storage:dirty_select(LServer, rosteritem, [{'=', user_host_jid, {LUser, LServer, '_'}}]) of - Items when is_list(Items) -> - fill_subscription_lists(Items, [], []); - _ -> - {[], []} - end + Items = gen_storage:dirty_select(LServer, rosteritem, [{'=', user_host_jid, {LUser, LServer, '_'}}]), + fill_subscription_lists(Items, [], []) catch _ -> {[], []} @@ -1142,8 +1138,7 @@ get_in_pending_subscriptions(Ls, User, Server) JID = exmpp_jid:make(User, Server), LUser = exmpp_stringprep:nodeprep(User), LServer = exmpp_stringprep:nameprep(Server), - case gen_storage:dirty_select(LServer, rosteritem, [{'=', user_host_jid, {LUser, LServer, '_'}}]) of - Result when is_list(Result) -> + Result = gen_storage:dirty_select(LServer, rosteritem, [{'=', user_host_jid, {LUser, LServer, '_'}}]), Ls ++ lists:map( fun(#rosteritem{user_host_jid = {_, _, RJID}, askmessage = Message}) -> @@ -1169,10 +1164,7 @@ get_in_pending_subscriptions(Ls, User, Server) _ -> false end end, - Result)); - _ -> - Ls - end. + Result)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1235,6 +1227,7 @@ get_jid_info(_, User, Server, JID) %% Only supports migration from ejabberd 1.1.2 or higher. update_table(Host, mnesia) -> + HostB = list_to_binary(Host), gen_storage_migration:migrate_mnesia( Host, rosteritem, [{roster, [usj, us, jid, name, subscription, ask, groups, askmessage, xs], @@ -1250,7 +1243,7 @@ update_table(Host, mnesia) -> lists:foreach( fun(Group) -> Group2 = list_to_binary(Group), - gen_storage:write(Host, + gen_storage:write(HostB, #rostergroup{user_host_jid = USJ1, grp = Group2}) end, Groups), diff --git a/src/mod_vcard.erl b/src/mod_vcard.erl index 344b63566..e090ab112 100644 --- a/src/mod_vcard.erl +++ b/src/mod_vcard.erl @@ -106,18 +106,18 @@ start(Host, Opts) -> {attributes, record_info(fields, vcard_search)}, {types, [{user_host, {text, text}}]}]), update_tables(Host, Backend), - gen_storage:add_table_index(Host, vcard_search, lusername), - gen_storage:add_table_index(Host, vcard_search, lfn), - gen_storage:add_table_index(Host, vcard_search, lfamily), - gen_storage:add_table_index(Host, vcard_search, lgiven), - gen_storage:add_table_index(Host, vcard_search, lmiddle), - gen_storage:add_table_index(Host, vcard_search, lnickname), - gen_storage:add_table_index(Host, vcard_search, lbday), - gen_storage:add_table_index(Host, vcard_search, lctry), - gen_storage:add_table_index(Host, vcard_search, llocality), - gen_storage:add_table_index(Host, vcard_search, lemail), - gen_storage:add_table_index(Host, vcard_search, lorgname), - gen_storage:add_table_index(Host, vcard_search, lorgunit), + gen_storage:add_table_index(HostB, vcard_search, lusername), + gen_storage:add_table_index(HostB, vcard_search, lfn), + gen_storage:add_table_index(HostB, vcard_search, lfamily), + gen_storage:add_table_index(HostB, vcard_search, lgiven), + gen_storage:add_table_index(HostB, vcard_search, lmiddle), + gen_storage:add_table_index(HostB, vcard_search, lnickname), + gen_storage:add_table_index(HostB, vcard_search, lbday), + gen_storage:add_table_index(HostB, vcard_search, lctry), + gen_storage:add_table_index(HostB, vcard_search, llocality), + gen_storage:add_table_index(HostB, vcard_search, lemail), + gen_storage:add_table_index(HostB, vcard_search, lorgname), + gen_storage:add_table_index(HostB, vcard_search, lorgunit), ejabberd_hooks:add(remove_user, HostB, ?MODULE, remove_user, 50), diff --git a/src/sha.erl b/src/sha.erl index 06dd3c2d1..57c675d21 100644 --- a/src/sha.erl +++ b/src/sha.erl @@ -47,7 +47,7 @@ start() -> end, case Res of ok -> - Port = open_port({spawn, ?DRIVER}, [binary]), + Port = open_port({spawn, atom_to_list(?DRIVER)}, [binary]), register(?DRIVER, Port); {error, Reason} -> ?CRITICAL_MSG("unable to load driver '~s': ~s",