settings[ self::ACCESS_OAUTH2_TOKEN ] ) ) {
foreach ( $api_credentials as $api_credentials_key => $value ) {
// Some of our pre-defined keys aren't used for oAuth2.
if ( ! isset( $instance_settings[ $api_credentials_key ] ) ) {
continue;
}
$api_credentials[ $api_credentials_key ] = $instance_settings[ $api_credentials_key ];
}
} else {
foreach ( $api_credentials as $api_credentials_key => $value ) {
/**
* If there's any key missing in the saved multi settings,
* try retrieving them from the wp_options instead.
*/
if ( empty( $instance_settings[ $api_credentials_key ] ) ) {
$get_keys_from_options = true;
break;
}
$api_credentials[ $api_credentials_key ] = $instance_settings[ $api_credentials_key ];
}
/**
* Any of the keys is missing in the saved multi settings.
* Try retrieving them from wp_options.
* This is were they were stored before 4.0.1.
*/
if ( $get_keys_from_options ) {
foreach ( $api_credentials as $api_credentials_key => $value ) {
$saved_key = $this->get_provider_option( $api_credentials_key, '' );
if ( empty( $saved_key ) ) {
break;
}
$api_credentials[ $api_credentials_key ] = $saved_key;
}
}
}
return $api_credentials;
}
/**
* Get the account ID
*
* @since 4.0.1
*
* @param string $global_multi_id Global multi ID.
* @return string|false
*/
public function get_account_id( $global_multi_id ) {
$account_id = $this->get_setting( 'account_id', false, $global_multi_id );
if ( ! $account_id ) {
try {
$account_id = $this->get_validated_account_id( $global_multi_id );
$saved_settings = $this->get_settings_values();
$settings_to_save = $saved_settings[ $global_multi_id ];
$settings_to_save['account_id'] = $account_id;
$this->save_multi_settings_values( $global_multi_id, $settings_to_save );
} catch ( Exception $e ) {
Hustle_Provider_Utils::maybe_log( __METHOD__, $e->getMessage() );
}
}
return $account_id;
}
/**
* Get validated account_id
*
* @param string $global_multi_id Global multi ID.
* @param array $api_key Api key.
* @return integer
* @throws Hustle_Addon_Aweber_Exception Failed to get AWeber account information.
*/
public function get_validated_account_id( $global_multi_id = null, $api_key = array() ) {
$api = $this->get_api( $global_multi_id, $api_key );
$accounts = $api->get_accounts();
if ( ! isset( $accounts->entries ) ) {
throw new Hustle_Addon_Aweber_Exception( __( 'Failed to get AWeber account information', 'hustle' ) );
}
$entries = $accounts->entries;
if ( ! isset( $entries[0] ) ) {
throw new Hustle_Addon_Aweber_Exception( __( 'Failed to get AWeber account information', 'hustle' ) );
}
$first_entry = $entries[0];
$account_id = $first_entry->id;
/**
* Filter validated account_id
*
* @since 1.3
*
* @param integer $account_id
* @param object $accounts
* @param Hustle_Addon_Aweber_Wp_Api $api
*/
$account_id = apply_filters( 'hustle_addon_aweber_validated_account_id', $account_id, $accounts, $api );
return $account_id;
}
/**
* Validate Access Token
*
* @param string $verifier_code Verification code.
*/
public function get_validated_access_token( $verifier_code ) {
// reinit api.
self::$api = null;
// get access_token.
$api = $this->get_api();
$access_tokens = $api->process_callback_request( $verifier_code );
// reinit api with new access token open success for future usage.
self::$api = null;
return $access_tokens;
}
/**
* Get the wizard callbacks for the global settings.
*
* @since 4.0
*
* @return array
*/
public function settings_wizards() {
return array(
array(
'callback' => array( $this, 'configure_api_key' ),
'is_completed' => array( $this, 'is_connected' ),
),
);
}
/**
* Configure the API key settings. Global settings.
*
* @since 4.0
*
* @param array $submitted_data Submitted data.
* @return array
*/
public function configure_api_key( $submitted_data ) {
$has_errors = false;
$default_data = array(
'api_key' => '',
'name' => '',
);
$current_data = $this->get_current_data( $default_data, $submitted_data );
$is_submit = isset( $submitted_data['api_key'] );
$global_multi_id = $this->get_global_multi_id( $submitted_data );
$api_key_validated = true;
if ( $is_submit ) {
$validated_credentials = $this->get_validated_credentials( $submitted_data['api_key'] );
if ( empty( $validated_credentials ) || ! is_array( $validated_credentials ) ) {
$api_key_validated = false;
$error_message = $this->provider_connection_falied();
$has_errors = true;
}
if ( ! $has_errors ) {
// If not active, activate it.
if (
$this->is_active() ||
Hustle_Providers::get_instance()->activate_addon( $this->slug )
) {
$keys_names = self::get_option_keys();
$settings_to_save = array(
'api_key' => $current_data['api_key'],
'name' => $current_data['name'],
);
foreach ( $keys_names as $name ) {
// Some of our pre-defined keys aren't used for oAuth2.
if ( ! isset( $validated_credentials[ $name ] ) ) {
continue;
}
// Add the key to the $settings_to_save.
$settings_to_save[ $name ] = $validated_credentials[ $name ];
// Store it in the wp_options to remain compatible with 4.0.0 in case of a rollback, even though these won't be used.
$this->update_provider_option( $name, $validated_credentials[ $name ] );
}
$this->save_multi_settings_values( $global_multi_id, $settings_to_save );
} else {
$error_message = __( "Provider couldn't be activated.", 'hustle' );
$has_errors = true;
}
}
if ( ! $has_errors ) {
return array(
'html' => Hustle_Provider_Utils::get_integration_modal_title_markup( __( 'Aweber Added', 'hustle' ), __( 'You can now go to your pop-ups, slide-ins and embeds and assign them to this integration', 'hustle' ) ),
'buttons' => array(
'close' => array(
'markup' => Hustle_Provider_Utils::get_provider_button_markup( __( 'Close', 'hustle' ), 'sui-button-ghost', 'close' ),
),
),
'redirect' => false,
'has_errors' => false,
'notification' => array(
'type' => 'success',
'text' => '' . $this->get_title() . ' ' . __( 'Successfully connected', 'hustle' ),
),
);
}
}
$options = array(
array(
'type' => 'wrapper',
'class' => $api_key_validated ? '' : 'sui-form-field-error',
'elements' => array(
'label' => array(
'type' => 'label',
'for' => 'api_key',
'value' => __( 'Authorization code', 'hustle' ),
),
'api_key' => array(
'type' => 'text',
'name' => 'api_key',
'value' => $current_data['api_key'],
'placeholder' => __( 'Enter Code', 'hustle' ),
'id' => 'api_key',
'icon' => 'key',
),
'error' => array(
'type' => 'error',
'class' => $api_key_validated ? 'sui-hidden' : '',
'value' => __( 'Please enter a valid Aweber authorization code', 'hustle' ),
),
),
),
array(
'type' => 'wrapper',
'style' => 'margin-bottom: 0;',
'elements' => array(
'label' => array(
'type' => 'label',
'for' => 'instance-name-input',
'value' => __( 'Identifier', 'hustle' ),
),
'name' => array(
'type' => 'text',
'name' => 'name',
'value' => $current_data['name'],
'placeholder' => __( 'E.g. Business Account', 'hustle' ),
'id' => 'instance-name-input',
),
'message' => array(
'type' => 'description',
'value' => __( 'Helps to distinguish your integrations if you have connected to the multiple accounts of this integration.', 'hustle' ),
),
),
),
);
$api = $this->get_api();
$auth_url = $api->get_authorization_uri( 0, true, Hustle_Data::INTEGRATIONS_PAGE );
/* translators: 1. open 'a' tag 2. closing 'a' tag */
$step_html = Hustle_Provider_Utils::get_integration_modal_title_markup( __( 'Configure Aweber', 'hustle' ), sprintf( __( 'Please %1$sclick here%2$s to connect to Aweber service to get your authorization code.', 'hustle' ), '', '' ) );
if ( $has_errors ) {
$error_notice = array(
'type' => 'notice',
'icon' => 'info',
'class' => 'sui-notice-error',
'value' => esc_html( $error_message ),
);
array_unshift( $options, $error_notice );
}
$step_html .= Hustle_Provider_Utils::get_html_for_options( $options );
$is_edit = $this->settings_are_completed( $global_multi_id );
if ( $is_edit ) {
$buttons = array(
'disconnect' => array(
'markup' => Hustle_Provider_Utils::get_provider_button_markup(
__( 'Disconnect', 'hustle' ),
'sui-button-ghost',
'disconnect',
true
),
),
'save' => array(
'markup' => Hustle_Provider_Utils::get_provider_button_markup(
__( 'Save', 'hustle' ),
'',
'connect',
true
),
),
);
} else {
$buttons = array(
'connect' => array(
'markup' => Hustle_Provider_Utils::get_provider_button_markup(
__( 'Connect', 'hustle' ),
'sui-button-right',
'connect',
true
),
),
);
}
$response = array(
'html' => $step_html,
'buttons' => $buttons,
'has_errors' => $has_errors,
);
return $response;
}
/**
* Validate the migrated API key.
*
* @since 4.1.1
*
* @param array $data Data.
* @return array
*/
public function configure_migrated_api_key( $data ) {
$has_errors = false;
$default_data = array(
'api_key' => '',
'name' => '',
);
$current_data = $this->get_current_data( $default_data, $data );
$global_multi_id = $this->get_global_multi_id( $data );
$validated_credentials = $this->get_validated_credentials( $data['api_key'] );
if ( empty( $validated_credentials ) || ! is_array( $validated_credentials ) ) {
$has_errors = true;
}
if ( ! $has_errors ) {
// If not active, activate it.
if (
$this->is_active() ||
Hustle_Providers::get_instance()->activate_addon( $this->slug )
) {
$keys_names = self::get_option_keys();
$settings_to_save = array(
'api_key' => $current_data['api_key'],
'name' => $current_data['name'],
);
foreach ( $keys_names as $name ) {
// Some of our pre-defined keys aren't used for oAuth2.
if ( ! isset( $validated_credentials[ $name ] ) ) {
continue;
}
// Add the key to the $settings_to_save.
$settings_to_save[ $name ] = $validated_credentials[ $name ];
// Store it in the wp_options to remain compatible with 4.0.0 in case of a rollback, even though these won't be used.
$this->update_provider_option( $name, $validated_credentials[ $name ] );
}
$this->save_multi_settings_values( $global_multi_id, $settings_to_save );
} else {
$has_errors = true;
}
}
return $has_errors;
}
/**
* Validate the provided API key.
*
* @since 4.0
*
* @param string $api_key Api key.
* @return bool
*/
private function get_validated_credentials( $api_key ) {
if ( empty( trim( $api_key ) ) ) {
return false;
}
// Check if API key is valid.
try {
$tokens = $this->get_validated_access_token( $api_key );
if ( ! $tokens ) {
return false;
} else {
$api_key = array(
self::ACCESS_OAUTH2_REFRESH => $tokens['refresh_token'],
self::ACCESS_OAUTH2_TOKEN => $tokens['access_token'],
self::REFRESH_TIME => time() + $tokens['expires_in'],
);
}
} catch ( Exception $e ) {
Hustle_Provider_Utils::maybe_log( $e->getMessage() );
return false;
}
// Check API Key by validating it on get_info request.
try {
$account_id = $this->get_validated_account_id( null, $api_key );
if ( ! $account_id ) {
Hustle_Provider_Utils::maybe_log( __METHOD__, __( 'Invalid Aweber authorization code.', 'hustle' ) );
return false;
}
} catch ( Exception $e ) {
Hustle_Provider_Utils::maybe_log( __METHOD__, $e->getMessage() );
return false;
}
return $api_key;
}
/**
* Remove wp_options rows
*/
public function remove_wp_options() {
$keys_names = self::get_option_keys();
foreach ( $keys_names as $name ) {
$this->delete_provider_option( $name );
}
}
/**
* Get additional params' keys
*
* @return array
*/
private static function get_option_keys() {
return array(
self::CONSUMER_KEY,
self::CONSUMER_SECRET,
self::ACCESS_TOKEN,
self::ACCESS_SECRET,
self::AUTH_CODE,
self::ACCESS_OAUTH2_REFRESH,
self::ACCESS_OAUTH2_TOKEN,
self::REFRESH_TIME,
);
}
/**
* Get 3.0 provider mappings
*
* @return array
*/
public function get_30_provider_mappings() {
return array(
'api_key' => 'api_key',
);
}
/**
* Refreshes the token for the registered multi-ids.
*
* @since 4.3.3
*/
public static function refresh_token() {
$aweber_instance = self::get_instance();
// Aweber is supposed to be connected if we're executing this, but check just in case.
if ( ! $aweber_instance->is_connected() ) {
return;
}
$multi_ids = wp_list_pluck( $aweber_instance->get_global_multi_ids(), 'id' );
foreach ( $multi_ids as $multi_id ) {
$api_instance = $aweber_instance->get_api( $multi_id );
$api_instance->validate_auth_token_lifespan( $multi_id );
}
}
}
endif;