# HG changeset patch # User wizard # Date 1268924313 -10800 # Node ID f47f935340054d112ea40976a8a705ac8fde9ae7 # Parent 2840c4c85db830fa9852e3565ac2874f69960046 Documentation diff -r 2840c4c85db8 -r f47f93534005 Lib/IMPL/Resources/Strings.pm --- 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 - Строковые ресурсы + =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, а переменная C<$ModName> получена +путем замены 'C<::>' в имени целевого модуля на 'C'. + +Если файл не был найден, то производится поиск в каталоге, где +расположен сам модуль, файла с относительным путем C, +где 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 diff -r 2840c4c85db8 -r f47f93534005 Lib/IMPL/Security.pm --- 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 - Модуль для работы с функциями авторизации и аутентификации. + +=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 + +Метод. Проверка доступа к объекту с определенными правами, в определенном контексте безопасности. + +=over + +=item C<$object> + +Объект доступа. + +=item C<$desiredAccess> + +Требуемые права доступа. + +=item C<$context> + +Контекст безопасности, если не указан, то используется текущий C<< IMPL::Security::Context->contextCurrent >> + +=item C + +C - результат проверки + +=back + +=item C + +Метод. Делегирует текущему пользователю полномочия другого пользователя. При этом выполняется проверка +правомерности такой операции. В случае неудачи вызывается исключение. + +=over + +=item C<$principal> + +Либо имя пользователя либо объект C. + +=item C<$role> + +Либо имя либо ссылка на роль, или ссылка на массив либо имен, либо ролей. + +=item C + +Новый контекст безопасности. + +=back + +=item C + +Возвращает список правил которые выполняются при проверках доступа. Пререопределите этот +метод, чтобы возвращать собственный список правил. Список правил является ссылкой на массив +элементами которого являются функции. + +=begin code + +package MySecurity; + +use base qw(IMPL::Security); + +sub Rules { + return [ + \&Rule1, + \&Rule2, + #... + ] +} + +=end code + +=back =cut \ No newline at end of file diff -r 2840c4c85db8 -r f47f93534005 Lib/IMPL/Security/Context.pm --- 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; } diff -r 2840c4c85db8 -r f47f93534005 Lib/IMPL/Web/Security.pm --- 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 -аутентифицирует пользователя на основе данных, предоставленных сервером +Аутентифицирует пользователя на основе данных, предоставленных сервером =item C diff -r 2840c4c85db8 -r f47f93534005 Lib/IMPL/Web/Security/Embed.pm --- /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 diff -r 2840c4c85db8 -r f47f93534005 _doc/make.pl --- 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 "
  • "; - print $hout "" if $item->{url}; + print $hout "" if $item->{url}; print $hout $item->{name}; print $hout "" 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 < @@ -109,9 +109,28 @@ FOOTER +undef $hout; + +open $hout, ">:encoding(utf-8)","$OutDir/index.html" or die "failed to open index.html for output: $!"; + +print $hout < + + +IMPL reference + + + + + + +FRAMES + package PodViewHTML; use base qw(Pod::POM::View::HTML); +use IPC::Open2; + sub view_pod { my ($self, $pod) = @_; return "\n @@ -121,7 +140,7 @@ } sub view_begin { my ($self,$begin) = @_; - $begin->format =~ /code/i ? return "
    \n".escape_html(join ("",$begin->text()))."
    \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 "
    ".escape_html($text)."
    \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 "
    ".escape_html($text)."
    \n"; + + binmode $hout, ':encoding(utf8)'; + binmode $hin, ':encoding(utf8)'; + + print $hout $text; + + undef $hout; + + my $fragment = <$hin>; + + undef $hin; + + return $fragment; + +} diff -r 2840c4c85db8 -r f47f93534005 _test/Resources/app.xml --- 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 @@ + + Sample application IMPL::Object @@ -13,11 +15,18 @@ - + + + + + + utf-8 + + IMPL::Web::Application::Action @@ -29,6 +38,8 @@ + + cp1251