From b6a47fc366e68758bac268c329eb5e9812dc9c97 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Sun, 26 Feb 2017 12:09:44 -0500 Subject: [PATCH] Abstract synthetic User backend for later tests --- tests/lib/User/Database.php | 73 ++++++++++++++++++++++++ tests/lib/User/DriverInternalMock.php | 81 +-------------------------- tests/lib/User/DriverSkeleton.php | 69 +++++++++++++++++++++++ 3 files changed, 143 insertions(+), 80 deletions(-) create mode 100644 tests/lib/User/Database.php create mode 100644 tests/lib/User/DriverSkeleton.php diff --git a/tests/lib/User/Database.php b/tests/lib/User/Database.php new file mode 100644 index 00000000..36c786ec --- /dev/null +++ b/tests/lib/User/Database.php @@ -0,0 +1,73 @@ +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); + } +} \ No newline at end of file diff --git a/tests/lib/User/DriverInternalMock.php b/tests/lib/User/DriverInternalMock.php index f1789774..df7f8030 100644 --- a/tests/lib/User/DriverInternalMock.php +++ b/tests/lib/User/DriverInternalMock.php @@ -1,13 +1,9 @@ db[$user]['password'])) return true; return false; } - - function userExists(string $user): bool { - if(!$this->data->user->authorize($user, __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]); - return array_key_exists($user, $this->db); - } - - 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(); - $u = [ - 'password' => $password ? password_hash($password, \PASSWORD_DEFAULT) : null, - 'rights' => Driver::RIGHTS_NONE, - ]; - $this->db[$user] = $u; - return $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]); - unset($this->db[$user]); - return true; - } - - function userList(string $domain = null): array { - $list = array_keys($this->db); - if($domain===null) { - if(!$this->data->user->authorize("", __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => "global"]); - return $list; - } else { - $suffix = '@'.$domain; - $len = -1 * strlen($suffix); - if(!$this->data->user->authorize($suffix, __FUNCTION__)) throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $domain]); - 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 { - 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(); - $this->db[$user]['password'] = password_hash($newPassword, \PASSWORD_DEFAULT); - return $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 = $this->db[$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]); - $this->db[$user] = array_merge($this->db[$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 $this->db[$user]['rights']; - } - - 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]); - $this->db[$user]['rights'] = $level; - return true; - } } \ No newline at end of file diff --git a/tests/lib/User/DriverSkeleton.php b/tests/lib/User/DriverSkeleton.php new file mode 100644 index 00000000..6b420cbc --- /dev/null +++ b/tests/lib/User/DriverSkeleton.php @@ -0,0 +1,69 @@ +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; + } +} \ No newline at end of file