changeset 73:2f31ecabe9ea

doc security
author wizard
date Mon, 29 Mar 2010 06:56:05 +0400 (2010-03-29)
parents eac47fa4f262
children 84aa8c395fce
files Lib/IMPL/Config.pm Lib/IMPL/Object/Factory.pm Lib/IMPL/Security.pm Lib/IMPL/Security/Auth.pm Lib/IMPL/Security/Auth/Simple.pm Lib/IMPL/Security/Role.pm Lib/IMPL/Web/Application.pm Lib/IMPL/Web/QueryHandler/AuthCookie.pm Lib/IMPL/Web/QueryHandler/SecureCookie.pm Lib/IMPL/Web/Security.pm Lib/IMPL/Web/Security/Embed.pm Lib/IMPL/Web/Security/Session.pm _doc/make.pl
diffstat 13 files changed, 358 insertions(+), 135 deletions(-) [+]
line wrap: on
line diff
--- a/Lib/IMPL/Config.pm	Fri Mar 26 16:26:31 2010 +0300
+++ b/Lib/IMPL/Config.pm	Mon Mar 29 06:56:05 2010 +0400
@@ -118,28 +118,34 @@
 
 =pod
 
-=h1 SYNOPSIS
+=head1 NAME
+
+C<IMPL::Config> - ������� ����� ��� �������������� ����������.
+
+=head1 SYNOPSIS
 
-package App::Config
-use base qw(IMPL::Config)
+=begin code
+
+# define application
+
+package MyApp;
+use base qw(IMPL::Config);
 
 use IMPL::Class::Property;
 use IMPL::Config::Class;
 
 BEGIN {
     public property SimpleString => prop_all;
-    public property MyClass => prop_all;
     public property DataSource => prop_all; 
 }
 
 sub CTOR {
     my $this = shift;
-
-    $this->MyClass(new IMPL::Config::Class(Type => 'MyClass'')) unless $this->MyClass;
+    
     $this->DataSource(
     	new IMPL::Config::Activator(
-    		type => 'MyDataSource',
-    		args=>{
+    		factory => 'MyDataSource',
+    		parameters=>{
     			host => 'localhost',
     			user => 'dbuser'
     		}
@@ -147,37 +153,85 @@
     ) unless $this->Exists('DataSource');
 }
 
-# in some script
+# using application object
 
-my $app = spawn App::Config('default.xml');
+my $app = spawn MyApp('default.xml');
 
 $app->Run();
 
+=end code
+
+���� �������� ������ ����� C<default.xml> ����������� ��������� ����������
+
+=begin code xml
+
+<app type='MyApp'>
+	<SimpleString>The application</SimpleString>
+	<DataSource type='IMPL::Config::Activator'>
+		<factory>MyDataSourceClass</factory>
+		<parameters type='HASH'>
+			<host>localhost</host>
+			<user>dbuser</user>
+		</parameters>
+	</DataSource>
+</app>
+
+=end code xml
+
 =head1 DESCRIPTION
 
-��������� ���������/��������� ������������. ����� ��� ������ ������������
-������ ������������� �� ������� ������, � ��� Public �������� �����
-������������� ����������� � �����������������.
+C<[Serializable]>
+
+C<[Autofill]>
+
+C<use base IMPL::Object::Accessor>
+
+������� ����� ��� ����������. ���������� ������, ��� ����������
+�������� ��������, ��������� �������� ����������� ����� ������������,
+� ������ - ������.
+
+������ ����� ��������� ���������� �������������� (� ������������) ����������
+���������� �� XML ���������. ��� ����� ������������ �������� C<IMPL::Serialization>.
+��� ���� ������������ ����� C<IMPL::Serialization::XmlFormatter> C<IdentOutput> �
+C<SkipWhitespace> ��� ������ ��������� � ����� �������� ����.
+
+��������� � ���������� �������������� ���������� ����������������� ��� ��������
+�� ����� ������������, �� ��� ����� ����������� ������������ �������� ���
+�������� ������, ������� ����� ������� �� ������������. ��������, �� ��������� �������������
+��������� ������ ��� �������� ������������ ����������� ������, ����������� �� �����.
+
+��� ������� ���� �������� ������������ ����������� ������� C<IMPL::Config::Activator>.
+
+���� � ���������� ������� ��������, � ������� �������� C<IMPL::Config::Activator>, ��
+��� ������ ��������� � ������ ��������, ����� ������ ������ ������� ������
+C<< IMPL::Config::Activator->activate() >> � ��������� ��� �������� ����� ��������.
+����� ������� ����������� ���������� ���������� ��������� ��������, ��� ���������
+��������� �������. 
 
 =head1 MEMBERS
 
 =over
 
-=item C<< IMPL::Config->LoadXMLFile($fileName) >>
+=item C<[static] LoadXMLFile($fileName) >
 
-������� �� XML ����� ��������� ����������
+������� �� XML ����� C<$fileName> ��������� ����������
 
-=item C<< $instance->SaveXMLFile($fileName) >>
+=item C<SaveXMLFile($fileName)>
 
-��������� ���������� � ����
+��������� ���������� � ���� C<$fileName>
+
+=item C<[get] xml >
 
-=item C<< xml >>
+��������� ������������ ���������� � XML ������.
 
-��������� ������������ ���������� � XML ������
+=item C<[static,operator] spawn($file)>
 
-=item C<< IMPL::Config->spawn($file) >>
+������� ��� C<LoadXMLFile>, �������������� ������������� ��� ���������.
 
-������� ��� C<LoadXMLFile>
+=item C<rawGet($propname,...)>
+
+����� ��� ��������� �������� ������� ����������. ������ ����� ��������� ��������
+������������� ��������� �������� ����� C<IMPL::Config::Activator>.
 
 =back
 
--- a/Lib/IMPL/Object/Factory.pm	Fri Mar 26 16:26:31 2010 +0300
+++ b/Lib/IMPL/Object/Factory.pm	Mon Mar 29 06:56:05 2010 +0400
@@ -7,7 +7,8 @@
 
 BEGIN {
 	public property factory => prop_get | owner_set;
-	public property parameters => prop_get | owner_set; 
+	public property parameters => prop_get | owner_set;
+	public property method => prop_get | owner_set; 
 }
 
 # custom factory, overrides default
@@ -18,10 +19,11 @@
 }
 
 sub CTOR {
-	my ($this,$factory,$parameters) = @_;
+	my ($this,$factory,$parameters,$method) = @_;
 	
 	$this->factory($factory) or die new IMPL::InvalidArgumentException("The argument 'factory' is mandatory");
 	$this->parameters($parameters) if $parameters;
+	$this->method($method) if $method;
 }
 
 # override default restore method
@@ -41,7 +43,11 @@
 sub CreateObject {
 	my $this = shift;
 	
-	return $this->factory->new($this->parameters ? (_as_list($this->parameters),@_) : @_);
+	if (my $method = $this->method) {
+		$this->factory->$method($this->parameters ? (_as_list($this->parameters),@_) : @_);	
+	} else {
+		$this->factory->new($this->parameters ? (_as_list($this->parameters),@_) : @_);		
+	}
 }
 
 sub _as_list {
@@ -122,9 +128,9 @@
 
 =over
 
-=item C< CTOR($factory,$parameters) >
+=item C< CTOR($factory,$parameters,$method) >
 
-������� ����� ���������
+������� ����� ��������� �������.
 
 =over
 
@@ -145,6 +151,11 @@
 ���� �������� ����� ������ �������� ��� ��������, �� ����� ������� ���������� ������
 C<new> ��� ����.
 
+=item C<$method>
+
+��� ������ (��� ������ �� ���������), ������� ����� ������ � C<$factory> ��� ��������
+������� �������� ������ �������.
+
 =back
 
 =item C< [get] factory >
@@ -168,7 +179,9 @@
 sub new {
 	my ($this,@params) = @_;
 	
-	return $this->factory->new(_as_list($this->parameters), @params);
+	my $method = $this->method || 'new';
+	
+	return $this->factory->$method(_as_list($this->parameters), @params);
 }
 
 =end code
--- a/Lib/IMPL/Security.pm	Fri Mar 26 16:26:31 2010 +0300
+++ b/Lib/IMPL/Security.pm	Mon Mar 29 06:56:05 2010 +0400
@@ -22,6 +22,16 @@
 	die new IMPL::NotImplementedException();
 }
 
+sub MakeContext {
+	my ($this,$principal,$refRoles,$auth) = @_;
+	
+	return new IMPL::Security::Context(
+		principal => $principal,
+		rolesAssigned => $refRoles,
+		auth => $auth
+	);
+}
+
 sub Rules {
 	return \@rules;
 }
@@ -129,6 +139,26 @@
 
 =back
 
+=item C<MakeContext($principal,$role,$auth)>
+
+������� �������� ������������, ������������� ��� ������������ �����������.
+
+=over
+
+=item C<$principal>
+
+������ ������������
+
+=item C<$role>
+
+���� ��� ������ �� ������ �����
+
+=item C<$auth>
+
+������ ��������������
+
+=back
+
 =item C<Take($principal,$role)>
 
 �����. ���������� �������� ������������ ���������� ������� ������������. ��� ���� ����������� ��������
@@ -150,7 +180,7 @@
 
 =back
 
-=item C<Roles()>
+=item C<Rules()>
 
 ���������� ������ ������ ������� ����������� ��� ��������� �������. ��������������� ����
 �����, ����� ���������� ����������� ������ ������. ������ ������ �������� ������� �� ������
--- a/Lib/IMPL/Security/Auth.pm	Fri Mar 26 16:26:31 2010 +0300
+++ b/Lib/IMPL/Security/Auth.pm	Mon Mar 29 06:56:05 2010 +0400
@@ -28,6 +28,10 @@
 	die new IMPL::NotImplementedException;
 }
 
+sub isTrusted {
+	0;
+}
+
 1;
 
 __END__
@@ -86,6 +90,10 @@
 ������� ����� ��� ����������� �� ������ ������ ������������ ��� ������������.
 C<$SecData> - ������� �� ������ ��������������.
 
+=item C<[get] isTrusted>
+
+���� ����, ��� �������������� ��������� �������.
+
 =item C<DoAuth($Challenge)>
 
 ���������� �������������� ������������ � ������������� ������,
@@ -103,6 +111,8 @@
 =item C<[static] SecDataArgs()>
 
 ���������� ��� � ��������� ���������� ��� ������� C<CreateSecData>. ������� ��������
-����� ����������, ���������� - ����. 
+����� ����������, ���������� - ����.
+
+=back 
 
 =cut
\ No newline at end of file
--- a/Lib/IMPL/Security/Auth/Simple.pm	Fri Mar 26 16:26:31 2010 +0300
+++ b/Lib/IMPL/Security/Auth/Simple.pm	Mon Mar 29 06:56:05 2010 +0400
@@ -80,7 +80,28 @@
 
 ��������� ���� C<AUTH_SUCCESS>, ���� C<AUTH_FAIL>
 
-=item
+=item C<$challenge>
+
+� ������ ������ ���������� cookie (���������� �����) ������
+
+=back
+
+=item C<ValidateSession($challenge)>
+
+��������� ������������� ������. ���������� ���� ����. C<$challenge> cookie
+������, ���������� ��� ���������� ������ C<DoAuth>.
+
+���������� C<($status,$challenge)>
+
+=over
+
+=item C<$status>
+
+��������� ���� C<AUTH_SUCCESS>, ���� C<AUTH_FAIL>
+
+=item C<$challenge>
+
+������ C<undef>
 
 =back
 
--- a/Lib/IMPL/Security/Role.pm	Fri Mar 26 16:26:31 2010 +0300
+++ b/Lib/IMPL/Security/Role.pm	Mon Mar 29 06:56:05 2010 +0400
@@ -5,8 +5,8 @@
 use IMPL::Class::Property;
 
 BEGIN {
-	public property roleName => prop_get;
-	public property parentRoles => prop_get;
+	public property roleName => prop_get | owner_set;
+	public property parentRoles => prop_get | owner_set | prop_list;
 }
 
 sub CTOR {
@@ -39,20 +39,24 @@
 
 =pod
 
+=head1 NAME
+
+C<IMPL::Security::Role> ����
+
 =head1 DESCRIPTION
 
-����. ����� �������� � ���� ������� ����.
+����� �������� � ���� ������� ����.
 ������� ����� ��� �������� ������� ����������� ����� � ������� ����.
 
 =head1 MEMBERS
 
 =over
 
-=item C<roleName>
+=item C<[get] roleName>
 
 ��� ����, �� �������������
 
-=item C<parentRoles>
+=item C<[get,list] parentRoles>
 
 ������ ������������ �����
 
--- a/Lib/IMPL/Web/Application.pm	Fri Mar 26 16:26:31 2010 +0300
+++ b/Lib/IMPL/Web/Application.pm	Mon Mar 29 06:56:05 2010 +0400
@@ -17,16 +17,10 @@
     public property actionFactory => prop_all;
     public property handlersQuery => prop_all | prop_list;
     public property responseCharset => prop_all;
+    public property security => prop_all;
     public property options => prop_all;
 }
 
-# custom factory
-sub new {
-    my ($self,$file) = @_;
-    
-    return $self->LoadXMLFile($file);
-}
-
 sub CTOR {
 	my ($this) = @_;
 	
@@ -84,6 +78,8 @@
 
 =head1 DESCRIPTION
 
+C< use base qw( IMPL::Config IMPL::Object::Singleton )>
+
 ��������� ���������� �������� � ���� ���������� ���������, ��������� ���������� ��������,
 � �������� ��������� �������� ������������ CGI ��� ���� ����������� ������.
 
@@ -180,3 +176,47 @@
 
 =end code xml
 
+=head1 MEMBERS
+
+=over
+
+=item C<[get,set] handlerError>
+
+���������� ������� ����� ������ � ������ ������������� �������������� ������
+� �������� ������ ����������. ����� ���� ���������� ��������� �����������.
+
+=item C<[get,set] actionFactory>
+
+������� ��������, ������� ������������ �����������, ��� �������� ��������
+���� C<IMPL::Web::Application::Action> ��� ��������� C<CGI> ��������.
+
+=begin code
+
+my $action = $this->actionFactory->new(
+    query => $query,
+    application => $this, 
+);
+
+=end code
+
+=item C< [get,set,list] handlersQuery >
+
+������ ������������ ��������, ������� ����� �������� ���������� �������-��������.
+
+=item C< [get,set] responseCharset>
+
+��������� ������ �������.
+
+=item C< [get,set] security >
+
+������ C<IMPL::Web::Security>, ��� ������ � ��������������� ������������.
+
+=item C< [get,set] options >
+
+������ ������ �� ��� � �������������� ���������, ������������ ��� �����������
+���������� ��������� �����������, �.�. �������� ����� �������� ���������� ��������
+� ��� ������ �� ���������.
+ 
+=back
+
+=cut
\ No newline at end of file
--- a/Lib/IMPL/Web/QueryHandler/AuthCookie.pm	Fri Mar 26 16:26:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-package IMPL::Web::QueryHandler::AuthCookie;
-
-use base qw(IMPL::Web::QueryHandler);
-use Digest::MD5 qw(md5_hex);
-
-use IMPL::Class::Property;
-use IMPL::Security::Auth qw(:Const);
-
-BEGIN {
-	public property salt => prop_all;
-}
-
-sub CTOR {
-	my ($this) = @_;
-	
-	
-}
-
-sub Process {
-	my ($this,$action,$nextHandler) = @_;
-	
-	my $method = $action->query->cookie('method') || 'simple';
-	
-	if ($method eq 'simple') {
-		
-		my $sid = $action->query->cookie('sid'); 
-		
-		if ($action->query->cookie('sign') eq md5_hex(
-			$this->salt,
-			$sid,
-			$this->salt
-		) ) {
-			
-			my $context = $action->application->security->Session(
-				id => $sid,
-				method => 'simple'				
-			);
-			
-			my ($result,$challenge) = $context->auth->ValidateSession($sid);
-			
-			if ($result == AUTH_SUCCESS) {
-				return $context->Impersonate($nextHandler);				
-			} else {
-				return $nextHandler->();
-			}
-		}
-	} else {
-		die new IMPL::Exception("Unknown auth method",$method);
-	}
-}
-
-
-1;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/IMPL/Web/QueryHandler/SecureCookie.pm	Mon Mar 29 06:56:05 2010 +0400
@@ -0,0 +1,52 @@
+package IMPL::Web::QueryHandler::SecureCookie;
+
+use base qw(IMPL::Web::QueryHandler);
+use Digest::MD5 qw(md5_hex);
+
+use IMPL::Class::Property;
+use IMPL::Security::Auth qw(:Const);
+
+BEGIN {
+	public property salt => prop_all;
+}
+
+sub CTOR {
+	my ($this) = @_;
+	
+	
+}
+
+sub Process {
+	my ($this,$action,$nextHandler) = @_;
+	
+	my $method = $action->query->cookie('method') || 'simple';
+	
+	if ($method eq 'simple') {
+		
+		my $sid = $action->query->cookie('sid'); 
+		
+		if ($action->query->cookie('sign') eq md5_hex(
+			$this->salt,
+			$sid,
+			$this->salt
+		) ) {
+			
+			my $context = $action->application->security->Session(
+				id => $sid				
+			);
+			
+			my ($result,$challenge) = $context->auth->ValidateSession($sid);
+			
+			if ($result == AUTH_SUCCESS) {
+				return $context->Impersonate($nextHandler);				
+			} else {
+				return $nextHandler->();
+			}
+		}
+	} else {
+		die new IMPL::Exception("Unknown auth method",$method);
+	}
+}
+
+
+1;
\ No newline at end of file
--- a/Lib/IMPL/Web/Security.pm	Fri Mar 26 16:26:31 2010 +0300
+++ b/Lib/IMPL/Web/Security.pm	Mon Mar 29 06:56:05 2010 +0400
@@ -1,29 +1,72 @@
 package IMPL::Web::Security;
 
+use base qw(IMPL::Object IMPL::Security IMPL::Object::Autofill);
+
+use IMPL::Class::Property;
+
+__PACKAGE__->PassThroughArgs;
+
+BEGIN {
+	public property sessionFactory => prop_get | owner_set;
+	public property userFactory => prop_get | owner_set; 
+}
+
+sub CTOR {
+	my ($this) = @_;
+	
+	$this->dataSource or die new IMPL::InvalidArgumentException("The argument is required",'dataSource');
+}
+
+sub Session {
+	my ($this,%args) = @_;
+}
+
+sub User {
+	
+}
+
 1;
 
 __END__
 
 =pod
 
+=head1 NAME
+
+C<IMPL::Web::Security> ������ ��� �������������� � ����������� ��� �������.
+
+=head1 SINOPSYS
+
+=begin code xml
+
+<security type='IMPL::Config::Activator'>
+	<factory>IMPL::Web::Security</factory>
+	<parameters type='HASH'>
+		<sessionFactory type='IMPL::Object::Factory'>
+			<factory type='IMPL::Object::Factory'>App::Data::Session</factory>
+			<method>insert</method>
+		</sessionFactory>
+	</parameters>
+</security>
+
+=end code xml
+
 =head1 DESCRIPTION
 
-������ ��� �������������� � ����������� ��� �������.
-
-�������� ������, ��������� �� ���� ���������� ��� �����������, ���������� ����������� ������������
-� ������� �������� ������������.
-
-��� ���� ���������� ��������� ������ ��������������.
-
-���������� ��� �������������� ������ �������� ����� ��������������� ��������.
+�������� �� �������������� �������������� � ����������� ��������. �������� �����������
+����������� � ���, ��� ������� �������� ����� ������������ �������� �������, ���� �
+��������� � ����� ���������� ����������. � ����������� ����� ��������� ������ ��
+��������� ���� ���������. ������� ��� ������ ��������� ������ ���������������
+�������� ������������.
 
-=item C<IMPL::Web::Security::Server>
-
-��������������� ������������ �� ������ ������, ��������������� ��������
+C<IMPL::Web::Session> ������ �������������� ���������� ��������� � ������ ����� ������
+������������. ����� ��������� ������������ ������ �������������� ������, ������� ����������
+��������� ����� ���������� ��������.
 
-=item C<IMPL::Web::Security::Embed>
+C<IMPL::Web::User> ������, ��������������� ����� ����� ��������������� ������������
+C<IMPL::Security::Principal>, ��� ������ � ������� ������������ ��� �������� ��������
+�������������� C<IMPL::Security::Auth>.
 
-��������������� ������������ ��������� ��������� ������, ��� ���� �������� ������
-�� �������.
+=head1 MEMBERS
 
 =cut
\ No newline at end of file
--- a/Lib/IMPL/Web/Security/Embed.pm	Fri Mar 26 16:26:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-package IMPL::Web::Security::Embed;
-
-use base qw(IMPL::Object);
-
-1;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/IMPL/Web/Security/Session.pm	Mon Mar 29 06:56:05 2010 +0400
@@ -0,0 +1,14 @@
+package IMPL::Web::Security::Session;
+
+use base qw(IMPL::Object);
+
+use IMPL::Class::Property;
+
+__PACKAGE__->PassThroughArgs;
+
+BEGIN {
+	public property id => prop_all;
+	public property securityContext => prop_all;
+}
+
+1;
\ No newline at end of file
--- a/_doc/make.pl	Fri Mar 26 16:26:31 2010 +0300
+++ b/_doc/make.pl	Mon Mar 29 06:56:05 2010 +0400
@@ -158,31 +158,31 @@
 sub view_seq_link {
 	my ($self,$text) = @_;
 	
-	if ($text =~ /^\s*(?:(\w+)\s+)?(\w+(?:\:\:\w+)+)\s*$/) {
+	$text =~ s/(\w+(?:\:\:\w+)+)/
+		if (my $url = $self->mk_filelink($1)) {
+			"<a href='$url'>$1<\/a>";
+		} else {
+			$1;
+		}
+	/gex;
 	
-		my ($keyword, $package) = ($1 || '',$2);
-		
-		my @path = split /::/, $package;
-		
-		pop @path if $keyword;		
-		shift @path if uc $path[0] eq 'IMPL';
-		
+	return "<code>$text</code>";
+}
+
+sub mk_filelink {
+	my ($self,$package) = @_;
+	
+	return undef unless $package; 
+	
+	my @path = split /::/, $package;
+	
+	if ($path[0] eq 'IMPL') {
+		shift @path;
 		if (-f File::Spec->catfile($LibDir,@path).".pm") {
-			return '<code><a href="'. '../'x($level-1) . File::Spec->catfile(@path) .'.html">'.$text.'</a></code>';			
-		}
-		
-	} elsif ($text =~ /^\s*(\w+(?:\:\:\w+)+)\s*-&gt;\s*(\w+)\s*$/) {
-		my ($package,$member) = ($1,$2);
-		
-		my @path = split /::/, $package;
-		shift @path;
-		
-		if (-f File::Spec->catfile($LibDir,@path).".pm") {
-			return '<code><a href="'. '../'x($level-1) . File::Spec->catfile(@path) .'.html">'.$text.'</a></code>';			
+			return '../'x($level-1) . File::Spec->catfile(@path).'.html';
 		}
 	}
-	
-	return "<code>$text</code>";
+	return undef;	
 }
 
 sub view_seq_code {