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