]> gitweb.factorcode.org Git - factor.git/blob - basis/furnace/auth/features/recover-password/recover-password.factor
77915f10831c8d1cbee20a5b983dd46be5e994e6
[factor.git] / basis / furnace / auth / features / recover-password / recover-password.factor
1 ! Copyright (c) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: namespaces accessors kernel assocs arrays io.sockets threads
4 fry urls smtp validators html.forms present
5 http http.server.responses http.server.redirection
6 http.server.dispatchers
7 furnace furnace.actions furnace.auth furnace.auth.providers
8 furnace.redirection ;
9 IN: furnace.auth.features.recover-password
10
11 SYMBOL: lost-password-from
12
13 : current-host ( -- string )
14     url get host>> host-name or ;
15
16 : new-password-url ( user -- url )
17     URL" recover-3" clone
18         swap
19         [ username>> "username" set-query-param ]
20         [ ticket>> "ticket" set-query-param ]
21         bi
22     adjust-url relative-to-request ;
23
24 : password-email ( user -- email )
25     <email>
26         [ "[ " % current-host % " ] password recovery" % ] "" make >>subject
27         lost-password-from get >>from
28         over email>> 1array >>to
29         [
30             "This e-mail was sent by the application server on " % current-host % "\n" %
31             "because somebody, maybe you, clicked on a ``recover password'' link in the\n" %
32             "login form, and requested a new password for the user named ``" %
33             over username>> % "''.\n" %
34             "\n" %
35             "If you believe that this request was legitimate, you may click the below link in\n" %
36             "your browser to set a new password for your account:\n" %
37             "\n" %
38             swap new-password-url present %
39             "\n\n" %
40             "Love,\n" %
41             "\n" %
42             "  FactorBot\n" %
43         ] "" make >>body ;
44
45 : send-password-email ( user -- )
46     '[ , password-email send-email ]
47     "E-mail send thread" spawn drop ;
48
49 : <recover-action-1> ( -- action )
50     <page-action>
51         { realm "features/recover-password/recover-1" } >>template
52
53         [
54             {
55                 { "username" [ v-username ] }
56                 { "email" [ v-email ] }
57                 { "captcha" [ v-captcha ] }
58             } validate-params
59         ] >>validate
60
61         [
62             "email" value "username" value
63             users issue-ticket [
64                 send-password-email
65             ] when*
66
67             URL" $realm/recover-2" <redirect>
68         ] >>submit ;
69
70 : <recover-action-2> ( -- action )
71     <page-action>
72         { realm "features/recover-password/recover-2" } >>template ;
73
74 : <recover-action-3> ( -- action )
75     <page-action>
76         [
77             {
78                 { "username" [ v-username ] }
79                 { "ticket" [ v-required ] }
80             } validate-params
81         ] >>init
82
83         { realm "features/recover-password/recover-3" } >>template
84
85         [
86             {
87                 { "username" [ v-username ] }
88                 { "ticket" [ v-required ] }
89                 { "new-password" [ v-password ] }
90                 { "verify-password" [ v-password ] }
91             } validate-params
92
93             same-password-twice
94         ] >>validate
95
96         [
97             "ticket" value
98             "username" value
99             users claim-ticket [
100                 "new-password" value >>encoded-password
101                 users update-user
102
103                 URL" $realm/recover-4" <redirect>
104             ] [
105                 <403>
106             ] if*
107         ] >>submit ;
108
109 : <recover-action-4> ( -- action )
110     <page-action>
111         { realm "features/recover-password/recover-4" } >>template ;
112
113 : allow-password-recovery ( login -- login )
114     <recover-action-1> <auth-boilerplate>
115         "recover-password" add-responder
116     <recover-action-2> <auth-boilerplate>
117         "recover-2" add-responder
118     <recover-action-3> <auth-boilerplate>
119         "recover-3" add-responder
120     <recover-action-4> <auth-boilerplate>
121         "recover-4" add-responder ;
122
123 : allow-password-recovery? ( -- ? )
124     realm get responders>> "recover-password" swap key? ;