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
9 IN: furnace.auth.features.recover-password
11 SYMBOL: lost-password-from
13 : current-host ( -- string )
14 url get host>> host-name or ;
16 : new-password-url ( user -- url )
19 [ username>> "username" set-query-param ]
20 [ ticket>> "ticket" set-query-param ]
22 adjust-url relative-to-request ;
24 : password-email ( user -- email )
26 [ "[ " % current-host % " ] password recovery" % ] "" make >>subject
27 lost-password-from get >>from
28 over email>> 1array >>to
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" %
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" %
38 swap new-password-url present %
45 : send-password-email ( user -- )
46 '[ , password-email send-email ]
47 "E-mail send thread" spawn drop ;
49 : <recover-action-1> ( -- action )
51 { realm "features/recover-password/recover-1" } >>template
55 { "username" [ v-username ] }
56 { "email" [ v-email ] }
57 { "captcha" [ v-captcha ] }
62 "email" value "username" value
67 URL" $realm/recover-2" <redirect>
70 : <recover-action-2> ( -- action )
72 { realm "features/recover-password/recover-2" } >>template ;
74 : <recover-action-3> ( -- action )
78 { "username" [ v-username ] }
79 { "ticket" [ v-required ] }
83 { realm "features/recover-password/recover-3" } >>template
87 { "username" [ v-username ] }
88 { "ticket" [ v-required ] }
89 { "new-password" [ v-password ] }
90 { "verify-password" [ v-password ] }
100 "new-password" value >>encoded-password
103 URL" $realm/recover-4" <redirect>
109 : <recover-action-4> ( -- action )
111 { realm "features/recover-password/recover-4" } >>template ;
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 ;
123 : allow-password-recovery? ( -- ? )
124 realm get responders>> "recover-password" swap key? ;