73
|
1 package IMPL::Web::QueryHandler::SecureCookie;
|
68
|
2
|
|
3 use base qw(IMPL::Web::QueryHandler);
|
|
4 use Digest::MD5 qw(md5_hex);
|
|
5
|
|
6 use IMPL::Class::Property;
|
69
|
7 use IMPL::Security::Auth qw(:Const);
|
68
|
8
|
|
9 BEGIN {
|
|
10 public property salt => prop_all;
|
|
11 }
|
|
12
|
69
|
13 sub CTOR {
|
|
14 my ($this) = @_;
|
|
15
|
75
|
16 $this->salt('DeadBeef') unless $this->salt;
|
69
|
17 }
|
|
18
|
68
|
19 sub Process {
|
|
20 my ($this,$action,$nextHandler) = @_;
|
|
21
|
75
|
22 return undef unless $nextHandler;
|
|
23
|
68
|
24 my $method = $action->query->cookie('method') || 'simple';
|
|
25
|
|
26 if ($method eq 'simple') {
|
|
27
|
69
|
28 my $sid = $action->query->cookie('sid');
|
75
|
29 my $cookie = $action->query->cookie('sdata');
|
|
30 my $sign = $action->query->cookie('sign');
|
69
|
31
|
75
|
32 if (
|
|
33 $sid and
|
|
34 $cookie and
|
|
35 $sign and
|
|
36 $sign eq md5_hex(
|
|
37 $this->salt,
|
|
38 $sid,
|
|
39 $cookie,
|
|
40 $this->salt
|
|
41 )
|
|
42 ) {
|
68
|
43
|
89
|
44 my $context = $action->application->security->sourceSession->find(
|
|
45 { id => $sid }
|
|
46 ) or return $nextHandler->();
|
69
|
47
|
74
|
48 my ($result,$challenge) = $context->auth->ValidateSession($cookie);
|
68
|
49
|
69
|
50 if ($result == AUTH_SUCCESS) {
|
|
51 return $context->Impersonate($nextHandler);
|
|
52 } else {
|
|
53 return $nextHandler->();
|
|
54 }
|
68
|
55 }
|
|
56 } else {
|
|
57 die new IMPL::Exception("Unknown auth method",$method);
|
|
58 }
|
|
59 }
|
|
60
|
75
|
61 1;
|
68
|
62
|
75
|
63 __END__
|
|
64
|
|
65 =pod
|
|
66
|
|
67 =head1 NAME
|
|
68
|
|
69 C<IMPL::Web::QueryHandler::SecureCookie>
|
|
70
|
|
71 =head1 DESCRIPTION
|
|
72
|
|
73 C<use base qw(IMPL::Web::QueryHandler)>
|
|
74
|
|
75 Возобновляет сессию пользователя на основе информации переданной через Cookie.
|
|
76
|
|
77 Использует механизм подписи информации для проверки верности входных данных перед
|
|
78 началом каких-либо действий.
|
|
79
|
|
80 Данный обработчик возвращает результат выполнения следдующего обработчика.
|
|
81
|
|
82 =head1 MEMBERS
|
|
83
|
|
84 =over
|
|
85
|
|
86 =item C<[get,set] salt>
|
|
87
|
|
88 Скаляр, использующийся для подписи данных.
|
|
89
|
|
90 =back
|
|
91
|
|
92 =cut |