self::TIMEOUT, 'body' => array( 'secret' => $secret, 'response' => $token, 'remoteip' => $ip, ), ) ); if ( is_wp_error( $response ) ) { Log::add( 'warning', 'Turnstile verification unavailable', array( 'reason' => $response->get_error_message() ) ); return self::UNAVAILABLE; } $code = (int) wp_remote_retrieve_response_code( $response ); $data = json_decode( (string) wp_remote_retrieve_body( $response ), true ); if ( $code < 200 || $code >= 300 || ! is_array( $data ) ) { Log::add( 'warning', 'Turnstile verification unavailable', array( 'reason' => 'http_' . $code ) ); return self::UNAVAILABLE; } if ( ! empty( $data['success'] ) ) { Options::unflag( self::MISCONFIGURED_FLAG ); Options::unflag( self::FAILING_FLAG ); delete_transient( self::STREAK_KEY ); return self::PASS; } $errors = array_values( array_map( 'strval', (array) ( $data['error-codes'] ?? array() ) ) ); if ( array() !== $errors && array() === array_diff( $errors, self::VISITOR_ERRORS ) ) { return self::fail(); } Log::add( 'error', 'Turnstile rejected the site configuration', array( 'codes' => $errors ) ); Options::flag( self::MISCONFIGURED_FLAG, (string) time() ); return self::UNAVAILABLE; } /** Egy FAIL beszámítása a sorozatba; a küszöbnél egyszer jelez. */ private static function fail(): string { $streak = (int) get_transient( self::STREAK_KEY ) + 1; set_transient( self::STREAK_KEY, $streak, DAY_IN_SECONDS ); if ( self::FAILING_STREAK === $streak ) { Log::add( 'warning', 'Turnstile: many failed checks in a row, none passed' ); Options::flag( self::FAILING_FLAG, (string) time() ); } return self::FAIL; } }