. */ str_replace("://", urlencode("://"), $query);
$url_uri = /* Put it all back together again, after the above modifications. */ $_."?".$query;
unset /* A little housekeeping here. Unset these vars. */($_, $query);
}
$parse = @parse_url /* Let PHP work its magic via ``parse_url()``. */($url_uri, $component);
/**/
if($clean_path && isset($parse["path"]) && is_string($parse["path"]) && !empty($parse["path"]))
$parse["path"] = /* Clean up the path now. */ preg_replace("/\/+/", "/", $parse["path"]);
/**/
return ($component !== -1) ? /* Force a string return value? */ (string)$parse : $parse;
}
/**
* Responsible for all remote communications processed by optimizeMember.
*
* Uses ``wp_remote_request()`` through the `WP_Http` class.
*
* @package optimizeMember\Utilities
* @since 3.5
*
* @param str $url Full URL with possible query string parameters.
* @param str|array $post_vars Optional. Either a string of POST vars, or an array.
* @param array $args Optional. An array of additional arguments used by ``wp_remote_request()``.
* @param bool $return_array Optional. If true, instead of a string, we return an array with elements:
* `code` *(http response code)*, `message` *(http response message)*, `headers` *(an array of lowercase headers)*, `body` *(the response body string)*, `response` *(full response array)*.
* @return str|array|bool Requested response str|array from remote location *(see ``$return_array`` parameter )*; else (bool)`false` on failure.
*/
public static function remote($url = FALSE, $post_vars = FALSE, $args = FALSE, $return_array = FALSE)
{
if($url && /* We MUST have a valid full URL (string) before we do anything in this routine. */ is_string($url))
{
$args = /* Force array, and disable SSL verification. */ (!is_array($args)) ? array(): $args;
$args["optimizemember"] = WS_PLUGIN__OPTIMIZEMEMBER_VERSION; // Indicates this is an optimizeMember connection.
$args["httpversion"] = (!isset($args["httpversion"])) ? "1.1" : $args["httpversion"];
$args["user-agent"] = !isset($args["user-agent"]) ? "optimizeMember v".WS_PLUGIN__OPTIMIZEMEMBER_VERSION."; ".home_url() : $args["user-agent"];
if(!isset($args["sslverify"]) && c_ws_plugin__optimizemember_utils_conds::is_localhost())
$args["sslverify"] = FALSE; // Force this off on localhost installs.
if((is_array($post_vars) || is_string($post_vars)) && !empty($post_vars))
$args = array_merge($args, array("method" => "POST", "body" => $post_vars));
if(!empty($args["method"]) && strcasecmp((string)$args["method"], "DELETE") === 0 && version_compare(get_bloginfo("version"), "3.4", "<"))
add_filter("use_curl_transport", "__return_false", /* ID via priority. */ 111209554);
foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
do_action("ws_plugin__optimizemember_before_wp_remote_request", get_defined_vars());
unset($__refs, $__v);
$response = /* Process remote request via ``wp_remote_request()``. */ wp_remote_request($url, $args);
remove_filter /* Remove this Filter now. */("use_curl_transport", "__return_false", 111209554);
if($return_array && !is_wp_error($response) && is_array($response))
{
$a = array("code" => (int)wp_remote_retrieve_response_code($response));
$a = array_merge($a, array("message" => wp_remote_retrieve_response_message($response)));
$a = array_merge($a, array("headers" => wp_remote_retrieve_headers($response)));
$a = array_merge($a, array("body" => wp_remote_retrieve_body($response)));
$a = array_merge($a, array("response" => $response));
return /* Return array w/ ``$response`` too. */ $a;
}
else if(!is_wp_error($response) && is_array($response) /* Return body only. */)
return /* Return ``$response`` body only. */ wp_remote_retrieve_body($response);
else // Else this remote request has failed completely. Return false.
return false; // Remote request failed, return false.
}
else // Else, return false.
return false;
}
/**
* Shortens a long URL, based on optimizeMember configuration.
*
* @package optimizeMember\Utilities
* @since 111002
*
* @param str $url A full/long URL to be shortened.
* @param str $api_sp Optional. A specific URL shortening API to use. Defaults to that which is configured in the optimizeMember Dashboard. Normally `tiny_url`, by default.
* @param bool $try_backups Defaults to true. If a failure occurs with the first API, we'll try others until we have success.
* @return str|bool The shortened URL on success, else false on failure.
*/
public static function shorten($url = FALSE, $api_sp = FALSE, $try_backups = TRUE)
{
$url = /* Force strings, else false. */ ($url && is_string($url)) ? $url : false;
$api_sp = ($api_sp && is_string($api_sp)) ? strtolower($api_sp) : false;
/**/
$default_url_shortener = $GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["default_url_shortener"];
if ($default_url_shortener === "none"){
return false;
}
$default_custom_str_url_shortener = $GLOBALS["WS_PLUGIN__"]["optimizemember"]["o"]["default_custom_str_url_shortener"];
/**/
$apis = /* The shortening APIs currently pre-integrated in this release of optimizeMember. */ array("tiny_url", "goo_gl");
/**/
if($url && ($api = /* If specific, use it. Otherwise, use the default shortening API. */ ($api_sp) ? $api_sp : $default_url_shortener))
{
if(!$api_sp && ($custom_url = trim(apply_filters("ws_plugin__optimizemember_url_shorten", false, get_defined_vars()))) && stripos($custom_url, "http") === 0)
return /* Using whatever other shortener API you prefer, over the ones available by default with optimizeMember. */ ($shorter_url = $custom_url);
/**/
else if(!$api_sp && stripos($default_custom_str_url_shortener, "http") === 0 && ($custom_url = trim(c_ws_plugin__optimizemember_utils_urls::remote(str_ireplace(array("%%s2_long_url%%", "%%s2_long_url_md5%%"), array(rawurlencode($url), urlencode(md5($url))), $default_custom_str_url_shortener)))) && stripos($custom_url, "http") === 0)
return /* Using whatever other shortener API that a site owner prefers, over the ones available by default with optimizeMember. */ ($shorter_url = $custom_url);
/**/
else if($api === "tiny_url" && ($tiny_url = trim(c_ws_plugin__optimizemember_utils_urls::remote("http://tinyurl.com/api-create.php?url=".rawurlencode($url)))) && stripos($tiny_url, "http") === 0)
return /* The default tinyURL API: . */ ($shorter_url = $tiny_url);
/**/
else if($api === "goo_gl" && ($goo_gl = json_decode(trim(c_ws_plugin__optimizemember_utils_urls::remote("https://www.googleapis.com/urlshortener/v1/url".((($goo_gl_key = apply_filters("ws_plugin__optimizemember_url_shorten_api_goo_gl_key", false))) ? "?key=".urlencode($goo_gl_key) : ""), json_encode(array("longUrl" => $url)), array("headers" => array("Content-Type" => "application/json")))), true)) && !empty($goo_gl["id"]) && is_string($goo_gl_url = $goo_gl["id"]) && stripos($goo_gl_url, "http") === 0)
return /* Google API: . */ ($shorter_url = $goo_gl_url);
/**/
else if /* Try backups? This way we can still shorten the URL with a backup. */($try_backups && count($apis) > 1)
/**/
foreach /* Try other backup APIs now. */(array_diff($apis, array($api)) as $backup)
if(($backup = c_ws_plugin__optimizemember_utils_urls::shorten($url, $backup, false)))
return /* Success, we can return now. */ ($shorter_url = $backup);
}
return /* Default return value. */ false;
}
/**
* Removes all optimizeMember-generated signatures from a full URL, a partial URI, or just a query string.
*
* @package optimizeMember\Utilities
* @since 111106
*
* @param str $url_uri_query A full URL, a partial URI, or just the query string; to remove optimizeMember-generated signatures from.
* @param str $sig_var Optional. The name of the optimizeMember-generated signature variable. Defaults to `_optimizemember_sig`.
* @return str A full URL, a partial URI, or just the query string; without any optimizeMember-generated signatures.
*/
public static function remove_optimizemember_sigs($url_uri_query = FALSE, $sig_var = FALSE)
{
$url_uri_query = c_ws_plugin__optimizemember_utils_strings::trim((string)$url_uri_query, false, "?&=");
$sig_var = ($sig_var && is_string($sig_var)) ? $sig_var : /* Use default. */ "_optimizemember_sig";
$sigs = /* Remove all signatures. */ array_unique(array($sig_var, "_optimizemember_sig"));
/**/
return trim(remove_query_arg($sigs, $url_uri_query), "?&=");
}
/**
* Adds an optimizeMember-generated signature onto a full URL, a partial URI, or just a query string.
*
* @package optimizeMember\Utilities
* @since 111106
*
* @param str $url_uri_query A full URL, a partial URI, or just a query string; to append the optimizeMember-generated signature onto.
* @param str $sig_var Optional. The name of the optimizeMember-generated signature variable. Defaults to `_optimizemember_sig`.
* @return str A full URL, a partial URI, or just a query string; with an optimizeMember-generated signature.
*/
public static function add_optimizemember_sig($url_uri_query = FALSE, $sig_var = FALSE)
{
$url_uri_query = $query = c_ws_plugin__optimizemember_utils_strings::trim((string)$url_uri_query, false, "?&=");
$sig_var = ($sig_var && is_string($sig_var)) ? $sig_var : /* Use default. */ "_optimizemember_sig";
/**/
$url_uri_query = $query = c_ws_plugin__optimizemember_utils_urls::remove_optimizemember_sigs($url_uri_query, $sig_var);
if( /* Is this a full URL, or a partial URI? */preg_match("/^(?:[a-z]+\:\/\/|\/)/i", ($url_uri_query)))
$query = trim(c_ws_plugin__optimizemember_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY), "?&=");
/**/
$key = /* Obtain the proper encryption/decryption key. */ c_ws_plugin__optimizemember_utils_encryption::key();
/**/
if($url_uri_query && is_string /* We DO allow empty query strings. So we can sign a URL without one. */($query))
{
wp_parse_str /* Parse the query string into an array of ``$vars``. Then sort & serialize them into a string. */($query, $vars);
$vars = c_ws_plugin__optimizemember_utils_arrays::remove_0b_strings(c_ws_plugin__optimizemember_utils_strings::trim_deep($vars));
$vars = serialize(c_ws_plugin__optimizemember_utils_arrays::ksort_deep($vars));
/**/
$sig = /* The optimizeMember-generated signature. */ ($time = time())."-".md5($key.$time.$vars);
/**/
$url_uri_query = add_query_arg($sig_var, urlencode($sig), $url_uri_query);
}
return /* Possibly with a ``$sig_var`` variable. */ $url_uri_query;
}
/**
* Verifies an optimizeMember-generated signature; in a full URL, a partial URI, or in just a query string.
*
* @package optimizeMember\Utilities
* @since 111106
*
* @param str $url_uri_query A full URL, a partial URI, or just a query string. Must have an optimizeMember-generated signature to validate.
* @param bool $check_time Optional. Defaults to false. If true, optimizeMember will also check if the signature has expired, based on ``$exp_secs``.
* @param str|int $exp_secs Optional. Defaults to (int)10. If ``$check_time`` is true, optimizeMember will check if the signature has expired, based on ``$exp_secs``.
* @param str $sig_var Optional. The name of the optimizeMember-generated signature variable. Defaults to `_optimizemember_sig`.
* @return bool True if the optimizeMember-generated signature is OK, else false.
*/
public static function optimizemember_sig_ok($url_uri_query = FALSE, $check_time = FALSE, $exp_secs = FALSE, $sig_var = FALSE)
{
$url_uri_query = $query = c_ws_plugin__optimizemember_utils_strings::trim((string)$url_uri_query, false, "?&=");
if( /* Is this a full URL, or a partial URI? */preg_match("/^(?:[a-z]+\:\/\/|\/)/i", ($url_uri_query)))
$query = trim(c_ws_plugin__optimizemember_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY), "?&=");
/**/
$check_time = /* Are we checking time? Force a boolean value here. */ ($check_time) ? true : false;
$exp_secs = (is_numeric($exp_secs)) ? (int)$exp_secs : /* Else 10 seconds by default here. */ 10;
$sig_var = ($sig_var && is_string($sig_var)) ? $sig_var : /* Use default. */ "_optimizemember_sig";
/**/
$key = /* Obtain the proper encryption/decryption key. */ c_ws_plugin__optimizemember_utils_encryption::key();
/**/
if(preg_match_all /* Does ``$query`` have an optimizeMember-generated signature? */("/".preg_quote($sig_var, "/")."\=([0-9]+)-([^&$]+)/", $query, $sigs))
{
$query = /* Remove existing optimizeMember-generated signatures. */ c_ws_plugin__optimizemember_utils_urls::remove_optimizemember_sigs($query, $sig_var);
/**/
wp_parse_str /* Parse the query string into an array of ``$vars``. Then sort & serialize them into a string. */($query, $vars);
$vars = c_ws_plugin__optimizemember_utils_arrays::remove_0b_strings(c_ws_plugin__optimizemember_utils_strings::trim_deep($vars));
$vars = serialize(c_ws_plugin__optimizemember_utils_arrays::ksort_deep($vars));
/**/
($time = $sigs[1][($i = count($sigs[1]) - 1)]).($sig = $sigs[2][$i]).($valid_sig = md5($key.$time.$vars));
/**/
if /* Checking time? This must NOT be older than ``$exp_secs`` seconds ago. */($check_time)
return ($sig === $valid_sig && $time >= strtotime("-".$exp_secs." seconds"));
/**/
else /* Ignoring time? Just need to compare signatures in this case. */
return /* Do they match up? */ ($sig === $valid_sig);
}
else /* Return false. No ``$query``, or no ``$sigs``. */
return /* False, it's NOT ok. */ false;
}
}
}
?>