authorize($user, __FUNCTION__)) { throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $user]); } return parent::userExists($user); } public function userAdd(string $user, string $password = null): string { if (!Arsse::$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(Arsse::$conf->userTempPasswordLength)->get(); } return parent::userAdd($user, $password); } public function userRemove(string $user): bool { if (!Arsse::$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); } public function userList(string $domain = null): array { if ($domain===null) { if (!Arsse::$user->authorize("", __FUNCTION__)) { throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => "global"]); } return parent::userList(); } else { $suffix = '@'.$domain; if (!Arsse::$user->authorize($suffix, __FUNCTION__)) { throw new ExceptionAuthz("notAuthorized", ["action" => __FUNCTION__, "user" => $domain]); } return parent::userList($domain); } } public function userPasswordSet(string $user, string $newPassword = null, string $oldPassword = null): string { if (!Arsse::$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(Arsse::$conf->userTempPasswordLength)->get(); } return parent::userPasswordSet($user, $newPassword); } public function userPropertiesGet(string $user): array { if (!Arsse::$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; } public function userPropertiesSet(string $user, array $properties): array { if (!Arsse::$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); } public function userRightsGet(string $user): int { if (!Arsse::$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); } public function userRightsSet(string $user, int $level): bool { if (!Arsse::$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); } // specific to mock database public function userPasswordGet(string $user): string { if (!Arsse::$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]['password']; } }