changeset 66:f47f93534005

Documentation
author wizard
date Thu, 18 Mar 2010 17:58:33 +0300
parents 2840c4c85db8
children 9f5795a10939
files Lib/IMPL/Resources/Strings.pm Lib/IMPL/Security.pm Lib/IMPL/Security/Context.pm Lib/IMPL/Web/Security.pm Lib/IMPL/Web/Security/Embed.pm _doc/make.pl _test/Resources/app.xml
diffstat 7 files changed, 264 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/Lib/IMPL/Resources/Strings.pm	Tue Mar 16 17:36:13 2010 +0300
+++ b/Lib/IMPL/Resources/Strings.pm	Thu Mar 18 17:58:33 2010 +0300
@@ -75,14 +75,21 @@
 sub get {
     my ($this,$msg_name) = @_;
 }
+
 1;
 
 __END__
 
 =pod
 
+=head1 NAME
+
+C<IMPL::Resources::Strings> - Строковые ресурсы
+
 =head1 SYNOPSIS
 
+=begin code
+
 package Foo;
 
 use IMPL::Resources::Strings {
@@ -97,4 +104,38 @@
     
 }
 
+=end code
+
+=head1 DESCRIPTION
+
+Импортирует в целевой модуль функции, которые возвращают локализованные
+параметризованные сообщения.
+
+При импорте ищутся модули по следующему алгоритму:
+
+В каталогах из массива C<@Locations> ищется файл с относительным путем
+C<$Base/$Locale/$ModName>, где C<$Base>, C<$Locale> - глобальные переменные
+модуля C<IMPL::Resourses::Strings>, а переменная C<$ModName> получена
+путем замены 'C<::>' в имени целевого модуля на 'C</>'.
+
+Если файл не был найден, то производится поиск в каталоге, где
+расположен сам модуль, файла с относительным путем C<locale/$Locale/$ShortModName>,
+где C<$ShortModeName> - последняя часть после 'C<::>' из имени целевого модуля.
+
+Если файл не найден, то используются строки, указанные при объявлении
+сообщений в целевом модуле.
+
+=head1 FORMAT
+
+=begin code text
+
+msg_name = any text with named %params%
+msg_hello = hello, %name%!!!
+msg_resolve = this is a value of the property: %user.age%
+
+msg_short_err = %error.Message%
+msg_full_err = %error% 
+
+=end code text 
+
 =cut
--- a/Lib/IMPL/Security.pm	Tue Mar 16 17:36:13 2010 +0300
+++ b/Lib/IMPL/Security.pm	Thu Mar 18 17:58:33 2010 +0300
@@ -16,6 +16,12 @@
 	return 1;
 }
 
+sub Take {
+	my ($self,$principal,$refRoles) = @_;
+	
+	die new IMPL::NotImplementedException();
+}
+
 sub Rules {
 	return \@rules;
 }
@@ -26,6 +32,63 @@
 
 =pod
 
+=head1 NAME
+
+C<IMPL::Security> - Модуль для работы с функциями авторизации и аутентификации.
+
+=head1 SINOPSYS
+
+=begin code
+
+use IMPL::Security;
+
+my Method {
+	my $this = shift;
+	
+	# access check in the current context, using standard configuration
+	IMPL::Security->AccessCheck($this,'Method') or die new IMPL::AccessDeniedException("Access is denied");
+	
+	#some more results 
+}
+
+my DelegationMethod {
+	
+	my $this = shift;
+	
+	#forced delegation 
+	my $delegatedContext = IMPL::Security::Context->new(
+		Principal => IMPL::Security::Principal->new(
+			Name => 'suser'
+		),
+		AssignedRoles => ['administrator']
+	)
+	
+	my $result;
+	
+	$delegatedContext->Impersonate(sub{
+		$result = $this->Method();
+	});
+	
+	return $result;
+}
+
+my SafeDelegationMethod {
+	
+	my $this = shift;
+	
+	my $delegatedContext = IMPL::Security->Take( suser => 'administrator' );
+	
+	my $result;
+	
+	$delegatedContext->Impersonate(sub{
+		$result = $this->Method();
+	});
+	
+	return $result;
+}
+
+=end code
+
 =head1 DESCRIPTION
 
 Модуль для инфраструктуры безопасности, реализует основные функции для авторизации
@@ -38,6 +101,77 @@
 При проверке прав доступа происходит последовательная проверка правил доступа,
 если все правила выполнены, то доступ разрешается.
 
+=head1 MEMBERS
 
+=over
+
+=item C<AccessCheck($object,$desiredAccess,$context)>
+
+Метод. Проверка доступа к объекту с определенными правами, в определенном контексте безопасности.
+
+=over
+
+=item C<$object>
+
+Объект доступа.
+
+=item C<$desiredAccess>
+
+Требуемые права доступа.
+
+=item C<$context>
+
+Контекст безопасности, если не указан, то используется текущий C<< IMPL::Security::Context->contextCurrent >>
+
+=item C<returns>
+
+C<true | false> - результат проверки
+
+=back
+
+=item C<Take($principal,$role)>
+
+Метод. Делегирует текущему пользователю полномочия другого пользователя. При этом выполняется проверка
+правомерности такой операции. В случае неудачи вызывается исключение.
+
+=over
+
+=item C<$principal>
+
+Либо имя пользователя либо объект C<IMPL::Security::Principal>.
+
+=item C<$role>
+
+Либо имя либо ссылка на роль, или ссылка на массив либо имен, либо ролей.
+
+=item C<returns>
+
+Новый контекст безопасности.
+
+=back
+
+=item C<Roles()>
+
+Возвращает список правил которые выполняются при проверках доступа. Пререопределите этот
+метод, чтобы возвращать собственный список правил. Список правил является ссылкой на массив
+элементами которого являются функции.
+
+=begin code
+
+package MySecurity;
+
+use base qw(IMPL::Security);
+
+sub Rules {
+	return [
+		\&Rule1,
+		\&Rule2,
+		#...
+	]
+}
+
+=end code
+
+=back
 
 =cut
\ No newline at end of file
--- a/Lib/IMPL/Security/Context.pm	Tue Mar 16 17:36:13 2010 +0300
+++ b/Lib/IMPL/Security/Context.pm	Thu Mar 18 17:58:33 2010 +0300
@@ -13,7 +13,7 @@
 
 BEGIN {
     public property Principal => prop_get;
-    public property AssignedRoles => prop_all;
+    public property AssignedRoles => prop_all | prop_list;
     public property AuthSession => prop_all;
 }
 
--- a/Lib/IMPL/Web/Security.pm	Tue Mar 16 17:36:13 2010 +0300
+++ b/Lib/IMPL/Web/Security.pm	Thu Mar 18 17:58:33 2010 +0300
@@ -10,16 +10,16 @@
 
 Модуль для аутентификации и авторизации веб запроса.
 
-Получает запрос, вчленяет из него информацию для авторизации, производит авторизацию пользователя
+Получает запрос, вычленяет из него информацию для авторизации, производит авторизацию пользователя
 и создает контекст безопасности.
 
 При этом использует указанные модули аутентификации.
 
-Информацию для аутентификации модкль получает через соответствующие адаптеры.
+Информацию для аутентификации модуль получает через соответствующие адаптеры.
 
 =item C<IMPL::Web::Security::Server>
 
-аутентифицирует пользователя на основе данных, предоставленных сервером
+Аутентифицирует пользователя на основе данных, предоставленных сервером
 
 =item C<IMPL::Web::Security::Embed>
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/IMPL/Web/Security/Embed.pm	Thu Mar 18 17:58:33 2010 +0300
@@ -0,0 +1,3 @@
+package IMPL::Web::Security::Embed;
+
+use base qw(IMPL::Object);
\ No newline at end of file
--- a/_doc/make.pl	Tue Mar 16 17:36:13 2010 +0300
+++ b/_doc/make.pl	Thu Mar 18 17:58:33 2010 +0300
@@ -32,7 +32,7 @@
     open my $hPod, "<:encoding(cp1251)", $fname or die "Failed to open $fname for input: $!";
     open my $hOut, ">:encoding(utf-8)", $fnameOut or die "Failed to open $fnameOut for output: $!";
     
-    my $parser = Pod::POM->new( );
+    my $parser = Pod::POM->new();
     
     my $pom = $parser->parse_file($hPod);
     
@@ -75,7 +75,7 @@
 		foreach my $itemKey (sort keys %{$index->{items}}) {
 			my $item = $index->{items}{$itemKey};
 			print $hout "<li>";
-			print $hout "<a href='$item->{url}'>" if $item->{url};
+			print $hout "<a target='content' href='$item->{url}'>" if $item->{url};
 			print $hout $item->{name};
 			print $hout "</a>" if $item->{url};
 			build_index($hout,$item) if $item->{items};
@@ -91,7 +91,7 @@
 
 process_dir($LibDir);
 
-open my $hout, ">:encoding(utf-8)", "$OutDir/index.html" or die "failed to open index.html for output: $!";
+open my $hout, ">:encoding(utf-8)", "$OutDir/toc.html" or die "failed to open toc.html for output: $!";
 
 print $hout <<HEADER;
 <html>
@@ -109,9 +109,28 @@
 </html>
 FOOTER
 
+undef $hout;
+
+open $hout, ">:encoding(utf-8)","$OutDir/index.html" or die "failed to open index.html for output: $!";
+
+print $hout <<FRAMES;
+<html>
+<head>
+<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>
+<title>IMPL reference</title>
+</head>
+<frameset cols="30%,*">
+	<frame name="toc" src="toc.html"/>
+	<frame name="content" src="about:blank"/>
+</frameset>
+</html>
+FRAMES
+
 package PodViewHTML;
 use base qw(Pod::POM::View::HTML);
 
+use IPC::Open2;
+
 sub view_pod {
     my ($self, $pod) = @_;
     return "<html>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />
@@ -121,7 +140,7 @@
 }
 sub view_begin {
 	my ($self,$begin) = @_;
-	$begin->format =~ /code/i ? return "<pre>\n".escape_html(join ("",$begin->text()))."</pre>\n" : return $self->SUPER::view_begin($begin); 
+	return code_highlight(join ("",$begin->content()),$begin->format);
 }
 
 sub escape_html {
@@ -169,3 +188,50 @@
 sub view_seq_code {
 	goto &view_seq_link;
 }
+
+sub view_code {
+	my ($self,$code) = @_;
+	
+	return code_highlight($code);
+}
+
+sub code_highlight {
+	my ($text,$format) = @_;
+	
+	if ($format) {
+		$format =~ s/code//i;
+		$format =~ s/\s+//g;
+	}
+	
+	$format ||= 'perl';
+	
+	return "<pre>".escape_html($text)."</pre>\n" if $format =~ /^text$/i;
+	
+	
+	
+	my ($hin,$hout);
+	local $/ = undef;
+	my $pid = eval { open2(
+		$hin, $hout, highlight => (
+			'--syntax' => $format,
+			'--html',
+			'--fragment',
+			'--inline-css',
+			'--enclose-pre'
+		)
+	) } or return "<pre>".escape_html($text)."</pre>\n";
+	
+	binmode $hout, ':encoding(utf8)';
+	binmode $hin, ':encoding(utf8)';
+	
+	print $hout $text;
+	
+	undef $hout;
+	
+	my $fragment = <$hin>;
+	
+	undef $hin;
+	
+	return $fragment;
+	
+}
--- a/_test/Resources/app.xml	Tue Mar 16 17:36:13 2010 +0300
+++ b/_test/Resources/app.xml	Thu Mar 18 17:58:33 2010 +0300
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Application id='app' type="Test::Web::Application::Instance">
+	
+	<!-- Begin custom properties -->
 	<name>Sample application</name>
 	<dataSource type='IMPL::Config::Activator' id='ds'>
 		<factory>IMPL::Object</factory>
@@ -13,11 +15,18 @@
 		<parameters type='HASH'>
 			<ds refid='ds'/>
 		</parameters>
-	</securityMod>
+	</securityMod>	
+	<!-- End custom properties -->
+	
+	<!-- direct access to the activators -->
 	<options type="HASH">
 		<dataSource refid='ds'/>
 	</options>
+	
+	<!-- Set default output encoding, can be changed due query handling -->
 	<responseCharset>utf-8</responseCharset>
+	
+	<!-- Actions creation configuration -->
 	<factoryAction type="IMPL::Object::Factory">
 		<factory>IMPL::Web::Application::Action</factory>
 		<parameters type='HASH'>
@@ -29,6 +38,8 @@
 			</responseFactory>
 		</parameters>
 	</factoryAction>
+	
+	<!-- Query processing  -->
 	<handlersQuery type="IMPL::Object::List">
 		<item type="IMPL::Web::QueryHandler::PageFormat">
 			<templatesCharset>cp1251</templatesCharset>