$key, 'email' => (string) ( $raw['email'] ?? '' ), 'created_at' => (int) ( $raw['created_at'] ?? 0 ), 'trial_days' => (int) ( $raw['trial_days'] ?? 0 ), 'download_url' => (string) ( $raw['download_url'] ?? '' ), 'portal_url' => (string) ( $raw['portal_url'] ?? '' ), 'marketing' => (string) ( $raw['marketing'] ?? 'none' ), ); } /** * Whether this site created (or linked) an account. */ public static function connected(): bool { return null !== self::get(); } /** * Stores the answer of a successful «Create account». * * @param array $answer API answer (status created). */ public static function save( array $answer ): bool { $key = (string) ( $answer['site_key'] ?? '' ); if ( ! preg_match( '/^ass_[A-Za-z0-9]{40}$/D', $key ) ) { return false; } $link = static function ( $url ): string { $url = is_string( $url ) ? esc_url_raw( $url, array( 'http', 'https' ) ) : ''; return '' !== $url && Api::link_allowed( $url ) ? $url : ''; }; update_option( self::OPTION, array( 'site_key' => Crypto::encrypt( $key, self::CRYPTO_CONTEXT ), 'email' => sanitize_email( (string) ( $answer['account_email'] ?? '' ) ), 'created_at' => time(), // The Pro trial is only OFFERED here: it starts when the add-on connects to this site (AddSynapse proves the domain). 'trial_days' => max( 0, min( 31, (int) ( $answer['trial_offer']['days'] ?? 0 ) ) ), 'download_url' => $link( $answer['download_url'] ?? '' ), 'portal_url' => $link( $answer['portal_url'] ?? '' ), 'marketing' => 'pending_confirmation' === ( $answer['marketing'] ?? '' ) ? 'pending_confirmation' : 'none', ), false ); return true; } /** * Forgets the connection (the account on addsynapse.com stays; announcements stop). */ public static function forget(): void { delete_option( self::OPTION ); delete_option( Announcements::OPTION ); } }