client = $client; } public function connect(): void { if ( $this->is_connected() ) { throw new ApiException( 'This WordPress site is already connected to 2UA.' ); } $challenge = $this->client->create_challenge(); $this->store_challenge( $challenge ); try { $this->store_credential( $this->client->verify_challenge( $challenge ) ); } catch ( ApiException $exception ) { update_option( Options::CONNECTION_STATUS, Options::CONNECTION_DISCONNECTED, false ); throw $exception; } finally { delete_option( Options::CHALLENGE_ID ); delete_option( Options::VERIFICATION_TOKEN ); } } public function rotate_secret(): void { $installation_id = $this->required_option( Options::INSTALLATION_ID ); $secret = $this->required_option( Options::HMAC_SECRET ); $credential = $this->client->rotate_secret( $installation_id, $secret ); $this->store_credential( $credential ); } public function disconnect(): void { $installation_id = $this->required_option( Options::INSTALLATION_ID ); $secret = $this->required_option( Options::HMAC_SECRET ); $this->client->disconnect( $installation_id, $secret ); delete_option( Options::INSTALLATION_ID ); delete_option( Options::HMAC_SECRET ); delete_option( Options::RUN_CAPABILITIES ); delete_option( Options::LAST_RUN ); delete_option( Options::LAST_RUN_ERROR ); wp_unschedule_hook( ReleaseScheduler::CRON_HOOK ); wp_unschedule_hook( RunPoller::CRON_HOOK ); update_option( Options::CONNECTION_STATUS, Options::CONNECTION_DISCONNECTED, false ); } public function is_connected(): bool { return Options::CONNECTION_CONNECTED === get_option( Options::CONNECTION_STATUS, '' ) && '' !== $this->option_string( Options::INSTALLATION_ID ) && '' !== $this->option_string( Options::HMAC_SECRET ); } private function store_challenge( Challenge $challenge ): void { update_option( Options::CHALLENGE_ID, $challenge->public_id, false ); update_option( Options::VERIFICATION_TOKEN, $challenge->verification_token, false ); update_option( Options::CONNECTION_STATUS, Options::CONNECTION_PENDING, false ); } private function store_credential( Credential $credential ): void { delete_option( Options::RUN_CAPABILITIES ); update_option( Options::INSTALLATION_ID, $credential->installation_id, false ); update_option( Options::HMAC_SECRET, $credential->secret, false ); update_option( Options::CONNECTION_STATUS, Options::CONNECTION_CONNECTED, false ); } private function required_option( string $option ): string { $value = $this->option_string( $option ); if ( '' === $value ) { throw new ApiException( 'The local 2UA connection is incomplete. Connect the site again.' ); } return $value; } private function option_string( string $option ): string { $value = get_option( $option, '' ); return is_string( $value ) ? $value : ''; } }