# HG changeset patch # User Sergey # Date 1266955036 -10800 # Node ID a9b70d836b2858ce87d63551aec615c1318c8e22 # Parent 75148ccd732de0cd7106910daa8c8f384ac495d9 Web::Application development (request controller) Security development diff -r 75148ccd732d -r a9b70d836b28 Lib/IMPL/Config.pm --- a/Lib/IMPL/Config.pm Tue Feb 02 17:09:49 2010 +0300 +++ b/Lib/IMPL/Config.pm Tue Feb 23 22:57:16 2010 +0300 @@ -116,6 +116,8 @@ =head1 MEMBERS +=over + =item static LoadXMLFile($fileName) Создает из XML файла экземпляр приложения @@ -125,4 +127,6 @@ =item xml Сохраняет конфигурацию приложения в XML строку +=back + =cut \ No newline at end of file diff -r 75148ccd732d -r a9b70d836b28 Lib/IMPL/Security/Context.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Security/Context.pm Tue Feb 23 22:57:16 2010 +0300 @@ -0,0 +1,42 @@ +package IMPL::Security::Context; +use strict; +use warnings; + +use base qw(IMPL::Object); + +use IMPL::Class::Property; + +require IMPL::Security::Principal; + +my $current = __PACKAGE__->nobody; +my $nobody; + +BEGIN { + public property Principal => prop_get; + public property AssignedRoles => prop_all; +} + +sub Impersonate { + my ($this,$code) = @_; + + my $old = $current; + my $result; + local $@; + eval { + $result = $code->(); + }; + $current = $old; + if($@) { + die $@; + } else { + return $result; + } +} + +sub nobody { + my ($self) = @_; + $nobody = $self->new(Principal => IMPL::Security::Principal->nobody, AssignedRoles => undef) unless $nobody; + $nobody; +} + +1; diff -r 75148ccd732d -r a9b70d836b28 Lib/IMPL/Security/Principal.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Security/Principal.pm Tue Feb 23 22:57:16 2010 +0300 @@ -0,0 +1,15 @@ +package IMPL::Security::Principal; +use strict; +use warnings; + +use base qw(IMPL::Object); +use IMPL::Class::Property; + +BEGIN { + public property Name => prop_get; + public property Description => prop_get; +} + + + +1; diff -r 75148ccd732d -r a9b70d836b28 Lib/IMPL/Web/Application.pm --- a/Lib/IMPL/Web/Application.pm Tue Feb 02 17:09:49 2010 +0300 +++ b/Lib/IMPL/Web/Application.pm Tue Feb 23 22:57:16 2010 +0300 @@ -3,13 +3,45 @@ use warnings; use base qw(IMPL::Object IMPL::Object::Singleton); +use IMPL::Class::Property; +BEGIN { + public property RequestFactory => prop_all; + public property ContextInitializers => prop_all; +} +# custom factory +sub new { + my ($self,$file) = @_; + + return $self->LoadXMLFile($file); +} + +sub Run { + my ($this) = @_; + + while (my $request = $this->fetch_request()) { + my $context = $this->prepare_context($request); + $context->invoke($request); + } +} 1; =pod +=head1 SYNOPSIS +require MyApp; +MyApp->instance('app.config')->Run(); + +=head1 DESCRIPTION + +Зкземпляр приложения содержит в себе глобальные настройки, реализует контроллер запросов, + +Получая запрос из источника запросов, создает контекст выполнения запроса +затем выполняет запрос в указанном контексте. + +Контекст формируется сначала из запроса, а затем посредством набора инициализаторов =cut \ No newline at end of file