diff options
Diffstat (limited to 'src/extauth.erl')
-rw-r--r-- | src/extauth.erl | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/extauth.erl b/src/extauth.erl new file mode 100644 index 000000000..a7ac59fae --- /dev/null +++ b/src/extauth.erl @@ -0,0 +1,76 @@ +%%%---------------------------------------------------------------------- +%%% File : extauth.erl +%%% Author : Leif Johansson <leifj@it.su.se> +%%% Purpose : External authentication using a simple port-driver +%%% Created : 30 Jul 2004 by Leif Johansson <leifj@it.su.se> +%%% Id : $Id$ +%%%---------------------------------------------------------------------- + +-module(extauth). +-author('leifj@it.su.se'). + +-export([start/1, stop/0, init/1, + check_password/2, set_password/2, is_user_exists/1 ]). + + +start(ExtPrg) -> + spawn(?MODULE, init, [ExtPrg]). + +init(ExtPrg) -> + register(eauth,self()), + process_flag(trap_exit,true), + Port = open_port({spawn, ExtPrg}, [{packet,2}]), + loop(Port). + +stop() -> + eauth ! stop. + +check_password(User,Password) -> + call_port(["auth",User,Password]). + +is_user_exists(User) -> + call_port(["isuser",User]). + +set_password(User,Password) -> + call_port(["setpass",User,Password]). + +call_port(Msg) -> + eauth ! {call, self(), Msg}, + receive + {eauth,Result}-> + Result + end. + +loop(Port) -> + receive + {call, Caller, Msg} -> + Port ! {self(), {command, encode(Msg)}}, + receive + {Port, {data, Data}} -> + Caller ! {eauth, decode(Data)} + end, + loop(Port); + stop -> + Port ! {self(), close}, + receive + {Port, closed} -> + exit(normal) + end; + {'EXIT', Port, Reason} -> + io:format("~p ~n", [Reason]), + exit(port_terminated) + end. + +join(List, Sep) -> + lists:foldl(fun(A, "") -> A; + (A, Acc) -> Acc ++ Sep ++ A + end, "", List). + +encode(L) -> + join(L,":"). + +decode([0,0]) -> + false; +decode([0,1]) -> + true. + |