factor/extra/http/server/sessions/sessions.factor

131 lines
3.6 KiB
Factor
Raw Normal View History

2008-02-29 01:57:38 -05:00
! Copyright (C) 2008 Doug Coleman, Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: assocs calendar kernel math.parser namespaces random
2008-03-15 07:22:47 -04:00
new-slots accessors http http.server
http.server.sessions.storage http.server.sessions.storage.assoc
quotations hashtables sequences fry combinators.cleave
2008-03-15 07:22:47 -04:00
html.elements symbols continuations destructors ;
2008-02-29 01:57:38 -05:00
IN: http.server.sessions
! ! ! ! ! !
! WARNING: this session manager is vulnerable to XSRF attacks
! ! ! ! ! !
2008-03-11 04:39:09 -04:00
GENERIC: init-session* ( responder -- )
2008-03-03 03:19:36 -05:00
2008-03-11 04:39:09 -04:00
M: dispatcher init-session* drop ;
2008-03-03 03:19:36 -05:00
TUPLE: session-manager responder sessions ;
2008-02-29 01:57:38 -05:00
: <session-manager> ( responder class -- responder' )
2008-03-15 07:22:47 -04:00
>r <sessions-in-memory> session-manager construct-boa
r> construct-delegate ; inline
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
SYMBOLS: session session-id session-changed? ;
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
: sget ( key -- value )
session get at ;
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
: sset ( value key -- )
session get set-at
session-changed? on ;
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
: schange ( key quot -- )
session get swap change-at
session-changed? on ; inline
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
: sessions session-manager get sessions>> ;
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
: managed-responder session-manager get responder>> ;
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
: init-session ( managed -- session )
H{ } clone [ session [ init-session* ] with-variable ] keep ;
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
: begin-session ( responder -- id session )
[ responder>> init-session ] [ sessions>> ] bi
[ new-session ] [ drop ] 2bi ;
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
! Destructor
TUPLE: session-saver id session ;
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
C: <session-saver> session-saver
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
M: session-saver dispose
session-changed? get [
[ session>> ] [ id>> ] bi
sessions update-session
] [ drop ] if ;
2008-03-11 04:39:09 -04:00
2008-03-15 07:22:47 -04:00
: call-responder/session ( path responder id session -- response )
[ <session-saver> add-always-destructor ]
[ [ session-id set ] [ session set ] bi* ] 2bi
[ session-manager set ] [ responder>> call-responder ] bi ;
2008-02-29 01:57:38 -05:00
2008-03-11 04:39:09 -04:00
TUPLE: null-sessions ;
: <null-sessions>
null-sessions <session-manager> ;
M: null-sessions call-responder ( path responder -- response )
2008-03-15 07:22:47 -04:00
H{ } clone f call-responder/session ;
2008-03-11 04:39:09 -04:00
2008-02-29 01:57:38 -05:00
TUPLE: url-sessions ;
: <url-sessions> ( responder -- responder' )
url-sessions <session-manager> ;
2008-03-15 07:22:47 -04:00
: session-id-key "factorsessid" ;
2008-02-29 01:57:38 -05:00
2008-03-15 07:22:47 -04:00
: current-url-session ( responder -- id/f session/f )
[ request-params session-id-key swap at ] [ sessions>> ] bi*
[ drop ] [ get-session ] 2bi ;
: add-session-id ( query -- query' )
2008-03-15 07:22:47 -04:00
session-id get [ session-id-key associate union ] when* ;
: session-form-field ( -- )
<input
2008-03-15 07:22:47 -04:00
"hidden" =type
session-id-key =id
session-id-key =name
session-id get =value
input/> ;
2008-03-11 04:39:09 -04:00
2008-03-15 07:22:47 -04:00
: new-url-session ( responder -- response )
[ f ] [ begin-session drop session-id-key associate ] bi*
<temporary-redirect> ;
2008-03-11 04:39:09 -04:00
M: url-sessions call-responder ( path responder -- response )
[ add-session-id ] link-hook set
[ session-form-field ] form-hook set
2008-03-15 07:22:47 -04:00
dup current-url-session dup [
2008-02-29 01:57:38 -05:00
call-responder/session
] [
2008-03-15 07:22:47 -04:00
2drop nip new-url-session
] if ;
2008-02-29 01:57:38 -05:00
TUPLE: cookie-sessions ;
: <cookie-sessions> ( responder -- responder' )
cookie-sessions <session-manager> ;
2008-03-15 07:22:47 -04:00
: current-cookie-session ( responder -- id namespace/f )
request get session-id-key get-cookie dup
[ value>> dup rot sessions>> get-session ] [ 2drop f f ] if ;
2008-02-29 01:57:38 -05:00
: <session-cookie> ( id -- cookie )
2008-03-15 07:22:47 -04:00
session-id-key <cookie> ;
: call-responder/new-session ( path responder -- response )
dup begin-session
[ call-responder/session ]
[ drop <session-cookie> ] 2bi
put-cookie ;
2008-02-29 01:57:38 -05:00
2008-03-11 04:39:09 -04:00
M: cookie-sessions call-responder ( path responder -- response )
2008-03-15 07:22:47 -04:00
dup current-cookie-session dup [
2008-02-29 01:57:38 -05:00
call-responder/session
] [
2008-03-15 07:22:47 -04:00
2drop call-responder/new-session
] if ;