1:- module(login_register, []).

Registration module for identity

/

    6:- use_module(library(http/http_dispatch)).    7:- use_module(library(http/html_write)).    8:- use_module(library(identity/login_page)).    9:- use_module(library(http/http_client)).   10:- use_module(library(http/http_path)).   11:- use_module(library(identity/login_crypto)).   12:- use_module(library(identity/login_database)).   13:- use_module(library(identity/customize)).   14:- use_module(library(identity/login_validate)).   15
   16:- http_handler(login(register), register_form_handler, [id(register), priority(-100)]).   17
   18
   19register_form_handler(_Request) :-
   20    setting(identity:style, Style),
   21    reply_html_page(
   22        Style,
   23        title(\local('Register')),
   24        \register_body).
   25
   26register_body -->
   27    html(div([
   28             h1(\local('Register')),
   29             div(\register_form)
   30             ])).
   31
   32register_form -->
   33    html(
   34        form([method('POST'), action(location_by_id(doregister))],
   35             [
   36                 div(\login_warning),
   37                 \login_hidden_referer,
   38                 div([id(emailwarn), class(warning)], &(nbsp)),
   39                 div([label(for(email), \local('Email:')), \login_email]),
   40                 div([id(unamewarn), class(warning)], &(nbsp)),
   41                 div([label(for(uname), \local('User name:')),
   42                            \register_user_name_field]),
   43                 div([id(passwdwarn), class(warning)], &(nbsp)),
   44                 div([label(for(passwd), \local('Password:')),
   45                      \register_password_field]),
   46                 div([id(passwd2warn), class(warning)], \local('Field below must match password')),
   47                 div([label(for(passwd2), \local('Repeat Password:')),
   48                      \register_password2_field]),
   49                 \login_submit_register,
   50                 \validate_js
   51             ])).
   52
   53login_submit_register -->
   54    html(input([type(submit),
   55                name(submit),
   56                value('Register')])).
   57
   58register_user_name_field -->
   59    html(input([type(text),
   60                name(uname),
   61                placeholder('User Name'),
   62                oninput('doValidation(this)'),
   63                required])).
   64
   65register_password_field -->
   66    { local('Password', Placeholder) },
   67    html(input([type(password),
   68                name(passwd),
   69                id(passwd),
   70                placeholder(Placeholder),
   71                oninput('doValidation(this)'),
   72               required])).
   73
   74login_email -->
   75    { local('Email', Email) },
   76    html(input([type(email),
   77                name(email),
   78                placeholder(Email),
   79                oninput('doValidation(this)'),
   80                required])).
   81
   82register_password2_field -->
   83    { local('Repeat Password', RP) },
   84    html(input([type(password),
   85                name(passwd2),
   86                id(passwd2),
   87                placeholder(RP),
   88                oninput('doValidation(this)'),
   89               required])).
   90
   91
   92		 /*******************************
   93		  *         doregister          *
   94		  *  handle register form data  *
   95		 *******************************/
   96
   97:- http_handler(login(doregister), doregister_handler, [id(doregister), identity(guest), priority(-100)]).   98
   99
  100doregister_handler(Request) :-
  101        member(method(post), Request),
  102        http_read_data(Request, Data, []),
  103        member(uname=UserName, Data),
  104        member(passwd=Password, Data),
  105        member(passwd2=Password2, Data),
  106        member(email=Email, Data),
  107        validate(ok, [uname=UserName,
  108                  passwd=Password,
  109                  passwd2=[Password, Password2],
  110                  email=Email],
  111                 Status),
  112        (   member(referer=SendUserTo, Data) ;
  113            http_location_by_id(home, SendUserTo) % TEST this
  114        ),
  115        (   Status == ok
  116        ->
  117            add_user(UserName,
  118                 Password,
  119                 Email
  120                 ),
  121            do_actual_login(ok, SendUserTo, UserName, Request)
  122        ;
  123           www_form_encode(Status, URLStatus),
  124           http_location_by_id(register, RegisterPage),
  125            format('Status: 302 Found~n'),
  126            format('Location: ~w?warn=~w~n', [RegisterPage, URLStatus]),
  127            format('Content-type: text/plain~n~n')
  128        ).
  129
  130validate(MyStatus, [passwd2=[P,P] | Rest], Status) :-
  131    validate(MyStatus, Rest, Status).
  132validate(MyStatus, [passwd2=[P1,P2] | Rest], Status) :-
  133    P1 \= P2,
  134    atom_concat(MyStatus, 'Passwords Differ~n', NewStatus),
  135    validate(NewStatus, Rest, Status).
  136
  137validate(Status, [], Status).
  138validate(ok, [FieldName=Value | Rest], Status) :-
  139    valid(FieldName=Value, MyStatus),
  140    validate(MyStatus, Rest, Status).
  141validate(OldStatus, [FieldName=Value | Rest], Status) :-
  142    valid(FieldName=Value, ok),
  143    validate(OldStatus, Rest, Status).
  144validate(OldStatus, [FieldName=Value | Rest], Status) :-
  145    valid(FieldName=Value, ThisStatus),
  146    atomic_list_concat([OldStatus, ' ', ThisStatus], NewStatus),
  147    validate(NewStatus, Rest, Status).
  148
  149/*
  150        Status = ok,  %  TODO make this work probably with a throw
  151        www_form_encode(Status, URLStatus),
  152        (   Status = ok
  153        ->
  154
  155            make_login_cookie(UserName, Cookie),
  156            format('Status: 302 Found~n'),
  157            format('Location: ~w~n', [SendUserTo]),
  158            % session cookie, lives until browser exits
  159            % however the cookie itself contains an expiry
  160            % as well
  161            format('Set-Cookie: login=~w; Path=/~n', [Cookie]),
  162            format('Content-type: text/plain~n~n')
  163        ;
  164            http_location_by_id(register, RegisterPage),
  165            format('Status: 302 Found~n'),
  166            format('Location: ~w?warn=~w~n', [RegisterPage, URLStatus]),
  167            format('Content-type: text/plain~n~n')
  168        ).
  169*/