Guest User

Untitled

a guest
Mar 12th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.47 KB | None | 0 0
  1. diff --git a/src/ejabberd_auth_external.erl b/src/ejabberd_auth_external.erl
  2. index 13dafa7..09c9518 100644
  3. --- a/src/ejabberd_auth_external.erl
  4. +++ b/src/ejabberd_auth_external.erl
  5. @@ -35,6 +35,9 @@
  6. try_register/3,
  7. dirty_get_registered_users/0,
  8. get_vh_registered_users/1,
  9. + get_vh_registered_users/2,
  10. + get_vh_registered_users_number/1,
  11. + get_vh_registered_users_number/2,
  12. get_password/2,
  13. get_password_s/2,
  14. is_user_exists/2,
  15. @@ -43,10 +46,21 @@
  16. plain_password_required/0
  17. ]).
  18.  
  19. +-include("ejabberd.hrl").
  20. +
  21. +-record(passwd, {us, password}).
  22. +
  23. %%%----------------------------------------------------------------------
  24. %%% API
  25. %%%----------------------------------------------------------------------
  26. start(Host) ->
  27. + mnesia:create_table(passwd, [{disc_copies, [node()]},
  28. + {attributes, record_info(fields, passwd)}]),
  29. + update_table(),
  30. + ejabberd_ctl:register_commands(
  31. + Host,
  32. + [{"registered-users", "list all registered users"}],
  33. + ejabberd_auth, ctl_process_get_registered),
  34. extauth:start(
  35. Host, ejabberd_config:get_local_option({extauth_program, Host})),
  36. ok.
  37. @@ -63,27 +77,196 @@ check_password(User, Server, Password, _StreamID, _Digest) ->
  38. set_password(User, Server, Password) ->
  39. extauth:set_password(User, Server, Password).
  40.  
  41. -try_register(_User, _Server, _Password) ->
  42. - {error, not_allowed}.
  43. +try_register(User, Server, Password) ->
  44. + LUser = jlib:nodeprep(User),
  45. + LServer = jlib:nameprep(Server),
  46. + US = {LUser, LServer},
  47. + if
  48. + (LUser == error) or (LServer == error) ->
  49. + {error, invalid_jid};
  50. + true ->
  51. + F = fun() ->
  52. + case mnesia:read({passwd, US}) of
  53. + [] ->
  54. + mnesia:write(#passwd{us = US,
  55. + password = Password}),
  56. + extauth:try_register(User, Server, Password),
  57. + ok;
  58. + [_E] ->
  59. + exists
  60. + end
  61. + end,
  62. + mnesia:transaction(F)
  63. + end.
  64.  
  65. dirty_get_registered_users() ->
  66. - [].
  67. + mnesia:dirty_all_keys(passwd).
  68. +
  69. +get_vh_registered_users(Server) ->
  70. + LServer = jlib:nameprep(Server),
  71. + mnesia:dirty_select(
  72. + passwd,
  73. + [{#passwd{us = '$1', _ = '_'},
  74. + [{'==', {element, 2, '$1'}, LServer}],
  75. + ['$1']}]).
  76. +
  77. +get_vh_registered_users(Server, [{from, Start}, {to, End}])
  78. + when is_integer(Start) and is_integer(End) ->
  79. + get_vh_registered_users(Server, [{limit, End-Start+1}, {offset, Start}]);
  80. +
  81. +get_vh_registered_users(Server, [{limit, Limit}, {offset, Offset}])
  82. + when is_integer(Limit) and is_integer(Offset) ->
  83. + case get_vh_registered_users(Server) of
  84. + [] ->
  85. + [];
  86. + Users ->
  87. + Set = lists:keysort(1, Users),
  88. + L = length(Set),
  89. + Start = if Offset < 1 -> 1;
  90. + Offset > L -> L;
  91. + true -> Offset
  92. + end,
  93. + lists:sublist(Set, Start, Limit)
  94. + end;
  95. +
  96. +get_vh_registered_users(Server, [{prefix, Prefix}])
  97. + when is_list(Prefix) ->
  98. + Set = [{U,S} || {U, S} <- get_vh_registered_users(Server), lists:prefix(Prefix, U)],
  99. + lists:keysort(1, Set);
  100. +
  101. +get_vh_registered_users(Server, [{prefix, Prefix}, {from, Start}, {to, End}])
  102. + when is_list(Prefix) and is_integer(Start) and is_integer(End) ->
  103. + get_vh_registered_users(Server, [{prefix, Prefix}, {limit, End-Start+1}, {offset, Start}]);
  104. +
  105. +get_vh_registered_users(Server, [{prefix, Prefix}, {limit, Limit}, {offset, Offset}])
  106. + when is_list(Prefix) and is_integer(Limit) and is_integer(Offset) ->
  107. + case [{U,S} || {U, S} <- get_vh_registered_users(Server), lists:prefix(Prefix, U)] of
  108. + [] ->
  109. + [];
  110. + Users ->
  111. + Set = lists:keysort(1, Users),
  112. + L = length(Set),
  113. + Start = if Offset < 1 -> 1;
  114. + Offset > L -> L;
  115. + true -> Offset
  116. + end,
  117. + lists:sublist(Set, Start, Limit)
  118. + end;
  119. +
  120. +get_vh_registered_users(Server, _) ->
  121. + get_vh_registered_users(Server).
  122. +
  123. +get_vh_registered_users_number(Server) ->
  124. + Set = get_vh_registered_users(Server),
  125. + length(Set).
  126.  
  127. -get_vh_registered_users(_Server) ->
  128. - [].
  129. +get_vh_registered_users_number(Server, [{prefix, Prefix}]) when is_list(Prefix) ->
  130. + Set = [{U, S} || {U, S} <- get_vh_registered_users(Server), lists:prefix(Prefix, U)],
  131. + length(Set);
  132. +
  133. +get_vh_registered_users_number(Server, _) ->
  134. + get_vh_registered_users_number(Server).
  135.  
  136. -get_password(_User, _Server) ->
  137. - false.
  138. +get_password(User, Server) ->
  139. + LUser = jlib:nodeprep(User),
  140. + LServer = jlib:nameprep(Server),
  141. + US = {LUser, LServer},
  142. + case catch mnesia:dirty_read(passwd, US) of
  143. + [#passwd{password = Password}] ->
  144. + Password;
  145. + _ ->
  146. + false
  147. + end.
  148.  
  149. -get_password_s(_User, _Server) ->
  150. - "".
  151. +get_password_s(User, Server) ->
  152. + LUser = jlib:nodeprep(User),
  153. + LServer = jlib:nameprep(Server),
  154. + US = {LUser, LServer},
  155. + case catch mnesia:dirty_read(passwd, US) of
  156. + [#passwd{password = Password}] ->
  157. + Password;
  158. + _ ->
  159. + []
  160. + end.
  161.  
  162. is_user_exists(User, Server) ->
  163. extauth:is_user_exists(User, Server).
  164.  
  165. -remove_user(_User, _Server) ->
  166. - {error, not_allowed}.
  167. +remove_user(User, Server) ->
  168. + LUser = jlib:nodeprep(User),
  169. + LServer = jlib:nameprep(Server),
  170. + US = {LUser, LServer},
  171. + F = fun() ->
  172. + mnesia:delete({passwd, US})
  173. + end,
  174. + mnesia:transaction(F),
  175. + ejabberd_hooks:run(remove_user, LServer, [User, Server]),
  176. + extauth:remove_user(User, Server).
  177.  
  178. -remove_user(_User, _Server, _Password) ->
  179. - not_allowed.
  180. +remove_user(User, Server, Password) ->
  181. + LUser = jlib:nodeprep(User),
  182. + LServer = jlib:nameprep(Server),
  183. + US = {LUser, LServer},
  184. + F = fun() ->
  185. + case mnesia:read({passwd, US}) of
  186. + [#passwd{password = Password}] ->
  187. + mnesia:delete({passwd, US}),
  188. + ok;
  189. + [_] ->
  190. + not_allowed;
  191. + _ ->
  192. + not_exists
  193. + end
  194. + end,
  195. + case mnesia:transaction(F) of
  196. + {atomic, ok} ->
  197. + ejabberd_hooks:run(remove_user, LServer, [User, Server]),
  198. + extauth:remove_user(User, Server, Password),
  199. + ok;
  200. + {atomic, Res} ->
  201. + Res;
  202. + _ ->
  203. + bad_request
  204. + end.
  205.  
  206. +update_table() ->
  207. + Fields = record_info(fields, passwd),
  208. + case mnesia:table_info(passwd, attributes) of
  209. + Fields ->
  210. + ok;
  211. + [user, password] ->
  212. + ?INFO_MSG("Converting passwd table from "
  213. + "{user, password} format", []),
  214. + Host = ?MYNAME,
  215. + {atomic, ok} = mnesia:create_table(
  216. + ejabberd_auth_internal_tmp_table,
  217. + [{disc_only_copies, [node()]},
  218. + {type, bag},
  219. + {local_content, true},
  220. + {record_name, passwd},
  221. + {attributes, record_info(fields, passwd)}]),
  222. + mnesia:transform_table(passwd, ignore, Fields),
  223. + F1 = fun() ->
  224. + mnesia:write_lock_table(ejabberd_auth_internal_tmp_table),
  225. + mnesia:foldl(
  226. + fun(#passwd{us = U} = R, _) ->
  227. + mnesia:dirty_write(
  228. + ejabberd_auth_internal_tmp_table,
  229. + R#passwd{us = {U, Host}})
  230. + end, ok, passwd)
  231. + end,
  232. + mnesia:transaction(F1),
  233. + mnesia:clear_table(passwd),
  234. + F2 = fun() ->
  235. + mnesia:write_lock_table(passwd),
  236. + mnesia:foldl(
  237. + fun(R, _) ->
  238. + mnesia:dirty_write(R)
  239. + end, ok, ejabberd_auth_internal_tmp_table)
  240. + end,
  241. + mnesia:transaction(F2),
  242. + mnesia:delete_table(ejabberd_auth_internal_tmp_table);
  243. + _ ->
  244. + ?INFO_MSG("Recreating passwd table", []),
  245. + mnesia:transform_table(passwd, ignore, Fields)
  246. + end.
  247. \ No newline at end of file
  248. diff --git a/src/extauth.erl b/src/extauth.erl
  249. index b84546d..0188d4c 100644
  250. --- a/src/extauth.erl
  251. +++ b/src/extauth.erl
  252. @@ -27,8 +27,15 @@
  253. -module(extauth).
  254. -author('leifj@it.su.se').
  255.  
  256. --export([start/2, stop/1, init/2,
  257. - check_password/3, set_password/3, is_user_exists/2]).
  258. +-export([start/2,
  259. + stop/1,
  260. + init/2,
  261. + check_password/3,
  262. + set_password/3,
  263. + try_register/3,
  264. + remove_user/2,
  265. + remove_user/3,
  266. + is_user_exists/2]).
  267.  
  268.  
  269. start(Host, ExtPrg) ->
  270. @@ -51,6 +58,15 @@ is_user_exists(User, Server) ->
  271.  
  272. set_password(User, Server, Password) ->
  273. call_port(Server, ["setpass", User, Server, Password]).
  274. +
  275. +try_register(User, Server, Password) ->
  276. + call_port(Server, ["tryregister", User, Server, Password]).
  277. +
  278. +remove_user(User, Server) ->
  279. + call_port(Server, ["removeuser", User, Server]).
  280. +
  281. +remove_user(User, Server, Password) ->
  282. + call_port(Server, ["removeuser", User, Server, Password]).
  283.  
  284. call_port(Server, Msg) ->
  285. LServer = jlib:nameprep(Server),
Add Comment
Please, Sign In to add comment