diff Lib/IMPL/Security/Auth/Simple.pm @ 230:6d8092d8ce1b

*reworked IMPL::Security *reworked IMPL::Web::Security *refactoring
author sergey
date Mon, 08 Oct 2012 03:37:37 +0400
parents 4d0e1962161c
children 23daf2fae33a
line wrap: on
line diff
--- a/Lib/IMPL/Security/Auth/Simple.pm	Sat Sep 29 02:34:47 2012 +0400
+++ b/Lib/IMPL/Security/Auth/Simple.pm	Mon Oct 08 03:37:37 2012 +0400
@@ -1,61 +1,69 @@
 package IMPL::Security::Auth::Simple;
 use strict;
 
-use parent qw(IMPL::Object IMPL::Security::Auth);
-use Digest::MD5;
+use Digest::MD5 qw(md5_hex);
 
-use IMPL::Class::Property;
 use IMPL::Security::Auth qw(:Const);
 
-BEGIN {    
-    private property _passwordImage => prop_all;
-    private property _sessionCookie => prop_all;
-}
+use IMPL::Const qw(:prop);
+use IMPL::declare {
+    require => {
+        Exception => 'IMPL::Exception',
+        WrongDataException => '-IMPL::WrongDataException'        
+    },
+    base => [
+        'IMPL::Security::Auth' => undef,
+        'IMPL::Object' => undef
+    ],
+    props => [
+        _stage => PROP_ALL,
+        _salt => PROP_ALL,
+        _image => PROP_ALL
+    ]
+};
+
+use constant {
+    STAGE_INIT => 1,
+    STAGE_DONE => 2    
+};
 
 sub CTOR {
     my ($this,$secData) = @_;
     
-    my ($passImg,$cookie) = split /\|/,$secData;
+    my ($stage,$salt,$img) = split /\|/,$secData;
+    
+    die WrongDataException->new()  unless grep $_ == $stage, (STAGE_INIT, STAGE_DONE);
     
-    $this->_passwordImage($passImg);
-    $this->_sessionCookie($cookie);
+    $this->_stage($stage);
+    $this->_salt($salt);
+    $this->_image($img);
+    
 }
 
 sub secData {
     my ($this) = @_;
     
-    if ($this->_sessionCookie) {
-        return join ('|',$this->_passwordImage, $this->_sessionCookie );
-    } else {
-        return $this->_passwordImage;
-    }
+    return join ('|',$this->_stage, $this->_salt , $this->_image );
 }
 
 sub isTrusted {
     my ($this) = @_;
     
-    $this->_sessionCookie ? 1 : 0;
+    $this->_stage == STAGE_DONE ? 1 : 0;
 }
 
 sub DoAuth {
     my ($this,$challenge) = @_;
-
-    if (Digest::MD5::md5_hex($challenge) eq $this->_passwordImage) {
-        return (AUTH_SUCCESS,$this->_sessionCookie($this->GenSSID));
-    } elsee {
-        return (AUTH_FAIL,$this->_sessionCookie(undef));
-    }
-}
+    
+    my $salt = $this->_salt;
 
-sub ValidateSession {
-    my ($this,$cookie) = @_;
-    
-    die new IMPL::InvalidOperationException("The context is untrusted") unless $this->_sessionCookie;
-    
-    if ($cookie eq $this->_sessionCookie) {
-        return (AUTH_SUCCESS,undef);
-    } else {
-        return (AUTH_FAIL,undef);
+    if (md5_hex($salt, $challenge, $salt) eq $this->_image) {
+        if ($this->_stage == STAGE_INIT) {
+            $this->_stage(STAGE_DONE);
+        }
+        return (AUTH_SUCCESS, undef);
+    } elsee {
+        return (AUTH_FAIL, undef);
     }
 }
 
@@ -64,11 +72,12 @@
     
     die new IMPL::InvalidArgumentException("The parameter is required",'password') unless $args{password};
     
-    return Digest::MD5::md5_hex($args{password});
+    my $salt = $self->GenSSID();
+    return return join ('|',STAGE_INIT, $salt, md5_hex($salt,$args{password},$salt));
 }
 
 sub SecDataArgs {
-    password => 'SCALAR'        
+    password => 'SCALAR'
 }
 
 1;
@@ -87,26 +96,24 @@
 
 =head1 MEMBERS
 
-=over
-
-=item C<CTOR($secData)>
+=head2 C<CTOR($secData)>
 
 Создает объект аутентификации, передавая ему данные для инициализации.
 
-=item C<[get]secData>
+=head2 C<[get]secData>
 
 Возвращает данные безопасности, которые можно использовать для восстановления
 состояния объекта.
 
-=item C<[get]isTrusted>
+=head2 C<[get]isTrusted>
 
 Является ли объект доверенным для аутентификации сессии (тоесть хранит данные
 для аутентификации сессии).
 
-=item C<DoAuth($challenge)>
+=head2 C<DoAuth($challenge)>
 
 Аутентифицирует пользователя. Используется один этап. C<$challenge>
-открытый пароль пользователя.
+открытый пароль пользователя или cookie сессии.
 
 Возвращает C<($status,$challenge)>
 
@@ -118,28 +125,7 @@
 
 =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
+В случае успеха возвращает cookie (уникальный номер) сессии, либо C<undef>
 
 =back