Mercurial > pub > Impl
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/Handler/SecureCookie.pm Mon Apr 16 17:42:54 2012 +0400 @@ -0,0 +1,115 @@ +package IMPL::Web::QueryHandler::SecureCookie; +use strict; + +use parent qw(IMPL::Web::QueryHandler); +use Digest::MD5 qw(md5_hex); + +use IMPL::Class::Property; +use IMPL::Security::Auth qw(:Const); +use IMPL::Security; + +BEGIN { + public property salt => prop_all; +} + +sub CTOR { + my ($this) = @_; + + $this->salt('DeadBeef') unless $this->salt; +} + +sub Process { + my ($this,$action,$nextHandler) = @_; + + return undef unless $nextHandler; + + local $IMPL::Security::authority = $this; + + my $method = $action->query->cookie('method') || 'simple'; + + if ($method eq 'simple') { + + my $sid = $action->query->cookie('sid'); + my $cookie = $action->query->cookie('sdata'); + my $sign = $action->query->cookie('sign'); + + if ( + $sid and + $cookie and + $sign and + $sign eq md5_hex( + $this->salt, + $sid, + $cookie, + $this->salt + ) + ) { + # TODO: add a DefferedProxy to deffer a request to a data source + my $context = $action->application->security->sourceSession->find( + { id => $sid } + ) or return $nextHandler->(); + + my ($result,$challenge) = $context->auth->ValidateSession($cookie); + + if ($result == AUTH_SUCCESS) { + $context->authority($this); + return $context->Impersonate($nextHandler); + } else { + return $nextHandler->(); + } + } else { + return $nextHandler->(); + } + } else { + return $nextHandler->(); + } +} + +sub WriteResponse { + my ($this,$response,$sid,$cookie,$method) = @_; + + my $sign = md5_hex( + $this->salt, + $sid, + $cookie, + $this->salt + ); + + $response->setCookie(sid => $sid); + $response->setCookie(sdata => $cookie); + $response->setCookie(sign => $sign); + $response->setCookie(method => $method) if $method; +} + +1; + +__END__ + +=pod + +=head1 NAME + +C<IMPL::Web::QueryHandler::SecureCookie> + +=head1 DESCRIPTION + +C<use parent qw(IMPL::Web::QueryHandler)> + +Возобновляет сессию пользователя на основе информации переданной через Cookie. + +Использует механизм подписи информации для проверки верности входных данных перед +началом каких-либо действий. + +Данный обработчик возвращает результат выполнения следдующего обработчика. + +=head1 MEMBERS + +=over + +=item C<[get,set] salt> + +Скаляр, использующийся для подписи данных. + +=back + +=cut