PKu"\MPfclass-base.phpnuW+Atype = esc_html__( 'Connection', 'wpforms-lite' ); $this->init(); // Add to list of available providers. add_filter( 'wpforms_providers_available', array( $this, 'register_provider' ), $this->priority, 1 ); // Process builder AJAX requests. add_action( "wp_ajax_wpforms_provider_ajax_{$this->slug}", array( $this, 'process_ajax' ) ); // Process entry. add_action( 'wpforms_process_complete', array( $this, 'process_entry' ), 5, 4 ); // Fetch and store the current form data when in the builder. add_action( 'wpforms_builder_init', array( $this, 'builder_form_data' ) ); // Output builder sidebar. add_action( 'wpforms_providers_panel_sidebar', array( $this, 'builder_sidebar' ), $this->priority ); // Output builder content. add_action( 'wpforms_providers_panel_content', array( $this, 'builder_output' ), $this->priority ); // Remove provider from Settings Integrations tab. add_action( "wp_ajax_wpforms_settings_provider_disconnect_{$this->slug}", array( $this, 'integrations_tab_disconnect' ) ); // Add new provider from Settings Integrations tab. add_action( "wp_ajax_wpforms_settings_provider_add_{$this->slug}", array( $this, 'integrations_tab_add' ) ); // Add providers sections to the Settings Integrations tab. add_action( 'wpforms_settings_providers', array( $this, 'integrations_tab_options' ), $this->priority, 2 ); } /** * All systems go. Used by subclasses. * * @since 1.0.0 */ public function init() { } /** * Add to list of registered providers. * * @since 1.0.0 * * @param array $providers Array of all active providers. * * @return array */ public function register_provider( $providers = array() ) { $providers[ $this->slug ] = $this->name; return $providers; } /** * Process the Builder AJAX requests. * * @since 1.0.0 */ public function process_ajax() { // Run a security check. check_ajax_referer( 'wpforms-builder', 'nonce' ); // Check for permissions. if ( ! wpforms_current_user_can( 'edit_forms' ) ) { wp_send_json_error( array( 'error' => esc_html__( 'You do not have permission', 'wpforms-lite' ), ) ); } $name = ! empty( $_POST['name'] ) ? sanitize_text_field( wp_unslash( $_POST['name'] ) ) : ''; $task = ! empty( $_POST['task'] ) ? sanitize_text_field( wp_unslash( $_POST['task'] ) ) : ''; $id = ! empty( $_POST['id'] ) ? sanitize_text_field( wp_unslash( $_POST['id'] ) ) : ''; $connection_id = ! empty( $_POST['connection_id'] ) ? sanitize_text_field( wp_unslash( $_POST['connection_id'] ) ) : ''; $account_id = ! empty( $_POST['account_id'] ) ? sanitize_text_field( wp_unslash( $_POST['account_id'] ) ) : ''; $list_id = ! empty( $_POST['list_id'] ) ? sanitize_text_field( wp_unslash( $_POST['list_id'] ) ) : ''; $data = ! empty( $_POST['data'] ) ? array_map( 'sanitize_text_field', wp_parse_args( wp_unslash( $_POST['data'] ) ) ) : array(); //phpcs:ignore /* * Create new connection. */ if ( 'new_connection' === $task ) { $connection = $this->output_connection( '', array( 'connection_name' => $name, ), $id ); wp_send_json_success( array( 'html' => $connection, ) ); } /* * Create new Provider account. */ if ( 'new_account' === $task ) { $auth = $this->api_auth( $data, $id ); if ( is_wp_error( $auth ) ) { wp_send_json_error( array( 'error' => $auth->get_error_message(), ) ); } else { $accounts = $this->output_accounts( $connection_id, array( 'account_id' => $auth, ) ); wp_send_json_success( array( 'html' => $accounts, ) ); } } /* * Select/Toggle Provider accounts. */ if ( 'select_account' === $task ) { $lists = $this->output_lists( $connection_id, array( 'account_id' => $account_id, ) ); if ( is_wp_error( $lists ) ) { wp_send_json_error( array( 'error' => $lists->get_error_message(), ) ); } else { wp_send_json_success( array( 'html' => $lists, ) ); } } /* * Select/Toggle Provider account lists. */ if ( 'select_list' === $task ) { $fields = $this->output_fields( $connection_id, array( 'account_id' => $account_id, 'list_id' => $list_id, ), $id ); if ( is_wp_error( $fields ) ) { wp_send_json_error( array( 'error' => $fields->get_error_message(), ) ); } else { $groups = $this->output_groups( $connection_id, array( 'account_id' => $account_id, 'list_id' => $list_id, ) ); $conditionals = $this->output_conditionals( $connection_id, array( 'account_id' => $account_id, 'list_id' => $list_id, ), array( 'id' => absint( $_POST['form_id'] ), //phpcs:ignore ) ); $options = $this->output_options( $connection_id, array( 'account_id' => $account_id, 'list_id' => $list_id, ) ); wp_send_json_success( array( 'html' => $groups . $fields . $conditionals . $options, ) ); } } die(); } /** * Process and submit entry to provider. * * @since 1.0.0 * * @param array $fields List of fields in a form. * @param array $entry Submitted entry values. * @param array $form_data Form data and settings. * @param int $entry_id Saved entry ID. */ public function process_entry( $fields, $entry, $form_data, $entry_id ) { } /** * Process conditional fields. * * @since 1.0.0 * * @param array $fields List of fields with their data and settings. * @param array $entry Submitted entry values. * @param array $form_data Form data and settings. * @param array $connection List of connection settings. * * @return bool */ public function process_conditionals( $fields, $entry, $form_data, $connection ) { if ( empty( $connection['conditional_logic'] ) || empty( $connection['conditionals'] ) ) { return true; } $process = wpforms_conditional_logic()->process( $fields, $form_data, $connection['conditionals'] ); if ( ! empty( $connection['conditional_type'] ) && 'stop' === $connection['conditional_type'] ) { $process = ! $process; } return $process; } /** * Retrieve all available forms in a field. * * Not all fields should be available for merge tags so we compare against a * white-list. Also some fields, such as Name, should have additional * variations. * * @since 1.0.0 * * @param object|bool $form * @param array $whitelist * * @return bool|array */ public function get_form_fields( $form = false, $whitelist = array() ) { // Accept form (post) object or form ID. if ( is_object( $form ) ) { $form = wpforms_decode( $form->post_content ); } elseif ( is_numeric( $form ) ) { $form = wpforms()->form->get( $form, array( 'content_only' => true, ) ); } if ( ! is_array( $form ) || empty( $form['fields'] ) ) { return false; } // White list of field types to allow. $allowed_form_fields = array( 'text', 'textarea', 'select', 'radio', 'checkbox', 'email', 'address', 'url', 'name', 'hidden', 'date-time', 'phone', 'number', ); $allowed_form_fields = apply_filters( 'wpforms_providers_fields', $allowed_form_fields ); $whitelist = ! empty( $whitelist ) ? $whitelist : $allowed_form_fields; $form_fields = $form['fields']; foreach ( $form_fields as $id => $form_field ) { if ( ! in_array( $form_field['type'], $whitelist, true ) ) { unset( $form_fields[ $id ] ); } } return $form_fields; } /** * Get form fields ready for select list options. * * In this function we also do the logic to limit certain fields to certain * provider field types. * * @since 1.0.0 * * @param array $form_fields * @param string $form_field_type * * @return array */ public function get_form_field_select( $form_fields = array(), $form_field_type = '' ) { if ( empty( $form_fields ) || empty( $form_field_type ) ) { return array(); } $formatted = array(); // Include only specific field types. foreach ( $form_fields as $id => $form_field ) { // Email. if ( 'email' === $form_field_type && ! in_array( $form_field['type'], array( 'text', 'email' ), true ) ) { unset( $form_fields[ $id ] ); } // Address. if ( 'address' === $form_field_type && ! in_array( $form_field['type'], array( 'address' ), true ) ) { unset( $form_fields[ $id ] ); } } // Format. foreach ( $form_fields as $id => $form_field ) { // Complex Name field. if ( 'name' === $form_field['type'] ) { // Full Name. $formatted[] = array( 'id' => $form_field['id'], 'key' => 'value', 'type' => $form_field['type'], 'subtype' => '', 'provider_type' => $form_field_type, 'label' => sprintf( /* translators: %s - Name field label. */ esc_html__( '%s (Full)', 'wpforms-lite' ), $form_field['label'] ), ); // First Name. if ( strpos( $form_field['format'], 'first' ) !== false ) { $formatted[] = array( 'id' => $form_field['id'], 'key' => 'first', 'type' => $form_field['type'], 'subtype' => 'first', 'provider_type' => $form_field_type, 'label' => sprintf( /* translators: %s - Name field label. */ esc_html__( '%s (First)', 'wpforms-lite' ), $form_field['label'] ), ); } // Middle Name. if ( strpos( $form_field['format'], 'middle' ) !== false ) { $formatted[] = array( 'id' => $form_field['id'], 'key' => 'middle', 'type' => $form_field['type'], 'subtype' => 'middle', 'provider_type' => $form_field_type, 'label' => sprintf( /* translators: %s - Name field label. */ esc_html__( '%s (Middle)', 'wpforms-lite' ), $form_field['label'] ), ); } // Last Name. if ( strpos( $form_field['format'], 'last' ) !== false ) { $formatted[] = array( 'id' => $form_field['id'], 'key' => 'last', 'type' => $form_field['type'], 'subtype' => 'last', 'provider_type' => $form_field_type, 'label' => sprintf( /* translators: %s - Name field label. */ esc_html__( '%s (Last)', 'wpforms-lite' ), $form_field['label'] ), ); } } else { // All other fields. $formatted[] = array( 'id' => $form_field['id'], 'key' => 'value', 'type' => $form_field['type'], 'subtype' => '', 'provider_type' => $form_field_type, 'label' => $form_field['label'], ); } } return $formatted; } /************************************************************************ * API methods - these methods interact directly with the provider API. * ************************************************************************/ /** * Authenticate with the provider API. * * @since 1.0.0 * * @param array $data * @param string $form_id * * @return mixed id or error object */ public function api_auth( $data = array(), $form_id = '' ) { } /** * Establish connection object to provider API. * * @since 1.0.0 * * @param string $account_id * * @return mixed array or error object */ public function api_connect( $account_id ) { } /** * Retrieve provider account lists. * * @since 1.0.0 * * @param string $connection_id * @param string $account_id * * @return mixed array or error object */ public function api_lists( $connection_id = '', $account_id = '' ) { } /** * Retrieve provider account list groups. * * @since 1.0.0 * * @param string $connection_id * @param string $account_id * @param string $list_id * * @return mixed array or error object */ public function api_groups( $connection_id = '', $account_id = '', $list_id = '' ) { } /** * Retrieve provider account list fields. * * @since 1.0.0 * * @param string $connection_id * @param string $account_id * @param string $list_id * * @return mixed array or error object */ public function api_fields( $connection_id = '', $account_id = '', $list_id = '' ) { } /************************************************************************* * Output methods - these methods generally return HTML for the builder. * *************************************************************************/ /** * Connection HTML. * * This method compiles all the HTML necessary for a connection to a provider. * * @since 1.0.0 * * @param string $connection_id * @param array $connection * @param mixed $form Form id or form data. * * @return string */ public function output_connection( $connection_id = '', $connection = array(), $form = '' ) { if ( empty( $connection_id ) ) { $connection_id = 'connection_' . uniqid(); } if ( empty( $connection ) || empty( $form ) ) { return ''; } $output = sprintf( '
', $this->slug, $connection_id ); $output .= $this->output_connection_header( $connection_id, $connection ); $output .= $this->output_auth(); $output .= $this->output_accounts( $connection_id, $connection ); $lists = $this->output_lists( $connection_id, $connection ); $output .= ! is_wp_error( $lists ) ? $lists : ''; $output .= $this->output_groups( $connection_id, $connection ); $fields = $this->output_fields( $connection_id, $connection, $form ); $output .= ! is_wp_error( $fields ) ? $fields : ''; $output .= $this->output_conditionals( $connection_id, $connection, $form ); $output .= $this->output_options( $connection_id, $connection ); $output .= '
'; return $output; } /** * Connection header HTML. * * @since 1.0.0 * * @param string $connection_id * @param array $connection * * @return string */ public function output_connection_header( $connection_id = '', $connection = array() ) { if ( empty( $connection_id ) || empty( $connection ) ) { return ''; } $output = '
'; $output .= sprintf( '%s', sanitize_text_field( $connection['connection_name'] ) ); $output .= ''; $output .= sprintf( '', $this->slug, $connection_id, esc_attr( $connection['connection_name'] ) ); $output .= '
'; return $output; } /** * Provider account authorize fields HTML. * * @since 1.0.0 * * @return mixed */ public function output_auth() { } /** * Provider account select HTML. * * @since 1.0.0 * * @param string $connection_id Unique connection ID. * @param array $connection Array of connection data. * * @return string */ public function output_accounts( $connection_id = '', $connection = array() ) { if ( empty( $connection_id ) || empty( $connection ) ) { return ''; } $providers = wpforms_get_providers_options(); if ( empty( $providers[ $this->slug ] ) ) { return ''; } $output = '
'; $output .= sprintf( '

%s

', esc_html__( 'Select Account', 'wpforms-lite' ) ); $output .= sprintf( ''; $output .= '
'; return $output; } /** * Provider account lists HTML. * * @since 1.0.0 * * @param string $connection_id * @param array $connection * * @return WP_Error|string */ public function output_lists( $connection_id = '', $connection = array() ) { if ( empty( $connection_id ) || empty( $connection['account_id'] ) ) { return ''; } $lists = $this->api_lists( $connection_id, $connection['account_id'] ); $selected = ! empty( $connection['list_id'] ) ? $connection['list_id'] : ''; if ( is_wp_error( $lists ) ) { return $lists; } $output = '
'; $output .= sprintf( '

%s

', esc_html__( 'Select List', 'wpforms-lite' ) ); $output .= sprintf( ''; $output .= '
'; return $output; } /** * Provider account list groups HTML. * * @since 1.0.0 * * @param string $connection_id * @param array $connection * * @return string */ public function output_groups( $connection_id = '', $connection = array() ) { if ( empty( $connection_id ) || empty( $connection['account_id'] ) || empty( $connection['list_id'] ) ) { return ''; } $groupsets = $this->api_groups( $connection_id, $connection['account_id'], $connection['list_id'] ); if ( is_wp_error( $groupsets ) ) { return ''; } $output = '
'; $output .= sprintf( '

%s

', esc_html__( 'Select Groups', 'wpforms-lite' ) ); $output .= sprintf( '

%s

', esc_html__( 'We also noticed that you have some segments in your list. You can select specific list segments below if needed. This is optional.', 'wpforms-lite' ) ); $output .= '
'; foreach ( $groupsets as $groupset ) { $output .= sprintf( '

%s

', esc_html( $groupset['name'] ) ); foreach ( $groupset['groups'] as $group ) { $selected = ! empty( $connection['groups'] ) && ! empty( $connection['groups'][ $groupset['id'] ] ) ? in_array( $group['name'], $connection['groups'][ $groupset['id'] ], true ) : false; $output .= sprintf( '', esc_attr( $group['id'] ), esc_attr( $group['name'] ), $this->slug, $connection_id, $groupset['id'], $group['id'], checked( $selected, true, false ), esc_attr( $group['id'] ), esc_attr( $group['name'] ) ); } } $output .= '
'; $output .= '
'; return $output; } /** * Provider account list fields HTML. * * @since 1.0.0 * * @param string $connection_id * @param array $connection * @param mixed $form * * @return WP_Error|string */ public function output_fields( $connection_id = '', $connection = array(), $form = '' ) { if ( empty( $connection_id ) || empty( $connection['account_id'] ) || empty( $connection['list_id'] ) || empty( $form ) ) { return ''; } $provider_fields = $this->api_fields( $connection_id, $connection['account_id'], $connection['list_id'] ); $form_fields = $this->get_form_fields( $form ); if ( is_wp_error( $provider_fields ) ) { return $provider_fields; } $output = '
'; $output .= sprintf( '

%s

', esc_html__( 'List Fields', 'wpforms-lite' ) ); // Table with all the fields. $output .= ''; $output .= sprintf( '', esc_html__( 'List Fields', 'wpforms-lite' ), esc_html__( 'Available Form Fields', 'wpforms-lite' ) ); $output .= ''; foreach ( $provider_fields as $provider_field ) : $output .= ''; $output .= ''; $output .= ''; endforeach; $output .= ''; $output .= '
%s%s
'; $output .= esc_html( $provider_field['name'] ); if ( ! empty( $provider_field['req'] ) && $provider_field['req'] == '1' ) { $output .= '*'; } $output .= ''; $output .= sprintf( ''; $output .= '
'; $output .= '
'; return $output; } /** * Provider connection conditional options HTML * * @since 1.0.0 * * @param string $connection_id * @param array $connection * @param string|array $form * * @return string */ public function output_conditionals( $connection_id = '', $connection = array(), $form = '' ) { if ( empty( $connection['account_id'] ) ) { return ''; } return wpforms_conditional_logic()->builder_block( array( 'form' => $this->form_data, 'type' => 'panel', 'panel' => $this->slug, 'parent' => 'providers', 'subsection' => $connection_id, 'reference' => esc_html__( 'Marketing provider connection', 'wpforms-lite' ), ), false ); } /** * Provider account list options HTML. * * @since 1.0.0 * * @param string $connection_id * @param array $connection * * @return string */ public function output_options( $connection_id = '', $connection = array() ) { } /******************************************************** * Builder methods - these methods _build_ the Builder. * ********************************************************/ /** * Fetch and store the current form data when in the builder. * * @since 1.2.3 */ public function builder_form_data() { if ( ! empty( $_GET['form_id'] ) && empty( $this->form_data ) ) { $this->form_data = wpforms()->form->get( absint( $_GET['form_id'] ), array( 'content_only' => true, ) ); } } /** * Display content inside the panel content area. * * @since 1.0.0 */ public function builder_content() { $form_data = $this->form_data; $providers = wpforms_get_providers_options(); if ( ! empty( $form_data['providers'][ $this->slug ] ) && ! empty( $providers[ $this->slug ] ) ) { foreach ( $form_data['providers'][ $this->slug ] as $connection_id => $connection ) { foreach ( $providers[ $this->slug ] as $account_id => $connections ) { if ( ! empty( $connection['account_id'] ) && $connection['account_id'] === $account_id ) { echo $this->output_connection( $connection_id, $connection, $form_data ); } } } } } /** * Display content inside the panel sidebar area. * * @since 1.0.0 */ public function builder_sidebar() { $form_data = $this->form_data; $configured = ! empty( $form_data['providers'][ $this->slug ] ) ? 'configured' : ''; $configured = apply_filters( 'wpforms_providers_' . $this->slug . '_configured', $configured ); echo ''; echo ''; echo esc_html( $this->name ); echo ''; if ( ! empty( $configured ) ) { echo ''; } echo ''; } /** * Wrap the builder content with the required markup. * * @since 1.0.0 */ public function builder_output() { ?>
builder_output_before(); ?>
name; ?>
builder_content(); ?>
builder_output_after(); ?>
esc_html__( 'You do not have permission', 'wpforms-lite' ), ) ); } if ( empty( $_POST['provider'] ) || empty( $_POST['key'] ) ) { wp_send_json_error( array( 'error' => esc_html__( 'Missing data', 'wpforms-lite' ), ) ); } $providers = wpforms_get_providers_options(); if ( ! empty( $providers[ $_POST['provider'] ][ $_POST['key'] ] ) ) { unset( $providers[ $_POST['provider'] ][ $_POST['key'] ] ); update_option( 'wpforms_providers', $providers ); wp_send_json_success(); } else { wp_send_json_error( array( 'error' => esc_html__( 'Connection missing', 'wpforms-lite' ), ) ); } } /** * AJAX to add a provider from the settings integrations tab. * * @since 1.0.0 */ public function integrations_tab_add() { if ( $_POST['provider'] !== $this->slug ) { //phpcs:ignore return; } // Run a security check. check_ajax_referer( 'wpforms-admin', 'nonce' ); // Check for permissions. if ( ! wpforms_current_user_can() ) { wp_send_json_error( array( 'error' => esc_html__( 'You do not have permission', 'wpforms-lite' ), ) ); } if ( empty( $_POST['data'] ) ) { wp_send_json_error( array( 'error' => esc_html__( 'Missing data', 'wpforms-lite' ), ) ); } $data = wp_parse_args( $_POST['data'], array() ); $auth = $this->api_auth( $data, '' ); if ( is_wp_error( $auth ) ) { wp_send_json_error( array( 'error' => esc_html__( 'Could not connect to the provider.', 'wpforms-lite' ), 'error_msg' => $auth->get_error_message(), ) ); } else { $account = '
  • '; $account .= '' . sanitize_text_field( $data['label'] ) . ''; /* translators: %s - Connection date. */ $account .= '' . sprintf( esc_html__( 'Connected on: %s', 'wpforms-lite' ), date_i18n( get_option( 'date_format', time() ) ) ) . ''; $account .= '' . esc_html__( 'Disconnect', 'wpforms-lite' ) . ''; $account .= '
  • '; wp_send_json_success( array( 'html' => $account, ) ); } } /** * Add provider to the Settings Integrations tab. * * @since 1.0.0 * * @param array $active Array of active connections. * @param array $settings Array of all connections settings. */ public function integrations_tab_options( $active, $settings ) { $connected = ! empty( $active[ $this->slug ] ); $accounts = ! empty( $settings[ $this->slug ] ) ? $settings[ $this->slug ] : array(); $class = $connected && $accounts ? 'connected' : ''; $arrow = 'right'; /* translators: %s - provider name. */ $title_connect_to = sprintf( esc_html__( 'Connect to %s', 'wpforms-lite' ), esc_html( $this->name ) ); // This lets us highlight a specific service by a special link. if ( ! empty( $_GET['wpforms-integration'] ) ) { //phpcs:ignore if ( $this->slug === $_GET['wpforms-integration'] ) { //phpcs:ignore $class .= ' focus-in'; $arrow = 'down'; } else { $class .= ' focus-out'; } } ?>

    name ); ?>

    name ) ); ?>

     
      $account ) { echo '
    • '; echo '' . esc_html( $account['label'] ) . ''; /* translators: %s - Connection date. */ echo '' . sprintf( esc_html__( 'Connected on: %s', 'wpforms-lite' ), date_i18n( get_option( 'date_format' ), intval( $account['date'] ) ) ) . ''; echo '' . esc_html__( 'Disconnect', 'wpforms-lite' ) . ''; echo '
    • '; } } ?>

    integrations_tab_new_form(); ?>

    slug . '-error', $message ); } } PKu"\6,xuxuclass-constant-contact.phpnuW+Aversion = '1.3.6'; $this->name = 'Constant Contact'; $this->slug = 'constant-contact'; $this->priority = 14; $this->icon = WPFORMS_PLUGIN_URL . 'assets/images/icon-provider-constant-contact.png'; if ( is_admin() ) { // Admin notice requesting connecting. add_action( 'admin_notices', array( $this, 'connect_request' ) ); add_action( 'wp_ajax_wpforms_constant_contact_dismiss', array( $this, 'connect_dismiss' ) ); add_action( 'wpforms_admin_page', array( $this, 'learn_more_page' ) ); // Provide option to override sign up link. $sign_up = get_option( 'wpforms_constant_contact_signup', false ); if ( $sign_up ) { $this->sign_up = esc_html( $sign_up ); } } } /** * Process and submit entry to provider. * * @since 1.3.6 * * @param array $fields List of fields with their data and settings. * @param array $entry Submitted entry values. * @param array $form_data Form data and settings. * @param int $entry_id Saved entry ID. * * @return void */ public function process_entry( $fields, $entry, $form_data, $entry_id = 0 ) { // Only run if this form has a connections for this provider. if ( empty( $form_data['providers'][ $this->slug ] ) ) { return; } /* * Fire for each connection. */ foreach ( $form_data['providers'][ $this->slug ] as $connection ) : // Before proceeding make sure required fields are configured. if ( empty( $connection['fields']['email'] ) ) { continue; } // Setup basic data. $list_id = $connection['list_id']; $account_id = $connection['account_id']; $email_data = explode( '.', $connection['fields']['email'] ); $email_id = $email_data[0]; $email = $fields[ $email_id ]['value']; $this->api_connect( $account_id ); // Email is required and Access token are required. if ( empty( $email ) || empty( $this->access_token ) ) { continue; } // Check for conditionals. $pass = $this->process_conditionals( $fields, $entry, $form_data, $connection ); if ( ! $pass ) { wpforms_log( esc_html__( 'Constant Contact Subscription stopped by conditional logic', 'wpforms-lite' ), $fields, array( 'type' => array( 'provider', 'conditional_logic' ), 'parent' => $entry_id, 'form_id' => $form_data['id'], ) ); continue; } // Check to see if the lead already exists in Constant Contact. $response = wp_remote_get( 'https://api.constantcontact.com/v2/contacts?api_key=' . $this->api_key . '&access_token=' . $this->access_token . '&email=' . $email ); $contact = json_decode( wp_remote_retrieve_body( $response ), true ); // Return early if there was a problem. if ( isset( $contact['error_key'] ) ) { wpforms_log( esc_html__( 'Constant Contact API Error', 'wpforms-lite' ), $contact->get_error_message(), array( 'type' => array( 'provider', 'error' ), 'parent' => $entry_id, 'form_id' => $form_data['id'], ) ); continue; } /* * Setup Merge Vars */ $merge_vars = array(); foreach ( $connection['fields'] as $name => $merge_var ) { // Don't include Email or Full name fields. if ( 'email' === $name ) { continue; } // Check if merge var is mapped. if ( empty( $merge_var ) ) { continue; } $merge_var = explode( '.', $merge_var ); $id = $merge_var[0]; $key = ! empty( $merge_var[1] ) ? $merge_var[1] : 'value'; // Check if mapped form field has a value. if ( empty( $fields[ $id ][ $key ] ) ) { continue; } $value = $fields[ $id ][ $key ]; // Constant Contact doesn't native URL field so it has to be // stored in a custom field. if ( 'url' === $name ) { $merge_vars['custom_fields'] = array( array( 'name' => 'custom_field_1', 'value' => $value, ), ); continue; } // Constant Contact stores name in two fields, so we have to // separate it. if ( 'full_name' === $name ) { $names = explode( ' ', $value ); if ( ! empty( $names[0] ) ) { $merge_vars['first_name'] = $names[0]; } if ( ! empty( $names[1] ) ) { $merge_vars['last_name'] = $names[1]; } continue; } // Constant Contact stores address in multiple fields, so we // have to separate it. if ( 'address' === $name ) { // Only support Address fields. if ( 'address' !== $fields[ $id ]['type'] ) { continue; } // Postal code may be in extended US format. $postal = array( 'code' => '', 'subcode' => '', ); if ( ! empty( $fields[ $id ]['postal'] ) ) { $p = explode( '-', $fields[ $id ]['postal'] ); $postal['code'] = ! empty( $p[0] ) ? $p[0] : ''; $postal['subcode'] = ! empty( $p[1] ) ? $p[1] : ''; } $merge_vars['addresses'] = array( array( 'address_type' => 'BUSINESS', 'city' => ! empty( $fields[ $id ]['city'] ) ? $fields[ $id ]['city'] : '', 'country_code' => ! empty( $fields[ $id ]['country'] ) ? $fields[ $id ]['country'] : '', 'line1' => ! empty( $fields[ $id ]['address1'] ) ? $fields[ $id ]['address1'] : '', 'line2' => ! empty( $fields[ $id ]['address2'] ) ? $fields[ $id ]['address2'] : '', 'postal_code' => $postal['code'], 'state' => ! empty( $fields[ $id ]['state'] ) ? $fields[ $id ]['state'] : '', 'sub_postal_code' => $postal['subcode'], ), ); continue; } $merge_vars[ $name ] = $value; } /* * Process in API */ // If we have a previous contact, only update the list association. if ( ! empty( $contact['results'] ) ) { $data = $contact['results'][0]; // Check if they are already assigned to lists. if ( ! empty( $data['lists'] ) ) { foreach ( $data['lists'] as $list ) { // If they are already assigned to this list, return early. if ( isset( $list['id'] ) && $list_id == $list['id'] ) { return; } } // Otherwise, add them to the list. $data['lists'][ count( $data['lists'] ) ] = array( 'id' => $list_id, 'status' => 'ACTIVE', ); } else { // Add the contact to the list. $data['lists'][0] = array( 'id' => $list_id, 'status' => 'ACTIVE', ); } // Combine merge vars into data before sending. $data = array_merge( $data, $merge_vars ); // Args to use. $args = array( 'body' => wp_json_encode( $data ), 'method' => 'PUT', 'headers' => array( 'Content-Type' => 'application/json', ), ); $update = wp_remote_request( 'https://api.constantcontact.com/v2/contacts/' . $data['id'] . '?api_key=' . $this->api_key . '&access_token=' . $this->access_token . '&action_by=ACTION_BY_VISITOR', $args ); $res = json_decode( wp_remote_retrieve_body( $update ), true ); } else { // Add a new contact. $data = array( 'email_addresses' => array( array( 'email_address' => $email ) ), 'lists' => array( array( 'id' => $list_id ) ), ); // Combine merge vars into data before sending. $data = array_merge( $data, $merge_vars ); // Args to use. $args = array( 'body' => wp_json_encode( $data ), 'headers' => array( 'Content-Type' => 'application/json', ), ); $add = wp_remote_post( 'https://api.constantcontact.com/v2/contacts?api_key=' . $this->api_key . '&access_token=' . $this->access_token . '&action_by=ACTION_BY_VISITOR', $args ); $res = json_decode( wp_remote_retrieve_body( $add ), true ); } // Check for errors. if ( isset( $res['error_key'] ) ) { wpforms_log( esc_html__( 'Constant Contact API Error', 'wpforms-lite' ), $res->get_error_message(), array( 'type' => array( 'provider', 'error' ), 'parent' => $entry_id, 'form_id' => $form_data['id'], ) ); } endforeach; } /************************************************************************ * API methods - these methods interact directly with the provider API. * ************************************************************************/ /** * Authenticate with the API. * * @since 1.3.6 * * @param array $data * @param string $form_id * * @return mixed id or error object */ public function api_auth( $data = array(), $form_id = '' ) { $id = uniqid(); $providers = wpforms_get_providers_options(); $providers[ $this->slug ][ $id ] = array( 'access_token' => sanitize_text_field( $data['authcode'] ), 'label' => sanitize_text_field( $data['label'] ), 'date' => time(), ); update_option( 'wpforms_providers', $providers ); return $id; } /** * Establish connection object to API. * * @since 1.3.6 * * @param string $account_id * * @return mixed array or error object. */ public function api_connect( $account_id ) { if ( ! empty( $this->api[ $account_id ] ) ) { return $this->api[ $account_id ]; } else { $providers = wpforms_get_providers_options(); if ( ! empty( $providers[ $this->slug ][ $account_id ] ) ) { $this->api[ $account_id ] = true; $this->access_token = $providers[ $this->slug ][ $account_id ]['access_token']; } else { return $this->error( 'API error' ); } } } /** * Retrieve provider account lists. * * @since 1.3.6 * * @param string $connection_id * @param string $account_id * * @return mixed array or error object */ public function api_lists( $connection_id = '', $account_id = '' ) { $this->api_connect( $account_id ); $request = wp_remote_get( 'https://api.constantcontact.com/v2/lists?api_key=' . $this->api_key . '&access_token=' . $this->access_token ); $lists = json_decode( wp_remote_retrieve_body( $request ), true ); if ( empty( $lists ) ) { wpforms_log( esc_html__( 'Constant Contact API Error', 'wpforms-lite' ), '', array( 'type' => array( 'provider', 'error' ), ) ); return $this->error( esc_html__( 'API list error: Constant API error', 'wpforms-lite' ) ); } return $lists; } /** * Retrieve provider account list fields. * * @since 1.3.6 * * @param string $connection_id * @param string $account_id * @param string $list_id * * @return mixed array or error object */ public function api_fields( $connection_id = '', $account_id = '', $list_id = '' ) { $provider_fields = array( array( 'name' => 'Email', 'field_type' => 'email', 'req' => '1', 'tag' => 'email', ), array( 'name' => 'Full Name', 'field_type' => 'name', 'tag' => 'full_name', ), array( 'name' => 'First Name', 'field_type' => 'first', 'tag' => 'first_name', ), array( 'name' => 'Last Name', 'field_type' => 'last', 'tag' => 'last_name', ), array( 'name' => 'Phone', 'field_type' => 'text', 'tag' => 'work_phone', ), array( 'name' => 'Website', 'field_type' => 'text', 'tag' => 'url', ), array( 'name' => 'Address', 'field_type' => 'address', 'tag' => 'address', ), array( 'name' => 'Job Title', 'field_type' => 'text', 'tag' => 'job_title', ), array( 'name' => 'Company', 'field_type' => 'text', 'tag' => 'company_name', ), ); return $provider_fields; } /************************************************************************* * Output methods - these methods generally return HTML for the builder. * *************************************************************************/ /** * Provider account authorize fields HTML. * * @since 1.3.6 * @return string */ public function output_auth() { $providers = wpforms_get_providers_options(); $class = ! empty( $providers[ $this->slug ] ) ? 'hidden' : ''; $output = '
    '; $output .= sprintf( '

    %s

    ', esc_html__( 'Add New Account', 'wpforms-lite' ) ); $output .= '

    '; $output .= esc_html__( 'Please fill out all of the fields below to register your new Constant Contact account.', 'wpforms-lite' ); $output .= '
    '; $output .= esc_html__( 'Click here for documentation on connecting WPForms with Constant Contact.', 'wpforms-lite' ); $output .= ''; $output .= '

    '; $output .= '

    '; $output .= esc_html__( 'Because Constant Contact requires external authentication, you will need to register WPForms with Constant Contact before you can proceed.', 'wpforms-lite' ); $output .= '

    '; $output .= '

    '; $output .= esc_html__( 'Click here to register with Constant Contact', 'wpforms-lite' ); $output .= '

    '; $output .= sprintf( '', $this->name, esc_html__( 'Authorization Code', 'wpforms-lite' ) ); $output .= sprintf( '', $this->name, esc_html__( 'Account Nickname', 'wpforms-lite' ) ); $output .= sprintf( '', $this->slug, esc_html__( 'Connect', 'wpforms-lite' ) ); $output .= '
    '; return $output; } /** * Provider account list groups HTML. * * @since 1.3.6 * * @param string $connection_id * @param array $connection * * @return string */ public function output_groups( $connection_id = '', $connection = array() ) { // No groups or segments for this provider. return ''; } /** * Output content after the main builder output. * * @since 1.3.6 */ public function builder_output_after() { // Only display if Constant Contact account has not been setup. $providers = wpforms_get_providers_options(); if ( ! empty( $providers[ $this->slug ] ) ) { return; } ?>

    WPForms — use it with an active Constant Contact account.', 'wpforms-lite' ), array( 'strong' => array(), ) ); ?>

    power of email marketing', 'wpforms-lite' ), array( 'a' => array( 'href' => array(), 'target' => array(), 'rel' => array(), ), ) ), esc_url( admin_url( 'admin.php?page=wpforms-page&wpforms-page=constant-contact' ) ) ); ?>

    '; $output .= ''; $output .= esc_html__( 'Click here for documentation on connecting WPForms with Constant Contact.', 'wpforms-lite' ); $output .= ''; $output .= '

    '; $output .= '

    '; $output .= esc_html__( 'Because Constant Contact requires external authentication, you will need to register WPForms with Constant Contact before you can proceed.', 'wpforms-lite' ); $output .= '

    '; $output .= '

    '; $output .= esc_html__( 'Click here to register with Constant Contact', 'wpforms-lite' ); $output .= '

    '; $output .= sprintf( '', $this->name, esc_html__( 'Authorization Code', 'wpforms-lite' ) ); $output .= sprintf( '', $this->name, esc_html__( 'Account Nickname', 'wpforms-lite' ) ); echo $output; } /************************ * Other functionality. * ************************/ /** * Add admin notices to connect to Constant Contact. * * @since 1.3.6 */ public function connect_request() { // Only consider showing the review request to admin users. if ( ! is_super_admin() ) { return; } // Don't display on WPForms admin content pages. if ( ! empty( $_GET['wpforms-page'] ) ) { return; } // Don't display if user is about to connect via Settings page. if ( ! empty( $_GET['wpforms-integration'] ) && $this->slug === $_GET['wpforms-integration'] ) { return; } // Only display the notice is the Constant Contact option is set and // there are previous Constant Contact connections created. $cc_notice = get_option( 'wpforms_constant_contact', false ); $providers = wpforms_get_providers_options(); if ( ! $cc_notice || ! empty( $providers[ $this->slug ] ) ) { return; } // Output the notice message. $connect = admin_url( 'admin.php?page=wpforms-settings&wpforms-integration=constant-contact#!wpforms-tab-providers' ); $learn_more = admin_url( 'admin.php?page=wpforms-page&wpforms-page=constant-contact' ); ?>

    WPForms plugin — use it with an active Constant Contact account.', 'wpforms-lite' ), array( 'strong' => array(), ) ); ?>

    power of email marketing', 'wpforms-lite' ), array( 'a' => array( 'href' => array(), ), ) ), esc_url( $learn_more ) ); ?>

    $44 back for every $1 spent according to DMA.', 'wpforms-lite' ), array( 'strong' => array() ) ); ?>

    1. Email is still #1 - At least 91% of consumers check their email on a daily basis. You get direct access to your subscribers, without having to play by social media's rules and algorithms.', 'wpforms-lite' ), array( 'strong' => array() ) ); ?>
    2. You own your email list - Unlike with social media, your list is your property and no one can revoke your access to it.', 'wpforms-lite' ), array( 'strong' => array() ) ); ?>
    3. Email converts - People who buy products marketed through email spend 138% more than those who don't receive email offers.', 'wpforms-lite' ), array( 'strong' => array() ) ); ?>

    why building your email list is so important.', 'wpforms-lite' ), array( 'a' => array( 'href' => array(), 'target' => array(), 'rel' => array(), ), ) ), $more ); ?>



    <> OtEXtSoftwareAdobe ImageReadyqe<(iTXtXML:com.adobe.xmp %,IDATxkHQwTX$AP}$?^H VB!E`_ { "2( "J"![A"aG#.<=;xeΙϽs9? ƣ%ƩiZkZkZx(5`>H3@a?+h/A ~dgYM#!٢}<At#P&TRՀ4 ~KSl hAxKHQ*bp ſJ5tr3B7JNߙ;iH3>6$ۙmdm ?'zXIJD/MVQwTiRh|O M < /- G]~6ULDnE]˙O%yXV-j维R9pl8Bh!Q4A.PՒyp8>ͣFZZ{kψfz4kEjZcme6*Yhᣔ^S8 NZjS .Ln |HU2 [Tg>}PvCL6-"jG 22ǰո~۠1 Cs8-X jci+Ac57ZƑv2=q _ҎH{<id = 'vk'; $this->label = 'VKontakte'; $this->path = dirname(__FILE__); } } NextendSocialLogin::addProvider(new NextendSocialProviderVK());PK|"\ $$twitter/twitter-client.phpnuW+Aconsumer_key = $consumer_key; $this->consumer_secret = $consumer_secret; } public function getTestUrl() { return $this->endpoint; } /** * @param string $redirect_uri */ public function setRedirectUri($redirect_uri) { $this->redirect_uri = $redirect_uri; } public function deleteLoginPersistentData() { Persistent::delete($this->providerID . '_request_token'); } /** * @return string * @throws Exception */ public function createAuthUrl() { $response = $this->oauthRequest($this->endpoint . 'oauth/request_token', 'POST', array(), array( 'oauth_callback' => $this->redirect_uri )); $oauthTokenData = $this->extract_params($response); Persistent::set($this->providerID . '_request_token', maybe_serialize($oauthTokenData)); return $this->endpoint . 'oauth/authenticate?oauth_token=' . $oauthTokenData['oauth_token'] /*. '&force_login=1'*/ ; } /** * @throws Exception */ public function checkError() { if (isset($_GET['denied'])) { throw new Exception('Authentication cancelled'); } } public function hasAuthenticateData() { return isset($_REQUEST['oauth_token']) && isset($_REQUEST['oauth_verifier']); } /** * @return false|string * @throws Exception */ public function authenticate() { $requestToken = maybe_unserialize(Persistent::get($this->providerID . '_request_token')); $response = $this->oauthRequest($this->endpoint . 'oauth/access_token', 'POST', array(), array( 'oauth_verifier' => $_GET['oauth_verifier'] ), array( 'token' => $requestToken['oauth_token'], 'secret' => $requestToken['oauth_token_secret'] )); $accessTokenData = $this->extract_params($response); $access_token_data = wp_json_encode(array( 'oauth_token' => $accessTokenData['oauth_token'], 'oauth_token_secret' => $accessTokenData['oauth_token_secret'], 'user_id' => $accessTokenData['user_id'], 'screen_name' => $accessTokenData['screen_name'] )); $this->setAccessTokenData($access_token_data); return $access_token_data; } /** * @param $path * @param array $data * * @return array|mixed|object * @throws Exception */ public function get($path, $data = array(), $endpoint = false) { if (!$endpoint) { $endpoint = $this->endpoint; } $response = $this->oauthRequest($endpoint . '1.1/' . $path . '.json', 'GET', $data + array( 'user_id' => $this->access_token_data['user_id'] ), array(), array( 'token' => $this->access_token_data['oauth_token'], 'secret' => $this->access_token_data['oauth_token_secret'] )); return json_decode($response, true); } /** * @param $url * @param $method * @param array $_requestData * @param array $_oauthData * @param array $context * * @return string * @throws Exception */ private function oauthRequest($url, $method, $_requestData = array(), $_oauthData = array(), $context = array()) { $method = strtoupper($method); uksort($_requestData, 'strcmp'); $headers = array(); $headers['Authorization'] = $this->getAuthorizationHeader($url, $method, $_requestData, $_oauthData, $context); $http_args = array( 'timeout' => 15, 'user-agent' => 'WordPress', 'headers' => $headers, 'body' => $_requestData ); if ($method == 'POST') { $request = wp_remote_post($url, $http_args); } else { $request = wp_remote_get($url, $http_args); } if (is_wp_error($request)) { throw new Exception($request->get_error_message()); } else if (wp_remote_retrieve_response_code($request) !== 200) { $this->errorFromResponse(json_decode(wp_remote_retrieve_body($request), true)); throw new Exception(sprintf(__('Unexpected response: %s', 'nextend-facebook-connect'), wp_remote_retrieve_body($request))); } return wp_remote_retrieve_body($request); } private function getAuthorizationHeader($url, $method, $_requestData = array(), $_oauthData = array(), $context = array()) { $oauthParams = $this->getOauth1Params($context); foreach ($_oauthData as $k => $v) { $oauthParams[$this->safe_encode($k)] = $this->safe_encode($v); } $params = array_merge($oauthParams, $_requestData); unset($params['oauth_signature']); uksort($params, 'strcmp'); $prepared_pairs_with_oauth = array(); foreach ($params as $k => $v) { $prepared_pairs_with_oauth[] = "{$k}={$v}"; } $paramsForSignature = implode('&', $this->safe_encode(array( $method, $url, implode('&', $prepared_pairs_with_oauth) ))); $left = $this->safe_encode($this->consumer_secret); $right = $this->safe_encode($this->secret($context)); $signing_key = $left . '&' . $right; $oauthParams['oauth_signature'] = $this->safe_encode(base64_encode(hash_hmac('sha1', $paramsForSignature, $signing_key, true))); uksort($oauthParams, 'strcmp'); $encoded_quoted_pairs = array(); foreach ($oauthParams as $k => $v) { $encoded_quoted_pairs[] = "{$k}=\"{$v}\""; } return 'OAuth ' . implode(', ', $encoded_quoted_pairs); } /** * @param $response * * @throws Exception */ private function errorFromResponse($response) { if (isset($response['errors']) && is_array($response['errors'])) { throw new Exception($response['errors'][0]['message']); } } private function safe_encode($data) { if (is_array($data)) { return array_map(array( $this, 'safe_encode' ), $data); } else if (is_scalar($data)) { return str_ireplace(array( '+', '%7E' ), array( ' ', '~' ), rawurlencode($data)); } else { return ''; } } private function safe_decode($data) { if (is_array($data)) { return array_map(array( $this, 'safe_decode' ), $data); } else if (is_scalar($data)) { return rawurldecode($data); } else { return ''; } } private function extract_params($body) { $kvs = explode('&', $body); $decoded = array(); foreach ($kvs as $kv) { $kv = explode('=', $kv, 2); $kv[0] = $this->safe_decode($kv[0]); $kv[1] = $this->safe_decode($kv[1]); $decoded[$kv[0]] = $kv[1]; } return $decoded; } private function nonce($length = 12, $include_time = true) { $prefix = $include_time ? microtime() : ''; return md5(substr($prefix . uniqid(), 0, $length)); } private function timestamp() { $time = time(); return (string)$time; } private function getOauth1Params($data) { $defaults = array( 'oauth_nonce' => $this->nonce(), 'oauth_timestamp' => $this->timestamp(), 'oauth_version' => self::VERSION, 'oauth_consumer_key' => $this->consumer_key, 'oauth_signature_method' => self::SIGNATURE_METHOD, ); // include the user token if it exists if ($oauth_token = $this->token($data)) { $defaults['oauth_token'] = $oauth_token; } $encoded = array(); foreach ($defaults as $k => $v) { $encoded[$this->safe_encode($k)] = $this->safe_encode($v); } return $encoded; } private function token($context) { if (isset($context['token']) && !empty($context['token'])) { return $context['token']; } else if (isset($context['user_token'])) { return $context['user_token']; } return ''; } private function secret($context) { if (isset($context['secret']) && !empty($context['secret'])) { return $context['secret']; } else if (isset($context['user_secret'])) { return $context['user_secret']; } return ''; } }PK|"\6>twitter/twitter.pngnuW+APNG  IHDR<<:rtEXtSoftwareAdobe ImageReadyqe<iTXtXML:com.adobe.xmp 4~ IDATx[HA`h%F]() .ЅBފB2ꡗ^*Bz]4,("QeP a'2/?'Igfwf~;774d 83-X ւ`-X ւ#ԃnA\@*g_)ae (e O3} !B_(w=ڃs5t#{`<4YvG7wlEbwsOA߆Hc=LN:A|;d74"b7Kf=T܂߄4$ n,} UDί4b L Ím燿\+vB_E(gQ0,||Eb_ŠIus1h% tEbONC&E``Y҃ฃrp 􂻠 lsz!F(YKBUqvI`@3puzx%\ KlngEq?[[ qaQ[)ӭ`+Dp=oGA fde-@gq :wFq@ N HXΣ9۱Ai!#ƂO>DtR"aX&RQ^_UXFE+1,,Z=d.j+lN:< VUUp0EYjrbX)PK^ 'diX GPd7(7 (ja٧ ;3ܰz-*\XtR-5`ae'S {a`YpP409 X\D[sѳd|i#uK ZBp1f gϣB*O3c"VqUX"V'X [g-`-X ւ`-8vW!:IENDB`PK|"\ CR!R!twitter/twitter.phpnuW+A'; protected $sync_fields = array( 'description' => array( 'label' => 'Bio', 'node' => 'me' ), 'lang' => array( 'label' => 'Language', 'node' => 'me' ), 'location' => array( 'label' => 'Location', 'node' => 'me' ), 'created_at' => array( 'label' => 'Register date', 'node' => 'me' ), 'profile_url' => array( 'label' => 'Profile URL', 'node' => 'me' ), 'screen_name' => array( 'label' => 'Screen name', 'node' => 'me' ), 'url' => array( 'label' => 'Owned website', 'node' => 'me' ) ); public function __construct() { $this->id = 'twitter'; $this->label = 'Twitter'; $this->path = dirname(__FILE__); $this->requiredFields = array( 'consumer_key' => 'Consumer Key', 'consumer_secret' => 'Consumer Secret' ); parent::__construct(array( 'consumer_key' => '', 'consumer_secret' => '', 'login_label' => 'Continue with Twitter', 'link_label' => 'Link account with Twitter', 'unlink_label' => 'Unlink account from Twitter', 'profile_image_size' => 'normal' )); } protected function forTranslation() { __('Continue with Twitter', 'nextend-facebook-connect'); __('Link account with Twitter', 'nextend-facebook-connect'); __('Unlink account from Twitter', 'nextend-facebook-connect'); } public function validateSettings($newData, $postedData) { $newData = parent::validateSettings($newData, $postedData); foreach ($postedData AS $key => $value) { switch ($key) { case 'tested': if ($postedData[$key] == '1' && (!isset($newData['tested']) || $newData['tested'] != '0')) { $newData['tested'] = 1; } else { $newData['tested'] = 0; } break; case 'consumer_key': case 'consumer_secret': $newData[$key] = trim(sanitize_text_field($value)); if ($this->settings->get($key) !== $newData[$key]) { $newData['tested'] = 0; } if (empty($newData[$key])) { Notices::addError(sprintf(__('The %1$s entered did not appear to be a valid. Please enter a valid %2$s.', 'nextend-facebook-connect'), $this->requiredFields[$key], $this->requiredFields[$key])); } break; case 'profile_image_size': $newData[$key] = trim(sanitize_text_field($value)); break; } } return $newData; } public function getRedirectUriForApp() { $parts = explode('?', $this->getRedirectUri()); return $parts[0]; } /** * @return NextendSocialProviderTwitterClient */ public function getClient() { if ($this->client === null) { require_once dirname(__FILE__) . '/twitter-client.php'; $this->client = new NextendSocialProviderTwitterClient($this->id, $this->settings->get('consumer_key'), $this->settings->get('consumer_secret')); $this->client->setRedirectUri($this->getRedirectUri()); } return $this->client; } /** * @return array|mixed|object * @throws Exception */ protected function getCurrentUserInfo() { $response = $this->getClient() ->get('account/verify_credentials', array( 'include_email' => 'true', 'include_entities' => 'false', 'skip_status' => 'true' )); if (isset($response['id']) && isset($response['id_str'])) { // On 32bit and Windows server, we must copy id_str to id as the id int representation won't be OK $response['id'] = $response['id_str']; } return $response; } public function getMe() { return $this->authUserData; } /** * @param $key * * @return string */ public function getAuthUserData($key) { switch ($key) { case 'id': return $this->authUserData['id']; case 'email': return !empty($this->authUserData['email']) ? $this->authUserData['email'] : ''; case 'name': return $this->authUserData['name']; case 'username': return $this->authUserData['screen_name']; case 'first_name': $name = explode(' ', $this->getAuthUserData('name'), 2); return isset($name[0]) ? $name[0] : ''; case 'last_name': $name = explode(' ', $this->getAuthUserData('name'), 2); return isset($name[1]) ? $name[1] : ''; case 'picture': $profile_image_size = $this->settings->get('profile_image_size'); $profile_image = $this->authUserData['profile_image_url_https']; $avatar_url = ''; if (!empty($profile_image)) { switch ($profile_image_size) { case 'mini': $avatar_url = str_replace('_normal.', '_' . $profile_image_size . '.', $profile_image); break; case 'bigger': $avatar_url = str_replace('_normal.', '_' . $profile_image_size . '.', $profile_image); break; case 'original': $avatar_url = str_replace('_normal.', '.', $profile_image); break; } } return $avatar_url; } return parent::getAuthUserData($key); } public function syncProfile($user_id, $provider, $access_token) { if ($this->needUpdateAvatar($user_id)) { if ($this->getAuthUserData('picture')) { $this->updateAvatar($user_id, $this->getAuthUserData('picture')); } } $this->storeAccessToken($user_id, $access_token); } public function deleteLoginPersistentData() { parent::deleteLoginPersistentData(); if ($this->client !== null) { $this->client->deleteLoginPersistentData(); } } public function getAvatar($user_id) { if (!$this->isUserConnected($user_id)) { return false; } $picture = $this->getUserData($user_id, 'profile_picture'); if (!$picture || $picture == '') { return false; } return $picture; } } NextendSocialLogin::addProvider(new NextendSocialProviderTwitter);PK|"\]T"twitter/admin/fix-redirect-uri.phpnuW+AgetProvider(); ?>
    1. %s', 'nextend-facebook-connect'), 'https://developer.twitter.com/en/apps'); ?>
    2. Details" button', 'nextend-facebook-connect'); ?>
    3. Edit button can be found on the App details tab. Click on it and select "Edit details"', 'nextend-facebook-connect'); ?>
    4. Callback URLs" field: %s', 'nextend-facebook-connect'), $provider->getRedirectUriForApp()); ?>
    5. Save"', 'nextend-facebook-connect'); ?>
    PK|"\2X twitter/admin/settings.phpnuW+AgetProvider(); $settings = $provider->settings; ?>
    renderSettingsHeader(); ?>

    Getting Started', 'nextend-facebook-connect'), 'API secret key', $this->getUrl()); ?>

    renderOtherSettings(); ?>




    renderProSettings(); ?>
    PK|"\Xp p !twitter/admin/getting-started.phpnuW+AgetProvider(); ?>

    1. %s', 'nextend-facebook-connect'), 'https://developer.twitter.com/en/apps/create'); ?>
    2. %s if you aren\'t already there!', 'nextend-facebook-connect'), 'https://developer.twitter.com/en/apps/create'); ?>
    3. App name, Application description fields. Then enter your site\'s URL to the Website URL field: %s', 'nextend-facebook-connect'), site_url()); ?>
    4. Enable Sign in with Twitter!', 'nextend-facebook-connect'); ?>
    5. Callback URLs" field: %s', 'nextend-facebook-connect'), $provider->getRedirectUriForApp()); ?>
    6. Terms of Service URL", "Privacy policy URL" and "Tell us how this app will be used" fields!', 'nextend-facebook-connect'); ?>
    7. Create button.', 'nextend-facebook-connect'); ?>
    8. Create button again!', 'nextend-facebook-connect'); ?>
    9. Permissions tab and click Edit.', 'nextend-facebook-connect'); ?>
    10. Request email address from users under the Additional permissions section and click Save.', 'nextend-facebook-connect'); ?>
    11. Keys and tokens tab and find the API key and API secret key', 'nextend-facebook-connect'); ?>

    PK|"\tN``linkedin/linkedin.pngnuW+APNG  IHDR<<:rtEXtSoftwareAdobe ImageReadyqe<iTXtXML:com.adobe.xmp Ǖ IDATxK(Daz5,d)#ׂeCv&%Y 6J%ʂĊ,2s4;,o==3aD$G 0 Ƿp;30 J46ے EgGxȗͦgYS}I ʚ12UvjՅub]ua?_umB U]x ֘W _NO++k- &8e ܀sUO@%(YV',[kÄvp)E_eZҩ`,lG`@% @G'kjc*< Q(X+WY3 @_~YY-h%~Ws\aki@v|BH²,isA7AfhNF^ 5] ?Cc u3d6B*H8R4 0 0 0 0 0 0 01?,,2Ƿ 俪OIENDB`PK|"\NVVlinkedin/linkedin.phpnuW+Aid = 'linkedin'; $this->label = 'LinkedIn'; $this->path = dirname(__FILE__); } } NextendSocialLogin::addProvider(new NextendSocialProviderLinkedIn());PK|"\EGbyahoo/yahoo.pngnuW+APNG  IHDR<_=HtEXtSoftwareAdobe ImageReadyqe<#iTXtXML:com.adobe.xmp DYк zIDATx\ }`X]>.~0h ~"ĔȯT$$| 'Ƥİ% &, b0|r;܉w=3==ʢOa_O߾3}v`"g<x88qp3g<x[pp2jx؋!āؚké{gE5ċ(WƲ9)8x"%mˈpz?lm%#G#EY\ۦC_baBO\E\I|6nEeUĦ78I{4Zxĝ>x(^aPep}U2݆eUOONINO^Ih$ ՅG WKϝ:C#{=e<[b3kٯ7KckCMb:+LA\uiP"nBUSA\zD&rįk쟉c(| [r_e4RˆYzfFFOؗxqq"qȮ!^~ÉwC-s}MC VP!gk2ƋEl,wr x /A v#[Al)>:6(z3P<<!>9 8!eXp|GA*/N't)(UczqsAxQKwl]DYN|&@ aF[ ȕAs)bNMkͬU"VB /ݼ7]#toGG9ƴHK=*yH"ޘ`4uPA5r3Ez.!ťZL B'b>o65|V\{ư)ʩR^Xj)ouI3둢Y'>b1:iiv$oI2qUWƓ5Pw؃ves.Lj?j[aSQ ;"X0@=hy*',ҤKmgOq/n/g*e( g6F A՗[ٽ(]DPPʗ-! }|L ) K2)6XspJ5CL:πWE_1( x9" /WͤS51,8w.3{B=S%\0z "+cNCmbJh3bkj b3P\bJn0""wBLѹ}lXw]okQeNjqy-7zjVϜu-#'<}"iyHol1s},.Q'#uV4id = 'yahoo'; $this->label = 'Yahoo'; $this->path = dirname(__FILE__); } } NextendSocialLogin::addProvider(new NextendSocialProviderYahoo());PK|"\ 2NNamazon/amazon.phpnuW+Aid = 'amazon'; $this->label = 'Amazon'; $this->path = dirname(__FILE__); } } NextendSocialLogin::addProvider(new NextendSocialProviderAmazon());PK|"\FR amazon/amazon.pngnuW+APNG  IHDRx<~tEXtSoftwareAdobe ImageReadyqe<(iTXtXML:com.adobe.xmp B~]IDATx[ lUE](|,}) (X+"QEqe "15$BDY1 H (h&T`Dd ,J7'wޛ9 ̛7罙{ qP(`q" l[X-V` + la[X-!p'`OMw-\zՀ]Ip-x- [bVjxX4t_`W``&0p#pp)^N1<\|XppKQ,> & pl.׶pY_B;$`7M;˕C%.`k>gx,p,r3]sRfۇ97qxB$p8K;-=uoOa mLC欍g mP 8ãV~^y[6kn k7GGO 0v"Y;RX(__ApAf@)]OlXt%[6k`3ZR3ugvӗ=Ad3՗DKSC*zK5͏CRM}* ƷbPAv|v=z!_c6lfS;Ql #p2=>6*l2x.l2$ZlȢ/r$k4/a&t+d6%$#qai ,p+QE 0d ŠB`#@UJfsȁF3`#u> S$S~(!$P0ƨ  Tbʺ c ? | d[k9Ul!ئk>cBY+p8R'W $)%6.RC T(+| MUEEB2h p4~]43l:4i*Uy A\^l{+ #/_U~g8W(8o+O2K/ތB@&ndFIkYf&nC Bٛ簯G?2(ʊ"10/=}5M d eyikĶ^g6FV| H ~lF e7 u+fB`.64!4W7EP_/i< {o\a<= ʲ*3KMҶ#r= Lт%_Y#L)^w 9z-RXSb#y: wqJ}¥20Y#%S /5ſ][&R[_7Xщy.pqz{]\D0BIt +Gx[3ܦ`fR/ϴ~#/:cvV#jrҦ cc$k<^뭔OemcmiC* }868pR? 1aoluy.=X#IRud `[ PFun<Ăe4BA@QqE1<> OtEXtSoftwareAdobe ImageReadyqe<(iTXtXML:com.adobe.xmp HrIDATxܛkHQnS^AVZZT =H{m}ǧ>ԃ z`V=4,>XFZYfelFMqg;wv̜{Ι{=a0? 恩 L#@~L'v |u<. ,2hVv$\!42ܱ xeUɠ5cI**r2tP/ G^m4MN `Q 84rFP)NLo)/GhƓ0R`/7LЭ ܒs`Ţ׊@i« FO&hqb@4OO7T0  Uw쪳‡*z5k1+g3ޛBYt`YJVbb7۱2XfF)pe -+cH4K@՗/1э`U_wĐf>u(ѭN+ cD4%)"S?s+>X%29쵓i7.0,Jؚq֌j0)қq@w7nQ,WTX$BSo*WR.n[˃ Chm5Qx03@*\qd[,;ܸ k"fIENDB`PK|"\Vid = 'disqus'; $this->label = 'Disqus'; $this->path = dirname(__FILE__); } } NextendSocialLogin::addProvider(new NextendSocialProviderDisqus());PK|"\JJapple/apple.phpnuW+Aid = 'apple'; $this->label = 'Apple'; $this->path = dirname(__FILE__); } } NextendSocialLogin::addProvider(new NextendSocialProviderApple());PK|"\dB.apple/apple.pngnuW+APNG  IHDR2<$5tEXtSoftwareAdobe ImageReadyqe<#iTXtXML:com.adobe.xmp WyIDATxԚ]HQǯRaM}H/Q[=}<ETdOKAo}X- RD!HX>XAfd]34;qg{9i&B`e` ]r3@4"a}6 \ L}"H\,A.BV{zʰ0VG&!AH%-Y/Jms WAZmWܿ>#(!Y)?DN3|| Rtg }:] |P W}>[|o-(y0`VV2+\?x'7> wWW΀>͙r zuzС! xy[!͚?6bNV-p ?<8)x(XJ 1DHw8#Sn=` ӌDE3qOΞEB) 4N+!񳋁e L|*]DHJHJުd dI_N3u"d'9; Ql[0Ȣ y&.![4;!vNŶ,#1;@U>*-b!x L}fB>#tEs*O}9+xڨ^3L\6L_$C!s%S0+bs  '', 'expires_in' => -1, 'created' => -1 ); private $accessType = 'offline'; private $prompt = 'select_account'; protected $scopes = array( 'email', 'profile' ); protected $endpointAuthorization = 'https://accounts.google.com/o/oauth2/auth'; protected $endpointAccessToken = 'https://accounts.google.com/o/oauth2/token'; protected $endpointRestAPI = 'https://www.googleapis.com/oauth2/v1/'; protected $defaultRestParams = array( 'alt' => 'json' ); /** * @param string $access_token_data */ public function setAccessTokenData($access_token_data) { $this->access_token_data = json_decode($access_token_data, true); } public function createAuthUrl() { $args = array( 'access_type' => urlencode($this->accessType) ); if ($this->prompt != '') { $args['prompt'] = urlencode($this->prompt); } return add_query_arg($args, parent::createAuthUrl()); } /** * @param string $prompt */ public function setPrompt($prompt) { $this->prompt = $prompt; } /** * @param $response * * @throws Exception */ protected function errorFromResponse($response) { if (isset($response['error']['message'])) { throw new Exception($response['error']['message']); } } }PK|"\]y.!google/admin/fix-redirect-uri.phpnuW+AgetProvider(); ?>
    1. %s', 'nextend-facebook-connect'), 'https://console.developers.google.com/apis/'); ?>
    2. Credentials" in the left hand menu', 'nextend-facebook-connect'); ?>
    3. OAuth 2.0 Client IDs" section find your Client ID: %s', 'nextend-facebook-connect'), $provider->settings->get('client_id')); ?>
    4. Authorised redirect URIs" field: %s', 'nextend-facebook-connect'), $provider->getLoginUrl()); ?>
    5. Save"', 'nextend-facebook-connect'); ?>
    PK|"\" " google/admin/settings.phpnuW+AgetProvider(); $settings = $provider->settings; ?>
    renderSettingsHeader(); ?>

    Getting Started', 'nextend-facebook-connect'), 'Client ID', $this->getUrl()); ?>

    renderOtherSettings(); $this->renderProSettings(); ?>
    PK|"\;Ch88google/admin/buttons.phpnuW+A

    PK|"\U google/admin/getting-started.phpnuW+AgetProvider(); ?>

    1. https://console.developers.google.com/apis/'); ?>
    2. Create" button on the right side! ( If you already have a project, click on the name of your project in the dashboard instead, which will bring up a modal and click "New Project". )', 'nextend-facebook-connect'); ?>
    3. Create" button again', 'nextend-facebook-connect'); ?>
    4. OAuth consent screen” button on the left hand side.', 'nextend-facebook-connect'); ?>
    5. User Type according to your needs. If you want to enable the social login with Google for any users with a Google account, then pick the External option!', 'nextend-facebook-connect'); ?>
      • Note: We don\'t use sensitive or restricted scopes either. But if you will use this App for other purposes too, then you may need to go through an %1$s!', 'nextend-facebook-connect'),'independent security review'); ?>
    6. Application name" field, which will appear as the name of the app asking for consent.', 'nextend-facebook-connect'); ?>
    7. Authorized domains" field with your domain name probably: %s without subdomains!', 'nextend-facebook-connect'), str_replace('www.', '', $_SERVER['HTTP_HOST'])); ?>
    8. %1$s" menu point, then click the "%2$s" button in the top bar.', 'nextend-facebook-connect'), 'Credentials', '+ Create Credentials') ?>
    9. OAuth client ID" option.', 'nextend-facebook-connect'); ?>
    10. Web application" under Application type.', 'nextend-facebook-connect'); ?>
    11. Name" that for your OAuth client ID.', 'nextend-facebook-connect'); ?>
    12. Authorised redirect URIs" field: %s', 'nextend-facebook-connect'), $provider->getLoginUrl()); ?>
    13. Create" button', 'nextend-facebook-connect'); ?>
    14. Client ID" and "Client Secret" from there.', 'nextend-facebook-connect'); ?>

    PK|"\++google/google.phpnuW+A'; protected $svgUniform = ''; const requiredApi1 = 'Google People API'; protected $sync_fields = array( 'gender' => array( 'label' => 'Gender', 'node' => 'me', ), 'link' => array( 'label' => 'Profile link', 'node' => 'me', ), 'locale' => array( 'label' => 'Locale', 'node' => 'me', ), 'biographies' => array( 'label' => 'Biographies', 'node' => 'people', 'description' => self::requiredApi1, ), 'birthdays' => array( 'label' => 'Birthdays', 'node' => 'people', 'scope' => 'https://www.googleapis.com/auth/user.birthday.read', 'description' => self::requiredApi1, ), 'occupations' => array( 'label' => 'Occupations', 'node' => 'people', 'description' => self::requiredApi1, ), 'organizations' => array( 'label' => 'Organizations', 'node' => 'people', 'description' => self::requiredApi1, ), 'residences' => array( 'label' => 'Residences', 'node' => 'people', 'description' => self::requiredApi1, ), 'taglines' => array( 'label' => 'Taglines', 'node' => 'people', 'description' => self::requiredApi1, ), 'ageRanges' => array( 'label' => 'Age ranges', 'node' => 'people', 'description' => self::requiredApi1, ), 'addresses' => array( 'label' => 'Addresses', 'node' => 'people', 'scope' => 'https://www.googleapis.com/auth/user.addresses.read', 'description' => self::requiredApi1, ), 'phoneNumbers' => array( 'label' => 'Phone Numbers', 'node' => 'people', 'scope' => 'https://www.googleapis.com/auth/user.phonenumbers.read', 'description' => self::requiredApi1, ) ); public function __construct() { $this->id = 'google'; $this->label = 'Google'; $this->path = dirname(__FILE__); $this->requiredFields = array( 'client_id' => 'Client ID', 'client_secret' => 'Client Secret' ); parent::__construct(array( 'client_id' => '', 'client_secret' => '', 'select_account' => 1, 'skin' => 'light', 'login_label' => 'Continue with Google', 'link_label' => 'Link account with Google', 'unlink_label' => 'Unlink account from Google' )); } protected function forTranslation() { __('Continue with Google', 'nextend-facebook-connect'); __('Link account with Google', 'nextend-facebook-connect'); __('Unlink account from Google', 'nextend-facebook-connect'); } public function getRawDefaultButton() { $skin = $this->settings->get('skin'); switch ($skin) { case 'dark': $color = $this->color; $svg = $this->svg; break; case 'light': $color = '#fff'; $svg = $this->svg; break; default: $color = $this->colorUniform; $svg = $this->svgUniform; } return '
    ' . $svg . '
    {{label}}
    '; } public function getRawIconButton() { return '
    ' . $this->svgUniform . '
    '; } public function validateSettings($newData, $postedData) { $newData = parent::validateSettings($newData, $postedData); foreach ($postedData AS $key => $value) { switch ($key) { case 'tested': if ($postedData[$key] == '1' && (!isset($newData['tested']) || $newData['tested'] != '0')) { $newData['tested'] = 1; } else { $newData['tested'] = 0; } break; case 'skin': $newData[$key] = trim(sanitize_text_field($value)); break; case 'client_id': case 'client_secret': $newData[$key] = trim(sanitize_text_field($value)); if ($this->settings->get($key) !== $newData[$key]) { $newData['tested'] = 0; } if (empty($newData[$key])) { Notices::addError(sprintf(__('The %1$s entered did not appear to be a valid. Please enter a valid %2$s.', 'nextend-facebook-connect'), $this->requiredFields[$key], $this->requiredFields[$key])); } break; case 'select_account': $newData[$key] = $value ? 1 : 0; break; } } return $newData; } public function getClient() { if ($this->client === null) { require_once dirname(__FILE__) . '/google-client.php'; $this->client = new NextendSocialProviderGoogleClient($this->id); $this->client->setClientId($this->settings->get('client_id')); $this->client->setClientSecret($this->settings->get('client_secret')); $this->client->setRedirectUri($this->getRedirectUri()); if (!$this->settings->get('select_account')) { $this->client->setPrompt(''); } } return $this->client; } /** * @return array * @throws Exception */ protected function getCurrentUserInfo() { $fields = array( 'id', 'name', 'email', 'family_name', 'given_name', 'picture', ); $extra_me_fields = apply_filters('nsl_google_sync_node_fields', array(), 'me'); return $this->getClient() ->get('userinfo?fields=' . implode(',', array_merge($fields, $extra_me_fields))); } public function getMe() { return $this->authUserData; } /** * @return array * @throws Exception */ public function getMyPeople() { $extra_people_fields = apply_filters('nsl_google_sync_node_fields', array(), 'people'); if (!empty($extra_people_fields)) { return $this->getClient() ->get('people/me?personFields=' . implode(',', $extra_people_fields), array(), 'https://people.googleapis.com/v1/'); } return $extra_people_fields; } /** * @param $key * * @return string */ public function getAuthUserData($key) { switch ($key) { case 'id': return $this->authUserData['id']; case 'email': return $this->authUserData['email']; case 'name': return !empty($this->authUserData['name']) ? $this->authUserData['name'] : ''; case 'first_name': return !empty($this->authUserData['given_name']) ? $this->authUserData['given_name'] : ''; case 'last_name': return !empty($this->authUserData['family_name']) ? $this->authUserData['family_name'] : ''; case 'picture': return $this->authUserData['picture']; } return parent::getAuthUserData($key); } public function syncProfile($user_id, $provider, $access_token) { if ($this->needUpdateAvatar($user_id)) { $this->updateAvatar($user_id, $this->getAuthUserData('picture')); } $this->storeAccessToken($user_id, $access_token); } public function deleteLoginPersistentData() { parent::deleteLoginPersistentData(); if ($this->client !== null) { $this->client->deleteLoginPersistentData(); } } public function getAvatar($user_id) { if (!$this->isUserConnected($user_id)) { return false; } $picture = $this->getUserData($user_id, 'profile_picture'); if (!$picture || $picture == '') { return false; } return $picture; } public function getSyncDataFieldDescription($fieldName) { if (isset($this->sync_fields[$fieldName]['description'])) { return sprintf(__('Required API: %1$s', 'nextend-facebook-connect'), $this->sync_fields[$fieldName]['description']); } return parent::getSyncDataFieldDescription($fieldName); } } NextendSocialLogin::addProvider(new NextendSocialProviderGoogle);PK|"\| google/google.pngnuW+APNG  IHDR<<:rtEXtSoftwareAdobe ImageReadyqe<#iTXtXML:com.adobe.xmp #IDATx[ pTݻd!3$PPQOnRq=\Up3p`%@PxR>!H d&Of %EFi؆w v+A6`O`w*Y'p/7pqCF9iQ7/}D: e hnΝܤek&\ie%]t,.6QnX/ׁ,ncOZ5s\qug1ز- c?.WUV fּ,Ξ&H;n` W_h\(WU 4ɘvHvzu@P +Lij`lNW7gf01̹@9##I++[Ʈ`s'EiC&^A'-Ar0N<?1oZ O6Lt[$SG@VĨ%ˀֶPIqGcX&Q(XirxZ+٣C9 mÀPi$)$d?֭!| -LE!$ZJF#lq7HyX)EXZgcyVͥ"EfzbR`Xctl\l\cQ$z@&0H3)Ejo #T4,l @F<`CJR{MDGagŭ rRh{dםc?`B`t~ Qфci/]jų @}+=ˏr>)]EǬEKI(K{ ?)sๆ9ծn1?WBuRSwtQ!XXUt^  D:o)vBz-q4CLܼiSugȁXoVKף[x.~_xll-ĉ$LΝM!X >Ly* G3 #0Z xPGK |$ p~%fk̚`R-ٛE}X7 uaUiW2y zb W~,z %})@qVM.}:|K'TUǏdVkwXu|mu(kNXA|S9΃٣ƺHcZIYvsi\\k&pS+zV4IuwSaΨeUPt(֕<$2嘶baj(91w4NȚ״^iJT15qZQi[qd #χccccc p [+0W+CCnPW-缝ltIENDB`PK|"\^^wordpress/wordpress.phpnuW+Aid = 'wordpress'; $this->label = 'WordPress.com'; $this->path = dirname(__FILE__); } } NextendSocialLogin::addProvider(new NextendSocialProviderWordpress());PK|"\$ wordpress/wordpress.pngnuW+APNG  IHDR6<-ItEXtSoftwareAdobe ImageReadyqe<(iTXtXML:com.adobe.xmp {IDATx[ilUE~ﱴF҂hRcbbB5E%`1F+F@FRJqE"6bIJ"PhyCq̼n}H<ɗvf333/#"\:a4aa$a/'!ϴ'vªH41%'O#fzJB !*b OWc30PXƘM8K w:ف0tyreEՙh 5FdЕ0pPSۅX1&'HHE)Gaп @,_:%Em\(}"2 [=lJ(:GB E#2M*&eeTQ I+DE)$qLq%-fRH@.-@7K1q7VǛO#Lr%|p .?iyvr!~0~?a N:y:\Rep= 'zM-H@ap)qx>0Q+NBOz00XVHABE ٧KhKBg\k˷ ,$0,:+E?Ahogh`&k -8UStBuギ;h--4ȱz[L{΄}1f9q }9X |WtGYb0"&֭-"Ru' s5RrT\oql:zq]cb7V<1B G%bo\B<& k\rm'L IـS2340qr^'q`_~ޛB|B1byr~ +b"B{[:( 4bd^9ݛ Bµ!v}>]c(h8֢H=dz4kIvZk "[t #KkI?L- bF-.RCc S&˰u-*>ǖq7^Lt u ĐX̠Ғ(v0J(Mu[<;+ %$?u!2Zѓ/e!=3*'+ mu[T,E9OA=syU sa0x?Ҭ3CFOI6sX.4`Lhј8+ ^Rre"24 9X˗u^ѵȠA@GS}t={` ])6ʵ4X<4[M,\]\1AGy^{Pz۶*VXL[5U2`yF=^[Lh֡1cn9'_}ౘ_G5 وrCХ I`̈́[ćd\hdnR^H`9=0 =d3skEB{ ~mv$?Û^ȨIENDB`PK|"\p paypal/paypal.pngnuW+APNG  IHDR<vtEXtSoftwareAdobe ImageReadyqe<(iTXtXML:com.adobe.xmp IDATx]ylTEmP95Ph F x$F$*4T@%PC(AA$^XErv߳yΗys|f H$,,"N%%%%%%%%%%%E"NHRe{7 C\s ; 8q~8.o٩镀LNw&u z;8\']鮿iɥINwAP|\N@'DZ߯qlH Tp9W.klJz.suRʥO\H0KeWL54p.)Qi\q͸Qo1@I\X0 \$?M%e5U9.T4QJ !1z# 4iS.CП<*9Q(\UBfCł1Խu891ԝP3,pC>#ȖʥyԿvmLi۹:Jrc.;@djCW.;'jwiQKD Sē8Mhk밶ix.Ӵ 6q&q ΰ(Edp9-Mr 2_B+HN3\lFqBY5=&L>':|Nl9EԴ[|#ǹ o3w2 )J|3<#Я0-\ Qh uDH"ث.]=!-2V Xsl- pqo2/2$3w>߈#(T#66J3Xj!q=+ ~zbSEkXRs^l\>UJ6b e! )X-!ĥH{Ů]G ije\ʇ}f FۭϵHz"rIA(bYh/.i&<)f"T<*68,i|͠&s5^0خYuFy4 I!U {)G MeK(>ck1.׸9hfЀ'Kˋs*3hJ ysY^g?!{AbGߋe:>I֚Ѳ9A0KNƵȪerJ(]M4LC)kd46t(4EPډIXM8Uy&68mz47$ɖ>,8u?oiOF["\p=vd'M`{\>@l efʥaS6ǡ]B\*JA51Ίf#6HB5?1$"c1QY486OhW Z~Kڙdӥ%R~#J>${a_O8Va$b7m#k sWMR&LD"S1 j(B?˰[0F\|W҇Ѹ/bd⸅g YShB 1&r4}2і(39}0a)GD@t6]'ih@eObrӹ[Q 䅗i^|LYy3ŮGq,6mP;lQ&s%_䆢fsTvԁoBoZhb8тiA wgƫc#) xɟeȢ|ьdGHP{<~"2I "{LDvPo*g80Ey,8ƅXcAT%LN@E2v.:Q0ʮQU&lR/.]$'7O3!ɾCvYpҙF{TH&̶i1gj b#g=aL .ss4D,j4ٚ\裭)&5¯;bkʇql<&u#^D(~H6U\^rVߤAk8aDYi0|܇ȴ> BHw2tF4<yD(?!R[˙k,bLXAs\ qt6r>Q_*=R)6]FG"^:lS/dXp.O+َ PW/X3`ӱīazaŦ =jΤd[vj!`4}DFWRKgI$^Q˙E+iw!.,%4Qe8i2`qD8Q `DN`'NcV-^퐅J?!~qIENDB`PK|"\f!NNpaypal/paypal.phpnuW+Aid = 'paypal'; $this->label = 'PayPal'; $this->path = dirname(__FILE__); } } NextendSocialLogin::addProvider(new NextendSocialProviderPaypal());PK|"\R8facebook/facebook.pngnuW+APNG  IHDR<<:rtEXtSoftwareAdobe ImageReadyqe<iTXtXML:com.adobe.xmp rpɕsIDATx1K@{ZE[Xp◰šՏK7;;] ƿ(r/^~KBL$bXPQ麇 #6q;hhWr)| @”>`'E7>Ⱥ>OG8tSY2xΥ,u֐]g3V0Y,r_@,5/Z-A0kY»ܷ" wV ZaI;Y.\`BfYV5蟜Oe֯?'2ÃiyZ [a-g(#dCVNV}l<_kpZ킾|*zHa S0)La S0)La Sv-Qª[Z6IENDB`PK|"\8x  facebook/facebook.phpnuW+A'; protected $popupWidth = 475; protected $popupHeight = 175; protected $sync_fields = array( 'age_range' => array( 'label' => 'Age range', 'node' => 'me', 'scope' => 'user_age_range' ), 'birthday' => array( 'label' => 'Birthday', 'node' => 'me', 'scope' => 'user_birthday' ), 'link' => array( 'label' => 'Profile link', 'node' => 'me', 'scope' => 'user_link' ), 'hometown' => array( 'label' => 'Hometown', 'node' => 'me', 'scope' => 'user_hometown' ), 'location' => array( 'label' => 'Location', 'node' => 'me', 'scope' => 'user_location' ), 'gender' => array( 'label' => 'Gender', 'node' => 'me', 'scope' => 'user_gender' ) ); public function __construct() { $this->id = 'facebook'; $this->label = 'Facebook'; $this->path = dirname(__FILE__); $this->requiredFields = array( 'appid' => 'App ID', 'secret' => 'App Secret' ); add_filter('nsl_finalize_settings_' . $this->optionKey, array( $this, 'finalizeSettings' )); parent::__construct(array( 'appid' => '', 'secret' => '', 'login_label' => 'Continue with Facebook', 'link_label' => 'Link account with Facebook', 'unlink_label' => 'Unlink account from Facebook' )); } protected function forTranslation() { __('Continue with Facebook', 'nextend-facebook-connect'); __('Link account with Facebook', 'nextend-facebook-connect'); __('Unlink account from Facebook', 'nextend-facebook-connect'); } public function finalizeSettings($settings) { if (defined('NEXTEND_FB_APP_ID')) { $settings['appid'] = NEXTEND_FB_APP_ID; } if (defined('NEXTEND_FB_APP_SECRET')) { $settings['secret'] = NEXTEND_FB_APP_SECRET; } return $settings; } /** * @return NextendSocialProviderFacebookClient */ public function getClient() { if ($this->client === null) { require_once dirname(__FILE__) . '/facebook-client.php'; $this->client = new NextendSocialProviderFacebookClient($this->id, $this->isTest()); $this->client->setClientId($this->settings->get('appid')); $this->client->setClientSecret($this->settings->get('secret')); $this->client->setRedirectUri($this->getRedirectUri()); } return $this->client; } public function validateSettings($newData, $postedData) { $newData = parent::validateSettings($newData, $postedData); foreach ($postedData AS $key => $value) { switch ($key) { case 'tested': if ($postedData[$key] == '1' && (!isset($newData['tested']) || $newData['tested'] != '0')) { $newData['tested'] = 1; } else { $newData['tested'] = 0; } break; case 'appid': case 'secret': $newData[$key] = trim(sanitize_text_field($value)); if ($this->settings->get($key) !== $newData[$key]) { $newData['tested'] = 0; } if (empty($newData[$key])) { Notices::addError(sprintf(__('The %1$s entered did not appear to be a valid. Please enter a valid %2$s.', 'nextend-facebook-connect'), $this->requiredFields[$key], $this->requiredFields[$key])); } break; } } return $newData; } /** * @param $accessTokenData * * @return string * @throws Exception */ protected function requestLongLivedToken($accessTokenData) { $client = $this->getClient(); if (!$client->isAccessTokenLongLived()) { return $client->requestLongLivedAccessToken(); } return $accessTokenData; } /** * @return array|mixed * @throws Exception */ protected function getCurrentUserInfo() { $fields = array( 'id', 'name', 'email', 'first_name', 'last_name', 'picture.type(large)' ); $extra_fields = apply_filters('nsl_facebook_sync_node_fields', array(), 'me'); return $this->getClient() ->get('/me?fields=' . implode(',', array_merge($fields, $extra_fields))); } public function getMe() { return $this->authUserData; } public function getAuthUserData($key) { switch ($key) { case 'id': return $this->authUserData['id']; case 'email': return !empty($this->authUserData['email']) ? $this->authUserData['email'] : ''; case 'name': return $this->authUserData['name']; case 'first_name': return $this->authUserData['first_name']; case 'last_name': return $this->authUserData['last_name']; case 'picture': $profilePicture = $this->authUserData['picture']; if (!empty($profilePicture) && !empty($profilePicture['data'])) { if (isset($profilePicture['data']['is_silhouette']) && !$profilePicture['data']['is_silhouette']) { return $profilePicture['data']['url']; } } return ''; } return parent::getAuthUserData($key); } public function syncProfile($user_id, $provider, $access_token) { if ($this->needUpdateAvatar($user_id)) { if ($this->getAuthUserData('picture')) { $this->updateAvatar($user_id, $this->getAuthUserData('picture')); } } $this->storeAccessToken($user_id, $access_token); } protected function saveUserData($user_id, $key, $data) { switch ($key) { case 'access_token': update_user_meta($user_id, 'fb_user_access_token', $data); break; default: parent::saveUserData($user_id, $key, $data); break; } } protected function getUserData($user_id, $key) { switch ($key) { case 'access_token': return get_user_meta($user_id, 'fb_user_access_token', true); break; } return parent::getUserData($user_id, $key); } public function deleteLoginPersistentData() { parent::deleteLoginPersistentData(); if ($this->client !== null) { $this->client->deleteLoginPersistentData(); } } public function getSyncDataFieldDescription($fieldName) { if (isset($this->sync_fields[$fieldName]['scope'])) { return sprintf(__('Required scope: %1$s', 'nextend-facebook-connect'), $this->sync_fields[$fieldName]['scope']); } return parent::getSyncDataFieldDescription($fieldName); } } NextendSocialLogin::addProvider(new NextendSocialProviderFacebook);PK|"\@,` ` facebook/admin/settings.phpnuW+AgetProvider(); $settings = $provider->settings; ?>
    getLoginUrl(), 0, 8) !== 'https://'): ?>

    renderSettingsHeader(); ?>

    Getting Started', 'nextend-facebook-connect'), 'App ID', $this->getUrl()); ?>

    renderOtherSettings(); $this->renderProSettings(); ?>
    PK|"\(#facebook/admin/fix-redirect-uri.phpnuW+AgetProvider(); ?>
    1. %s', 'nextend-facebook-connect'), 'https://developers.facebook.com/apps/'); ?>
    2. %s', 'nextend-facebook-connect'), $provider->settings->get('appid')); ?>
    3. Facebook Login > Settings"', 'nextend-facebook-connect'); ?>
    4. Valid OAuth redirect URIs" field: %s', 'nextend-facebook-connect'), $provider->getLoginUrl()); ?>
    5. Save Changes"', 'nextend-facebook-connect'); ?>
    PK|"\="facebook/admin/getting-started.phpnuW+AgetProvider(); ?>
    getLoginUrl(), 0, 8) !== 'https://'): ?>

    1. https://developers.facebook.com/apps/'); ?>
    2. Add a New App" button', 'nextend-facebook-connect'); ?>
    3. Become a Facebook Developer", then you need to click on the green "Register Now" button, fill the form then finally verify your account.', 'nextend-facebook-connect'); ?>
    4. Display Name" and "Contact Email". The specified "Display Name" will appear on your %s!', 'nextend-facebook-connect'), 'Consent Screen'); ?>
    5. Create App ID" button and complete the Security Check.', 'nextend-facebook-connect'); ?>
    6. %1$s” menu point, then click “%2$s”.', 'nextend-facebook-connect'), 'Settings', 'Basic') ?>
    7. App Domains" field, probably: %s', 'nextend-facebook-connect'), str_replace('www.', '', $_SERVER['HTTP_HOST'])); ?>
    8. Privacy Policy URL" field. Provide a publicly available and easily accessible privacy policy that explains what data you are collecting and how you will use that data.', 'nextend-facebook-connect'); ?>
    9. Category”, an “App Icon” and pick the “Business Use” option that describes your the App best, then press "Save Changes".', 'nextend-facebook-connect'); ?>
    10. %1$s” menu point, then click “%2$s”.', 'nextend-facebook-connect'), 'Facebook Login', 'Settings') ?>
    11. Valid OAuth redirect URIs" field: %s', 'nextend-facebook-connect'), $provider->getLoginUrl()); ?>
    12. Save Changes”', 'nextend-facebook-connect'); ?>
    13. In development" label, then click the "Switch Mode" button.', 'nextend-facebook-connect'); ?>
    14. %1$s" menu point, then click "%2$s" again. Here you can see your "APP ID" and you can see your "App secret" if you click on the "Show" button. These will be needed in plugin’s settings.', 'nextend-facebook-connect'), 'Settings', 'Basic') ?>

    PK|"\1facebook/facebook-client.phpnuW+A '', 'expires_in' => -1, 'created' => -1 ); protected $scopes = array( 'public_profile', 'email' ); public function __construct($providerID, $isTest) { $this->isTest = $isTest; parent::__construct($providerID); $this->endpointAccessToken = 'https://graph.facebook.com/' . self::DEFAULT_GRAPH_VERSION . '/oauth/access_token'; $this->endpointRestAPI = 'https://graph.facebook.com/' . self::DEFAULT_GRAPH_VERSION . '/'; } public function getEndpointAuthorization() { if (preg_match('/Android|iPhone|iP[ao]d|Mobile/', $_SERVER['HTTP_USER_AGENT'])) { $endpointAuthorization = 'https://m.facebook.com/'; } else { $endpointAuthorization = 'https://www.facebook.com/'; } $endpointAuthorization .= self::DEFAULT_GRAPH_VERSION . '/dialog/oauth'; if ((isset($_GET['display']) && $_GET['display'] == 'popup') || $this->isTest) { $endpointAuthorization .= '?display=popup'; } return $endpointAuthorization; } protected function formatScopes($scopes) { return implode(',', $scopes); } public function isAccessTokenLongLived() { return $this->access_token_data['created'] + $this->access_token_data['expires_in'] > time() + (60 * 60 * 2); } /** * @return false|string * @throws Exception */ public function requestLongLivedAccessToken() { $http_args = array( 'timeout' => 15, 'user-agent' => 'WordPress', 'body' => array( 'grant_type' => 'fb_exchange_token', 'client_id' => $this->client_id, 'client_secret' => $this->client_secret, 'fb_exchange_token' => $this->access_token_data['access_token'] ) ); $request = wp_remote_get($this->endpointAccessToken, $this->extendAllHttpArgs($http_args)); if (is_wp_error($request)) { throw new Exception($request->get_error_message()); } else if (wp_remote_retrieve_response_code($request) !== 200) { $this->errorFromResponse(json_decode(wp_remote_retrieve_body($request), true)); } $accessTokenData = json_decode(wp_remote_retrieve_body($request), true); if (!is_array($accessTokenData)) { throw new Exception(sprintf(__('Unexpected response: %s', 'nextend-facebook-connect'), wp_remote_retrieve_body($request))); } $accessTokenData['created'] = time(); $this->access_token_data = $accessTokenData; return wp_json_encode($accessTokenData); } protected function errorFromResponse($response) { if (isset($response['error'])) { throw new Exception($response['error']['message']); } } protected function extendAllHttpArgs($http_args) { $http_args['body']['appsecret_proof'] = hash_hmac('sha256', $this->getAccessToken(), $this->client_secret); return $http_args; } protected function getAccessToken() { if (!empty($this->access_token_data['access_token'])) { return $this->access_token_data['access_token']; } return $this->client_id; } }PKu"\MPfclass-base.phpnuW+APKu"\6,xuxu݄class-constant-contact.phpnuW+APK|"\hvB|| vk/vk.pngnuW+APK|"\mNEE Tvk/vk.phpnuW+APK|"\ $$twitter/twitter-client.phpnuW+APK|"\6>(twitter/twitter.pngnuW+APK|"\ CR!R!1twitter/twitter.phpnuW+APK|"\]T"Rtwitter/admin/fix-redirect-uri.phpnuW+APK|"\2X Vtwitter/admin/settings.phpnuW+APK|"\Xp p !ftwitter/admin/getting-started.phpnuW+APK|"\tN``tlinkedin/linkedin.pngnuW+APK|"\NVV9{linkedin/linkedin.phpnuW+APK|"\EGb|yahoo/yahoo.pngnuW+APK|"\= JJyahoo/yahoo.phpnuW+APK|"\ 2NNamazon/amazon.phpnuW+APK|"\FR 2amazon/amazon.pngnuW+APK|"\f~bdisqus/disqus.pngnuW+APK|"\V