ID; // multisite $is_multisite = is_multisite(); $blog_id = get_current_blog_id(); if ( $is_multisite && $blog_id && ! is_user_member_of_blog( $shop_user_id, $blog_id ) ) { $role = Helper::get_shop_user_role(); $result = add_user_to_blog( $blog_id, $shop_user_id, $role ); if ( is_wp_error( $result ) ) { Logger::log( $result->get_error_message(), '[multisite]add_user_to_blog fail: ', 'process_shop_access_keys' ); } } } $app_name = Helper::getConfigSetting( 'shop/keys_creation_params/app_name', 'AdScale App' ); $app_user_id = Helper::get_shop_user_id(); $scope = Helper::getConfigSetting( 'shop/keys_creation_params/scope', 'read' ); $exist_shop_keys_data = self::get_shop_keys_data_by_user_id( $shop_user_id ); if ( ! $exist_shop_keys_data ) { $created_shop_keys_data = self::create_shop_keys( $app_name, $app_user_id, $scope, $shop_user_id ); Logger::log( ! empty( $created_shop_keys_data['key_id'] ), 'create_shop_keys: ', 'process_shop_access_keys' ); self::save_keys_data( $created_shop_keys_data ); return $created_shop_keys_data; } Logger::log( ! empty( $exist_shop_keys_data['key_id'] ), 'create_shop_keys : exist_shop_keys_data : ', 'process_shop_access_keys' ); return $exist_shop_keys_data; } protected static function create_shop_keys( $app_name, $app_user_id, $scope, $shop_user_id ) { global $wpdb; if ( ! $shop_user_id ) { return false; } $description = sprintf( /* translators: 1: app name 2: scope 3: date 4: time */ __( '%1$s - API %2$s (created on %3$s at %4$s).', 'adscale-ai' ), wc_clean( $app_name ), $scope, date_i18n( wc_date_format() ), date_i18n( wc_time_format() ) ); // Created API keys. $permissions = in_array( $scope, [ 'read', 'write', 'read_write' ], true ) ? sanitize_text_field( $scope ) : 'read'; $consumer_key = 'ck_' . wc_rand_hash(); $consumer_secret = 'cs_' . wc_rand_hash(); // PHPCS: WordPress.DB.DirectDatabaseQuery.DirectQuery -- No public CRUD for WooCommerce API keys; using $wpdb->insert() with value formats. See: https://developer.wordpress.org/plugins/security/securing-input/#sanitizing-with-prepared-sql-queries $wpdb->insert( $wpdb->prefix . 'woocommerce_api_keys', [ 'user_id' => $shop_user_id, 'description' => $description, 'permissions' => $permissions, 'consumer_key' => wc_api_hash( $consumer_key ), 'consumer_secret' => $consumer_secret, 'truncated_key' => substr( $consumer_key, - 7 ), ], [ '%d', '%s', '%s', '%s', '%s', '%s', ] ); // Invalidate caches for this user/key lookups if ( function_exists( 'wp_cache_delete' ) ) { wp_cache_delete( 'user_id_' . absint( $shop_user_id ), 'adscale_shop_keys' ); } return [ 'key_id' => $wpdb->insert_id, 'user_id' => $app_user_id, 'wp_user_id' => $shop_user_id, 'consumer_key' => $consumer_key, 'consumer_secret' => $consumer_secret, 'key_permissions' => $permissions, ]; } public static function get_shop_keys_data_by_user_id( $shop_user_id ) { global $wpdb; $data = $wpdb->get_row( $wpdb->prepare( " SELECT key_id, user_id, permissions, consumer_key, consumer_secret, truncated_key FROM {$wpdb->prefix}woocommerce_api_keys WHERE user_id = %d ", $shop_user_id ), ARRAY_A ); return $data; } public static function get_shop_keys_data_by_key_id( $key_id ) { global $wpdb; $data = $wpdb->get_row( $wpdb->prepare( " SELECT key_id, user_id, description, permissions, consumer_key, consumer_secret, truncated_key FROM {$wpdb->prefix}woocommerce_api_keys WHERE key_id = %d ", $key_id ), ARRAY_A ); return $data; } public static function delete_shop_keys_data_by_user_id( $shop_user_id ) { global $wpdb; return $wpdb->delete( "{$wpdb->prefix}woocommerce_api_keys", [ 'user_id' => $shop_user_id ], [ '%d' ] ); } protected static function create_shop_user() { $user_id = get_current_user_id(); update_option('adscale__access_wp_user_id', $user_id ); update_user_meta( $user_id, 'is_adscale_api_user', 'yes' ); return $user_id; } protected static function save_keys_data($created_shop_keys_data) { update_option( 'adscale__access_key_id', $created_shop_keys_data['key_id'] ); update_option( 'adscale__access_consumer_key', $created_shop_keys_data['consumer_key'] ); update_option( 'adscale__access_consumer_secret', $created_shop_keys_data['consumer_secret'] ); update_option( 'adscale__access_wp_user_id', $created_shop_keys_data['wp_user_id'] ); } public static function get_keys_data() { return [ 'key_id' => get_option( 'adscale__access_key_id', '' ), 'consumer_key' => get_option( 'adscale__access_consumer_key', '' ), 'consumer_secret' => get_option( 'adscale__access_consumer_secret', '' ), 'wp_user_id' => get_option( 'adscale__access_wp_user_id', '' ), ]; } }