#============================================================ # MyAuthApplication #============================================================ package MyAuthApplication; use MyApplication; @ISA = qw(MyApplication); use strict; use SQLDB; #========================================== # 大域変数 #========================================== my $DefaultSendmail = '/usr/sbin/sendmail'; my $SourceCharCode = Jcode::getcode('月火水木金土日 '); #============================================================ # 静的関数 #============================================================ #============================================================ # 変数等取得関数 #============================================================ #============================================================ # コンストラクタ、デストラクタ #============================================================ BEGIN { } sub new { my ($module, $app) = @_; my $this = {}; bless $this; # $this->SUPER::new(@_); return $this; } sub DESTROY { my $this = shift; # $this->SUPER::DESTROY(@_); } #============================================================ # 継承クラスで定義しなおす関数 #============================================================ #============================================================ # 一般関数 #============================================================ #========================================== # 認証関係 #========================================== sub CryptMethod { my ($this, $cm) = @_; return $this->{CryptMethod} = $cm; } sub CryptPhrase { my ($this, $phrase) = @_; return $this->{CryptPhrase} = $phrase; } sub SetCryptedHeader { my ($this, $header) = @_; return $this->{CryptedHeader} = $header; } sub Crypt { my ($this, $s, $CryptMethod, $CryptPhrase, $CryptedHeader) = @_; my $pParams = $this->pParams(); $pParams = {} if(!defined $pParams); $CryptMethod = $pParams->{CryptMethod} if(!defined $CryptMethod); $CryptPhrase = $pParams->{CryptPhrase} if(!defined $CryptPhrase); $CryptedHeader = $pParams->{CryptedHeader} if(!defined $CryptedHeader); #$this->print("C2: $pParams->{CryptMethod}, $pParams->{CryptPhrase}, $pParams->{CryptedHeader}\n"); #$this->print("C3: $CryptMethod, $CryptPhrase, $CryptedHeader\n"); return $s if($s eq ''); return $s if($CryptedHeader ne '' and $s =~ /^$CryptedHeader/); # if($this->pParams()->{LogonUserPrivilege} =~ /IPAddressCoded/i) { if($this->HasPrivilege('IPAddressCoded', 0)) { my $ip = $this->RemoteIPAddress(); $s = $CryptedHeader . Utils::Crypt($CryptMethod, $CryptPhrase, "$s:/:$ip"); } else { $s = $CryptedHeader . Utils::Crypt($CryptMethod, $CryptPhrase, $s); } $s =~ s/[\+&\s]/@/g; return $s; } sub CryptForSchedule { my ($this, $s, $CryptMethod, $CryptPhrase, $CryptedHeader) = @_; $CryptMethod = $this->{CryptMethod} if(!defined $CryptMethod); $CryptPhrase = $this->{CryptPhrase} if(!defined $CryptPhrase); $CryptedHeader = $this->{CryptedHeader} if(!defined $CryptedHeader); return $s if($s eq ''); return $s if($CryptedHeader ne '' and $s =~ /^$CryptedHeader/); # if($this->pParams()->{LogonUserPrivilege} =~ /NoIPAddressCoded/i) { if($this->HasPrivilege('NoIPAddressCoded', 0)) { $s = $CryptedHeader . Utils::Crypt($CryptMethod, $CryptPhrase, $s); } else { my $ip = $this->RemoteIPAddress(); $s = $CryptedHeader . Utils::Crypt($CryptMethod, $CryptPhrase, "$s:/:$ip"); } $s =~ s/[\+&\s]/@/g; return $s; } sub IsIncluded { my ($this, $key, $KeyList, $separator) = @_; $separator = "[,\\|\\s]+" if(!defined $separator); my @keys = Utils::Split($separator, $KeyList); for(my $i = 0 ; $i < @keys ; $i++) { return 1 if($key eq $keys[$i]); } return 0; } sub MergePrivileges { my ($this, $priv1, $priv2) = @_; my @p = (Utils::Split("[,\\|\\s]+", $priv1), Utils::Split("[,\\|\\s]+", $priv2)); my %h; for(my $i = 0 ; $i < @p ; $i++) { $h{$p[$i]}++; } my $s = ''; foreach my $key (sort keys %h) { if($s eq '') { $s .= $key; } else { $s .= ",$key"; } } #$this->print("s: [$priv1][$priv2][$s]\n"); #$this->print("s: [$s]\n"); return $s; } sub IsPrivilegeIncluded { my ($this, $Privilege, $PrivilegeList) = @_; my @Privileges = Utils::Split("[,\\|\\s]+", $PrivilegeList); #$this->print("TargetPrivilege:[$Privilege]\n"); for(my $i = 0 ; $i < @Privileges ; $i++) { #$this->print("$i: [$Privileges[$i]]/[$Privilege]\n"); return 1 if($Privilege eq $Privileges[$i]); } return 0; } sub GetPrivilege { my ($this, $DB, $EMail, $UsersTableName, $pPrivilegesList) = @_; return '' if(!$DB); my $pParams = $this->pParams(); $pPrivilegesList = $pParams->{pPrivilegesList} if(!defined $pPrivilegesList); $pParams = {} if(!defined $pParams); $UsersTableName = $pParams->{UsersTableName} if(!defined $UsersTableName); my $priv = ''; my $category = ''; if($DB) { my $ret = $DB->Search($UsersTableName, "EMail=\'$EMail\' order by sn desc", ""); my %Hit = $DB->GetNextHit(); $priv = $Hit{Privilege}; $category = $Hit{Category}; #$this->print("p: $priv/$pPrivilegesList\n"); } #===================================================================== # # .iniファイルで個別に追加 #Privilege::ByCategory::Everyone=Logon #Privilege::ByCategory::Secretary=LogonLevel2 #Privilege::ByCategory::Committee=LogonLevel1 #Privilege::ByPrivilege::Everyone=Logon #Privilege::ByPrivilege::LogonLevel1=Logon # #===================================================================== #Privilege::ByCategory #Privilege::ByCategory::Everyone my $s = $pParams->{"Privilege::ByCategory::Everyone"}; $priv = $this->MergePrivileges($priv, $s) if($s); #Privilege::ByCategory::{Category} #$this->print("Category[$category]\n"); my @cat = Utils::Split(",", $category); foreach my $cat (@cat) { my $s = $pParams->{"Privilege::ByCategory::${cat}"}; next if(!$s); #$this->print("PC[$cat][$s]\n"); $priv = $this->MergePrivileges($priv, $s); if($s =~ /^LogonLevel(\d+)$/) { $priv = $this->MergePrivileges($priv, $pPrivilegesList->[$1]); } } if($pPrivilegesList) { my $pParams = $this->pParams(); #$this->H3("PL[$pParams->{LogonLevel}]\n"); if(defined $pParams and defined $pParams->{LogonLevel} and $pParams->{LogonLevel} > 0) { for(my $i = $pParams->{LogonLevel} ; $i < @$pPrivilegesList ; $i++) { $priv = $this->MergePrivileges($priv, $pPrivilegesList->[$i]); } $priv = $this->MergePrivileges($priv, "LogonLevel$pParams->{LogonLevel}"); } } #$this->print("p2: $priv\n"); #Privilege::ByPrivilege #Privilege::ByPrivilege::Everyone $s = $pParams->{"Privilege::ByPrivilege::Everyone"}; $priv = $this->MergePrivileges($priv, $s) if($s); #Privilege::ByPrivilege::{Privilege} my @prv = Utils::Split("\\s*,\\s*", $priv); foreach my $prv (@prv) { #$this->print("Prv[$prv]\n"); my $s = $pParams->{"Privilege::ByPrivilege::${prv}"}; next if(!$s); #$this->print("PP[$prv][$s]\n"); $priv = $this->MergePrivileges($priv, $s); if($s =~ /^LogonLevel(\d+)$/) { $priv = $this->MergePrivileges($priv, $pPrivilegesList->[$1]); } } #$this->print("p3: $priv/$pPrivilegesList\n"); return $priv; } sub CheckPrivilege { my ($this, $DB, $EMail, $priv, $Password, $UsersTableName) = @_; return 0 if(!$DB); my $pParams = $this->pParams(); $pParams = {} if(!defined $pParams); $UsersTableName = $pParams->{UsersTableName} if(!defined $UsersTableName); my $ret = $DB->Search($UsersTableName, "EMail=\'$EMail\' order by sn desc", ""); my %Hit = $DB->GetNextHit(); #$App->print("EMail : $Hit{EMail} [$EMail]\n"); #$App->print("Password : $Hit{Password} [$Password]\n"); #$App->print("Privilege: $Hit{Privilege}\n"); return -1 unless($Password eq $Hit{Password} or $Password eq $this->Crypt($Hit{Password})); return 1 if($Hit{Privilege} =~ /$priv/i); # if($App->IsAdministrator($DB, $EMail)) { # return 0 if($priv =~ /^LimitedByIPAddress$/i); # return 1; #$Hit{Privilege}; # } return 0; } sub HasPriviledge { return HasPrivilege(@_); } sub HasPrivilege { my ($this, $key, $IsPrint) = @_; $IsPrint = 1 if(!defined $IsPrint); my $pParams = $this->pParams(); $pParams = {} if(!defined $pParams); #$this->print("MyCGIApplication::HasPrivilege: key=[$key]\n"); if($pParams->{LogonLevel} <= 0) { if($IsPrint) { $this->mlPrintRawHTML('en' => "

$key is not allowed for non-logon user

", 'jp' => "

$keyを実行するにはログオンする必要があります

"); } return 0; } if($key eq 'IPAddressCoded' or $key eq 'NoIPAddressCoded') { return $this->IsPrivilegeIncluded($key, $pParams->{LogonUserPrivilege}); } #$this->print("MyCGIApplication::HasPrivilege: LogonLevel=[$pParams->{LogonLevel}] for [$pParams->{EMail}] [$pParams->{LogonUserPrivilege}]\n"); if($pParams->{LogonLevel} == 1 or $this->IsPrivilegeIncluded('Admin', $pParams->{LogonUserPrivilege}) or $this->IsPrivilegeIncluded($key, $pParams->{LogonUserPrivilege}) ) { # $pParams->{LogonUserPrivilege} =~ /Admin/ or # $pParams->{LogonUserPrivilege} =~ /$key/) { return 1; } for(my $i = $pParams->{LogonLevel} ; $i <= 6 ; $i++) { #$this->print("P: [$PrivilegesList[$i]] : |$key|\n"); # if($PrivilegesList[$i] =~ /\|$key\|/) { if($this->IsPrivilegeIncluded($key, $pParams->{LogonUserPrivilege}) ) { return 1; } } if($IsPrint) { my $ip = $this->RemoteIPAddress(); $this->mlPrintRawHTML('en' => "

[$pParams->{EMail}:$pParams->{LogonLevel} ($ip)] is not authorized to execute $key

", 'jp' => "

[$pParams->{EMail}:$pParams->{LogonLevel} ($ip)]には$keyを実行する権限がありません

"); } return 0; } sub GetLogonLevelText { my ($App, $LogonLevel) = @_; if($App->Language() eq 'jp') { return '管理者' if($LogonLevel == 1); return "一般ユーザー (ログオンレベル:$LogonLevel)" if($LogonLevel > 1); return 'SQL Error' if($LogonLevel == -1); return '登録されていないアカウント' if($LogonLevel == -2); return '空白パスワード' if($LogonLevel == -3); return '不正なパスワード' if($LogonLevel == -4); return '不正なIPアドレス' if($LogonLevel == -6); return '空白パスワード' if($LogonLevel == -7); } else { return 'Administrator' if($LogonLevel == 1); return "User (LogonLevel:$LogonLevel)" if($LogonLevel > 1); return 'SQL Error' if($LogonLevel == -1); return 'Non-registered Account' if($LogonLevel == -2); return 'Blank Password' if($LogonLevel == -3); return 'Invalid Password' if($LogonLevel == -4); return 'Invalid IPAddress' if($LogonLevel == -6); return 'Null Password' if($LogonLevel == -7); } } # @PrivilegedAccount で指定されているかどうかのチェック sub IsAdministrator { my($this, $DB, $EMail, $Password, $CheckIPAddress, $pPrivilegedAccount, $pPrivilegedIPAddress) = @_; # return 0 if(!$DB); #$this->print("EMail[$EMail] PW[$Password]\n"); $CheckIPAddress = 1 if(!defined $CheckIPAddress); my $pParams = $this->pParams(); $pParams = {} if(!defined $pParams); $pPrivilegedAccount = $pParams->{pPrivilegedAccount} if(!defined $pPrivilegedAccount); $pPrivilegedIPAddress = $pParams->{pPrivilegedIPAddress} if(!defined $pPrivilegedIPAddress); #$this->print("pP=$pPrivilegedAccount, $pPrivilegedIPAddress\n"); my $ip = $this->RemoteIPAddress(); my @PrivilegedAccount = @$pPrivilegedAccount; #$this->print("PA: ", @PrivilegedAccount, "\n"); my @PrivilegedIPAddress = @$pPrivilegedIPAddress; for(my $i = 0 ; $i < @PrivilegedAccount ; $i++) { my ($account, $pass, $level) = Utils::Split(":", $PrivilegedAccount[$i]); #$this->H3("i=$i: Acount[$EMail] [$account] Level[$level]\n"); my $CryptPassword = $this->Crypt($pass); #$this->H3("i=$i: Password: [$Password] [$CryptPassword][$pass]\n"); if($account eq $EMail and ($pass eq $Password or $CryptPassword eq $Password)) { if(!$CheckIPAddress) { #$this->print("ip2: return level=$level\n"); return $level; } my ($IPAddress, $IPAddressLevel); my $MinAllowedLevel = 1000; for(my $j = 0 ; $j < @PrivilegedIPAddress ; $j++) { ($IPAddress, $IPAddressLevel) = Utils::Split(":", $PrivilegedIPAddress[$j]); #$this->print("ip: $IPAddress [$ip], $IPAddressLevel >= $level?\n"); if($ip =~ /^$IPAddress$/) { if($IPAddressLevel <= $level) { return $level; } else { $this->H2("IPAddress [$ip] is not allowed for priviledged access [$level] from the rule [$IPAddress:$IPAddressLevel].") if(!$pParams->{NoMessageForLogonLevelWarning}); $MinAllowedLevel = $IPAddressLevel if($MinAllowedLevel > $IPAddressLevel); } } } # IPアドレス制限が定義されている場合、許される最高の権限(最小のLevel)を返す #$this->print("MinAllowedLevel: $MinAllowedLevel\n"); if($MinAllowedLevel < 1000) { return $MinAllowedLevel; } # $this->H2("IPAddress [$ip] is not allowed for priviledged access [$level]."); # return -1; } } # IPアドレス制限が定義されていない場合、0を返す return 0; } sub IsPrivilegedIPAddress { my ($this, $ip, $pPrivilegedIPAddress) = (@_); my $pParams = $this->pParams(); $pParams = {} if(!defined $pParams); $pPrivilegedIPAddress = $pParams->{pPrivilegedIPAddress} if(!defined $pPrivilegedIPAddress); $ip = $this->RemoteIPAddress() unless(defined $ip); my @PrivilegedIPAddress = @$pPrivilegedIPAddress; if($this->{AllowedIPAddress}) { my @AllowedIPArray = Utils::Split(";", $this->{AllowedIPAddress}); @PrivilegedIPAddress = (@AllowedIPArray, @PrivilegedIPAddress); } for(my $i = 0 ; $i < @PrivilegedIPAddress ; $i++) { my ($IPAddress, $Level) = Utils::Split(":", $PrivilegedIPAddress[$i]); return $Level if($ip =~ /^$IPAddress$/); } return 0; } sub IsPrivilegedIPAddressForConference2 { my ($this, $ip, $pPrivilegedIPAddress) = (@_); $pPrivilegedIPAddress = $this->{pPrivilegedIPAddress} if(!defined $pPrivilegedIPAddress); $ip = $this->RemoteIPAddress() unless(defined $ip); my @PrivilegedIPAddress = @$pPrivilegedIPAddress; for(my $i = 0 ; $i < @PrivilegedIPAddress ; $i++) { my ($IPAddress, $Level) = Utils::Split(":", $PrivilegedIPAddress[$i]); return $Level if($ip =~ /^$IPAddress$/); } return 0; } sub GetAdministratorAccount { my ($App, $pParams, $Password, $CheckIPAddress, $pPrivilegedAccount, $pPrivilegedIPAddress) = @_; $pPrivilegedAccount = $pParams->{pPrivilegedAccount} if(!defined $pPrivilegedAccount); $pPrivilegedIPAddress = $pParams->{pPrivilegedIPAddress} if(!defined $pPrivilegedIPAddress); my $AdministratorAccount = 'Administrator'; my $ip = $App->RemoteIPAddress(); my @PrivilegedAccount = ($pPrivilegedAccount)? @$pPrivilegedAccount : (); my @PrivilegedIPAddress = ($pPrivilegedIPAddress)? @$pPrivilegedIPAddress : (); for(my $i = 0 ; $i < @PrivilegedAccount ; $i++) { my ($account, $pass, $level) = Utils::Split(":", $PrivilegedAccount[$i]); #$this->H3("i=$i: Acount[$EMail] [$account] Level[$level]\n"); next if($account ne $AdministratorAccount); my $CryptPassword = $App->Crypt($pass); #$this->H3("i=$i: Password: [$Password] [$CryptPassword][$pass]\n"); if($pass eq $Password or $CryptPassword eq $Password) { if(!$CheckIPAddress) { #$this->print("ip2: return level=$level\n"); return ($account, $pass, $level); } my ($IPAddress, $IPAddressLevel); my $MinAllowedLevel = 1000; for(my $j = 0 ; $j < @PrivilegedIPAddress ; $j++) { ($IPAddress, $IPAddressLevel) = Utils::Split(":", $PrivilegedIPAddress[$j]); #$this->print("ip: $IPAddress [$ip], $IPAddressLevel >= $level?\n"); if($ip =~ /^$IPAddress$/) { if($IPAddressLevel <= $level) { return $level; } else { $App->H2("IPAddress [$ip] is not allowed for priviledged access [$level] from the rule [$IPAddress:$IPAddressLevel].") if(!$pParams->{NoMessageForLogonLevelWarning}); $MinAllowedLevel = $IPAddressLevel if($MinAllowedLevel > $IPAddressLevel); } } } # IPアドレス制限が定義されている場合、許される最高の権限(最小のLevel)を返す #$this->print("MinAllowedLevel: $MinAllowedLevel\n"); if($MinAllowedLevel < 1000) { return ($account, $pass, $MinAllowedLevel); } # $this->H2("IPAddress [$ip] is not allowed for priviledged access [$level]."); # return -1; } } # IPアドレス制限が定義されていない場合、0を返す return (); } sub IsRegisteredNickName { my ($App, $nn) = @_; my $pParams = $App->pParams(); my $db = $App->DuplicateDB(); #$App->H1("db=$db Table=$pParams->{DBRegistersTableName}
\n"); $db->Search($pParams->{DBRegistersTableName}, "EMail=\'$pParams->{EMail}\' order by sn", "*"); my %Me = $db->GetNextHit(); my $db2 = $App->DuplicateDB(); $db2->Search($pParams->{DBRegistersTableName}, "NickName = \'$pParams->{NickName}\' order by sn", "*"); my $n = $db2->nHit(); for(my $i = 0 ; $i < $n ; $i++) { my %h = $db2->GetNextHit(); next if($h{sn} == $Me{sn}); if(uc $h{NickName} eq uc $pParams->{NickName}) { return 1; } } return 0; } sub IsValidNickName { my ($App, $nn) = @_; return 0 if($nn =~ /^(submit|update)$/i); return 1; } sub IsValidPasscode { my ($App, $pc) = @_; #$App->print("pc[$pc]\n"); return 1 if($pc =~ /^\d{4,}$/); return 0; } sub NicknameAuthorization { my($App, $DB, $pParams) = @_; #$App->print("submit[$pParams->{submit}] Table[$pParams->{UsersTableName}] Allow[$pParams->{AllowNicknameLogon} ]\n"); return (-1, 'Nickname logon not allowed', $pParams->{EMail}, $pParams->{Password}) if(!$pParams->{AllowNicknameLogon}); return (-1, 'Not nickname logon', $pParams->{EMail}, $pParams->{Password}) if($pParams->{submit} eq '' or $pParams->{submit} =~ /^(submit|update)$/i); $DB->Search($pParams->{UsersTableName}, "NickName='$pParams->{submit}' order by sn", "*"); my $n = $DB->nHit(); if($n == 0) { $App->mlPrintRawHTML( 'en' => "

Error in Nickname authorization: Nickname [$pParams->{submit}] is not found

\n", 'jp' => "

エラー (Nickname authorization): Nickname [$pParams->{submit}] が見つかりません

\n", ); return (0, 'Nickname not found', undef, undef); } my %h = $DB->GetNextHit(); #$App->print("pw[$h{Passcode}] [$pParams->{Passcode}] hit [$h{EMail}] [$h{Password}]\n"); if($pParams->{Passcode} eq $h{Passcode}) { # $App->H2("Nickname and passcode have passed the authorization.\n"); return (1, 'Authorized', $h{EMail}, $h{Password}); } $App->mlPrintRawHTML( 'en' => "

Error in Nickname authorization: Wrong passcode

\n", 'jp' => "

エラー (Nickname authorization): Passcodeを間違えてます

\n", ); return (0, 'Wrong passcode', undef, undef); } sub UserAuthorization { my($App, $DB, $EMail, $Password, $CryptedHeader, $AdditionalCondition) = @_; my $pParams = $App->pParams(); $pParams = {} if(!defined $pParams); # return $pParams->{LogonLevel} = 6 if(!$DB); $pParams->{Password} = $App->Crypt($pParams->{Password}); $pParams->{IPAddressLevel} = $App->IsPrivilegedIPAddress($pParams->{IPAddress}); $pParams->{AuthorizationLevel} = $App->UserAuthorization2($DB, $EMail, $Password, $CryptedHeader, $AdditionalCondition); # IPAddressLevelが0の場合は、IPAddressによる制限は行わない #$App->print("IPAddressLevel: $pParams->{IPAddressLevel} AuthorizationLevel: $pParams->{AuthorizationLevel}\n"); if($pParams->{AuthorizationLevel} <= 0 or $pParams->{IPAddressLevel} == 0 or $pParams->{IPAddressLevel} <= $pParams->{AuthorizationLevel}) { $pParams->{LogonLevel} = $pParams->{AuthorizationLevel}; } else { $pParams->{LogonLevel} = $pParams->{IPAddressLevel}; } $pParams->{LogonUserPrivilege} = $App->GetPrivilege($DB, $pParams->{EMail}, undef, $pParams->{pPrivilegesList}); $pParams->{LogonLevelText} = $App->GetLogonLevelText($pParams->{LogonLevel}); return $pParams->{LogonLevel}; } sub UserAuthorization2 { my($App, $DB, $EMail, $Password, $CryptedHeader, $AdditionalCondition) = @_; my $pParams = $App->pParams(); # return $pParams->{LogonLevel} = 6 if(!$DB); $pParams = {} if(!defined $pParams); $CryptedHeader = $pParams->{CryptedHeader} if(!defined $CryptedHeader); $CryptedHeader = '' if(!defined $CryptedHeader); if($pParams->{Password} eq '' or $pParams->{Password} eq $App->Crypt('')) { $App->mlPrintRawHTML('en' => "

Null password is not allowed

", 'jp' => "

空白パスワードです

"); return $pParams->{LogonLevel} = -7; } # @PrivilegedAccount で指定されている情報とマッチしたら、Logon OK my $pParams = ($App->{pParams})? $App->{pParams} : {}; my $CheckPrivilegedIPAddress = $pParams->{CheckPrivilegedIPAddress}; #$App->print("CheckPrivilegedIPAddress=$CheckPrivilegedIPAddress\n"); my $AdministratorLevelWithoutIPCheck = $App->IsAdministrator($DB, $EMail, $Password, 0); #$App->print("AdministratorLevel=$AdministratorLevelWithoutIPCheck\n"); my $AdministratorLevel = $App->IsAdministrator($DB, $EMail, $Password, $CheckPrivilegedIPAddress); #$App->print("AdministratorLevel=$AdministratorLevel\n"); $pParams->{AdministratorLevel} = $AdministratorLevel; return $AdministratorLevel if($AdministratorLevel > 0); my $IPAddressLevel = $App->IsPrivilegedIPAddress($App->RemoteIPAddress()); #$App->print("PPP: $pParams->{pPrivilegesList}\n"); my $Privileges = $App->GetPrivilege($DB, $EMail, undef, $pParams->{pPrivilegesList}); $pParams->{LogonUserPrivilege} = $Privileges; $pParams->{IPAddressLevel} = $IPAddressLevel; $pParams->{LogonLevel} = 0; # return $pParams->{LogonLevel} = 7; if(!$DB) { $App->H2("Error in MyAuthApplication::UserAuthorization2: DB object can not be obtained.\n"); $App->H2(" Probably your password for Administrator would be wrong.\n"); return $pParams->{LogonLevel} = -1; } my $condition = "EMail='$EMail' order by sn";# desc"; if($AdditionalCondition ne '') { $condition = "$AdditionalCondition and EMail='$EMail' order by sn;# desc"; } #$App->print("Cond: [$condition][$pParams->{UsersTableName}]\n"); my $ret = $DB->Search($pParams->{UsersTableName}, $condition, "*"); if(!$ret) { $App->print("Execute Select: Error\n"); return $pParams->{LogonLevel} = -1; } my $nHit = $DB->nHit; #$App->print("nHit=$nHit\n"); return $pParams->{LogonLevel} = -2 if($nHit == 0); my %Hit = $DB->GetNextHit(); #$App->print("Privilege(sn=$Hit{sn}): $Hit{Privilege}\n"); #foreach my $key (sort keys %Hit) { #$App->print("$key: $Hit{$key}\n"); #} my $DBPassword = $Hit{Password}; my $CryptDBPassword = $App->Crypt($DBPassword); #$App->print("P: [$Password] [$DBPassword] [$CryptDBPassword]\n"); if($DBPassword =~ /^\s*$/ and $Password eq '') { $App->mlPrintRawHTML('en' => "

Blank password is not allowed

", 'jp' => "

空白パスワードは認識されません

"); Utils::MergeHash($App->{pParams}, \%Hit); return $pParams->{LogonLevel} = -3; } #$App->print("P: [$Password] [$DBPassword] [$CryptDBPassword]\n"); if($DBPassword eq '' and $AdministratorLevelWithoutIPCheck) { my $ip = $App->RemoteIPAddress(); $App->mlPrintRawHTML('en' => "

Invalid IPAddress [$ip] for Administartor

", 'jp' => "

管理者アクセスには不正なIPアドレスです [$ip]

"); return $pParams->{LogonLevel} = -6; } elsif($Password eq $DBPassword or $Password eq $CryptDBPassword or "$CryptedHeader$Password" eq $CryptDBPassword) { } else { # PrivilegedAccountのAdministratorのパスワードと一致していたらOK my ($AdministratorAccount, $AdministratorPassword, $AdministratorLevel) = $App->GetAdministratorAccount($pParams, $Password); #$App->print("A[$AdministratorLevel]\n"); if($AdministratorLevel) { $pParams->{LogonLevel} = $AdministratorLevel if($pParams->{LogonLevel} > 0 and $AdministratorLevel > $pParams->{LogonLevel}); } else { $App->mlPrintRawHTML('en' => "

Invalid password

", 'jp' => "

不正なパスワードです

"); return $pParams->{LogonLevel} = -4; } } # Passwordチェックをクリアーしたら、LimitedByIPAddressの確認 if($Password eq $DBPassword or $Password eq $CryptDBPassword) { my $ret = $App->CheckPrivilege($DB, $EMail, "LimitedByIPAddress", $Password); if($ret == 1) { #LimitedByIPAddressが設定されていて、PrivilegedIPAddress以外からのアクセスなら承認しない if($IPAddressLevel == 0) { return $pParams->{LogonLevel} = -6; } } } #$App->print("P1: $Hit{Privilege}\n"); # if($Hit{Privilege} =~ /Admin/ and $IPAddressLevel == 1) { if($App->IsPrivilegeIncluded('Admin', $Hit{Privilege}) and $IPAddressLevel == 1) { return $pParams->{LogonLevel} = 1; } #$App->print("P2: $Hit{Privilege}\n"); if($Hit{Privilege} =~ /LogonLevel(\d)/) { my $level = $1; if($IPAddressLevel > $level) { return $pParams->{LogonLevel} = $IPAddressLevel; } else { return $pParams->{LogonLevel} = $level; } } return $pParams->{LogonLevel} = 6; } 1;