factor/basis/furnace/sessions/sessions.factor

113 lines
3.1 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.
2008-04-29 06:58:34 -04:00
USING: assocs kernel math.intervals math.parser namespaces
2008-11-24 21:26:11 -05:00
strings random accessors quotations hashtables sequences
continuations fry calendar combinators combinators.short-circuit
2008-11-30 16:13:30 -05:00
destructors alarms io.sockets db db.tuples db.types
2008-06-02 16:00:03 -04:00
http http.server http.server.dispatchers http.server.filters
furnace.cache furnace.scopes furnace.utilities ;
IN: furnace.sessions
2008-02-29 01:57:38 -05:00
TUPLE: session < scope user-agent client ;
2008-04-26 02:44:45 -04:00
: <session> ( id -- session )
session new-server-state ;
2008-04-26 02:44:45 -04:00
2008-04-29 06:58:34 -04:00
session "SESSIONS"
{
{ "user-agent" "USER_AGENT" TEXT +not-null+ }
{ "client" "CLIENT" TEXT +not-null+ }
2008-04-29 06:58:34 -04:00
} define-persistent
: get-session ( id -- session )
dup [ session get-state ] when ;
2008-04-29 06:58:34 -04:00
2008-03-11 04:39:09 -04:00
GENERIC: init-session* ( responder -- )
2008-03-03 03:19:36 -05:00
2008-03-17 05:31:13 -04:00
M: object init-session* drop ;
2008-04-26 06:49:41 -04:00
M: dispatcher init-session* default>> init-session* ;
M: filter-responder init-session* responder>> init-session* ;
2008-02-29 01:57:38 -05:00
TUPLE: sessions < server-state-manager domain verify? ;
2008-04-29 06:58:34 -04:00
: <sessions> ( responder -- responder' )
sessions new-server-state-manager
t >>verify? ;
2008-02-29 01:57:38 -05:00
2008-04-26 06:49:41 -04:00
: session-changed ( -- )
session get scope-changed ;
2008-02-29 01:57:38 -05:00
: sget ( key -- value ) session get scope-get ;
2008-02-29 01:57:38 -05:00
: sset ( value key -- ) session get scope-set ;
2008-02-29 01:57:38 -05:00
: schange ( key quot -- ) session get scope-change ; inline
2008-02-29 01:57:38 -05:00
2008-04-29 06:58:34 -04:00
: init-session ( session -- )
session [ sessions get init-session* ] with-variable ;
2008-04-26 02:44:45 -04:00
2008-04-26 06:49:41 -04:00
: touch-session ( session -- )
sessions get touch-state ;
2008-04-26 06:49:41 -04:00
2008-06-14 05:00:57 -04:00
: remote-host ( -- string )
{
[ request get "x-forwarded-for" header ]
[ remote-address get host>> ]
} 0|| ;
2008-04-26 02:44:45 -04:00
: empty-session ( -- session )
session empty-scope
remote-host >>client
user-agent >>user-agent
2008-04-26 06:49:41 -04:00
dup touch-session ;
2008-02-29 01:57:38 -05:00
2008-04-29 06:58:34 -04:00
: begin-session ( -- session )
empty-session [ init-session ] [ insert-tuple ] [ ] tri ;
2008-02-29 01:57:38 -05:00
2008-04-29 06:58:34 -04:00
: save-session-after ( session -- )
2008-07-10 00:41:45 -04:00
sessions get save-scope-after ;
2008-03-17 05:31:13 -04:00
2008-04-29 06:58:34 -04:00
: existing-session ( path session -- response )
[ session set ] [ save-session-after ] bi
sessions get responder>> call-responder ;
2008-02-29 01:57:38 -05:00
CONSTANT: session-id-key "__s"
2008-02-29 01:57:38 -05:00
: verify-session ( session -- session )
sessions get verify?>> [
dup [
dup
[ client>> remote-host = ]
[ user-agent>> user-agent = ]
bi and [ drop f ] unless
] when
] when ;
2008-04-29 06:58:34 -04:00
: request-session ( -- session/f )
session-id-key
2008-06-17 01:10:46 -04:00
client-state dup string? [ string>number ] when
get-session verify-session ;
2008-02-29 01:57:38 -05:00
: <session-cookie> ( -- cookie )
session get id>> session-id-key <cookie>
2008-04-29 06:58:34 -04:00
"$sessions" resolve-base-path >>path
sessions get domain>> >>domain ;
2008-03-15 07:22:47 -04:00
: put-session-cookie ( response -- response' )
<session-cookie> put-cookie ;
2008-02-29 01:57:38 -05:00
M: sessions modify-form ( responder -- )
drop session get id>> session-id-key hidden-form-field ;
2008-04-29 06:58:34 -04:00
M: sessions call-responder* ( path responder -- response )
sessions set
request-session [ begin-session ] unless*
existing-session put-session-cookie ;
2008-09-22 00:55:36 -04:00
SLOT: session
: check-session ( state/f -- state/f )
dup [ dup session>> session get id>> = [ drop f ] unless ] when ;