no temporary variable
[catagits/Web-Session.git] / lib / Plack / Session / State.pm
CommitLineData
06190e8b 1package Plack::Session::State;
2use strict;
3use warnings;
4
3b4205cd 5use Digest::SHA1 ();
6
ac4892f4 7use Plack::Util::Accessor qw[
8 session_key
9 sid_generator
6a695f07 10 sid_validator
ac4892f4 11];
06190e8b 12
13sub new {
14 my ($class, %params) = @_;
ac4892f4 15
16 $params{'_expired'} ||= +{};
17 $params{'session_key'} ||= 'plack_session';
18 $params{'sid_generator'} ||= sub {
ac4892f4 19 Digest::SHA1::sha1_hex(rand() . $$ . {} . time)
20 };
6a695f07 21 $params{'sid_validator'} ||= qr/\A[0-9a-f]{40}\Z/;
ac4892f4 22
23 bless { %params } => $class;
06190e8b 24}
25
26sub expire_session_id {
27 my ($self, $id) = @_;
ac4892f4 28 $self->{'_expired'}->{ $id }++;
06190e8b 29}
30
05b5f99d 31sub is_session_expired {
32 my ($self, $id) = @_;
33 exists $self->{'_expired'}->{ $id }
34}
35
bd992981 36sub check_expired {
37 my ($self, $id) = @_;
05b5f99d 38 return unless $id && not $self->is_session_expired( $id );
06190e8b 39 return $id;
40}
41
6a695f07 42sub validate_request_session_id {
56b9910a 43 my ($self, $request) = @_;
44
45 my $reqest_session_id = $self->get_request_session_id($request);
56b9910a 46
2498bde0 47 defined $reqest_session_id && $reqest_session_id =~ $self->sid_validator;
56b9910a 48}
49
06190e8b 50sub get_session_id {
51 my ($self, $request) = @_;
56b9910a 52 (
6a695f07 53 $self->validate_request_session_id($request)
56b9910a 54 &&
55 $self->extract( $request )
56 )
06190e8b 57 ||
bd992981 58 $self->generate( $request )
59}
60
56b9910a 61sub get_request_session_id {
62 my ($self, $request ) = @_;
63
64 $request->param( $self->session_key );
65}
66
bd992981 67sub extract {
68 my ($self, $request) = @_;
56b9910a 69
70 $self->check_expired( $self->get_request_session_id($request) );
bd992981 71}
72
fe1bfe7d 73sub generate {
74 my $self = shift;
ac4892f4 75 $self->sid_generator->( @_ );
bd992981 76}
77
fe1bfe7d 78
bd992981 79sub finalize {
80 my ($self, $id, $response) = @_;
81 ();
06190e8b 82}
83
fe1bfe7d 841;
ac4892f4 85
86__END__
87
88=pod
89
90=head1 NAME
91
92Plack::Session::State - Basic parameter-based session state
93
3d92cf47 94=head1 SYNOPSIS
95
96 use Plack::Builder;
97 use Plack::Middleware::Session;
98 use Plack::Session::State;
99
100 my $app = sub {
101 return [ 200, [ 'Content-Type' => 'text/plain' ], [ 'Hello Foo' ] ];
102 };
103
104 builder {
105 enable 'Session',
106 state => Plack::Session::State->new;
107 $app;
108 };
109
ac4892f4 110=head1 DESCRIPTION
111
3d92cf47 112This will maintain session state by passing the session through
113the request params. It does not do this automatically though,
114you are responsible for passing the session param.
115
116This should be considered the state "base" class (although
117subclassing is not a requirement) and defines the spec for
118all B<Plack::Session::State::*> modules. You will only
119need to override a couple methods if you do subclass. See
120L<Plack::Session::State::Cookie> for an example of this.
121
ac4892f4 122=head1 METHODS
123
124=over 4
125
126=item B<new ( %params )>
127
56b9910a 128The C<%params> can include I<session_key>, I<sid_generator> and I<sid_checker>
3d92cf47 129however in both cases a default will be provided for you.
130
ac4892f4 131=item B<session_key>
132
43f34c01 133This is the name of the session key, it default to 'plack_session'.
134
ac4892f4 135=item B<sid_generator>
136
3d92cf47 137This is a CODE ref used to generate unique session ids, by default
138it will generate a SHA1 using fairly sufficient entropy. If you are
139concerned or interested, just read the source.
43f34c01 140
6a695f07 141=item B<sid_validator>
56b9910a 142
6a695f07 143This is a regex used to validate requested session id,
56b9910a 144
ac4892f4 145=back
146
43f34c01 147=head2 Session ID Managment
148
ac4892f4 149=over 4
150
151=item B<get_session_id ( $request )>
152
43f34c01 153Given a C<$request> this will first attempt to extract the session,
154if the is expired or does not exist, it will then generate a new
155session. The C<$request> is expected to be a L<Plack::Request> instance
156or an object with an equivalent interface.
157
6a695f07 158=item B<get_request_session_id ( $request )>
159
ac4892f4 160=item B<extract ( $request )>
161
43f34c01 162This will attempt to extract the session from a C<$request> by looking
163for the C<session_key> in the C<$request> params. It will then check to
164see if the session has expired and return the session id if it is not.
165The C<$request> is expected to be a L<Plack::Request> instance or an
166object with an equivalent interface.
167
ac4892f4 168=item B<generate ( $request )>
169
43f34c01 170This will generate a new session id using the C<sid_generator> callback.
171The C<$request> argument is not used by this method but is there for
172use by subclasses. The C<$request> is expected to be a L<Plack::Request>
173instance or an object with an equivalent interface.
174
ac4892f4 175=item B<finalize ( $session_id, $response )>
176
43f34c01 177Given a C<$session_id> and a C<$response> this will perform any
178finalization nessecary to preserve state. This method is called by
179the L<Plack::Session> C<finalize> method. The C<$response> is expected
180to be a L<Plack::Response> instance or an object with an equivalent
181interface.
182
ac4892f4 183=back
184
43f34c01 185=head2 Session Expiration Handling
186
ac4892f4 187=over 4
188
189=item B<expire_session_id ( $id )>
190
43f34c01 191This will mark the session for C<$id> as expired. This method is called
192by the L<Plack::Session> C<expire> method.
193
194=item B<is_session_expired ( $id )>
195
196This will check to see if the session C<$id> has been marked as
197expired.
198
ac4892f4 199=item B<check_expired ( $id )>
200
43f34c01 201Given an session C<$id> this will return C<undef> if the session is
202expired or return the C<$id> if it is not.
203
ac4892f4 204=back
205
206=head1 BUGS
207
208All complex software has bugs lurking in it, and this module is no
209exception. If you find a bug please either email me, or add the bug
210to cpan-RT.
211
212=head1 AUTHOR
213
214Stevan Little E<lt>stevan.little@iinteractive.comE<gt>
215
216=head1 COPYRIGHT AND LICENSE
217
218Copyright 2009 Infinity Interactive, Inc.
219
220L<http://www.iinteractive.com>
221
222This library is free software; you can redistribute it and/or modify
223it under the same terms as Perl itself.
224
225=cut
226
227