# HG changeset patch # User cin # Date 1370215681 -14400 # Node ID 63709a4e6da0fb229c86130969bb5562d0c7fbb5 # Parent 6cb0d4d325d7d359cca71f394f23f547dea0c299 Security framework refactoring diff -r 6cb0d4d325d7 -r 63709a4e6da0 Lib/IMPL/Object/Disposable.pm --- a/Lib/IMPL/Object/Disposable.pm Thu May 30 20:31:37 2013 +0400 +++ b/Lib/IMPL/Object/Disposable.pm Mon Jun 03 03:28:01 2013 +0400 @@ -1,5 +1,6 @@ package IMPL::Object::Disposable; use strict; +require IMPL::Object::AutoDispose; our $Strict = 1; @@ -15,14 +16,8 @@ warn sprintf('The object %s were marked as disposable but isn\'t disposed properly', $this->can('ToString') ? $this->ToString() : (ref $this || $this) ); } -sub superDispose { - my ($this) = @_; - - my $package = caller; - - no strict 'refs'; - - ($_.'::Dispose')->($this) foreach @{$package.'::ISA'}; +sub AutoPtr { + IMPL::Object::AutoDispose->new(shift); } package IMPL::Object::Disposed; diff -r 6cb0d4d325d7 -r 63709a4e6da0 Lib/IMPL/Web/Application.pm --- a/Lib/IMPL/Web/Application.pm Thu May 30 20:31:37 2013 +0400 +++ b/Lib/IMPL/Web/Application.pm Mon Jun 03 03:28:01 2013 +0400 @@ -26,8 +26,6 @@ actionFactory => PROP_RW, handlers => PROP_RW | PROP_LIST, security => PROP_RW, - options => PROP_RW, - requestCharset => PROP_RW, output => PROP_RW, location => PROP_RO, _handler => PROP_RW @@ -63,6 +61,8 @@ query => $q, application => $this, ); + + $this->BeforeProcessRequest($action); eval { my $result = $handler->($action); @@ -72,6 +72,8 @@ $result->PrintResponse( $this->output ); }; + + $this->AfterProcessRequest($action); if ($@) { my $e = $@; @@ -130,6 +132,14 @@ } } +sub BeforeProcessRequest { + +} + +sub AfterProcessRequest { + +} + 1; __END__ diff -r 6cb0d4d325d7 -r 63709a4e6da0 Lib/IMPL/Web/CGIApplication.pm --- a/Lib/IMPL/Web/CGIApplication.pm Thu May 30 20:31:37 2013 +0400 +++ b/Lib/IMPL/Web/CGIApplication.pm Mon Jun 03 03:28:01 2013 +0400 @@ -21,7 +21,7 @@ my $query = CGIWrapper->new(); - $query->charset($this->requestCharset) if $this->requestCharset; + $query->charset('utf-8'); $this->ProcessRequest($query); } diff -r 6cb0d4d325d7 -r 63709a4e6da0 Lib/IMPL/Web/Handler/SecureCookie.pm --- a/Lib/IMPL/Web/Handler/SecureCookie.pm Thu May 30 20:31:37 2013 +0400 +++ b/Lib/IMPL/Web/Handler/SecureCookie.pm Mon Jun 03 03:28:01 2013 +0400 @@ -65,8 +65,8 @@ my $sign = $action->cookie('sign',qw/(\w+)/); if ( $this->ValidateCookie($sid,$cookie,$sign) ) { - # TODO: add a DefferedProxy to deffer a request to a data source - if ( $context = $this->_manager->GetSession($sid) ) { + # TODO: add a DeferredProxy to deffer a request to a data source + if ( $context = $this->_manager->sessions->GetById($sid) ) { if ( eval { $context->auth->isa(AuthSimple) } ) { my ($result,$challenge) = $context->auth->DoAuth($cookie); @@ -115,13 +115,13 @@ sdata => $cookie }); - my $context = $this->_manager->CreateSession( + my $context = $this->_manager->sessions->Create({ sessionId => $sid, principal => $user, auth => AuthSimple->Create(password => $cookie), authority => $this, rolesAssigned => $roles - ); + }); $context->Apply(); diff -r 6cb0d4d325d7 -r 63709a4e6da0 Lib/IMPL/Web/QueryHandler.pm --- a/Lib/IMPL/Web/QueryHandler.pm Thu May 30 20:31:37 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -package IMPL::Web::QueryHandler; - -use parent qw(IMPL::Object IMPL::Object::Autofill IMPL::Object::Serializable); -use IMPL::Class::Property; - -__PACKAGE__->PassThroughArgs; - -use IMPL::Exception; - -sub Invoke { - my ($self,$action,$nextHandler) = @_; - - if (not ref $self) { - return $self->new( action => $action )->Invoke($action,$nextHandler); - } else { - return $self->Process($action,$nextHandler); - } -} - -sub Process { - die new IMPL::NotImplementedException("The method isn't implemented", __PACKAGE__, 'Process'); -} - -1; - -__END__ - -=pod - -=head1 NAME - -Базовый класс для обработчиков запросов. - -=head1 SYNOPSIS - -Простой вариант - -=begin code - -package MyHandler; - -use parent qw(IMPL::Web::QueryHandler); - -sub CTOR { - my ($this,%args) = @_; - -} - -sub Process { - my ($this,$action,$nextHandler) = @_; - -} - -=end code - -=head1 MEMBERS - -=over 4 - -=item C< Invoke($action,$nextHandler) > - -Вызывается механизмом обработки запроса, для передачи управления обработчику. Данная реализация -проверяет контекст вызова, если как статический метод, то создает экземпляр класса и вызывает -у созданного объекта метод C< Invoke > с параметрами C< $action >, C< $nextHandler >. - -При создании нового объекта в конструктор передается именованый параметр C. - -Если метод был вызван у объекта, то управление передается методу C< Process >. - -=over - -=item C< $action > - -Экземпляр запроса - -=item C< $nextHandler > - -Делегат для вызова следующего обработчика. Вызывается без параметров, но следующему обработчику -втоматически будут переданы необходимые параметры. - -=back - -=back - -=cut diff -r 6cb0d4d325d7 -r 63709a4e6da0 Lib/IMPL/Web/RestContract.pm --- a/Lib/IMPL/Web/RestContract.pm Thu May 30 20:31:37 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -package IMPL::Web::RestContract; -use strict; - -use IMPL::lang qw(:declare); -use IMPL::declare { - require => { - Exception => 'IMPL::Exception', - InvalidOpException => '-IMPL::InvalidOperationException', - ForbiddenException => 'IMPL::Web::ForbiddenException', - TRestResource => 'IMPL::Web::Application::RestResource', - RestBaseResource => 'IMPL::Web::Application::RestBaseResource', - }, - base => { - 'IMPL::Transform' => sub { my %args = @_; $args{resources} }, - 'IMPL::Object::Serializable' => undef - } -}; - -sub CTOR { - my ($this) = @_; - - $this->templates->{-plain} = sub { die ForbiddenException->new(); }; - $this->templates->{-default} = sub { die ForbiddenException->new(); }; - $this->templates->{&RestBaseResource} = sub { $_[1] }; -} - -sub ProcessTemplate { - my ($this,$t,$obj,$props) = @_; - - $props ||= {}; - - if (ref $t eq 'HASH') { - my $factory = $t->{factory} || TRestResource; - return $factory->new(%$t, target => $obj, contract => $this, %$props); - } elsif (ref $t eq 'CODE') { - return $this->$t($obj,$props); - } else { - die InvalidOpException->new(); - } -} - -1; - -__END__ - -=pod - -=head1 NAME - -C Описывает правила публикации ресурсов. - -=head1 SYNOPSIS - - - -=begin code - -=end code - -=head1 DESCRIPTION - -Контракт представляет собой отображение модели предметной области на модель -ресурсов. Контракт описывает дерево ресурсов начиная с корневого ресурса, -и далее. - -Ресурсы состоят из нескольких описаний: C, C -которые описываю отображение самих ресурсов и операций над ресурсами в предметную -область. - -C представляет собой описание того, какой ресурс и с какими -параметрами должен быть создан. Например, может быть создан ресурс публикующий -методы родительского ресурса, или же ресурс может слжить контроллером для -работы с объектами предметной области. - -C описывает связь между методом объекта предметной области и -операцией возможной над ресурсом. Операция сводится к преобразованию запроса в -аргументы метода, затем вызову метода и преобразованию результата в ответ на запрос. - -Ответ на запрос может быть как сформирован полностью в виде C ответа, так и -в виде объекта, который будет в дальнейшем обработан нижележащими обработчиками -приложения. - - - -=cut \ No newline at end of file diff -r 6cb0d4d325d7 -r 63709a4e6da0 Lib/IMPL/Web/Security.pm --- a/Lib/IMPL/Web/Security.pm Thu May 30 20:31:37 2013 +0400 +++ b/Lib/IMPL/Web/Security.pm Mon Jun 03 03:28:01 2013 +0400 @@ -6,6 +6,7 @@ require => { Exception => 'IMPL::Exception', NotImplementedException => '-IMPL::NotImplementedException', + ArgException => '-IMPL::InvalidArgumentException', SecurityContext => 'IMPL::Security::AbstractContext' }, }; @@ -21,7 +22,7 @@ sub AuthUser { my ($this,$name,$package,$challenge) = @_; - my $user = $this->FindUserByName($name) + my $user = $this->users->GetById($name) or return { status => AUTH_FAIL, code => ERR_NO_SUCH_USER @@ -69,28 +70,17 @@ if($session && $session->authority) { $session->authority->CloseSession($session); - $this->CloseSession($session); + $this->sessions->Delete($session); } } -sub FindUserByName { - die NotImplementedException->new(); -} - -sub CreateSession { - die NotImplementedException->new(); -} - -sub GetSession { - die NotImplementedException->new(); -} - -sub SaveSession { - die NotImplementedException->new(); -} - -sub CloseSession { - die NotImplementedException->new(); +sub CreateSecData { + my ($this,$package,$params) = @_; + + die ArgException->new(params => 'A hash reference is required') + unless ref($params) eq 'HASH'; + + return $package->CreateSecData(%$params); } 1; @@ -121,12 +111,14 @@ =item Модуль безопасности +Контекст безопасности создается именно этим модулем. + Как правило встраивается в транспортный уровеь в виде обработчика C и реализует непосредственно протокол аутентификации и обмена с пользователем. Также модуль безопасности использует модель для хранения сессий и данных -аутентификции. Контекст безопасности создается именно этим модулем. +аутентификции. =back