J. King
7 years ago
3 changed files with 143 additions and 80 deletions
@ -0,0 +1,73 @@ |
|||
<?php |
|||
declare(strict_types=1); |
|||
namespace JKingWeb\NewsSync\Test\User; |
|||
use JKingWeb\NewsSync\User\Driver; |
|||
use JKingWeb\NewsSync\User\Exception; |
|||
use JKingWeb\NewsSync\User\ExceptionAuthz; |
|||
use PasswordGenerator\Generator as PassGen; |
|||
|
|||
class Database extends DriverSkeleton { |
|||
|
|||
function userExists(string $user): bool { |
|||
if(!$this->data->user->authorize($user, __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]); |
|||
return parent::userExists($user); |
|||
} |
|||
|
|||
function userAdd(string $user, string $password = null): string { |
|||
if(!$this->data->user->authorize($user, __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]); |
|||
if($this->userExists($user)) throw new Exception("alreadyExists", ["action" => __FUNCTION__, "user" => $user]); |
|||
if($password===null) $password = (new PassGen)->length($this->data->conf->userTempPasswordLength)->get(); |
|||
return parent::userAdd($user, $password); |
|||
} |
|||
|
|||
function userRemove(string $user): bool { |
|||
if(!$this->data->user->authorize($user, __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]); |
|||
if(!$this->userExists($user)) throw new Exception("doesNotExist", ["action" => __FUNCTION__, "user" => $user]); |
|||
return parent::userRemove($user); |
|||
} |
|||
|
|||
function userList(string $domain = null): array { |
|||
if($domain===null) { |
|||
if(!$this->data->user->authorize("", __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => "global"]); |
|||
return parent::userList(); |
|||
} else { |
|||
$suffix = '@'.$domain; |
|||
if(!$this->data->user->authorize($suffix, __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $domain]); |
|||
return parent::userList($domain); |
|||
} |
|||
} |
|||
|
|||
function userPasswordSet(string $user, string $newPassword = null, string $oldPassword = null): string { |
|||
if(!$this->data->user->authorize($user, __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]); |
|||
if(!$this->userExists($user)) throw new Exception("doesNotExist", ["action" => __FUNCTION__, "user" => $user]); |
|||
if($newPassword===null) $newPassword = (new PassGen)->length($this->data->conf->userTempPasswordLength)->get(); |
|||
return parent::userPasswordSet($user, $newPassword); |
|||
} |
|||
|
|||
function userPropertiesGet(string $user): array { |
|||
if(!$this->data->user->authorize($user, __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]); |
|||
if(!$this->userExists($user)) throw new Exception("doesNotExist", ["action" => __FUNCTION__, "user" => $user]); |
|||
$out = parent::userPropertiesGet($user); |
|||
unset($out['password']); |
|||
return $out; |
|||
} |
|||
|
|||
function userPropertiesSet(string $user, array $properties): array { |
|||
if(!$this->data->user->authorize($user, __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]); |
|||
if(!$this->userExists($user)) throw new Exception("doesNotExist", ["action" => __FUNCTION__, "user" => $user]); |
|||
parent::userPropertiesSet($user, $properties); |
|||
return $this->userPropertiesGet($user); |
|||
} |
|||
|
|||
function userRightsGet(string $user): int { |
|||
if(!$this->data->user->authorize($user, __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]); |
|||
if(!$this->userExists($user)) throw new Exception("doesNotExist", ["action" => __FUNCTION__, "user" => $user]); |
|||
return parent::userRightsGet($user); |
|||
} |
|||
|
|||
function userRightsSet(string $user, int $level): bool { |
|||
if(!$this->data->user->authorize($user, __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]); |
|||
if(!$this->userExists($user)) throw new Exception("doesNotExist", ["action" => __FUNCTION__, "user" => $user]); |
|||
return parent::userRightsSet($user, $level); |
|||
} |
|||
} |
@ -0,0 +1,69 @@ |
|||
<?php |
|||
declare(strict_types=1); |
|||
namespace JKingWeb\NewsSync\Test\User; |
|||
use JKingWeb\NewsSync\Lang; |
|||
use JKingWeb\NewsSync\User\Driver; |
|||
use JKingWeb\NewsSync\User\Exception; |
|||
use JKingWeb\NewsSync\User\ExceptionAuthz; |
|||
use PasswordGenerator\Generator as PassGen; |
|||
|
|||
abstract class DriverSkeleton { |
|||
|
|||
protected $db = []; |
|||
protected $data; |
|||
|
|||
function userExists(string $user): bool { |
|||
return array_key_exists($user, $this->db); |
|||
} |
|||
|
|||
function userAdd(string $user, string $password = null): string { |
|||
$u = [ |
|||
'password' => $password ? password_hash($password, \PASSWORD_DEFAULT) : null, |
|||
'rights' => Driver::RIGHTS_NONE, |
|||
]; |
|||
$this->db[$user] = $u; |
|||
return $password; |
|||
} |
|||
|
|||
function userRemove(string $user): bool { |
|||
unset($this->db[$user]); |
|||
return true; |
|||
} |
|||
|
|||
function userList(string $domain = null): array { |
|||
$list = array_keys($this->db); |
|||
if($domain===null) { |
|||
return $list; |
|||
} else { |
|||
$suffix = '@'.$domain; |
|||
$len = -1 * strlen($suffix); |
|||
return array_filter($list, function($user) use($suffix, $len) { |
|||
return substr_compare($user, $suffix, $len); |
|||
}); |
|||
} |
|||
} |
|||
|
|||
function userPasswordSet(string $user, string $newPassword = null, string $oldPassword = null): string { |
|||
$this->db[$user]['password'] = password_hash($newPassword, \PASSWORD_DEFAULT); |
|||
return $newPassword; |
|||
} |
|||
|
|||
function userPropertiesGet(string $user): array { |
|||
$out = $this->db[$user]; |
|||
return $out; |
|||
} |
|||
|
|||
function userPropertiesSet(string $user, array $properties): array { |
|||
$this->db[$user] = array_merge($this->db[$user], $properties); |
|||
return $this->userPropertiesGet($user); |
|||
} |
|||
|
|||
function userRightsGet(string $user): int { |
|||
return $this->db[$user]['rights']; |
|||
} |
|||
|
|||
function userRightsSet(string $user, int $level): bool { |
|||
$this->db[$user]['rights'] = $level; |
|||
return true; |
|||
} |
|||
} |
Loading…
Reference in new issue