Mercurial > pub > Impl
comparison Lib/Security/Auth.pm @ 0:03e58a454b20
Создан репозитарий
| author | Sergey |
|---|---|
| date | Tue, 14 Jul 2009 12:54:37 +0400 |
| parents | |
| children | 16ada169ca75 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:03e58a454b20 |
|---|---|
| 1 package Security::Auth; | |
| 2 use strict; | |
| 3 use Common; | |
| 4 use Security; | |
| 5 use DateTime; | |
| 6 use Digest::MD5 qw(md5_hex); | |
| 7 our @ISA = qw(Object); | |
| 8 | |
| 9 our $Package; | |
| 10 our $DataSource; | |
| 11 | |
| 12 srand time; | |
| 13 | |
| 14 BEGIN { | |
| 15 DeclareProperty DS => ACCESS_READ; | |
| 16 DeclareProperty SecPackage => ACCESS_READ; | |
| 17 } | |
| 18 | |
| 19 { | |
| 20 my $i = 0; | |
| 21 sub GenSSID() { | |
| 22 return md5_hex(time,rand,$i++); | |
| 23 } | |
| 24 } | |
| 25 | |
| 26 sub CTOR { | |
| 27 my ($this,%args) = @_; | |
| 28 $this->{$DS} = $args{'DS'} or die new Exception('A data source is required'); | |
| 29 $this->{$SecPackage} = $args{'SecPackage'} or die new Exception('A security package is required'); | |
| 30 } | |
| 31 | |
| 32 sub AuthenticateUser { | |
| 33 my ($this,$Name,$SecData) = @_; | |
| 34 | |
| 35 my $User = $this->{$DS}->FindUser($Name); | |
| 36 if (not $User or not $User->Active ) { | |
| 37 return new Security::AuthResult ( | |
| 38 State => Security::AUTH_FAILED, | |
| 39 AuthModule => $this | |
| 40 ); | |
| 41 } else { | |
| 42 | |
| 43 | |
| 44 if (my $StoredData = $this->{$DS}->GetUserAuthData($User,$this->{$SecPackage})) { | |
| 45 my $AuthData = $this->{$SecPackage}->ConstructAuthData($StoredData->AuthData); | |
| 46 if ((my $status = $AuthData->DoAuth($SecData)) != Security::AUTH_FAILED) { | |
| 47 $AuthData = $this->{$SecPackage}->NewAuthData(GenSSID); | |
| 48 return new Security::AuthResult ( | |
| 49 State => $status, | |
| 50 Session => $this->{$DS}->CreateSession(GenSSID,$User,$AuthData), | |
| 51 ClientSecData => $AuthData->ClientAuthData, | |
| 52 AuthModule => $this | |
| 53 ) | |
| 54 } else { | |
| 55 return new Security::AuthResult ( | |
| 56 State => Security::AUTH_FAILED, | |
| 57 AuthModule => $this | |
| 58 ); | |
| 59 } | |
| 60 } else { | |
| 61 # the user isn't allowed to authenticate using this method | |
| 62 return new Security::AuthResult ( | |
| 63 State => Security::AUTH_FAILED, | |
| 64 AuthModule => $this | |
| 65 ); | |
| 66 } | |
| 67 } | |
| 68 } | |
| 69 | |
| 70 sub AuthenticateSession { | |
| 71 my ($this,$SSID,$SecData) = @_; | |
| 72 | |
| 73 my $Session = $this->{$DS}->LoadSession($SSID) or return new Security::AuthResult(State => Security::AUTH_FAILED); | |
| 74 | |
| 75 my $AuthData = $this->{$SecPackage}->ConstructAuthData($Session->SecData); | |
| 76 if ((my $status = $AuthData->DoAuth($SecData)) != Security::AUTH_FAILED) { | |
| 77 $Session->SecData($AuthData->SessionAuthData); | |
| 78 $Session->LastUsage(DateTime->now()); | |
| 79 return new Security::AuthResult(State => $status, Session => $Session, ClientSecData => $AuthData->ClientAuthData, AuthModule => $this); | |
| 80 } else { | |
| 81 $this->{$DS}->CloseSession($Session); | |
| 82 return new Security::AuthResult(State => Security::AUTH_FAILED, AuthModule => $this); | |
| 83 } | |
| 84 } | |
| 85 | |
| 86 sub CreateUser { | |
| 87 my ($this,$uname,$description,$active,$secData) = @_; | |
| 88 | |
| 89 my $user = $this->{$DS}->CreateUser($uname,$description,$active); | |
| 90 $this->{$DS}->SetUserAuthData($user,$this->{$SecPackage},$this->{$SecPackage}->NewAuthData($secData)); | |
| 91 | |
| 92 return $user; | |
| 93 } | |
| 94 | |
| 95 sub try_construct { | |
| 96 my $package = shift; | |
| 97 return $package->can('construct') ? $package->construct() : $package; | |
| 98 } | |
| 99 | |
| 100 sub construct { | |
| 101 $Package or die new Exception('A security package is reqiured'); | |
| 102 $DataSource or die new Exception('A data source is required'); | |
| 103 eval "require $DataSource;" or die new Exception('Failed to load the data source module',$@) if not ref $DataSource; | |
| 104 eval "require $Package;" or die new Exception('Failed to load the security package module',$@) if not ref $Package; | |
| 105 return __PACKAGE__->new(DS => try_construct($DataSource), SecPackage => try_construct($Package)); | |
| 106 } | |
| 107 | |
| 108 1; |
