changeset 328:63709a4e6da0

Security framework refactoring
author cin
date Mon, 03 Jun 2013 03:28:01 +0400
parents 6cb0d4d325d7
children 50ff1595bd62
files Lib/IMPL/Object/Disposable.pm Lib/IMPL/Web/Application.pm Lib/IMPL/Web/CGIApplication.pm Lib/IMPL/Web/Handler/SecureCookie.pm Lib/IMPL/Web/QueryHandler.pm Lib/IMPL/Web/RestContract.pm Lib/IMPL/Web/Security.pm
diffstat 7 files changed, 33 insertions(+), 206 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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__
--- 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);
 }
--- 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();
 	    
--- 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<action>. 
-
-Если метод был вызван у объекта, то управление передается методу C< Process >.
-
-=over
-
-=item C< $action >
-
-Экземпляр запроса
-
-=item C< $nextHandler >
-
-Делегат для вызова следующего обработчика. Вызывается без параметров, но следующему обработчику
-втоматически будут переданы необходимые параметры.
-
-=back
-
-=back
-
-=cut
--- 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<IMPL::Web::RestContract> Описывает правила публикации ресурсов.
-
-=head1 SYNOPSIS
-
-
-
-=begin code
-
-=end code 
-
-=head1 DESCRIPTION
-
-Контракт представляет собой отображение модели предметной области на модель
-ресурсов. Контракт описывает дерево ресурсов начиная с корневого ресурса,
-и далее.
-
-Ресурсы состоят из нескольких описаний: C<ResourceContract>, C<OperationContract>
-которые описываю отображение самих ресурсов и операций над ресурсами в предметную
-область.
-
-C<ResourceContract> представляет собой описание того, какой ресурс и с какими
-параметрами должен быть создан. Например, может быть создан ресурс публикующий
-методы родительского ресурса, или же ресурс может слжить контроллером для
-работы с объектами предметной области.
-
-C<OperationContract> описывает связь между методом объекта предметной области и
-операцией возможной над ресурсом. Операция сводится к преобразованию запроса в
-аргументы метода, затем вызову метода и преобразованию результата в ответ на запрос.
-
-Ответ на запрос может быть как сформирован полностью в виде C<HTTP> ответа, так и
-в виде объекта, который будет в дальнейшем обработан нижележащими обработчиками
-приложения. 
- 
-
-
-=cut
\ No newline at end of file
--- 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<IMPL::Web::Handler> и реализует непосредственно протокол аутентификации и
 обмена с пользователем.
 
 Также модуль безопасности использует модель для хранения сессий и данных
-аутентификции. Контекст безопасности создается именно этим модулем.
+аутентификции. 
 
 =back