storage = $storage; $this->clock = null === $clock ? 'time' : $clock; } /** @return true|\WP_Error */ public function record( $code, $origin ) { if ( ! in_array( $code, array( 'attach_target_missing', 'attach_target_restored' ), true ) ) { return $this->error(); } $current = Protocol::canonical_site( home_url( '/' ) ); $source = Protocol::canonical_site( $origin ); if ( ! $current || ! $source || ! Crypto::safe_equal( $current['site_origin'], $source['site_origin'] ) ) { return $this->error(); } $settings = $this->storage->get(); $selector = $settings['placement']['attach_selector']; if ( ! $this->storage->has_management_binding( $settings ) || 'attach' !== $settings['placement']['mode'] || ! is_string( $selector ) || '' === $selector ) { return $this->error(); } $now = call_user_func( $this->clock ); $last_at = (int) $settings['placement']['fallback_observed_at']; $last_code = $settings['placement']['fallback_observed_code']; if ( 'attach_target_restored' === $code && 'attach_target_missing_runtime' !== $settings['placement']['fallback_warning'] ) { return true; } if ( ( $last_code === $code && $last_at > $now - self::COOLDOWN ) || ( '' !== $last_code && $last_code !== $code && $last_at > $now - self::TRANSITION_COOLDOWN ) ) { return true; } $settings['placement']['fallback_observed_at'] = $now; $settings['placement']['fallback_observed_code'] = $code; if ( 'attach_target_missing' === $code ) { $settings['placement']['fallback_warning'] = 'attach_target_missing_runtime'; } elseif ( 'attach_target_missing_runtime' === $settings['placement']['fallback_warning'] ) { $settings['placement']['fallback_warning'] = ''; } $this->storage->save( $settings ); return true; } /** @return \WP_Error */ private function error() { return new \WP_Error( 'invalid_runtime_diagnostic', 'Runtime diagnostic rejected.', array( 'status' => 403 ) ); } }