Mercurial > pub > Impl
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 |
