403)
);
}
if (Akkedli_Connector_State::exists()) {
wp_safe_redirect(admin_url('admin.php?page=akkedli-connector&error=v2_state'));
exit;
}
if ('POST' === self::method()) {
self::handle_post();
return;
}
$webhook_url = isset($_GET['webhook_url'])
? esc_url_raw(wp_unslash($_GET['webhook_url'])) : '';
$return_url = isset($_GET['return_url'])
? esc_url_raw(wp_unslash($_GET['return_url'])) : '';
if (empty($webhook_url)) {
wp_safe_redirect(admin_url('admin.php?page=akkedli-connector&error=missing_params'));
exit;
}
self::render_form($webhook_url, $return_url);
exit;
}
public static function render_form($webhook_url, $return_url = '')
{
?>
403)
);
}
$api_key = isset($_POST['api_key'])
? sanitize_text_field(wp_unslash($_POST['api_key'])) : '';
$webhook_url = isset($_POST['webhook_url'])
? esc_url_raw(wp_unslash($_POST['webhook_url'])) : '';
$return_url = isset($_POST['return_url'])
? esc_url_raw(wp_unslash($_POST['return_url'])) : '';
if (empty($api_key) || empty($webhook_url)) {
wp_safe_redirect(admin_url('admin.php?page=akkedli-connector&error=missing_params'));
exit;
}
$values = array('akkedli_api_key' => $api_key, 'akkedli_webhook_url' => $webhook_url,
'akkedli_connected_at' => current_time('mysql'), 'akkedli_store_domain' => home_url());
if (!self::persist($values)) {
unset($_POST['api_key'], $api_key);
wp_safe_redirect(admin_url('admin.php?page=akkedli-connector&error=persistence_failed'));
exit;
}
unset($_POST['api_key']);
$api_key = '';
if (!empty($return_url)) {
$redirect_url = add_query_arg(array(
'status' => 'success',
'domain' => rawurlencode(home_url()),
'store_name' => rawurlencode(get_bloginfo('name')),
), $return_url);
wp_redirect(esc_url_raw($redirect_url)); // phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect -- Existing Dashboard return URL behavior.
exit;
}
wp_safe_redirect(admin_url('admin.php?page=akkedli-connector&connected=1'));
exit;
}
public static function persist(array $values)
{
global $wpdb;
$suppressed = $wpdb->suppress_errors(true);
try {
update_option('akkedli_api_key_validated', 0);
foreach ($values as $name => $value) update_option($name, $value);
foreach ($values as $name => $value) {
$stored = $wpdb->get_var($wpdb->prepare("SELECT option_value FROM {$wpdb->options} WHERE option_name=%s", $name));
if (!is_string($stored) || !hash_equals((string) $value, $stored)) return false;
}
$legacy = Akkedli_Legacy_Connection_State::load();
if (null !== $legacy) {
if (!is_array($legacy) || 'disconnected' !== $legacy['status']) return false;
$raw = Akkedli_Legacy_Connection_State::raw();
if (1 !== $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->options} WHERE option_name=%s AND option_value=%s",
Akkedli_Legacy_Connection_State::OPTION, $raw))) return false;
wp_cache_delete(Akkedli_Legacy_Connection_State::OPTION, 'options');
}
update_option('akkedli_api_key_validated', 1);
return '1' === (string) $wpdb->get_var($wpdb->prepare(
"SELECT option_value FROM {$wpdb->options} WHERE option_name=%s", 'akkedli_api_key_validated'));
} finally {
$wpdb->suppress_errors($suppressed);
}
}
private static function is_request()
{
return isset($_GET['action'], $_GET['page'])
&& 'auto_connect' === sanitize_text_field(wp_unslash($_GET['action']))
&& 'akkedli-connector' === sanitize_text_field(wp_unslash($_GET['page']));
}
private static function method()
{
return isset($_SERVER['REQUEST_METHOD'])
? strtoupper(sanitize_text_field(wp_unslash($_SERVER['REQUEST_METHOD']))) : 'GET';
}
}