comparison Lib/IMPL/Web/Handler/SecureCookie.pm @ 196:a705e848dcc7

added IMPL::Config::Reference
author cin
date Mon, 16 Apr 2012 17:42:54 +0400
parents
children 6d8092d8ce1b
comparison
equal deleted inserted replaced
195:7a920771fd8e 196:a705e848dcc7
1 package IMPL::Web::QueryHandler::SecureCookie;
2 use strict;
3
4 use parent qw(IMPL::Web::QueryHandler);
5 use Digest::MD5 qw(md5_hex);
6
7 use IMPL::Class::Property;
8 use IMPL::Security::Auth qw(:Const);
9 use IMPL::Security;
10
11 BEGIN {
12 public property salt => prop_all;
13 }
14
15 sub CTOR {
16 my ($this) = @_;
17
18 $this->salt('DeadBeef') unless $this->salt;
19 }
20
21 sub Process {
22 my ($this,$action,$nextHandler) = @_;
23
24 return undef unless $nextHandler;
25
26 local $IMPL::Security::authority = $this;
27
28 my $method = $action->query->cookie('method') || 'simple';
29
30 if ($method eq 'simple') {
31
32 my $sid = $action->query->cookie('sid');
33 my $cookie = $action->query->cookie('sdata');
34 my $sign = $action->query->cookie('sign');
35
36 if (
37 $sid and
38 $cookie and
39 $sign and
40 $sign eq md5_hex(
41 $this->salt,
42 $sid,
43 $cookie,
44 $this->salt
45 )
46 ) {
47 # TODO: add a DefferedProxy to deffer a request to a data source
48 my $context = $action->application->security->sourceSession->find(
49 { id => $sid }
50 ) or return $nextHandler->();
51
52 my ($result,$challenge) = $context->auth->ValidateSession($cookie);
53
54 if ($result == AUTH_SUCCESS) {
55 $context->authority($this);
56 return $context->Impersonate($nextHandler);
57 } else {
58 return $nextHandler->();
59 }
60 } else {
61 return $nextHandler->();
62 }
63 } else {
64 return $nextHandler->();
65 }
66 }
67
68 sub WriteResponse {
69 my ($this,$response,$sid,$cookie,$method) = @_;
70
71 my $sign = md5_hex(
72 $this->salt,
73 $sid,
74 $cookie,
75 $this->salt
76 );
77
78 $response->setCookie(sid => $sid);
79 $response->setCookie(sdata => $cookie);
80 $response->setCookie(sign => $sign);
81 $response->setCookie(method => $method) if $method;
82 }
83
84 1;
85
86 __END__
87
88 =pod
89
90 =head1 NAME
91
92 C<IMPL::Web::QueryHandler::SecureCookie>
93
94 =head1 DESCRIPTION
95
96 C<use parent qw(IMPL::Web::QueryHandler)>
97
98 Возобновляет сессию пользователя на основе информации переданной через Cookie.
99
100 Использует механизм подписи информации для проверки верности входных данных перед
101 началом каких-либо действий.
102
103 Данный обработчик возвращает результат выполнения следдующего обработчика.
104
105 =head1 MEMBERS
106
107 =over
108
109 =item C<[get,set] salt>
110
111 Скаляр, использующийся для подписи данных.
112
113 =back
114
115 =cut