request()->post($this->url('/userlogin?form=login'), [ 'method' => 'set', 'param' => [ 'name' => $username, 'key' => md5($username.':'.$password), 'value' => '', 'captcha_v' => '', 'captcha_f' => '', ], ]); $this->assertSuccess($response->json()); $this->token = $response->header('x-token'); if (! $this->token) { throw new RuntimeException('HSGQ_WEB_AUTH_FAILED: WebGUI tidak memberikan token sesi.'); } } /** @return array> */ public function users(): array { $response = $this->authenticated()->get($this->url('/usermgmt?form=userlist')); $this->assertSuccess($response->json()); return $response->json('data', []); } public function addUser(string $username, string $password, int $level): void { $this->post('/usermgmt?form=userlist', [ 'method' => 'add', 'param' => [ 'name' => $username, 'key' => md5($username.':'.$password), 'level' => $level, 'reenter' => 4, 'info' => 'Managed by RADIQ NDM', ], ]); } public function changePassword(string $username, string $newPassword, string $currentPassword = ''): void { $this->post('/usermgmt?form=modifyps', [ 'method' => 'set', 'param' => [ 'name' => $username, 'key' => $currentPassword === '' ? '' : md5($username.':'.$currentPassword), 'key1' => md5($username.':'.$newPassword), ], ]); } public function deleteUser(string $username): void { $this->post('/usermgmt?form=userlist', [ 'method' => 'delete', 'param' => ['name' => $username], ]); } public function hasUser(string $username): bool { return collect($this->users())->contains(fn (array $user) => ($user['name'] ?? null) === $username); } /** @return array */ public function boardInfo(): array { $response = $this->authenticated()->get($this->url('/board_info')); $this->assertSuccess($response->json()); return $response->json('data', []); } private function post(string $path, array $payload): void { $response = $this->authenticated()->post($this->url($path), $payload); $this->assertSuccess($response->json()); } private function request(): PendingRequest { return Http::acceptJson()->asJson()->timeout($this->timeout)->connectTimeout($this->timeout); } private function authenticated(): PendingRequest { if (! $this->token) { throw new RuntimeException('HSGQ_WEB_AUTH_REQUIRED: sesi WebGUI belum dibuat.'); } return $this->request()->withHeader('x-token', $this->token); } private function assertSuccess(?array $payload): void { if (($payload['code'] ?? null) !== 1) { throw new RuntimeException('HSGQ_WEB_REJECTED: '.str($payload['message'] ?? 'WebGUI menolak operasi user.')->limit(160)); } } private function url(string $path): string { return 'http://'.$this->host.$path; } }