/**
  * Enqueues administrative notices.
  *
  * @package s2Member\Admin_Notices
  * @since 3.5
  *
  * @param str $notice String value of actual notice *( i.e. the message )*.
  * @param str|array $on_pages Optional. Defaults to any page. String or array of pages to display this notice on.
  * @param bool $error Optional. True if this notice is regarding an error. Defaults to false.
  * @param int $time Optional. Unix timestamp indicating when this notice will be displayed.
  * @param bool $dismiss Optional. If true, the notice will remain persistent, until dismissed. Defaults to false.
  * @return null
  */
 public static function enqueue_admin_notice($notice = FALSE, $on_pages = FALSE, $error = FALSE, $time = FALSE, $dismiss = FALSE)
 {
     eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
     do_action("ws_plugin__s2member_before_enqueue_admin_notice", get_defined_vars());
     unset($__refs, $__v);
     /* Unset defined __refs, __v. */
     /**/
     if (is_string($notice) && $notice) {
         $notices = (array) get_option("ws_plugin__s2member_notices");
         /**/
         array_push($notices, array("notice" => $notice, "on_pages" => $on_pages, "error" => $error, "time" => $time, "dismiss" => $dismiss));
         /**/
         eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
         do_action("ws_plugin__s2member_during_enqueue_admin_notice", get_defined_vars());
         unset($__refs, $__v);
         /* Unset defined __refs, __v. */
         /**/
         update_option("ws_plugin__s2member_notices", c_ws_plugin__s2member_utils_arrays::array_unique($notices));
     }
     /**/
     do_action("ws_plugin__s2member_after_enqueue_admin_notice", get_defined_vars());
     /**/
     return;
     /* Return for uniformity. */
 }
 /**
  * Enqueues administrative notices.
  *
  * @package s2Member\Admin_Notices
  * @since 3.5
  *
  * @param string $notice String value of actual notice *(i.e. the message)*.
  * @param string|array $on_pages Optional. Defaults to any page. String or array of pages to display this notice on.
  * @param bool $error Optional. True if this notice is regarding an error. Defaults to false.
  * @param int $time Optional. Unix timestamp indicating when this notice will be displayed.
  * @param bool $dismiss Optional. If true, the notice will remain persistent, until dismissed. Defaults to false.
  */
 public static function enqueue_admin_notice($notice = FALSE, $on_pages = FALSE, $error = FALSE, $time = FALSE, $dismiss = FALSE)
 {
     foreach (array_keys(get_defined_vars()) as $__v) {
         $__refs[$__v] =& ${$__v};
     }
     do_action("ws_plugin__s2member_before_enqueue_admin_notice", get_defined_vars());
     unset($__refs, $__v);
     if (is_string($notice) && $notice) {
         $notices = (array) get_option("ws_plugin__s2member_notices");
         array_push($notices, array("notice" => $notice, "on_pages" => $on_pages, "error" => $error, "time" => $time, "dismiss" => $dismiss));
         foreach (array_keys(get_defined_vars()) as $__v) {
             $__refs[$__v] =& ${$__v};
         }
         do_action("ws_plugin__s2member_during_enqueue_admin_notice", get_defined_vars());
         unset($__refs, $__v);
         update_option("ws_plugin__s2member_notices", c_ws_plugin__s2member_utils_arrays::array_unique($notices));
     }
     do_action("ws_plugin__s2member_after_enqueue_admin_notice", get_defined_vars());
 }
 /**
  * Enqueues administrative notices.
  *
  * @package s2Member\Admin_Notices
  * @since 3.5
  *
  * @param string       $notice String value of actual notice *(i.e., the message)*.
  * @param string|array $on_pages Optional. Defaults to any page. String or array of pages to display this notice on.
  * @param bool         $error Optional. True if this notice is regarding an error. Defaults to false.
  * @param int          $time Optional. Unix timestamp indicating when this notice will be displayed.
  * @param bool         $dismiss Optional. If true, the notice will remain persistent, until dismissed. Defaults to false.
  */
 public static function enqueue_admin_notice($notice = '', $on_pages = array(), $error = FALSE, $time = 0, $dismiss = FALSE)
 {
     foreach (array_keys(get_defined_vars()) as $__v) {
         $__refs[$__v] =& ${$__v};
     }
     do_action('ws_plugin__s2member_before_enqueue_admin_notice', get_defined_vars());
     unset($__refs, $__v);
     // Allow variables to be modified by reference.
     if ($notice && is_string($notice)) {
         $notices = (array) get_option('ws_plugin__s2member_notices');
         array_push($notices, array('notice' => $notice, 'on_pages' => $on_pages, 'error' => $error, 'time' => $time, 'dismiss' => $dismiss));
         foreach (array_keys(get_defined_vars()) as $__v) {
             $__refs[$__v] =& ${$__v};
         }
         do_action('ws_plugin__s2member_during_enqueue_admin_notice', get_defined_vars());
         unset($__refs, $__v);
         // Allow variables to be modified by reference.
         update_option('ws_plugin__s2member_notices', c_ws_plugin__s2member_utils_arrays::array_unique($notices));
     }
     do_action('ws_plugin__s2member_after_enqueue_admin_notice', get_defined_vars());
 }
Example #4
0
 /**
  * Sorts arrays *(also supports multi-dimensional arrays)* by key, low to high.
  *
  * @package s2Member\Utilities
  * @since 111205
  *
  * @param array $array An input array.
  * @param int $flags Optional. Can be used to modify the sorting behavior.
  * 	See: {@link http://www.php.net/manual/en/function.ksort.php}
  * @return Unlike PHP's ``ksort()``, this function returns the array, and does NOT work on a reference.
  */
 function ksort_deep($array = FALSE, $flags = SORT_REGULAR)
 {
     $array = (array) $array;
     ksort($array, $flags);
     foreach ($array as &$value) {
         if (is_array($value)) {
             $value = c_ws_plugin__s2member_utils_arrays::ksort_deep($value, $flags);
         }
     }
     return $array;
 }
Example #5
0
 /**
  * Listens to Collective EOT/MOD Events processed internally by s2Member.
  *
  * This is only applicable when ``["custom_reg_auto_opt_outs"]`` contains related Event(s).
  *
  * @package s2Member\List_Servers
  * @since 3.5
  *
  * @attaches-to ``add_action("ws_plugin__s2member_during_collective_mods");``
  * @attaches-to ``add_action("ws_plugin__s2member_during_collective_eots");``
  *
  * @param int|str $user_id Required. A WordPress User ID, numeric string or integer.
  * @param array $vars Required. An array of defined variables passed by the calling Hook.
  * @param str $event Required. A specific event that triggered this call from the Action Hook.
  * @param str $event_spec Required. A specific event specification *(a broader classification)*.
  * @param str $mod_new_role Required if ``$event_spec === "modification"`` (but can be empty). Role the User is being modified to.
  * @param str $mod_new_user Optional. If ``$event_spec === "modification"``, the new User object with current details.
  * @param str $mod_old_user Optional. If ``$event_spec === "modification"``, the old/previous User obj with old details.
  * @return null This function does not have a return value.
  */
 public static function auto_process_list_server_removals($user_id = FALSE, $vars = FALSE, $event = FALSE, $event_spec = FALSE, $mod_new_role = FALSE, $mod_new_user = FALSE, $mod_old_user = FALSE)
 {
     global $current_site, $current_blog;
     static $auto_processed = array();
     foreach (array_keys(get_defined_vars()) as $__v) {
         $__refs[$__v] =& ${$__v};
     }
     do_action("ws_plugin__s2member_before_auto_process_list_server_removals", get_defined_vars());
     unset($__refs, $__v);
     $custom_reg_auto_op_outs = c_ws_plugin__s2member_utils_strings::wrap_deep($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_outs"], "/^", "\$/i");
     if (c_ws_plugin__s2member_list_servers::list_servers_integrated() && $user_id && is_numeric($user_id) && !in_array($user_id, $auto_processed) && is_array($vars) && is_string($event = (string) $event) && is_string($event_spec = (string) $event_spec) && (c_ws_plugin__s2member_utils_arrays::in_regex_array($event, $custom_reg_auto_op_outs) || c_ws_plugin__s2member_utils_arrays::in_regex_array($event_spec, $custom_reg_auto_op_outs)) && is_object($user = $_user = new WP_User($user_id)) && !empty($user->ID)) {
         $mod_new_role = $event_spec === "modification" && $mod_new_role && is_string($mod_new_role) ? $mod_new_role : false;
         $mod_new_user = $event_spec === "modification" && $mod_new_user && is_object($mod_new_user) && !empty($mod_new_user->ID) && $mod_new_user->ID === $_user->ID ? $mod_new_user : false;
         $mod_old_user = $event_spec === "modification" && $mod_old_user && is_object($mod_old_user) && !empty($mod_old_user->ID) && $mod_old_user->ID === $_user->ID ? $mod_old_user : false;
         $user = $event_spec === "modification" && $mod_old_user ? $mod_old_user : $_user;
         // Now, should we switch over to the old/previous User object ``$mod_old_user`` here? Or, should we use the one pulled by this routine with the User's ID?
         if (($event_spec !== "modification" || $event_spec === "modification" && (string) $mod_new_role !== c_ws_plugin__s2member_user_access::user_access_role($user) && strtotime($user->user_registered) < strtotime("-10 seconds") && ($event !== "user-role-change" || $event === "user-role-change" && !empty($vars["_p"]["ws_plugin__s2member_custom_reg_auto_opt_out_transitions"]))) && ($auto_processed[$user->ID] = true)) {
             $removed = c_ws_plugin__s2member_list_servers::process_list_server_removals(c_ws_plugin__s2member_user_access::user_access_role($user), c_ws_plugin__s2member_user_access::user_access_level($user), $user->user_login, false, $user->user_email, $user->first_name, $user->last_name, false, true, $user->ID);
             if ($event_spec === "modification" && $mod_new_role && ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_out_transitions"] === "2" || $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_out_transitions"] === "1" && $removed)) {
                 $user = $event_spec === "modification" && $mod_new_user ? $mod_new_user : $_user;
                 // Now, should we switch over to a new/current User object ``$mod_new_user`` here? (which may contain newly updated details). Or, should we simply use the User object pulled by this routine with the User's ID?
                 $transitioned = c_ws_plugin__s2member_list_servers::process_list_servers($mod_new_role, c_ws_plugin__s2member_user_access::user_access_role_to_level($mod_new_role), $user->user_login, false, $user->user_email, $user->first_name, $user->last_name, false, true, $removed ? false : true, $user->ID);
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action("ws_plugin__s2member_during_auto_process_list_server_removal_transitions", get_defined_vars());
                 unset($__refs, $__v);
             }
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_auto_process_list_server_removals", get_defined_vars());
             unset($__refs, $__v);
         }
     }
     foreach (array_keys(get_defined_vars()) as $__v) {
         $__refs[$__v] =& ${$__v};
     }
     do_action("ws_plugin__s2member_after_auto_process_list_server_removals", get_defined_vars());
     unset($__refs, $__v);
     return;
 }
 /**
  * s2Member's PayPal IPN handler (inner processing routine).
  *
  * @package s2Member\PayPal
  * @since 110720
  *
  * @param array $vars Required. An array of defined variables passed by {@link s2Member\PayPal\c_ws_plugin__s2member_paypal_notify_in::paypal_notify()}.
  * @return array|bool The original ``$paypal`` array passed in (extracted) from ``$vars``, or false when conditions do NOT apply.
  *
  * @todo Optimize with ``empty()`` and ``isset()``.
  */
 public static function cp($vars = array())
 {
     extract($vars, EXTR_OVERWRITE | EXTR_REFS);
     // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
     if (!empty($paypal["txn_type"]) && preg_match("/^web_accept\$/i", $paypal["txn_type"]) && (!empty($paypal["item_number"]) && preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["sp_access_item_number_regex"], $paypal["item_number"])) && (empty($paypal["payment_status"]) || empty($payment_status_issues) || !preg_match($payment_status_issues, $paypal["payment_status"])) && !empty($paypal["payer_email"]) && !empty($paypal["txn_id"])) {
         foreach (array_keys(get_defined_vars()) as $__v) {
             $__refs[$__v] =& ${$__v};
         }
         do_action("ws_plugin__s2member_during_paypal_notify_before_sp_access", get_defined_vars());
         unset($__refs, $__v);
         if (!get_transient($transient_ipn = "s2m_ipn_" . md5("s2member_transient_" . $_paypal_s)) && set_transient($transient_ipn, time(), 31556926 * 10)) {
             $paypal["s2member_log"][] = "s2Member `txn_type` identified as ( `web_accept` ) for Specific Post/Page Access.";
             list(, $paypal["sp_ids"], $paypal["hours"]) = preg_split("/\\:/", $paypal["item_number"], 3);
             $paypal["ip"] = preg_match("/ip address/i", $paypal["option_name2"]) && $paypal["option_selection2"] ? $paypal["option_selection2"] : "";
             $paypal["ip"] = !$paypal["ip"] && preg_match("/^[a-z0-9]+~[0-9\\.]+\$/i", $paypal["invoice"]) ? preg_replace("/^[a-z0-9]+~/i", "", $paypal["invoice"]) : $paypal["ip"];
             if (($sp_access_url = c_ws_plugin__s2member_sp_access::sp_access_link_gen($paypal["sp_ids"], $paypal["hours"])) && is_array($cv = preg_split("/\\|/", $paypal["custom"]))) {
                 $processing = $during = true;
                 // Yes, we ARE processing this.
                 if (preg_match("/(referenc|associat)/i", $paypal["option_name1"]) && $paypal["option_selection1"]) {
                     // Associating this purchase with a Member?
                     if (($user_id = c_ws_plugin__s2member_utils_users::get_user_id_with($paypal["option_selection1"], $paypal["option_selection1"])) && is_object($user = new WP_User($user_id)) && $user->ID) {
                         $sp_references = (array) get_user_option("s2member_sp_references", $user_id);
                         $_sp_reference = array("time" => time(), "ids" => $paypal["sp_ids"], "hours" => $paypal["hours"], "url" => $sp_access_url);
                         $sp_references = c_ws_plugin__s2member_utils_arrays::array_unique(array_merge($sp_references, $_sp_reference));
                         update_user_option($user_id, "s2member_sp_references", $sp_references);
                         $paypal["s2member_log"][] = "Specific Post/Page ~ Sale associated with User ID: " . $user_id . ".";
                     }
                 }
                 $sbj = preg_replace("/%%sp_access_url%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($sp_access_url), $GLOBALS["WS_PLUGIN__"]["s2member"]["o"][($_REQUEST["s2member_paypal_proxy"] && preg_match("/pro-emails/", $_REQUEST["s2member_paypal_proxy_use"]) ? "pro_" : "") . "sp_email_subject"]);
                 $sbj = preg_replace("/%%sp_access_exp%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime("+" . $paypal["hours"] . " hours"))), $sbj);
                 $msg = preg_replace("/%%sp_access_url%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($sp_access_url), $GLOBALS["WS_PLUGIN__"]["s2member"]["o"][($_REQUEST["s2member_paypal_proxy"] && preg_match("/pro-emails/", $_REQUEST["s2member_paypal_proxy_use"]) ? "pro_" : "") . "sp_email_message"]);
                 $msg = preg_replace("/%%sp_access_exp%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime("+" . $paypal["hours"] . " hours"))), $msg);
                 $rec = preg_replace("/%%sp_access_url%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($sp_access_url), $GLOBALS["WS_PLUGIN__"]["s2member"]["o"][($_REQUEST["s2member_paypal_proxy"] && preg_match("/pro-emails/", $_REQUEST["s2member_paypal_proxy_use"]) ? "pro_" : "") . "sp_email_recipients"]);
                 $rec = preg_replace("/%%sp_access_exp%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime("+" . $paypal["hours"] . " hours"))), $rec);
                 if (($rec = preg_replace("/%%cv([0-9]+)%%/ei", 'trim($cv[$1])', $rec)) && ($rec = preg_replace("/%%txn_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["txn_id"]), $rec))) {
                     if ($rec = preg_replace("/%%amount%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["mc_gross"]), $rec)) {
                         // Full amount of the payment, before fee is subtracted.
                         if (($rec = preg_replace("/%%item_number%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["item_number"]), $rec)) && ($rec = preg_replace("/%%item_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["item_name"]), $rec))) {
                             if (($rec = preg_replace("/%%first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_dq(c_ws_plugin__s2member_utils_strings::esc_ds($paypal["first_name"])), $rec)) && ($rec = preg_replace("/%%last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_dq(c_ws_plugin__s2member_utils_strings::esc_ds($paypal["last_name"])), $rec))) {
                                 if ($rec = preg_replace("/%%full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_dq(c_ws_plugin__s2member_utils_strings::esc_ds(trim($paypal["first_name"] . " " . $paypal["last_name"]))), $rec)) {
                                     // **NOTE** c_ws_plugin__s2member_utils_strings::esc_dq() is applied here. (ex. "N\"ame" <email>).
                                     if ($rec = preg_replace("/%%payer_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["payer_email"]), $rec)) {
                                         if ($rec = preg_replace("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["ip"]), $rec)) {
                                             if (($rec = preg_replace("/%%full_coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["full_coupon_code"]), $rec)) && ($rec = preg_replace("/%%coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["coupon_code"]), $rec)) && ($rec = preg_replace("/%%coupon_affiliate_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["affiliate_id"]), $rec))) {
                                                 if (($sbj = preg_replace("/%%cv([0-9]+)%%/ei", 'trim($cv[$1])', $sbj)) && ($sbj = preg_replace("/%%txn_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["txn_id"]), $sbj))) {
                                                     if ($sbj = preg_replace("/%%amount%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["mc_gross"]), $sbj)) {
                                                         // Full amount of the payment, before fee is subtracted.
                                                         if (($sbj = preg_replace("/%%item_number%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["item_number"]), $sbj)) && ($sbj = preg_replace("/%%item_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["item_name"]), $sbj))) {
                                                             if (($sbj = preg_replace("/%%first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["first_name"]), $sbj)) && ($sbj = preg_replace("/%%last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["last_name"]), $sbj))) {
                                                                 if ($sbj = preg_replace("/%%full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(trim($paypal["first_name"] . " " . $paypal["last_name"])), $sbj)) {
                                                                     if ($sbj = preg_replace("/%%payer_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["payer_email"]), $sbj)) {
                                                                         if ($sbj = preg_replace("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["ip"]), $sbj)) {
                                                                             if (($sbj = preg_replace("/%%full_coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["full_coupon_code"]), $sbj)) && ($sbj = preg_replace("/%%coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["coupon_code"]), $sbj)) && ($sbj = preg_replace("/%%coupon_affiliate_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["affiliate_id"]), $sbj))) {
                                                                                 if (($msg = preg_replace("/%%cv([0-9]+)%%/ei", 'trim($cv[$1])', $msg)) && ($msg = preg_replace("/%%txn_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["txn_id"]), $msg))) {
                                                                                     if ($msg = preg_replace("/%%amount%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["mc_gross"]), $msg)) {
                                                                                         // Full amount of the payment, before fee is subtracted.
                                                                                         if (($msg = preg_replace("/%%item_number%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["item_number"]), $msg)) && ($msg = preg_replace("/%%item_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["item_name"]), $msg))) {
                                                                                             if (($msg = preg_replace("/%%first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["first_name"]), $msg)) && ($msg = preg_replace("/%%last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["last_name"]), $msg))) {
                                                                                                 if ($msg = preg_replace("/%%full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(trim($paypal["first_name"] . " " . $paypal["last_name"])), $msg)) {
                                                                                                     if ($msg = preg_replace("/%%payer_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["payer_email"]), $msg)) {
                                                                                                         if ($msg = preg_replace("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["ip"]), $msg)) {
                                                                                                             if (($msg = preg_replace("/%%full_coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["full_coupon_code"]), $msg)) && ($msg = preg_replace("/%%coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["coupon_code"]), $msg)) && ($msg = preg_replace("/%%coupon_affiliate_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["affiliate_id"]), $msg))) {
                                                                                                                 if (($rec = trim(preg_replace("/%%(.+?)%%/i", "", $rec))) && ($sbj = trim(preg_replace("/%%(.+?)%%/i", "", $sbj))) && ($msg = trim(preg_replace("/%%(.+?)%%/i", "", $msg)))) {
                                                                                                                     if (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) {
                                                                                                                         $sbj = c_ws_plugin__s2member_utilities::evl($sbj, get_defined_vars());
                                                                                                                         $msg = c_ws_plugin__s2member_utilities::evl($msg, get_defined_vars());
                                                                                                                     }
                                                                                                                     foreach (c_ws_plugin__s2member_utils_strings::parse_emails($rec) as $recipient) {
                                                                                                                         // Go through a possible list of recipients.
                                                                                                                         c_ws_plugin__s2member_email_configs::email_config() . wp_mail($recipient, apply_filters("ws_plugin__s2member_sp_email_sbj", $sbj, get_defined_vars()), apply_filters("ws_plugin__s2member_sp_email_msg", $msg, get_defined_vars()), "From: \"" . preg_replace('/"/', "'", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["reg_email_from_name"]) . "\" <" . $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["reg_email_from_email"] . ">\r\nContent-Type: text/plain; charset=UTF-8") . c_ws_plugin__s2member_email_configs::email_config_release();
                                                                                                                     }
                                                                                                                     $paypal["s2member_log"][] = "Specific Post/Page Confirmation Email sent to: " . $rec . ".";
                                                                                                                 }
                                                                                                             }
                                                                                                         }
                                                                                                     }
                                                                                                 }
                                                                                             }
                                                                                         }
                                                                                     }
                                                                                 }
                                                                             }
                                                                         }
                                                                     }
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
                 if ($processing && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_sale_notification_urls"] && is_array($cv = preg_split("/\\|/", $paypal["custom"]))) {
                     foreach (preg_split("/[\r\n\t]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_sale_notification_urls"]) as $url) {
                         if (($url = preg_replace("/%%cv([0-9]+)%%/ei", 'urlencode(trim($cv[$1]))', $url)) && ($url = preg_replace("/%%sp_access_url%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(rawurlencode($sp_access_url)), $url))) {
                             if ($url = preg_replace("/%%sp_access_exp%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime("+" . $paypal["hours"] . " hours")))), $url)) {
                                 if (($url = preg_replace("/%%amount%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["mc_gross"])), $url)) && ($url = preg_replace("/%%txn_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["txn_id"])), $url))) {
                                     if (($url = preg_replace("/%%item_number%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["item_number"])), $url)) && ($url = preg_replace("/%%item_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["item_name"])), $url))) {
                                         if (($url = preg_replace("/%%first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["first_name"])), $url)) && ($url = preg_replace("/%%last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["last_name"])), $url))) {
                                             if ($url = preg_replace("/%%full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode(trim($paypal["first_name"] . " " . $paypal["last_name"]))), $url)) {
                                                 if ($url = preg_replace("/%%payer_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["payer_email"])), $url)) {
                                                     if ($url = preg_replace("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["ip"])), $url)) {
                                                         if (($url = preg_replace("/%%full_coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($coupon["full_coupon_code"])), $url)) && ($url = preg_replace("/%%coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($coupon["coupon_code"])), $url)) && ($url = preg_replace("/%%coupon_affiliate_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($coupon["affiliate_id"])), $url))) {
                                                             if ($url = trim(preg_replace("/%%(.+?)%%/i", "", $url))) {
                                                                 c_ws_plugin__s2member_utils_urls::remote($url);
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                     $paypal["s2member_log"][] = "Specific Post/Page ~ Sale Notification URLs have been processed.";
                 }
                 if ($processing && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_sale_notification_recipients"] && is_array($cv = preg_split("/\\|/", $paypal["custom"]))) {
                     $msg = $sbj = "(s2Member / API Notification Email) - Specific Post/Page ~ Sale";
                     $msg .= "\n\n";
                     // Spacing in the message body.
                     $msg .= "sp_access_url: %%sp_access_url%%\n";
                     $msg .= "sp_access_exp: %%sp_access_exp%%\n";
                     $msg .= "amount: %%amount%%\n";
                     $msg .= "txn_id: %%txn_id%%\n";
                     $msg .= "item_number: %%item_number%%\n";
                     $msg .= "item_name: %%item_name%%\n";
                     $msg .= "first_name: %%first_name%%\n";
                     $msg .= "last_name: %%last_name%%\n";
                     $msg .= "full_name: %%full_name%%\n";
                     $msg .= "payer_email: %%payer_email%%\n";
                     $msg .= "user_ip: %%user_ip%%\n";
                     $msg .= "full_coupon_code: %%full_coupon_code%%\n";
                     $msg .= "coupon_code: %%coupon_code%%\n";
                     $msg .= "coupon_affiliate_id: %%coupon_affiliate_id%%\n";
                     $msg .= "cv0: %%cv0%%\n";
                     $msg .= "cv1: %%cv1%%\n";
                     $msg .= "cv2: %%cv2%%\n";
                     $msg .= "cv3: %%cv3%%\n";
                     $msg .= "cv4: %%cv4%%\n";
                     $msg .= "cv5: %%cv5%%\n";
                     $msg .= "cv6: %%cv6%%\n";
                     $msg .= "cv7: %%cv7%%\n";
                     $msg .= "cv8: %%cv8%%\n";
                     $msg .= "cv9: %%cv9%%";
                     if (($msg = preg_replace("/%%cv([0-9]+)%%/ei", 'trim($cv[$1])', $msg)) && ($msg = preg_replace("/%%sp_access_url%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($sp_access_url), $msg))) {
                         if ($msg = preg_replace("/%%sp_access_exp%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime("+" . $paypal["hours"] . " hours"))), $msg)) {
                             if (($msg = preg_replace("/%%amount%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["mc_gross"]), $msg)) && ($msg = preg_replace("/%%txn_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["txn_id"]), $msg))) {
                                 if (($msg = preg_replace("/%%item_number%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["item_number"]), $msg)) && ($msg = preg_replace("/%%item_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["item_name"]), $msg))) {
                                     if (($msg = preg_replace("/%%first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["first_name"]), $msg)) && ($msg = preg_replace("/%%last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["last_name"]), $msg))) {
                                         if ($msg = preg_replace("/%%full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(trim($paypal["first_name"] . " " . $paypal["last_name"])), $msg)) {
                                             if ($msg = preg_replace("/%%payer_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["payer_email"]), $msg)) {
                                                 if ($msg = preg_replace("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["ip"]), $msg)) {
                                                     if (($msg = preg_replace("/%%full_coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["full_coupon_code"]), $msg)) && ($msg = preg_replace("/%%coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["coupon_code"]), $msg)) && ($msg = preg_replace("/%%coupon_affiliate_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["affiliate_id"]), $msg))) {
                                                         if ($sbj && ($msg = trim(preg_replace("/%%(.+?)%%/i", "", $msg)))) {
                                                             // Still have a ``$sbj`` and a ``$msg``?
                                                             foreach (c_ws_plugin__s2member_utils_strings::parse_emails($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_sale_notification_recipients"]) as $recipient) {
                                                                 wp_mail($recipient, apply_filters("ws_plugin__s2member_sp_sale_notification_email_sbj", $sbj, get_defined_vars()), apply_filters("ws_plugin__s2member_sp_sale_notification_email_msg", $msg, get_defined_vars()), "Content-Type: text/plain; charset=UTF-8");
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                     $paypal["s2member_log"][] = "Specific Post/Page ~ Sale Notification Emails have been processed.";
                 }
                 if ($processing && $_REQUEST["s2member_paypal_proxy"] && ($url = $_REQUEST["s2member_paypal_proxy_return_url"]) && is_array($cv = preg_split("/\\|/", $paypal["custom"]))) {
                     if (($url = preg_replace("/%%cv([0-9]+)%%/ei", 'urlencode(trim($cv[$1]))', $url)) && ($url = preg_replace("/%%sp_access_url%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(rawurlencode($sp_access_url)), $url))) {
                         if ($url = preg_replace("/%%sp_access_exp%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime("+" . $paypal["hours"] . " hours")))), $url)) {
                             if (($url = preg_replace("/%%amount%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["mc_gross"])), $url)) && ($url = preg_replace("/%%txn_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["txn_id"])), $url))) {
                                 if (($url = preg_replace("/%%item_number%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["item_number"])), $url)) && ($url = preg_replace("/%%item_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["item_name"])), $url))) {
                                     if (($url = preg_replace("/%%first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["first_name"])), $url)) && ($url = preg_replace("/%%last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["last_name"])), $url))) {
                                         if ($url = preg_replace("/%%full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode(trim($paypal["first_name"] . " " . $paypal["last_name"]))), $url)) {
                                             if ($url = preg_replace("/%%payer_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["payer_email"])), $url)) {
                                                 if ($url = preg_replace("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($paypal["ip"])), $url)) {
                                                     if (($url = preg_replace("/%%full_coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($coupon["full_coupon_code"])), $url)) && ($url = preg_replace("/%%coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($coupon["coupon_code"])), $url)) && ($url = preg_replace("/%%coupon_affiliate_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(urlencode($coupon["affiliate_id"])), $url))) {
                                                         if ($url = trim($url)) {
                                                             // Preserve Remaining replacements.
                                                             // Because the parent routine may perform replacements too.
                                                             $paypal["s2member_paypal_proxy_return_url"] = $url;
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                     $paypal["s2member_log"][] = "Specific Post/Page Return, a Proxy Return URL is ready.";
                 }
                 if ($processing && ($code = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_tracking_codes"]) && is_array($cv = preg_split("/\\|/", $paypal["custom"]))) {
                     if (($code = preg_replace("/%%cv([0-9]+)%%/ei", 'trim($cv[$1])', $code)) && ($code = preg_replace("/%%amount%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["mc_gross"]), $code)) && ($code = preg_replace("/%%txn_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["txn_id"]), $code))) {
                         if (($code = preg_replace("/%%item_number%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["item_number"]), $code)) && ($code = preg_replace("/%%item_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["item_name"]), $code))) {
                             if (($code = preg_replace("/%%first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["first_name"]), $code)) && ($code = preg_replace("/%%last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["last_name"]), $code))) {
                                 if ($code = preg_replace("/%%full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_ds(trim($paypal["first_name"] . " " . $paypal["last_name"])), $code)) {
                                     if ($code = preg_replace("/%%payer_email%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["payer_email"]), $code)) {
                                         if ($code = preg_replace("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($paypal["ip"]), $code)) {
                                             if (($code = preg_replace("/%%full_coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["full_coupon_code"]), $code)) && ($code = preg_replace("/%%coupon_code%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["coupon_code"]), $code)) && ($code = preg_replace("/%%coupon_affiliate_id%%/i", c_ws_plugin__s2member_utils_strings::esc_ds($coupon["affiliate_id"]), $code))) {
                                                 if ($code = trim(preg_replace("/%%(.+?)%%/i", "", $code))) {
                                                     $paypal["s2member_log"][] = "Storing Specific Post/Page Tracking Codes into a Transient Queue. These will be processed on-site.";
                                                     set_transient("s2m_" . md5("s2member_transient_sp_tracking_codes_" . $paypal["txn_id"]), $code, 43200);
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action("ws_plugin__s2member_during_paypal_notify_during_sp_access", get_defined_vars());
                 unset($__refs, $__v);
             } else {
                 $paypal["s2member_log"][] = "Unable to generate Access Link for Specific Post/Page Access. Does your Leading Post/Page still exist?";
             }
         } else {
             $paypal["s2member_log"][] = "Not processing. Duplicate IPN.";
             $paypal["s2member_log"][] = "s2Member `txn_type` identified as ( `web_accept` ) for Specific Post/Page Access.";
             $paypal["s2member_log"][] = "Duplicate IPN. Already processed. This IPN will be ignored.";
         }
         foreach (array_keys(get_defined_vars()) as $__v) {
             $__refs[$__v] =& ${$__v};
         }
         do_action("ws_plugin__s2member_during_paypal_notify_after_sp_access", get_defined_vars());
         unset($__refs, $__v);
         return apply_filters("c_ws_plugin__s2member_paypal_notify_in_web_accept_sp", $paypal, get_defined_vars());
     } else {
         return apply_filters("c_ws_plugin__s2member_paypal_notify_in_web_accept_sp", false, get_defined_vars());
     }
 }
Example #7
0
 /**
  * Handles Download Access permissions.
  *
  * @package s2Member\Files
  * @since 3.5
  *
  * @attaches-to ``add_action('init');``
  * @also-called-by API Function {@link s2Member\API_Functions\s2member_file_download_url()}, w/ ``$create_file_download_url`` param.
  *
  * @param null|array $create_file_download_url Optional. If this function is called directly, we can pass arguments through this array.
  *   Possible array elements: `file_download` *(required)*, `file_download_key`, `file_stream`, `file_inline`, `file_storage`, `file_remote`, `file_ssl`, `file_rewrite`, `file_rewrite_base`, `skip_confirmation`, `url_to_storage_source`, `count_against_user`, `check_user`.
  *
  * @return null|string If called directly with ``$create_file_download_url``, returns a string with the URL, based on configuration.
  *   Else, this function may exit script execution after serving a File Download.
  */
 public static function check_file_download_access($create_file_download_url = NULL)
 {
     foreach (array_keys(get_defined_vars()) as $__v) {
         $__refs[$__v] =& ${$__v};
     }
     do_action('ws_plugin__s2member_before_file_download_access', get_defined_vars());
     unset($__refs, $__v);
     // Housekeeping.
     $_g = !empty($_GET) ? $_GET : array();
     $_g = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_g));
     $creating = is_array($create = $create_file_download_url) ? TRUE : FALSE;
     // Creating URL?
     $serving = !$creating ? TRUE : FALSE;
     // If NOT creating a File Download URL, we're serving one.
     $serving_range = $range = FALSE;
     // Default values (so these variables DO get defined at all times).
     if ($serving) {
         $range = (string) @$_SERVER['HTTP_RANGE'];
         if (!$range && function_exists('apache_request_headers')) {
             foreach ((array) apache_request_headers() as $_header => $_value) {
                 // Note: ``apache_request_headers()`` works in FastCGI too, starting w/ PHP v5.4.
                 if (is_string($_header) && strcasecmp($_header, 'range') === 0) {
                     $range = $_value;
                 }
             }
         }
         unset($_header, $_value);
         // Housekeeping.
         if ($range) {
             $serving_range = TRUE;
         }
     }
     $req['file_download'] = $creating ? @$create['file_download'] : @$_g['s2member_file_download'];
     $req['file_download_key'] = $creating ? @$create['file_download_key'] : @$_g['s2member_file_download_key'];
     $req['file_stream'] = $creating ? @$create['file_stream'] : @$_g['s2member_file_stream'];
     $req['file_inline'] = $creating ? @$create['file_inline'] : @$_g['s2member_file_inline'];
     $req['file_storage'] = $creating ? @$create['file_storage'] : @$_g['s2member_file_storage'];
     $req['file_remote'] = $creating ? @$create['file_remote'] : @$_g['s2member_file_remote'];
     $req['file_ssl'] = $creating ? @$create['file_ssl'] : @$_g['s2member_file_ssl'];
     $req['file_rewrite'] = $creating ? @$create['file_rewrite'] : NULL;
     $req['file_rewrite_base'] = $creating ? @$create['file_rewrite_base'] : NULL;
     $req['skip_confirmation'] = $creating ? @$create['skip_confirmation'] : NULL;
     $req['url_to_storage_source'] = $creating ? @$create['url_to_storage_source'] : NULL;
     $req['count_against_user'] = $creating ? @$create['count_against_user'] : NULL;
     $req['check_user'] = $creating ? @$create['check_user'] : NULL;
     if ($req['file_download'] && is_string($req['file_download']) && ($req['file_download'] = trim($req['file_download'], '/'))) {
         if (strpos($req['file_download'], '..') === FALSE && strpos(basename($req['file_download']), '.') !== 0) {
             $using_amazon_cf_storage = (!$req['file_storage'] || strcasecmp((string) $req['file_storage'], 'cf') === 0) && c_ws_plugin__s2member_utils_conds::using_amazon_cf_storage() ? TRUE : FALSE;
             $using_amazon_s3_storage = (!$req['file_storage'] || strcasecmp((string) $req['file_storage'], 's3') === 0) && c_ws_plugin__s2member_utils_conds::using_amazon_s3_storage() ? TRUE : FALSE;
             $using_amazon_storage = $using_amazon_cf_storage || $using_amazon_s3_storage ? TRUE : FALSE;
             $excluded = apply_filters('ws_plugin__s2member_check_file_download_access_excluded', FALSE, get_defined_vars());
             $valid_file_download_key = $req['file_download_key'] && is_string($req['file_download_key']) && $creating && (!isset($req['check_user']) || !filter_var($req['check_user'], FILTER_VALIDATE_BOOLEAN)) && (!isset($req['count_against_user']) || !filter_var($req['count_against_user'], FILTER_VALIDATE_BOOLEAN)) ? TRUE : FALSE;
             $valid_file_download_key = !$valid_file_download_key && $req['file_download_key'] && is_string($req['file_download_key']) ? c_ws_plugin__s2member_files_in::check_file_download_key($req['file_download'], $req['file_download_key']) : FALSE;
             $checking_user = $excluded || $valid_file_download_key || $creating && (!isset($req['check_user']) || !filter_var($req['check_user'], FILTER_VALIDATE_BOOLEAN)) && (!isset($req['count_against_user']) || !filter_var($req['count_against_user'], FILTER_VALIDATE_BOOLEAN)) ? FALSE : TRUE;
             $updating_user_counter = $serving_range || !$checking_user || $creating && (!isset($req['count_against_user']) || !filter_var($req['count_against_user'], FILTER_VALIDATE_BOOLEAN)) ? FALSE : TRUE;
             if (($serving || $creating) && $checking_user) {
                 if (!$using_amazon_storage && !file_exists($GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir'] . '/' . $req['file_download'])) {
                     if ($serving) {
                         status_header(404);
                         header('Content-Type: text/html; charset=UTF-8');
                         while (@ob_end_clean()) {
                         }
                         // Clean any existing output buffers.
                         exit(_x('<strong>404: Sorry, file not found.</strong> Please contact Support for assistance.', 's2member-front', 's2member'));
                     }
                     return FALSE;
                     // Else return false.
                 } else {
                     if ($req['file_download_key'] && is_string($req['file_download_key']) && !$valid_file_download_key) {
                         if ($serving) {
                             status_header(503);
                             header('Content-Type: text/html; charset=UTF-8');
                             while (@ob_end_clean()) {
                             }
                             // Clean any existing output buffers.
                             exit(_x('<strong>503 (Invalid Key):</strong> Sorry, your access to this file has expired. Please contact Support for assistance.', 's2member-front', 's2member'));
                         }
                         return FALSE;
                         // Else return false.
                     } else {
                         if ($serving) {
                             // We only need remote functionality when/if we're actually serving.
                             if (!has_filter('ws_plugin__s2member_check_file_download_access_user', 'c_ws_plugin__s2member_files_in::check_file_remote_authorization')) {
                                 add_filter('ws_plugin__s2member_check_file_download_access_user', 'c_ws_plugin__s2member_files_in::check_file_remote_authorization', 10, 2);
                             }
                         }
                         if ($creating) {
                             // We only need remote functionality when/if we're actually serving.
                             if (has_filter('ws_plugin__s2member_check_file_download_access_user', 'c_ws_plugin__s2member_files_in::check_file_remote_authorization')) {
                                 remove_filter('ws_plugin__s2member_check_file_download_access_user', 'c_ws_plugin__s2member_files_in::check_file_remote_authorization', 10, 2);
                             }
                         }
                         if (!$GLOBALS['WS_PLUGIN__']['s2member']['o']['membership_options_page']) {
                             if ($serving) {
                                 status_header(503);
                                 header('Content-Type: text/html; charset=UTF-8');
                                 while (@ob_end_clean()) {
                                 }
                                 // Clean any existing output buffers.
                                 exit(_x('<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <strong>s2Member → General Options → Membership Options Page</strong>.', 's2member-front', 's2member'));
                             }
                             return FALSE;
                             // Else return false.
                         } else {
                             if (($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads()) === FALSE) {
                                 if ($serving) {
                                     status_header(503);
                                     header('Content-Type: text/html; charset=UTF-8');
                                     while (@ob_end_clean()) {
                                     }
                                     // Clean any existing output buffers.
                                     exit(_x('<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <strong>s2Member → Download Options → Basic Download Restrictions</strong>.', 's2member-front', 's2member'));
                                 }
                                 return FALSE;
                                 // Else return false.
                             } else {
                                 if (!is_object($user = apply_filters('ws_plugin__s2member_check_file_download_access_user', is_user_logged_in() ? wp_get_current_user() : FALSE, get_defined_vars())) || empty($user->ID) || !($user_id = $user->ID) || !is_array($user_file_downloads = c_ws_plugin__s2member_files::user_downloads($user)) || !$user->has_cap('administrator') && (!$user_file_downloads['allowed'] || !$user_file_downloads['allowed_days'])) {
                                     if (preg_match('/(?:^|\\/)access[_\\-]s2member[_\\-]level([0-9]+)\\//', $req['file_download'], $m) && strlen($req_level = $m[1]) && (!is_object($user) || empty($user->ID) || !$user->has_cap('access_s2member_level' . $req_level))) {
                                         if ($serving) {
                                             // We only need this section when/if we're actually serving.
                                             c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars('file', $req['file_download'], 'level', $req_level, $_SERVER['REQUEST_URI']) . exit;
                                         }
                                         return FALSE;
                                         // Else return false.
                                     } else {
                                         if (preg_match('/(?:^|\\/)access[_\\-]s2member[_\\-]ccap[_\\-](.+?)\\//', $req['file_download'], $m) && strlen($req_ccap = preg_replace('/-/', '_', $m[1])) && (!is_object($user) || empty($user->ID) || !$user->has_cap('access_s2member_ccap_' . $req_ccap))) {
                                             if ($serving) {
                                                 // We only need this section when/if we're actually serving.
                                                 c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars('file', $req['file_download'], 'ccap', $req_ccap, $_SERVER['REQUEST_URI']) . exit;
                                             }
                                             return FALSE;
                                             // Else return false.
                                         } else {
                                             if ($serving) {
                                                 // We only need this section when/if we're actually serving.
                                                 c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars('file', $req['file_download'], 'level', $min_level_4_downloads, $_SERVER['REQUEST_URI']) . exit;
                                             }
                                         }
                                     }
                                     return FALSE;
                                     // Else return false.
                                 } else {
                                     if (preg_match('/(?:^|\\/)access[_\\-]s2member[_\\-]level([0-9]+)\\//', $req['file_download'], $m) && strlen($req_level = $m[1]) && !$user->has_cap('access_s2member_level' . $req_level)) {
                                         if ($serving) {
                                             // We only need this section when/if we're actually serving.
                                             c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars('file', $req['file_download'], 'level', $req_level, $_SERVER['REQUEST_URI']) . exit;
                                         }
                                         return FALSE;
                                         // Else return false.
                                     } else {
                                         if (preg_match('/(?:^|\\/)access[_\\-]s2member[_\\-]ccap[_\\-](.+?)\\//', $req['file_download'], $m) && strlen($req_ccap = preg_replace('/-/', '_', $m[1])) && !$user->has_cap('access_s2member_ccap_' . $req_ccap)) {
                                             if ($serving) {
                                                 // We only need this section when/if we're actually serving.
                                                 c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars('file', $req['file_download'], 'ccap', $req_ccap, $_SERVER['REQUEST_URI']) . exit;
                                             }
                                             return FALSE;
                                             // Else return false.
                                         } else {
                                             if ($serving || $creating) {
                                                 $user_previous_file_downloads = 0;
                                                 // Downloads the User has already; in current period/cycle.
                                                 $user_already_downloaded_this_file = $user_already_downloaded_a_streaming_variation_of_this_file = FALSE;
                                                 $user_file_download_access_log = is_array($user_file_download_access_log = get_user_option('s2member_file_download_access_log', $user_id)) ? $user_file_download_access_log : array();
                                                 $user_file_download_access_arc = is_array($user_file_download_access_arc = get_user_option('s2member_file_download_access_arc', $user_id)) ? $user_file_download_access_arc : array();
                                                 $streaming_file_extns = c_ws_plugin__s2member_utils_strings::preg_quote_deep($GLOBALS['WS_PLUGIN__']['s2member']['c']['streaming_file_extns'], '/');
                                                 $streaming_variations = '/\\.(' . implode('|', $streaming_file_extns) . ')$/i';
                                                 // Only count one streaming media file variation.
                                                 foreach ($user_file_download_access_log as $user_file_download_access_log_entry_key => $user_file_download_access_log_entry) {
                                                     if (isset($user_file_download_access_log_entry['date'], $user_file_download_access_log_entry['file'])) {
                                                         if (strtotime($user_file_download_access_log_entry['date']) < strtotime('-' . $user_file_downloads['allowed_days'] . ' days')) {
                                                             unset($user_file_download_access_log[$user_file_download_access_log_entry_key]);
                                                             // Remove it from the `log`.
                                                             $user_file_download_access_arc[] = $user_file_download_access_log_entry;
                                                             // Move `log` entry to the `archive` now.
                                                         } else {
                                                             if (strtotime($user_file_download_access_log_entry['date']) >= strtotime('-' . $user_file_downloads['allowed_days'] . ' days')) {
                                                                 $user_previous_file_downloads++;
                                                                 // Previous files always count against this User/Member.
                                                                 $_user_file_download_access_log_entry =& $user_file_download_access_log[$user_file_download_access_log_entry_key];
                                                                 $_user_already_downloaded_this_file = $_user_already_downloaded_a_streaming_variation_of_this_file = FALSE;
                                                                 if ($user_file_download_access_log_entry['file'] === $req['file_download']) {
                                                                     // Already downloaded this file? If yes, mark this flag as true.
                                                                     $user_already_downloaded_this_file = $_user_already_downloaded_this_file = TRUE;
                                                                 } else {
                                                                     if (preg_replace($streaming_variations, '', $user_file_download_access_log_entry['file']) === preg_replace($streaming_variations, '', $req['file_download'])) {
                                                                         $user_already_downloaded_this_file = $_user_already_downloaded_this_file = $user_already_downloaded_a_streaming_variation_of_this_file = $_user_already_downloaded_a_streaming_variation_of_this_file = TRUE;
                                                                     }
                                                                 }
                                                                 if ($updating_user_counter && ($_user_already_downloaded_this_file || $_user_already_downloaded_a_streaming_variation_of_this_file)) {
                                                                     $_user_file_download_access_log_entry['ltime'] = time();
                                                                     // First, we update the last download time for this file.
                                                                     if (!empty($user_file_download_access_log_entry['counter'])) {
                                                                         // Backward compatibility here. Is this even set?
                                                                         $_user_file_download_access_log_entry['counter'] = (int) $user_file_download_access_log_entry['counter'] + 1;
                                                                     } else {
                                                                         // Backward compatibility here. Default value to `1`, if this is NOT even set yet.
                                                                         $_user_file_download_access_log_entry['counter'] = 1 + 1;
                                                                     }
                                                                 }
                                                             }
                                                         }
                                                     } else {
                                                         // Weed out empty log entries. Some older versions of s2Member may have corrupt/empty log entries.
                                                         unset($user_file_download_access_log[$user_file_download_access_log_entry_key]);
                                                     }
                                                     // Remove.
                                                 }
                                                 if ($updating_user_counter && !$user_already_downloaded_this_file && !$user_already_downloaded_a_streaming_variation_of_this_file) {
                                                     // Do we need a new log entry for this file?
                                                     $user_file_download_access_log[] = array('date' => date('Y-m-d'), 'time' => time(), 'ltime' => time(), 'file' => $req['file_download'], 'counter' => 1);
                                                 }
                                                 if ($user_previous_file_downloads >= $user_file_downloads['allowed'] && !$user_already_downloaded_this_file && !$user_already_downloaded_a_streaming_variation_of_this_file && !$user->has_cap('administrator')) {
                                                     if ($serving) {
                                                         // We only need this section when/if we're actually serving.
                                                         wp_redirect(add_query_arg(urlencode_deep(array('_s2member_seeking' => array('type' => 'file', 'file' => $req['file_download'], '_uri' => base64_encode($_SERVER['REQUEST_URI'])), 's2member_seeking' => 'file-' . $req['file_download'])), get_page_link($GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_limit_exceeded_page'])), apply_filters('ws_plugin__s2member_content_redirect_status', 301, get_defined_vars())) . exit;
                                                     }
                                                     return FALSE;
                                                     // Else return false.
                                                 } else {
                                                     if ($updating_user_counter) {
                                                         // Save/update counter? By default, we do NOT update the counter when a URL is simply being created for access.
                                                         update_user_option($user_id, 's2member_file_download_access_log', c_ws_plugin__s2member_utils_arrays::array_unique($user_file_download_access_log)) . update_user_option($user_id, 's2member_file_download_access_arc', c_ws_plugin__s2member_utils_arrays::array_unique($user_file_download_access_arc));
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             } else {
                 if (!$using_amazon_storage && !file_exists($GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir'] . '/' . $req['file_download'])) {
                     if ($serving) {
                         status_header(404);
                         header('Content-Type: text/html; charset=UTF-8');
                         while (@ob_end_clean()) {
                         }
                         // Clean any existing output buffers.
                         exit(_x('<strong>404: Sorry, file not found.</strong> Please contact Support for assistance.', 's2member-front', 's2member'));
                     }
                     return FALSE;
                     // Else return false.
                 }
             }
             if ($serving || $creating) {
                 $basename = basename($req['file_download']);
                 $mimetypes = parse_ini_file(dirname(dirname(dirname(__FILE__))) . '/includes/mime-types.ini');
                 $extension = strtolower(substr($req['file_download'], strrpos($req['file_download'], '.') + 1));
                 $key = $req['file_download_key'] && is_string($req['file_download_key']) ? $req['file_download_key'] : FALSE;
                 $stream = isset($req['file_stream']) ? filter_var($req['file_stream'], FILTER_VALIDATE_BOOLEAN) : (in_array($extension, preg_split('/[' . "\r\n\t" . '\\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_stream_extensions'])) ? TRUE : FALSE);
                 $inline = !$stream && isset($req['file_inline']) ? filter_var($req['file_inline'], FILTER_VALIDATE_BOOLEAN) : ($stream || in_array($extension, preg_split('/[' . "\r\n\t" . '\\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_inline_extensions'])) ? TRUE : FALSE);
                 $ssl = isset($req['file_ssl']) ? filter_var($req['file_ssl'], FILTER_VALIDATE_BOOLEAN) : (is_ssl() ? TRUE : FALSE);
                 $storage = $req['file_storage'] && is_string($req['file_storage']) ? strtolower($req['file_storage']) : FALSE;
                 $remote = isset($req['file_remote']) ? filter_var($req['file_remote'], FILTER_VALIDATE_BOOLEAN) : FALSE;
                 $_basename_dir_app_data = c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir']);
                 $rewrite_base_guess = is_dir(dirname($GLOBALS['WS_PLUGIN__']['s2member']['c']['dir']) . '/' . $_basename_dir_app_data) ? dirname($GLOBALS['WS_PLUGIN__']['s2member']['c']['dir_url']) . '/' . $_basename_dir_app_data : content_url('/' . $_basename_dir_app_data);
                 $rewrite_base = $req['file_rewrite_base'] && is_string($req['file_rewrite_base']) ? $req['file_rewrite_base'] : FALSE;
                 $rewrite = $rewriting = !$rewrite_base && isset($req['file_rewrite']) ? filter_var($req['file_rewrite'], FILTER_VALIDATE_BOOLEAN) : ($rewrite_base ? TRUE : FALSE);
                 unset($_basename_dir_app_data);
                 // A little housekeeping here.
                 $skip_confirmation = isset($req['skip_confirmation']) ? filter_var($req['skip_confirmation'], FILTER_VALIDATE_BOOLEAN) : FALSE;
                 $url_to_storage_source = isset($req['url_to_storage_source']) ? filter_var($req['url_to_storage_source'], FILTER_VALIDATE_BOOLEAN) : FALSE;
                 $file = $GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir'] . '/' . $req['file_download'];
                 $pathinfo = !$using_amazon_storage && $file ? pathinfo($file) : array();
                 $mimetype = $mimetypes[$extension] ? $mimetypes[$extension] : 'application/octet-stream';
                 $disposition = ($inline ? 'inline' : 'attachment') . '; filename="' . c_ws_plugin__s2member_utils_strings::esc_dq($basename) . '"; filename*=UTF-8\'\'' . rawurlencode($basename);
                 $length = !$using_amazon_storage && $file ? filesize($file) : -1;
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action('ws_plugin__s2member_during_file_download_access', get_defined_vars());
                 unset($__refs, $__v);
                 // Housekeeping.
                 if ($using_amazon_storage && $using_amazon_cf_storage && ($serving || $creating && $url_to_storage_source)) {
                     if ($serving) {
                         // We only need this section when/if we're actually serving.
                         wp_redirect(c_ws_plugin__s2member_files_in::amazon_cf_url($req['file_download'], $stream, $inline, $ssl, $basename, $mimetype)) . exit;
                     }
                     return apply_filters('ws_plugin__s2member_file_download_access_url', c_ws_plugin__s2member_files_in::amazon_cf_url($req['file_download'], $stream, $inline, $ssl, $basename, $mimetype), get_defined_vars());
                 } else {
                     if ($using_amazon_storage && $using_amazon_s3_storage && ($serving || $creating && $url_to_storage_source)) {
                         if ($serving) {
                             // We only need this section when/if we're actually serving.
                             wp_redirect(c_ws_plugin__s2member_files_in::amazon_s34_url($req['file_download'], $stream, $inline, $ssl, $basename, $mimetype)) . exit;
                         }
                         return apply_filters('ws_plugin__s2member_file_download_access_url', c_ws_plugin__s2member_files_in::amazon_s34_url($req['file_download'], $stream, $inline, $ssl, $basename, $mimetype), get_defined_vars());
                     } else {
                         if ($creating && $rewriting) {
                             // Note: we don't URL encode unreserved chars. Improves media player compatibility.
                             $_url_e_key = $key ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($key)) : '';
                             $_url_e_storage = $storage ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($storage)) : '';
                             $_url_e_file = c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($req['file_download']));
                             $_url_e_file = str_ireplace('%2F', '/', $_url_e_file);
                             $url = $rewrite_base ? rtrim($rewrite_base, '/') : rtrim($rewrite_base_guess, '/');
                             $url .= isset($req['file_download_key']) ? $key && $_url_e_key ? '/s2member-file-download-key-' . $_url_e_key : '' : '';
                             $url .= isset($req['file_stream']) ? $stream ? '/s2member-file-stream' : '/s2member-file-stream-no' : '';
                             $url .= isset($req['file_inline']) ? $inline ? '/s2member-file-inline' : '/s2member-file-inline-no' : '';
                             $url .= isset($req['file_storage']) ? $storage && $_url_e_storage ? '/s2member-file-storage-' . $_url_e_storage : '' : '';
                             $url .= isset($req['file_remote']) ? $remote ? '/s2member-file-remote' : '/s2member-file-remote-no' : '';
                             $url .= isset($req['skip_confirmation']) ? $skip_confirmation ? '/s2member-skip-confirmation' : '/s2member-skip-confirmation-no' : '';
                             $url = $url . '/' . $_url_e_file;
                             // File Download Access URL via `mod_rewrite` functionality.
                             $url = $ssl ? preg_replace('/^https?/', 'https', $url) : preg_replace('/^https?/', 'http', $url);
                             return apply_filters('ws_plugin__s2member_file_download_access_url', $url, get_defined_vars());
                         } else {
                             if ($creating) {
                                 // Note: we don't URL encode unreserved chars. Improves media player compatibility.
                                 $_url_e_key = $key ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($key)) : '';
                                 $_url_e_storage = $storage ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($storage)) : '';
                                 $_url_e_file = c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($req['file_download']));
                                 $_url_e_file = str_ireplace('%2F', '/', $_url_e_file);
                                 $url = isset($req['file_download_key']) ? $key && $_url_e_key ? '&s2member_file_download_key=' . $_url_e_key : '' : '';
                                 $url .= isset($req['file_stream']) ? $stream ? '&s2member_file_stream=yes' : '&s2member_file_stream=no' : '';
                                 $url .= isset($req['file_inline']) ? $inline ? '&s2member_file_inline=yes' : '&s2member_file_inline=no' : '';
                                 $url .= isset($req['file_storage']) ? $storage && $_url_e_storage ? '&s2member_file_storage=' . $_url_e_storage : '' : '';
                                 $url .= isset($req['file_remote']) ? $remote ? '&s2member_file_remote=yes' : '&s2member_file_remote=no' : '';
                                 $url .= isset($req['skip_confirmation']) ? $skip_confirmation ? '&s2member_skip_confirmation=yes' : '&s2member_skip_confirmation=no' : '';
                                 $url = home_url('/?' . ltrim($url . '&s2member_file_download=/' . $_url_e_file, '&'));
                                 $url = $ssl ? preg_replace('/^https?/', 'https', $url) : preg_replace('/^https?/', 'http', $url);
                                 return apply_filters('ws_plugin__s2member_file_download_access_url', $url, get_defined_vars());
                             } else {
                                 if ($serving) {
                                     @set_time_limit(0);
                                     @ini_set('zlib.output_compression', 0);
                                     if (function_exists('apache_setenv')) {
                                         @apache_setenv('no-gzip', '1');
                                     }
                                     $content_encoding_header = 'Content-Encoding:';
                                     // Default value; standards compliant.
                                     if ($GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_content_encodong_none']) {
                                         $content_encoding_header = 'Content-Encoding: none';
                                     }
                                     while (@ob_end_clean()) {
                                     }
                                     // Cleans existing output buffers.
                                     if ($range) {
                                         if (strpos($range, '=') === FALSE) {
                                             status_header(416);
                                             nocache_headers();
                                             header($content_encoding_header);
                                             header('Accept-Ranges: bytes');
                                             header('Content-Type: ' . $mimetype);
                                             header('Content-Length: ' . $length);
                                             header('Content-Disposition: ' . $disposition);
                                             exit;
                                             // Stop here (invalid).
                                         }
                                         list($range_type, $byte_range) = preg_split('/\\s*\\=\\s*/', $range, 2);
                                         $range_type = strtolower(trim($range_type));
                                         $byte_range = trim($byte_range);
                                         if ($range_type !== 'bytes') {
                                             status_header(416);
                                             nocache_headers();
                                             header($content_encoding_header);
                                             header('Accept-Ranges: bytes');
                                             header('Content-Type: ' . $mimetype);
                                             header('Content-Length: ' . $length);
                                             header('Content-Disposition: ' . $disposition);
                                             exit;
                                             // Stop here (invalid).
                                         }
                                         $byte_ranges = preg_split('/\\s*,\\s*/', $byte_range);
                                         if (strpos($byte_ranges[0], '-') === FALSE) {
                                             status_header(416);
                                             nocache_headers();
                                             header($content_encoding_header);
                                             header('Accept-Ranges: bytes');
                                             header('Content-Type: ' . $mimetype);
                                             header('Content-Length: ' . $length);
                                             header('Content-Disposition: ' . $disposition);
                                             exit;
                                             // Stop here (invalid).
                                         }
                                         // Only dealing with the first byte range. Others are simply ignored here.
                                         list($byte_range_start, $byte_range_stops) = preg_split('/\\s*\\-\\s*/', $byte_ranges[0], 2);
                                         $byte_range_start = trim($byte_range_start);
                                         $byte_range_stops = trim($byte_range_stops);
                                         $byte_range_start = $byte_range_start === '' ? NULL : (int) $byte_range_start;
                                         $byte_range_stops = $byte_range_stops === '' ? NULL : (int) $byte_range_stops;
                                         if (!isset($byte_range_start) && $byte_range_stops > 0 && $byte_range_stops <= $length) {
                                             $byte_range_start = $length - $byte_range_stops;
                                             $byte_range_stops = $length - 1;
                                             // The last X number of bytes.
                                         } else {
                                             if (!isset($byte_range_stops) && $byte_range_start >= 0 && $byte_range_start < $length - 1) {
                                                 $byte_range_stops = $length - 1;
                                                 // To the end of the file in this case.
                                             } else {
                                                 if (isset($byte_range_start, $byte_range_stops) && $byte_range_start >= 0 && $byte_range_start < $length - 1 && $byte_range_stops > $byte_range_start && $byte_range_stops <= $length - 1) {
                                                     // Nothing to do in this case, starts/stops already defined properly.
                                                 } else {
                                                     status_header(416);
                                                     nocache_headers();
                                                     header($content_encoding_header);
                                                     header('Accept-Ranges: bytes');
                                                     header('Content-Type: ' . $mimetype);
                                                     header('Content-Length: ' . $length);
                                                     header('Content-Disposition: ' . $disposition);
                                                     exit;
                                                     // Stop here (invalid).
                                                 }
                                             }
                                         }
                                         status_header(206);
                                         nocache_headers();
                                         header($content_encoding_header);
                                         header('Accept-Ranges: bytes');
                                         header('Content-Type: ' . $mimetype);
                                         header('Content-Range: bytes ' . $byte_range_start . '-' . $byte_range_stops . '/' . $length);
                                         $byte_range_size = $byte_range_stops - $byte_range_start + 1;
                                         header('Content-Length: ' . $byte_range_size);
                                         header('Content-Disposition: ' . $disposition);
                                     } else {
                                         status_header(200);
                                         nocache_headers();
                                         header($content_encoding_header);
                                         header('Accept-Ranges: bytes');
                                         header('Content-Type: ' . $mimetype);
                                         header('Content-Length: ' . $length);
                                         header('Content-Disposition: ' . $disposition);
                                     }
                                     if (is_resource($resource = fopen($file, 'rb'))) {
                                         if ($range && isset($byte_range_size, $byte_range_start)) {
                                             $_bytes_to_read = $byte_range_size;
                                             fseek($resource, $byte_range_start);
                                         } else {
                                             $_bytes_to_read = $length;
                                         }
                                         // Entire file.
                                         $chunk_size = apply_filters('ws_plugin__s2member_file_downloads_chunk_size', 2097152, get_defined_vars());
                                         while ($_bytes_to_read > 0) {
                                             $_bytes_to_read -= $_reading = $_bytes_to_read > $chunk_size ? $chunk_size : $_bytes_to_read;
                                             echo fread($resource, $_reading);
                                             // Serve file in chunks (default chunk size is 2MB).
                                             flush();
                                             // Flush each chunk to the browser as it is served (avoids high memory consumption).
                                         }
                                         fclose($resource);
                                         // Close file resource handle.
                                         unset($_bytes_to_read, $_reading);
                                         // Housekeeping.
                                     }
                                     exit;
                                     // Stop execution now (the file has been served).
                                 }
                             }
                         }
                     }
                 }
             }
         } else {
             if ($serving && $req['file_download']) {
                 status_header(503);
                 header('Content-Type: text/html; charset=UTF-8');
                 while (@ob_end_clean()) {
                 }
                 // Clean any existing output buffers.
                 exit(_x('<strong>503: Access denied.</strong> Invalid File Download specs.', 's2member-front', 's2member'));
             } else {
                 if ($creating) {
                     return FALSE;
                 }
             }
         }
     }
     // We only need this section when/if we're creating a URL.
     do_action('ws_plugin__s2member_after_file_download_access', get_defined_vars());
     return $creating ? FALSE : NULL;
     // If creating, false.
 }
Example #8
0
 /**
  * Filters WordPress Page queries that use wp_list_pages()
  *
  * @package s2Member\Queries
  * @since 130617
  *
  * @attaches-to ``add_filter('wp_list_pages_excludes');``
  *
  * @param array $excludes An array of any existing excludes.
  *
  * @return array The array of ``$excludes``.
  */
 public static function _query_level_access_list_pages($excludes = array())
 {
     if (!$GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query'] || !in_array('all', $GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query']) && !in_array('pages', $GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query'])) {
         return $excludes;
     }
     // Not applicable.
     $systematics = array();
     // Initialize.
     $systematics[] = $GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_limit_exceeded_page'];
     if (!is_user_logged_in()) {
         $systematics[] = $GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page'];
     }
     $systematics = c_ws_plugin__s2member_utils_arrays::force_integers($systematics);
     // Force integer values here.
     $excludes = array_merge($excludes, $systematics);
     for ($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) {
         if ($GLOBALS['WS_PLUGIN__']['s2member']['o']['level' . $n . '_pages'] === 'all' && !current_user_can('access_s2member_level' . $n)) {
             $excludes = array_merge($excludes, c_ws_plugin__s2member_utils_arrays::force_integers(c_ws_plugin__s2member_utils_gets::get_all_page_ids()));
         } else {
             if ($GLOBALS['WS_PLUGIN__']['s2member']['o']['level' . $n . '_pages'] && !current_user_can('access_s2member_level' . $n)) {
                 $excludes = array_merge($excludes, c_ws_plugin__s2member_utils_arrays::force_integers(preg_split('/[' . "\r\n\t" . '\\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level' . $n . '_pages'])));
             }
         }
     }
     return apply_filters('_ws_plugin__s2member_query_level_access_list_pages', $excludes, get_defined_vars());
 }
 /**
  * Listens to Collective EOT/MOD Events processed internally by s2Member.
  *
  * This is only applicable when ``['custom_reg_auto_opt_outs']`` contains related Event(s).
  *
  * @package s2Member\List_Servers
  * @since 3.5
  *
  * @attaches-to ``add_action('ws_plugin__s2member_during_collective_mods');``
  * @attaches-to ``add_action('ws_plugin__s2member_during_collective_eots');``
  *
  * @param int|string $user_id Required. A WordPress User ID, numeric string or integer.
  * @param array      $vars Required. An array of defined variables passed by the calling Hook.
  * @param string     $event Required. A specific event that triggered this call from the Action Hook.
  * @param string     $event_spec Required. A specific event specification *(a broader classification)*.
  * @param string     $mod_new_role Required if ``$event_spec === 'modification'`` (but can be empty). Role the User is being modified to.
  * @param string     $mod_new_user Optional. If ``$event_spec === 'modification'``, the new User object with current details.
  * @param string     $mod_old_user Optional. If ``$event_spec === 'modification'``, the old/previous User obj with old details.
  */
 public static function auto_process_list_server_removals($user_id, $vars, $event, $event_spec, $mod_new_role = NULL, $mod_new_user = NULL, $mod_old_user = NULL)
 {
     global $current_site, $current_blog;
     // For Multisite support.
     static $auto_processed = array();
     foreach (array_keys(get_defined_vars()) as $__v) {
         $__refs[$__v] =& ${$__v};
     }
     do_action('ws_plugin__s2member_before_auto_process_list_server_removals', get_defined_vars());
     unset($__refs, $__v);
     $custom_reg_auto_op_outs = c_ws_plugin__s2member_utils_strings::wrap_deep($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_auto_opt_outs'], '/^', '$/i');
     if (c_ws_plugin__s2member_list_servers::list_servers_integrated() && $user_id && is_numeric($user_id) && !in_array($user_id, $auto_processed) && is_array($vars) && is_string($event = (string) $event) && is_string($event_spec = (string) $event_spec) && (c_ws_plugin__s2member_utils_arrays::in_regex_array($event, $custom_reg_auto_op_outs) || c_ws_plugin__s2member_utils_arrays::in_regex_array($event_spec, $custom_reg_auto_op_outs)) && is_object($user = $_user = new WP_User($user_id)) && !empty($user->ID)) {
         $mod_new_role = $event_spec === 'modification' && $mod_new_role && is_string($mod_new_role) ? $mod_new_role : FALSE;
         // Might be empty(i.e. they now have NO Role).
         $mod_new_user = $event_spec === 'modification' && $mod_new_user && is_object($mod_new_user) && !empty($mod_new_user->ID) && $mod_new_user->ID === $_user->ID ? $mod_new_user : FALSE;
         $mod_old_user = $event_spec === 'modification' && $mod_old_user && is_object($mod_old_user) && !empty($mod_old_user->ID) && $mod_old_user->ID === $_user->ID ? $mod_old_user : FALSE;
         $user = $event_spec === 'modification' && $mod_old_user ? $mod_old_user : $_user;
         // Now, should we switch over to the old/previous User object ``$mod_old_user`` here? Or, should we use the one pulled by this routine with the User's ID?
         if (($event_spec !== 'modification' || $event_spec === 'modification' && (string) $mod_new_role !== c_ws_plugin__s2member_user_access::user_access_role($user) && strtotime($user->user_registered) < strtotime('-10 seconds') && ($event !== 'user-role-change' || $event === 'user-role-change' && !empty($vars['_p']['ws_plugin__s2member_custom_reg_auto_opt_out_transitions']))) && ($auto_processed[$user->ID] = TRUE)) {
             $removed = c_ws_plugin__s2member_list_servers::process_list_server_removals(c_ws_plugin__s2member_user_access::user_access_role($user), c_ws_plugin__s2member_user_access::user_access_level($user), $user->user_login, FALSE, $user->user_email, $user->first_name, $user->last_name, FALSE, TRUE, $user->ID);
             if ($event_spec === 'modification' && $mod_new_role && ($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_auto_opt_out_transitions'] === '2' || $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_auto_opt_out_transitions'] === '1' && $removed)) {
                 $user = $event_spec === 'modification' && $mod_new_user ? $mod_new_user : $_user;
                 // Now, should we switch over to a new/current User object ``$mod_new_user`` here? (which may contain newly updated details). Or, should we simply use the User object pulled by this routine with the User's ID?
                 $transitioned = c_ws_plugin__s2member_list_servers::process_list_servers($mod_new_role, c_ws_plugin__s2member_user_access::user_access_role_to_level($mod_new_role), $user->user_login, FALSE, $user->user_email, $user->first_name, $user->last_name, FALSE, TRUE, $removed ? FALSE : TRUE, $user->ID);
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action('ws_plugin__s2member_during_auto_process_list_server_removal_transitions', get_defined_vars());
                 unset($__refs, $__v);
             }
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action('ws_plugin__s2member_during_auto_process_list_server_removals', get_defined_vars());
             unset($__refs, $__v);
         }
     }
     foreach (array_keys(get_defined_vars()) as $__v) {
         $__refs[$__v] =& ${$__v};
     }
     do_action('ws_plugin__s2member_after_auto_process_list_server_removals', get_defined_vars());
     unset($__refs, $__v);
 }
 /**
  * s2Member's PayPal IPN handler (inner processing routine).
  *
  * @package s2Member\PayPal
  * @since 110720
  *
  * @param array $vars Required. An array of defined variables passed by {@link s2Member\PayPal\c_ws_plugin__s2member_paypal_notify_in::paypal_notify()}.
  *
  * @return array|bool The original ``$paypal`` array passed in (extracted) from ``$vars``, or false when conditions do NOT apply.
  */
 public static function cp($vars = array())
 {
     extract($vars, EXTR_OVERWRITE | EXTR_REFS);
     // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
     if (!empty($paypal['txn_type']) && preg_match('/^web_accept$/i', $paypal['txn_type']) && (!empty($paypal['item_number']) && preg_match($GLOBALS['WS_PLUGIN__']['s2member']['c']['sp_access_item_number_regex'], $paypal['item_number'])) && (empty($paypal['payment_status']) || empty($payment_status_issues) || !preg_match($payment_status_issues, $paypal['payment_status'])) && !empty($paypal['payer_email']) && !empty($paypal['txn_id']) && (!empty($paypal['txn_baid']) || ($paypal['txn_baid'] = $paypal['txn_id'])) && (!empty($paypal['txn_cid']) || ($paypal['txn_cid'] = $paypal['txn_id']))) {
         foreach (array_keys(get_defined_vars()) as $__v) {
             $__refs[$__v] =& ${$__v};
         }
         do_action('ws_plugin__s2member_during_paypal_notify_before_sp_access', get_defined_vars());
         unset($__refs, $__v);
         if (!get_transient($transient_ipn = 's2m_ipn_' . md5('s2member_transient_' . $_paypal_s)) && set_transient($transient_ipn, time(), 31556926 * 10)) {
             $paypal['s2member_log'][] = 's2Member `txn_type` identified as ( `web_accept` ) for Specific Post/Page Access.';
             list(, $paypal['sp_ids'], $paypal['hours']) = preg_split('/\\:/', $paypal['item_number'], 3);
             $paypal['ip'] = preg_match('/ip address/i', $paypal['option_name2']) && $paypal['option_selection2'] ? $paypal['option_selection2'] : '';
             $paypal['ip'] = !$paypal['ip'] && preg_match('/^[a-z0-9]+~[0-9\\.]+$/i', $paypal['invoice']) ? preg_replace('/^[a-z0-9]+~/i', '', $paypal['invoice']) : $paypal['ip'];
             $paypal['currency'] = strtoupper($paypal['mc_currency']);
             // Normalize input currency.
             $paypal['currency_symbol'] = c_ws_plugin__s2member_utils_cur::symbol($paypal['currency']);
             if (!empty($coupon['coupon_code']) && c_ws_plugin__s2member_utils_conds::pro_is_installed()) {
                 $coupon_class = new c_ws_plugin__s2member_pro_coupons();
                 $coupon_class->update_uses($coupon['coupon_code']);
             }
             if ($sp_access_url = c_ws_plugin__s2member_sp_access::sp_access_link_gen($paypal['sp_ids'], $paypal['hours'])) {
                 $processing = $during = TRUE;
                 // Yes, we ARE processing this.
                 if (preg_match('/(referenc|associat)/i', $paypal['option_name1']) && $paypal['option_selection1']) {
                     // Associating this purchase with a Member?
                     if (($user_id = c_ws_plugin__s2member_utils_users::get_user_id_with($paypal['option_selection1'], $paypal['option_selection1'])) && is_object($user = new WP_User($user_id)) && $user->ID) {
                         $sp_references = (array) get_user_option('s2member_sp_references', $user_id);
                         $_sp_reference = array('time' => time(), 'ids' => $paypal['sp_ids'], 'hours' => $paypal['hours'], 'url' => $sp_access_url);
                         $sp_references = c_ws_plugin__s2member_utils_arrays::array_unique(array_merge($sp_references, $_sp_reference));
                         update_user_option($user_id, 's2member_sp_references', $sp_references);
                         if (!empty($coupon['full_coupon_code']) && c_ws_plugin__s2member_utils_conds::pro_is_installed()) {
                             $user_coupons = is_array($user_coupons = get_user_option('s2member_coupon_codes', $user_id)) ? $user_coupons : array();
                             $user_coupons = array_unique(array_merge($user_coupons, (array) $coupon['full_coupon_code']));
                             update_user_option($user_id, 's2member_coupon_codes', $user_coupons);
                         }
                         $paypal['s2member_log'][] = 'Specific Post/Page ~ Sale associated with User ID: ' . $user_id . '.';
                     }
                 }
                 $sbj = preg_replace('/%%sp_access_url%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($sp_access_url), $GLOBALS['WS_PLUGIN__']['s2member']['o'][($_REQUEST['s2member_paypal_proxy'] && preg_match('/pro-emails/', $_REQUEST['s2member_paypal_proxy_use']) ? 'pro_' : '') . 'sp_email_subject']);
                 $sbj = preg_replace('/%%sp_access_exp%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime('+' . $paypal['hours'] . ' hours'))), $sbj);
                 $msg = preg_replace('/%%sp_access_url%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($sp_access_url), $GLOBALS['WS_PLUGIN__']['s2member']['o'][($_REQUEST['s2member_paypal_proxy'] && preg_match('/pro-emails/', $_REQUEST['s2member_paypal_proxy_use']) ? 'pro_' : '') . 'sp_email_message']);
                 $msg = preg_replace('/%%sp_access_exp%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime('+' . $paypal['hours'] . ' hours'))), $msg);
                 $rec = preg_replace('/%%sp_access_url%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($sp_access_url), $GLOBALS['WS_PLUGIN__']['s2member']['o'][($_REQUEST['s2member_paypal_proxy'] && preg_match('/pro-emails/', $_REQUEST['s2member_paypal_proxy_use']) ? 'pro_' : '') . 'sp_email_recipients']);
                 $rec = preg_replace('/%%sp_access_exp%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime('+' . $paypal['hours'] . ' hours'))), $rec);
                 if (($rec = c_ws_plugin__s2member_utils_strings::fill_cvs($rec, $paypal['custom'])) && ($rec = preg_replace('/%%txn_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_id']), $rec))) {
                     if ($rec = preg_replace('/%%amount%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['mc_gross']), $rec)) {
                         // Full amount of the payment, before fee is subtracted.
                         if (($rec = preg_replace('/%%currency%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['currency']), $rec)) && ($rec = preg_replace('/%%currency_symbol%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['currency_symbol']), $rec))) {
                             if (($rec = preg_replace('/%%txn_baid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_baid']), $rec)) && ($rec = preg_replace('/%%txn_cid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_cid']), $rec))) {
                                 if (($rec = preg_replace('/%%item_number%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['item_number']), $rec)) && ($rec = preg_replace('/%%item_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['item_name']), $rec))) {
                                     if (($rec = preg_replace('/%%first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_dq(c_ws_plugin__s2member_utils_strings::esc_refs($paypal['first_name'])), $rec)) && ($rec = preg_replace('/%%last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_dq(c_ws_plugin__s2member_utils_strings::esc_refs($paypal['last_name'])), $rec))) {
                                         if ($rec = preg_replace('/%%full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_dq(c_ws_plugin__s2member_utils_strings::esc_refs(trim($paypal['first_name'] . ' ' . $paypal['last_name']))), $rec)) {
                                             // **NOTE** c_ws_plugin__s2member_utils_strings::esc_dq() is applied here. (ex. 'N\'ame' <email>).
                                             if ($rec = preg_replace('/%%payer_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['payer_email']), $rec)) {
                                                 if ($rec = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['ip']), $rec)) {
                                                     if (($rec = preg_replace('/%%full_coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['full_coupon_code']), $rec)) && ($rec = preg_replace('/%%coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['coupon_code']), $rec)) && ($rec = preg_replace('/%%coupon_affiliate_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['affiliate_id']), $rec))) {
                                                         if (($sbj = c_ws_plugin__s2member_utils_strings::fill_cvs($sbj, $paypal['custom'])) && ($sbj = preg_replace('/%%txn_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_id']), $sbj))) {
                                                             if ($sbj = preg_replace('/%%amount%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['mc_gross']), $sbj)) {
                                                                 // Full amount of the payment, before fee is subtracted.
                                                                 if (($sbj = preg_replace('/%%currency%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['currency']), $sbj)) && ($sbj = preg_replace('/%%currency_symbol%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['currency_symbol']), $sbj))) {
                                                                     if (($sbj = preg_replace('/%%txn_baid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_baid']), $sbj)) && ($sbj = preg_replace('/%%txn_cid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_cid']), $sbj))) {
                                                                         if (($sbj = preg_replace('/%%item_number%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['item_number']), $sbj)) && ($sbj = preg_replace('/%%item_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['item_name']), $sbj))) {
                                                                             if (($sbj = preg_replace('/%%first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['first_name']), $sbj)) && ($sbj = preg_replace('/%%last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['last_name']), $sbj))) {
                                                                                 if ($sbj = preg_replace('/%%full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(trim($paypal['first_name'] . ' ' . $paypal['last_name'])), $sbj)) {
                                                                                     if ($sbj = preg_replace('/%%payer_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['payer_email']), $sbj)) {
                                                                                         if ($sbj = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['ip']), $sbj)) {
                                                                                             if (($sbj = preg_replace('/%%full_coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['full_coupon_code']), $sbj)) && ($sbj = preg_replace('/%%coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['coupon_code']), $sbj)) && ($sbj = preg_replace('/%%coupon_affiliate_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['affiliate_id']), $sbj))) {
                                                                                                 if (($msg = c_ws_plugin__s2member_utils_strings::fill_cvs($msg, $paypal['custom'])) && ($msg = preg_replace('/%%txn_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_id']), $msg))) {
                                                                                                     if ($msg = preg_replace('/%%amount%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['mc_gross']), $msg)) {
                                                                                                         // Full amount of the payment, before fee is subtracted.
                                                                                                         if (($msg = preg_replace('/%%currency%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['currency']), $msg)) && ($msg = preg_replace('/%%currency_symbol%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['currency_symbol']), $msg))) {
                                                                                                             if (($msg = preg_replace('/%%txn_baid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_baid']), $msg)) && ($msg = preg_replace('/%%txn_cid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_cid']), $msg))) {
                                                                                                                 if (($msg = preg_replace('/%%item_number%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['item_number']), $msg)) && ($msg = preg_replace('/%%item_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['item_name']), $msg))) {
                                                                                                                     if (($msg = preg_replace('/%%first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['first_name']), $msg)) && ($msg = preg_replace('/%%last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['last_name']), $msg))) {
                                                                                                                         if ($msg = preg_replace('/%%full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(trim($paypal['first_name'] . ' ' . $paypal['last_name'])), $msg)) {
                                                                                                                             if ($msg = preg_replace('/%%payer_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['payer_email']), $msg)) {
                                                                                                                                 if ($msg = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['ip']), $msg)) {
                                                                                                                                     if (($msg = preg_replace('/%%full_coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['full_coupon_code']), $msg)) && ($msg = preg_replace('/%%coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['coupon_code']), $msg)) && ($msg = preg_replace('/%%coupon_affiliate_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['affiliate_id']), $msg))) {
                                                                                                                                         if (($rec = trim(preg_replace('/%%(.+?)%%/i', '', $rec))) && ($sbj = trim(preg_replace('/%%(.+?)%%/i', '', $sbj))) && ($msg = trim(preg_replace('/%%(.+?)%%/i', '', $msg)))) {
                                                                                                                                             if (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) {
                                                                                                                                                 $sbj = c_ws_plugin__s2member_utilities::evl($sbj, get_defined_vars());
                                                                                                                                                 $msg = c_ws_plugin__s2member_utilities::evl($msg, get_defined_vars());
                                                                                                                                             }
                                                                                                                                             foreach (c_ws_plugin__s2member_utils_strings::parse_emails($rec) as $recipient) {
                                                                                                                                                 // Go through a possible list of recipients.
                                                                                                                                                 c_ws_plugin__s2member_email_configs::email_config() . wp_mail($recipient, apply_filters('ws_plugin__s2member_sp_email_sbj', $sbj, get_defined_vars()), apply_filters('ws_plugin__s2member_sp_email_msg', $msg, get_defined_vars()), 'From: "' . preg_replace('/"/', '"', $GLOBALS['WS_PLUGIN__']['s2member']['o']['reg_email_from_name']) . '" <' . $GLOBALS['WS_PLUGIN__']['s2member']['o']['reg_email_from_email'] . '>' . "\r\n" . 'Content-Type: text/plain; charset=UTF-8') . c_ws_plugin__s2member_email_configs::email_config_release();
                                                                                                                                             }
                                                                                                                                             $paypal['s2member_log'][] = 'Specific Post/Page Confirmation Email sent to: ' . $rec . '.';
                                                                                                                                         }
                                                                                                                                     }
                                                                                                                                 }
                                                                                                                             }
                                                                                                                         }
                                                                                                                     }
                                                                                                                 }
                                                                                                             }
                                                                                                         }
                                                                                                     }
                                                                                                 }
                                                                                             }
                                                                                         }
                                                                                     }
                                                                                 }
                                                                             }
                                                                         }
                                                                     }
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
                 if ($processing && $GLOBALS['WS_PLUGIN__']['s2member']['o']['sp_sale_notification_urls']) {
                     foreach (preg_split('/[' . "\r\n\t" . ']+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['sp_sale_notification_urls']) as $url) {
                         if (($url = c_ws_plugin__s2member_utils_strings::fill_cvs($url, $paypal['custom'], true)) && ($url = preg_replace('/%%sp_access_url%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(rawurlencode($sp_access_url)), $url))) {
                             if ($url = preg_replace('/%%sp_access_exp%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime('+' . $paypal['hours'] . ' hours')))), $url)) {
                                 if (($url = preg_replace('/%%currency%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['currency'])), $url)) && ($url = preg_replace('/%%currency_symbol%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['currency_symbol'])), $url))) {
                                     if (($url = preg_replace('/%%amount%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['mc_gross'])), $url)) && ($url = preg_replace('/%%txn_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['txn_id'])), $url))) {
                                         if (($url = preg_replace('/%%txn_baid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['txn_baid'])), $url)) && ($url = preg_replace('/%%txn_cid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['txn_cid'])), $url))) {
                                             if (($url = preg_replace('/%%item_number%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['item_number'])), $url)) && ($url = preg_replace('/%%item_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['item_name'])), $url))) {
                                                 if (($url = preg_replace('/%%first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['first_name'])), $url)) && ($url = preg_replace('/%%last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['last_name'])), $url))) {
                                                     if ($url = preg_replace('/%%full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode(trim($paypal['first_name'] . ' ' . $paypal['last_name']))), $url)) {
                                                         if ($url = preg_replace('/%%payer_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['payer_email'])), $url)) {
                                                             if ($url = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['ip'])), $url)) {
                                                                 if (($url = preg_replace('/%%full_coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($coupon['full_coupon_code'])), $url)) && ($url = preg_replace('/%%coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($coupon['coupon_code'])), $url)) && ($url = preg_replace('/%%coupon_affiliate_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($coupon['affiliate_id'])), $url))) {
                                                                     if ($url = trim(preg_replace('/%%(.+?)%%/i', '', $url))) {
                                                                         c_ws_plugin__s2member_utils_urls::remote($url);
                                                                     }
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                     $paypal['s2member_log'][] = 'Specific Post/Page ~ Sale Notification URLs have been processed.';
                 }
                 if ($processing && $GLOBALS['WS_PLUGIN__']['s2member']['o']['sp_sale_notification_recipients']) {
                     $msg = $sbj = '(s2Member / API Notification Email) - Specific Post/Page ~ Sale';
                     $msg .= "\n\n";
                     // Spacing in the message body.
                     $msg .= 'sp_access_url: %%sp_access_url%%' . "\n";
                     $msg .= 'sp_access_exp: %%sp_access_exp%%' . "\n";
                     $msg .= 'currency: %%currency%%' . "\n";
                     $msg .= 'currency_symbol: %%currency_symbol%%' . "\n";
                     $msg .= 'amount: %%amount%%' . "\n";
                     $msg .= 'txn_id: %%txn_id%%' . "\n";
                     $msg .= 'txn_baid: %%txn_baid%%' . "\n";
                     $msg .= 'txn_cid: %%txn_cid%%' . "\n";
                     $msg .= 'item_number: %%item_number%%' . "\n";
                     $msg .= 'item_name: %%item_name%%' . "\n";
                     $msg .= 'first_name: %%first_name%%' . "\n";
                     $msg .= 'last_name: %%last_name%%' . "\n";
                     $msg .= 'full_name: %%full_name%%' . "\n";
                     $msg .= 'payer_email: %%payer_email%%' . "\n";
                     $msg .= 'user_ip: %%user_ip%%' . "\n";
                     $msg .= 'full_coupon_code: %%full_coupon_code%%' . "\n";
                     $msg .= 'coupon_code: %%coupon_code%%' . "\n";
                     $msg .= 'coupon_affiliate_id: %%coupon_affiliate_id%%' . "\n";
                     $msg .= 'cv0: %%cv0%%' . "\n";
                     $msg .= 'cv1: %%cv1%%' . "\n";
                     $msg .= 'cv2: %%cv2%%' . "\n";
                     $msg .= 'cv3: %%cv3%%' . "\n";
                     $msg .= 'cv4: %%cv4%%' . "\n";
                     $msg .= 'cv5: %%cv5%%' . "\n";
                     $msg .= 'cv6: %%cv6%%' . "\n";
                     $msg .= 'cv7: %%cv7%%' . "\n";
                     $msg .= 'cv8: %%cv8%%' . "\n";
                     $msg .= 'cv9: %%cv9%%';
                     if (($msg = c_ws_plugin__s2member_utils_strings::fill_cvs($msg, $paypal['custom'])) && ($msg = preg_replace('/%%sp_access_url%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($sp_access_url), $msg))) {
                         if ($msg = preg_replace('/%%sp_access_exp%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime('+' . $paypal['hours'] . ' hours'))), $msg)) {
                             if (($msg = preg_replace('/%%currency%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['currency']), $msg)) && ($msg = preg_replace('/%%currency_symbol%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['currency_symbol']), $msg))) {
                                 if (($msg = preg_replace('/%%amount%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['mc_gross']), $msg)) && ($msg = preg_replace('/%%txn_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_id']), $msg))) {
                                     if (($msg = preg_replace('/%%txn_baid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_baid']), $msg)) && ($msg = preg_replace('/%%txn_cid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_cid']), $msg))) {
                                         if (($msg = preg_replace('/%%item_number%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['item_number']), $msg)) && ($msg = preg_replace('/%%item_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['item_name']), $msg))) {
                                             if (($msg = preg_replace('/%%first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['first_name']), $msg)) && ($msg = preg_replace('/%%last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['last_name']), $msg))) {
                                                 if ($msg = preg_replace('/%%full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(trim($paypal['first_name'] . ' ' . $paypal['last_name'])), $msg)) {
                                                     if ($msg = preg_replace('/%%payer_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['payer_email']), $msg)) {
                                                         if ($msg = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['ip']), $msg)) {
                                                             if (($msg = preg_replace('/%%full_coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['full_coupon_code']), $msg)) && ($msg = preg_replace('/%%coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['coupon_code']), $msg)) && ($msg = preg_replace('/%%coupon_affiliate_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['affiliate_id']), $msg))) {
                                                                 if ($sbj && ($msg = trim(preg_replace('/%%(.+?)%%/i', '', $msg)))) {
                                                                     // Still have a ``$sbj`` and a ``$msg``?
                                                                     foreach (c_ws_plugin__s2member_utils_strings::parse_emails($GLOBALS['WS_PLUGIN__']['s2member']['o']['sp_sale_notification_recipients']) as $recipient) {
                                                                         wp_mail($recipient, apply_filters('ws_plugin__s2member_sp_sale_notification_email_sbj', $sbj, get_defined_vars()), apply_filters('ws_plugin__s2member_sp_sale_notification_email_msg', $msg, get_defined_vars()), 'Content-Type: text/plain; charset=UTF-8');
                                                                     }
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                     $paypal['s2member_log'][] = 'Specific Post/Page ~ Sale Notification Emails have been processed.';
                 }
                 if ($processing && $_REQUEST['s2member_paypal_proxy'] && ($url = $_REQUEST['s2member_paypal_proxy_return_url'])) {
                     if (($url = c_ws_plugin__s2member_utils_strings::fill_cvs($url, $paypal['custom'], true)) && ($url = preg_replace('/%%sp_access_url%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(rawurlencode($sp_access_url)), $url))) {
                         if ($url = preg_replace('/%%sp_access_exp%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode(c_ws_plugin__s2member_utils_time::approx_time_difference(time(), strtotime('+' . $paypal['hours'] . ' hours')))), $url)) {
                             if (($url = preg_replace('/%%currency%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['currency'])), $url)) && ($url = preg_replace('/%%currency_symbol%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['currency_symbol'])), $url))) {
                                 if (($url = preg_replace('/%%amount%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['mc_gross'])), $url)) && ($url = preg_replace('/%%txn_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['txn_id'])), $url))) {
                                     if (($url = preg_replace('/%%txn_baid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['txn_baid'])), $url)) && ($url = preg_replace('/%%txn_cid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['txn_cid'])), $url))) {
                                         if (($url = preg_replace('/%%item_number%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['item_number'])), $url)) && ($url = preg_replace('/%%item_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['item_name'])), $url))) {
                                             if (($url = preg_replace('/%%first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['first_name'])), $url)) && ($url = preg_replace('/%%last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['last_name'])), $url))) {
                                                 if ($url = preg_replace('/%%full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode(trim($paypal['first_name'] . ' ' . $paypal['last_name']))), $url)) {
                                                     if ($url = preg_replace('/%%payer_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['payer_email'])), $url)) {
                                                         if ($url = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($paypal['ip'])), $url)) {
                                                             if (($url = preg_replace('/%%full_coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($coupon['full_coupon_code'])), $url)) && ($url = preg_replace('/%%coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($coupon['coupon_code'])), $url)) && ($url = preg_replace('/%%coupon_affiliate_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($coupon['affiliate_id'])), $url))) {
                                                                 if ($url = trim($url)) {
                                                                     // Preserve Remaining replacements.
                                                                     // Because the parent routine may perform replacements too.
                                                                     $paypal['s2member_paypal_proxy_return_url'] = $url;
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                     $paypal['s2member_log'][] = 'Specific Post/Page Return, a Proxy Return URL is ready.';
                 }
                 if ($processing && ($code = $GLOBALS['WS_PLUGIN__']['s2member']['o']['sp_tracking_codes'])) {
                     if (($code = c_ws_plugin__s2member_utils_strings::fill_cvs($code, $paypal['custom'])) && ($code = preg_replace('/%%amount%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['mc_gross']), $code)) && ($code = preg_replace('/%%txn_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_id']), $code))) {
                         if (($code = preg_replace('/%%currency%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['currency']), $code)) && ($code = preg_replace('/%%currency_symbol%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['currency_symbol']), $code))) {
                             if (($code = preg_replace('/%%txn_baid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_baid']), $code)) && ($code = preg_replace('/%%txn_cid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['txn_cid']), $code))) {
                                 if (($code = preg_replace('/%%item_number%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['item_number']), $code)) && ($code = preg_replace('/%%item_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['item_name']), $code))) {
                                     if (($code = preg_replace('/%%first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['first_name']), $code)) && ($code = preg_replace('/%%last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['last_name']), $code))) {
                                         if ($code = preg_replace('/%%full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(trim($paypal['first_name'] . ' ' . $paypal['last_name'])), $code)) {
                                             if ($code = preg_replace('/%%payer_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['payer_email']), $code)) {
                                                 if ($code = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($paypal['ip']), $code)) {
                                                     if (($code = preg_replace('/%%full_coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['full_coupon_code']), $code)) && ($code = preg_replace('/%%coupon_code%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['coupon_code']), $code)) && ($code = preg_replace('/%%coupon_affiliate_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($coupon['affiliate_id']), $code))) {
                                                         if ($code = trim(preg_replace('/%%(.+?)%%/i', '', $code))) {
                                                             $paypal['s2member_log'][] = 'Storing Specific Post/Page Tracking Codes into a Transient Queue. These will be processed on-site.';
                                                             set_transient('s2m_' . md5('s2member_transient_sp_tracking_codes_' . $paypal['txn_id']), $code, 43200);
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action('ws_plugin__s2member_during_paypal_notify_during_sp_access', get_defined_vars());
                 unset($__refs, $__v);
             } else {
                 $paypal['s2member_log'][] = 'Unable to generate Access Link for Specific Post/Page Access. Does your Leading Post/Page still exist?';
             }
         } else {
             $paypal['s2member_log'][] = 'Not processing. Duplicate IPN.';
             $paypal['s2member_log'][] = 's2Member `txn_type` identified as ( `web_accept` ) for Specific Post/Page Access.';
             $paypal['s2member_log'][] = 'Duplicate IPN. Already processed. This IPN will be ignored.';
         }
         foreach (array_keys(get_defined_vars()) as $__v) {
             $__refs[$__v] =& ${$__v};
         }
         do_action('ws_plugin__s2member_during_paypal_notify_after_sp_access', get_defined_vars());
         unset($__refs, $__v);
         return apply_filters('c_ws_plugin__s2member_paypal_notify_in_web_accept_sp', $paypal, get_defined_vars());
     } else {
         return apply_filters('c_ws_plugin__s2member_paypal_notify_in_web_accept_sp', FALSE, get_defined_vars());
     }
 }
 /**
  * Listens to Collective EOT/MOD events processed by s2Member.
  *
  * @since 3.5
  * @package s2Member\List_Servers
  *
  * @attaches-to `add_action('ws_plugin__s2member_during_collective_mods');`.
  * @attaches-to `add_action('ws_plugin__s2member_during_collective_eots');`.
  *
  * @param int|string $user_id Required. A WordPress User ID, numeric string or integer.
  * @param array      $vars Required. An array of defined variables passed by the calling hook.
  * @param string     $event Required. A specific event that triggered this call from the action hook.
  * @param string     $event_spec Required. A specific event specification *(a broader classification)*.
  * @param string     $mod_new_role Required if `$event_spec === 'modification'`; but can be empty. User role.
  * @param string     $mod_new_user Optional. If `$event_spec === 'modification'`, the new user object with current details.
  * @param string     $mod_old_user Optional. If `$event_spec === 'modification'`, the old/previous user obj with old details.
  *
  * @note This is only applicable when `['custom_reg_auto_opt_outs']` contains related Event(s).
  */
 public static function auto_process_list_server_removals($user_id, $vars, $event, $event_spec, $mod_new_role = NULL, $mod_new_user = NULL, $mod_old_user = NULL)
 {
     static $auto_processed = array();
     // Static cache.
     foreach (array_keys(get_defined_vars()) as $__v) {
         $__refs[$__v] =& ${$__v};
     }
     do_action('ws_plugin__s2member_before_auto_process_list_server_removals', get_defined_vars());
     unset($__refs, $__v);
     // Allows vars to be modified by reference.
     if (c_ws_plugin__s2member_list_servers::list_servers_integrated()) {
         if ($user_id && is_numeric($user_id) && !isset($auto_processed[$user_id])) {
             if (is_array($vars) && is_string($event = (string) $event) && is_string($event_spec = (string) $event_spec)) {
                 if ($custom_reg_auto_op_outs = c_ws_plugin__s2member_utils_strings::wrap_deep($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_auto_opt_outs'], '/^', '$/i')) {
                     if (c_ws_plugin__s2member_utils_arrays::in_regex_array($event, $custom_reg_auto_op_outs) || c_ws_plugin__s2member_utils_arrays::in_regex_array($event_spec, $custom_reg_auto_op_outs)) {
                         if (is_object($dynamic_user = $user_now = new WP_User($user_id)) && $dynamic_user->exists() && !empty($dynamic_user->ID)) {
                             $mod_new_role = $event_spec === 'modification' && is_string($mod_new_role) ? $mod_new_role : '';
                             // Might be empty.
                             $mod_new_user = $event_spec === 'modification' && !empty($mod_new_user->ID) && $mod_new_user->ID === $dynamic_user->ID ? $mod_new_user : NULL;
                             $mod_old_user = $event_spec === 'modification' && !empty($mod_old_user->ID) && $mod_old_user->ID === $dynamic_user->ID ? $mod_old_user : NULL;
                             $dynamic_user = $event_spec === 'modification' && $mod_old_user ? $mod_old_user : $user_now;
                             // Use old user when applicable.
                             if ($event_spec !== 'modification' || $event_spec === 'modification' && $mod_new_role !== c_ws_plugin__s2member_user_access::user_access_role($dynamic_user) && strtotime($dynamic_user->user_registered) < strtotime('-10 seconds') && ($event !== 'user-role-change' || $event === 'user-role-change' && !empty($vars['_p']['ws_plugin__s2member_custom_reg_auto_opt_out_transitions']))) {
                                 $auto_processed[$dynamic_user->ID] = -1;
                                 // Flag as auto-processed!
                                 $auto_removal_success = c_ws_plugin__s2member_list_servers::process_list_server_removals(c_ws_plugin__s2member_user_access::user_access_role($dynamic_user), c_ws_plugin__s2member_user_access::user_access_level($dynamic_user), $dynamic_user->user_login, '', $dynamic_user->user_email, $dynamic_user->first_name, $dynamic_user->last_name, '', TRUE, $dynamic_user->ID);
                                 if ($event_spec === 'modification' && $mod_new_role && ($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_auto_opt_out_transitions'] === '2' || $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_auto_opt_out_transitions'] === '1' && $auto_removal_success)) {
                                     $dynamic_user = $event_spec === 'modification' && $mod_new_user ? $mod_new_user : $user_now;
                                     // New user; when applicable.
                                     $auto_transition_success = c_ws_plugin__s2member_list_servers::process_list_servers($mod_new_role, c_ws_plugin__s2member_user_access::user_access_role_to_level($mod_new_role), $dynamic_user->user_login, '', $dynamic_user->user_email, $dynamic_user->first_name, $dynamic_user->last_name, '', TRUE, $auto_removal_success ? FALSE : TRUE, $dynamic_user->ID);
                                     do_action('ws_plugin__s2member_during_auto_process_list_server_removal_transitions', get_defined_vars());
                                 }
                                 do_action('ws_plugin__s2member_during_auto_process_list_server_removals', get_defined_vars());
                             }
                         }
                     }
                 }
             }
         }
     }
     do_action('ws_plugin__s2member_after_auto_process_list_server_removals', get_defined_vars());
 }
 /**
  * Filters ``$cwhere`` query portion.
  *
  * @package s2Member\Queries
  * @since 110912
  *
  * @attaches-to ``add_filter("comment_feed_where");``
  *
  * @param str $cwhere Expects the SQL `WHERE` portion to be passed through by the Filter.
  * @param obj $wp_query Expects ``$wp_query`` by reference, from the Filter.
  * @return str The revised ``$cwhere`` string.
  */
 public static function _query_level_access_coms($cwhere = FALSE, &$wp_query = FALSE)
 {
     global $wpdb;
     /* Need this global DB object reference here. */
     /**/
     if (is_string($cwhere) && is_object($wpdb) && is_object($wp_query) && !$wp_query->get("suppress_filters")) {
         $x_terms = array_merge((array) $wp_query->get("category__not_in"), (array) $wp_query->get("tag__not_in"));
         $x_terms = array_unique(c_ws_plugin__s2member_utils_arrays::force_integers($x_terms));
         $x_singulars = c_ws_plugin__s2member_utils_gets::get_singular_ids_in_terms($x_terms);
         /**/
         $cwhere .= " AND `" . $wpdb->comments . "`.`comment_post_ID` NOT IN('" . implode("','", (array) $wp_query->get("post__not_in")) . "')";
         $cwhere .= " AND `" . $wpdb->comments . "`.`comment_post_ID` NOT IN('" . implode("','", $x_singulars) . "')";
     }
     remove_filter("comment_feed_where", "c_ws_plugin__s2member_querys::_query_level_access_coms", 100, 2);
     return apply_filters("_ws_plugin__s2member_query_level_access_coms", $cwhere, get_defined_vars());
 }
Example #13
0
 /**
  * Filters WordPress Page queries that use wp_list_pages()
  *
  * @package s2Member\Queries
  * @since 130617
  *
  * @attaches-to ``add_filter("wp_list_pages_excludes");``
  *
  * @return array The array of ``$excludes``.
  */
 public static function _query_level_access_list_pages($excludes = array())
 {
     // Here we need to exclude any Page not available to the current user.
     for ($n = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n >= 0; $n--) {
         if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_pages"] === "all" && !current_user_can("access_s2member_level" . $n)) {
             $excludes = array_merge($excludes, c_ws_plugin__s2member_utils_arrays::force_integers(c_ws_plugin__s2member_utils_gets::get_all_page_ids()));
         } else {
             if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_pages"] && !current_user_can("access_s2member_level" . $n)) {
                 $excludes = array_merge($excludes, c_ws_plugin__s2member_utils_arrays::force_integers(preg_split("/[\r\n\t\\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_pages"])));
             }
         }
     }
     return $excludes;
 }
Example #14
0
 /**
  * Filters WordPress Page queries that use wp_list_pages()
  *
  * @package s2Member\Queries
  * @since 130617
  *
  * @attaches-to ``add_filter('wp_list_pages_excludes');``
  *
  * @param array $excludes An array of any existing excludes.
  *
  * @return array The array of ``$excludes``.
  */
 public static function _query_level_access_list_pages($excludes = array())
 {
     for ($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--) {
         if ($GLOBALS['WS_PLUGIN__']['s2member']['o']['level' . $n . '_pages'] === 'all' && !current_user_can('access_s2member_level' . $n)) {
             $excludes = array_merge($excludes, c_ws_plugin__s2member_utils_arrays::force_integers(c_ws_plugin__s2member_utils_gets::get_all_page_ids()));
         } else {
             if ($GLOBALS['WS_PLUGIN__']['s2member']['o']['level' . $n . '_pages'] && !current_user_can('access_s2member_level' . $n)) {
                 $excludes = array_merge($excludes, c_ws_plugin__s2member_utils_arrays::force_integers(preg_split('/[' . "\r\n\t" . '\\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level' . $n . '_pages'])));
             }
         }
     }
     return $excludes;
 }
 /**
  * Handles Download Access permissions.
  *
  * @package s2Member\Files
  * @since 3.5
  *
  * @attaches-to ``add_action("init");``
  * @also-called-by API Function {@link s2Member\API_Functions\s2member_file_download_url()}, w/ ``$create_file_download_url`` param.
  *
  * @param array $create_file_download_url Optional. If this function is called directly, we can pass arguments through this array.
  * 	Possible array elements: `file_download` *(required)*, `file_download_key`, `file_stream`, `file_inline`, `file_storage`, `file_remote`, `file_ssl`, `file_rewrite`, `file_rewrite_base`, `skip_confirmation`, `url_to_storage_source`, `count_against_user`, `check_user`.
  * @return null|str If called directly with ``$create_file_download_url``, returns a string with the URL, based on configuration.
  * 	Else, this function may exit script execution after serving a File Download.
  */
 public static function check_file_download_access($create_file_download_url = FALSE)
 {
     foreach (array_keys(get_defined_vars()) as $__v) {
         $__refs[$__v] =& ${$__v};
     }
     do_action("ws_plugin__s2member_before_file_download_access", get_defined_vars());
     unset($__refs, $__v);
     $_g = !empty($_GET) ? $_GET : array();
     $_g = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_g));
     $creating = is_array($create = $create_file_download_url) ? true : false;
     $serving = !$creating ? true : false;
     $serving_range = $range = false;
     if ($serving) {
         $range = (string) @$_SERVER["HTTP_RANGE"];
         if (!$range && function_exists("apache_request_headers")) {
             // Note: ``apache_request_headers()`` works in FastCGI too, starting w/ PHP v5.4.
             foreach ((array) apache_request_headers() as $_header => $_value) {
                 if (is_string($_header) && strcasecmp($_header, "range") === 0) {
                     $range = $_value;
                 }
             }
         }
         if ($range) {
             $serving_range = true;
         }
         unset($_header, $_value);
     }
     $req["file_download"] = $creating ? @$create["file_download"] : @$_g["s2member_file_download"];
     $req["file_download_key"] = $creating ? @$create["file_download_key"] : @$_g["s2member_file_download_key"];
     $req["file_stream"] = $creating ? @$create["file_stream"] : @$_g["s2member_file_stream"];
     $req["file_inline"] = $creating ? @$create["file_inline"] : @$_g["s2member_file_inline"];
     $req["file_storage"] = $creating ? @$create["file_storage"] : @$_g["s2member_file_storage"];
     $req["file_remote"] = $creating ? @$create["file_remote"] : @$_g["s2member_file_remote"];
     $req["file_ssl"] = $creating ? @$create["file_ssl"] : @$_g["s2member_file_ssl"];
     $req["file_rewrite"] = $creating ? @$create["file_rewrite"] : null;
     $req["file_rewrite_base"] = $creating ? @$create["file_rewrite_base"] : null;
     $req["skip_confirmation"] = $creating ? @$create["skip_confirmation"] : null;
     $req["url_to_storage_source"] = $creating ? @$create["url_to_storage_source"] : null;
     $req["count_against_user"] = $creating ? @$create["count_against_user"] : null;
     $req["check_user"] = $creating ? @$create["check_user"] : null;
     if ($req["file_download"] && is_string($req["file_download"]) && ($req["file_download"] = trim($req["file_download"], "/"))) {
         if (strpos($req["file_download"], "..") === false && strpos(basename($req["file_download"]), ".") !== 0) {
             $using_amazon_cf_storage = (!$req["file_storage"] || strcasecmp((string) $req["file_storage"], "cf") === 0) && c_ws_plugin__s2member_utils_conds::using_amazon_cf_storage() ? true : false;
             $using_amazon_s3_storage = (!$req["file_storage"] || strcasecmp((string) $req["file_storage"], "s3") === 0) && c_ws_plugin__s2member_utils_conds::using_amazon_s3_storage() ? true : false;
             $using_amazon_storage = $using_amazon_cf_storage || $using_amazon_s3_storage ? true : false;
             $excluded = apply_filters("ws_plugin__s2member_check_file_download_access_excluded", false, get_defined_vars());
             $valid_file_download_key = $req["file_download_key"] && is_string($req["file_download_key"]) && $creating && (!isset($req["check_user"]) || !filter_var($req["check_user"], FILTER_VALIDATE_BOOLEAN)) && (!isset($req["count_against_user"]) || !filter_var($req["count_against_user"], FILTER_VALIDATE_BOOLEAN)) ? true : false;
             $valid_file_download_key = !$valid_file_download_key && $req["file_download_key"] && is_string($req["file_download_key"]) ? c_ws_plugin__s2member_files_in::check_file_download_key($req["file_download"], $req["file_download_key"]) : false;
             $checking_user = $excluded || $valid_file_download_key || $creating && (!isset($req["check_user"]) || !filter_var($req["check_user"], FILTER_VALIDATE_BOOLEAN)) && (!isset($req["count_against_user"]) || !filter_var($req["count_against_user"], FILTER_VALIDATE_BOOLEAN)) ? false : true;
             $updating_user_counter = $serving_range || !$checking_user || $creating && (!isset($req["count_against_user"]) || !filter_var($req["count_against_user"], FILTER_VALIDATE_BOOLEAN)) ? false : true;
             if (($serving || $creating) && $checking_user) {
                 if (!$using_amazon_storage && !file_exists($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $req["file_download"])) {
                     if ($serving) {
                         status_header(404);
                         header("Content-Type: text/html; charset=UTF-8");
                         while (@ob_end_clean()) {
                         }
                         // Clean any existing output buffers.
                         exit(_x('<strong>404: Sorry, file not found.</strong> Please contact Support for assistance.', "s2member-front", "s2member"));
                     } else {
                         // Else return false.
                         return false;
                     }
                 } else {
                     if ($req["file_download_key"] && is_string($req["file_download_key"]) && !$valid_file_download_key) {
                         if ($serving) {
                             status_header(503);
                             header("Content-Type: text/html; charset=UTF-8");
                             while (@ob_end_clean()) {
                             }
                             // Clean any existing output buffers.
                             exit(_x('<strong>503 (Invalid Key):</strong> Sorry, your access to this file has expired. Please contact Support for assistance.', "s2member-front", "s2member"));
                         } else {
                             // Else return false.
                             return false;
                         }
                     } else {
                         if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"] || ($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads()) === false) {
                             if ($serving) {
                                 if (!has_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization")) {
                                     add_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization", 10, 2);
                                 }
                             }
                             if ($creating) {
                                 if (has_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization")) {
                                     remove_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization", 10, 2);
                                 }
                             }
                             if (isset($file_downloads_enabled_by_site_owner, $min_level_4_downloads) && $file_downloads_enabled_by_site_owner === false || ($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads()) === false) {
                                 if ($serving) {
                                     status_header(503);
                                     header("Content-Type: text/html; charset=UTF-8");
                                     while (@ob_end_clean()) {
                                     }
                                     // Clean any existing output buffers.
                                     exit(_x('<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <code>s2Member -› Download Options -› Basic Download Restrictions</code>.', "s2member-front", "s2member"));
                                 } else {
                                     // Else return false.
                                     return false;
                                 }
                             } else {
                                 if (!is_object($user = apply_filters("ws_plugin__s2member_check_file_download_access_user", is_user_logged_in() ? wp_get_current_user() : false, get_defined_vars())) || empty($user->ID) || !($user_id = $user->ID) || !is_array($user_file_downloads = c_ws_plugin__s2member_files::user_downloads($user)) || !$user->has_cap("administrator") && (!$user_file_downloads["allowed"] || !$user_file_downloads["allowed_days"])) {
                                     if (preg_match("/(?:^|\\/)access[_\\-]s2member[_\\-]level([0-9]+)\\//", $req["file_download"], $m) && strlen($req_level = $m[1]) && (!is_object($user) || empty($user->ID) || !$user->has_cap("access_s2member_level" . $req_level))) {
                                         if ($serving) {
                                             c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars("file", $req["file_download"], "level", $req_level, $_SERVER["REQUEST_URI"]) . exit;
                                         } else {
                                             // Else return false.
                                             return false;
                                         }
                                     } else {
                                         if (preg_match("/(?:^|\\/)access[_\\-]s2member[_\\-]ccap[_\\-](.+?)\\//", $req["file_download"], $m) && strlen($req_ccap = preg_replace("/-/", "_", $m[1])) && (!is_object($user) || empty($user->ID) || !$user->has_cap("access_s2member_ccap_" . $req_ccap))) {
                                             if ($serving) {
                                                 c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars("file", $req["file_download"], "ccap", $req_ccap, $_SERVER["REQUEST_URI"]) . exit;
                                             } else {
                                                 // Else return false.
                                                 return false;
                                             }
                                         } else {
                                             if ($serving) {
                                                 c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars("file", $req["file_download"], "level", $min_level_4_downloads, $_SERVER["REQUEST_URI"]) . exit;
                                             } else {
                                                 // Else return false.
                                                 return false;
                                             }
                                         }
                                     }
                                 } else {
                                     if (preg_match("/(?:^|\\/)access[_\\-]s2member[_\\-]level([0-9]+)\\//", $req["file_download"], $m) && strlen($req_level = $m[1]) && !$user->has_cap("access_s2member_level" . $req_level)) {
                                         if ($serving) {
                                             c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars("file", $req["file_download"], "level", $req_level, $_SERVER["REQUEST_URI"]) . exit;
                                         } else {
                                             // Else return false.
                                             return false;
                                         }
                                     } else {
                                         if (preg_match("/(?:^|\\/)access[_\\-]s2member[_\\-]ccap[_\\-](.+?)\\//", $req["file_download"], $m) && strlen($req_ccap = preg_replace("/-/", "_", $m[1])) && !$user->has_cap("access_s2member_ccap_" . $req_ccap)) {
                                             if ($serving) {
                                                 c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars("file", $req["file_download"], "ccap", $req_ccap, $_SERVER["REQUEST_URI"]) . exit;
                                             } else {
                                                 // Else return false.
                                                 return false;
                                             }
                                         } else {
                                             if ($serving || $creating) {
                                                 $user_previous_file_downloads = 0;
                                                 $user_already_downloaded_this_file = $user_already_downloaded_a_streaming_variation_of_this_file = false;
                                                 $user_file_download_access_log = is_array($user_file_download_access_log = get_user_option("s2member_file_download_access_log", $user_id)) ? $user_file_download_access_log : array();
                                                 $user_file_download_access_arc = is_array($user_file_download_access_arc = get_user_option("s2member_file_download_access_arc", $user_id)) ? $user_file_download_access_arc : array();
                                                 $streaming_file_extns = c_ws_plugin__s2member_utils_strings::preg_quote_deep($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["streaming_file_extns"], "/");
                                                 $streaming_variations = "/\\.(" . implode("|", $streaming_file_extns) . ")\$/i";
                                                 foreach ($user_file_download_access_log as $user_file_download_access_log_entry_key => $user_file_download_access_log_entry) {
                                                     if (isset($user_file_download_access_log_entry["date"], $user_file_download_access_log_entry["file"])) {
                                                         if (strtotime($user_file_download_access_log_entry["date"]) < strtotime("-" . $user_file_downloads["allowed_days"] . " days")) {
                                                             unset($user_file_download_access_log[$user_file_download_access_log_entry_key]);
                                                             $user_file_download_access_arc[] = $user_file_download_access_log_entry;
                                                         } else {
                                                             if (strtotime($user_file_download_access_log_entry["date"]) >= strtotime("-" . $user_file_downloads["allowed_days"] . " days")) {
                                                                 $user_previous_file_downloads++;
                                                                 // Previous files always count against this User/Member.
                                                                 $_user_file_download_access_log_entry =& $user_file_download_access_log[$user_file_download_access_log_entry_key];
                                                                 $_user_already_downloaded_this_file = $_user_already_downloaded_a_streaming_variation_of_this_file = false;
                                                                 if ($user_file_download_access_log_entry["file"] === $req["file_download"]) {
                                                                     $user_already_downloaded_this_file = $_user_already_downloaded_this_file = true;
                                                                 } else {
                                                                     if (preg_replace($streaming_variations, "", $user_file_download_access_log_entry["file"]) === preg_replace($streaming_variations, "", $req["file_download"])) {
                                                                         $user_already_downloaded_this_file = $_user_already_downloaded_this_file = $user_already_downloaded_a_streaming_variation_of_this_file = $_user_already_downloaded_a_streaming_variation_of_this_file = true;
                                                                     }
                                                                 }
                                                                 if ($updating_user_counter && ($_user_already_downloaded_this_file || $_user_already_downloaded_a_streaming_variation_of_this_file)) {
                                                                     $_user_file_download_access_log_entry["ltime"] = time();
                                                                     if (!empty($user_file_download_access_log_entry["counter"])) {
                                                                         $_user_file_download_access_log_entry["counter"] = (int) $user_file_download_access_log_entry["counter"] + 1;
                                                                     } else {
                                                                         // Backward compatibility here. Default value to `1`, if this is NOT even set yet.
                                                                         $_user_file_download_access_log_entry["counter"] = 1 + 1;
                                                                     }
                                                                 }
                                                             }
                                                         }
                                                     } else {
                                                         // Weed out empty log entries. Some older versions of s2Member may have corrupt/empty log entries.
                                                         unset($user_file_download_access_log[$user_file_download_access_log_entry_key]);
                                                     }
                                                 }
                                                 if ($updating_user_counter && !$user_already_downloaded_this_file && !$user_already_downloaded_a_streaming_variation_of_this_file) {
                                                     $user_file_download_access_log[] = array("date" => date("Y-m-d"), "time" => time(), "ltime" => time(), "file" => $req["file_download"], "counter" => 1);
                                                 }
                                                 if ($user_previous_file_downloads >= $user_file_downloads["allowed"] && !$user_already_downloaded_this_file && !$user_already_downloaded_a_streaming_variation_of_this_file && !$user->has_cap("administrator")) {
                                                     if ($serving) {
                                                         wp_redirect(add_query_arg(urlencode_deep(array("_s2member_seeking" => array("type" => "file", "file" => $req["file_download"], "_uri" => base64_encode($_SERVER["REQUEST_URI"])), "s2member_seeking" => "file-" . $req["file_download"])), get_page_link($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"])), apply_filters("ws_plugin__s2member_content_redirect_status", 301, get_defined_vars())) . exit;
                                                     } else {
                                                         // Else return false.
                                                         return false;
                                                     }
                                                 } else {
                                                     if ($updating_user_counter) {
                                                         update_user_option($user_id, "s2member_file_download_access_log", c_ws_plugin__s2member_utils_arrays::array_unique($user_file_download_access_log)) . update_user_option($user_id, "s2member_file_download_access_arc", c_ws_plugin__s2member_utils_arrays::array_unique($user_file_download_access_arc));
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             } else {
                 if (!$using_amazon_storage && !file_exists($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $req["file_download"])) {
                     if ($serving) {
                         status_header(404);
                         header("Content-Type: text/html; charset=UTF-8");
                         while (@ob_end_clean()) {
                         }
                         // Clean any existing output buffers.
                         exit(_x('<strong>404: Sorry, file not found.</strong> Please contact Support for assistance.', "s2member-front", "s2member"));
                     } else {
                         // Else return false.
                         return false;
                     }
                 }
             }
             if ($serving || $creating) {
                 $basename = basename($req["file_download"]);
                 $mimetypes = parse_ini_file(dirname(dirname(dirname(__FILE__))) . "/includes/mime-types.ini");
                 $extension = strtolower(substr($req["file_download"], strrpos($req["file_download"], ".") + 1));
                 $key = $req["file_download_key"] && is_string($req["file_download_key"]) ? $req["file_download_key"] : false;
                 $stream = isset($req["file_stream"]) ? filter_var($req["file_stream"], FILTER_VALIDATE_BOOLEAN) : (in_array($extension, preg_split("/[\r\n\t\\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_stream_extensions"])) ? true : false);
                 $inline = !$stream && isset($req["file_inline"]) ? filter_var($req["file_inline"], FILTER_VALIDATE_BOOLEAN) : ($stream || in_array($extension, preg_split("/[\r\n\t\\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_inline_extensions"])) ? true : false);
                 $ssl = isset($req["file_ssl"]) ? filter_var($req["file_ssl"], FILTER_VALIDATE_BOOLEAN) : (is_ssl() ? true : false);
                 $storage = $req["file_storage"] && is_string($req["file_storage"]) ? strtolower($req["file_storage"]) : false;
                 $remote = isset($req["file_remote"]) ? filter_var($req["file_remote"], FILTER_VALIDATE_BOOLEAN) : false;
                 $_basename_dir_app_data = c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"]);
                 $rewrite_base_guess = is_dir(dirname($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir"]) . "/" . $_basename_dir_app_data) ? dirname($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . "/" . $_basename_dir_app_data : content_url("/" . $_basename_dir_app_data);
                 $rewrite_base = $req["file_rewrite_base"] && is_string($req["file_rewrite_base"]) ? $req["file_rewrite_base"] : false;
                 $rewrite = $rewriting = !$rewrite_base && isset($req["file_rewrite"]) ? filter_var($req["file_rewrite"], FILTER_VALIDATE_BOOLEAN) : ($rewrite_base ? true : false);
                 unset($_basename_dir_app_data);
                 $skip_confirmation = isset($req["skip_confirmation"]) ? filter_var($req["skip_confirmation"], FILTER_VALIDATE_BOOLEAN) : false;
                 $url_to_storage_source = isset($req["url_to_storage_source"]) ? filter_var($req["url_to_storage_source"], FILTER_VALIDATE_BOOLEAN) : false;
                 $pathinfo = !$using_amazon_storage ? pathinfo($file = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $req["file_download"]) : array();
                 $mimetype = $mimetypes[$extension] ? $mimetypes[$extension] : "application/octet-stream";
                 $disposition = ($inline ? "inline" : "attachment") . "; filename=\"" . c_ws_plugin__s2member_utils_strings::esc_dq($basename) . "\"; filename*=UTF-8''" . rawurlencode($basename);
                 $length = !$using_amazon_storage && $file ? filesize($file) : -1;
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action("ws_plugin__s2member_during_file_download_access", get_defined_vars());
                 unset($__refs, $__v);
                 if ($using_amazon_storage && $using_amazon_cf_storage && ($serving || $creating && $url_to_storage_source)) {
                     if ($serving) {
                         wp_redirect(c_ws_plugin__s2member_files_in::amazon_cf_url($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype)) . exit;
                     } else {
                         // Else return File Download URL.
                         return apply_filters("ws_plugin__s2member_file_download_access_url", c_ws_plugin__s2member_files_in::amazon_cf_url($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype), get_defined_vars());
                     }
                 } else {
                     if ($using_amazon_storage && $using_amazon_s3_storage && ($serving || $creating && $url_to_storage_source)) {
                         if ($serving) {
                             wp_redirect(c_ws_plugin__s2member_files_in::amazon_s3_url($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype)) . exit;
                         } else {
                             // Else return File Download URL.
                             return apply_filters("ws_plugin__s2member_file_download_access_url", c_ws_plugin__s2member_files_in::amazon_s3_url($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype), get_defined_vars());
                         }
                     } else {
                         if ($creating && $rewriting) {
                             // Note: we don't URL encode unreserved chars. Improves media player compatibility.
                             $_url_e_key = $key ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($key)) : "";
                             $_url_e_storage = $storage ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($storage)) : "";
                             $_url_e_file = c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($req["file_download"]));
                             $_url_e_file = str_ireplace("%2F", "/", $_url_e_file);
                             $url = $rewrite_base ? rtrim($rewrite_base, "/") : rtrim($rewrite_base_guess, "/");
                             $url .= isset($req["file_download_key"]) ? $key && $_url_e_key ? "/s2member-file-download-key-" . $_url_e_key : "" : "";
                             $url .= isset($req["file_stream"]) ? $stream ? "/s2member-file-stream" : "/s2member-file-stream-no" : "";
                             $url .= isset($req["file_inline"]) ? $inline ? "/s2member-file-inline" : "/s2member-file-inline-no" : "";
                             $url .= isset($req["file_storage"]) ? $storage && $_url_e_storage ? "/s2member-file-storage-" . $_url_e_storage : "" : "";
                             $url .= isset($req["file_remote"]) ? $remote ? "/s2member-file-remote" : "/s2member-file-remote-no" : "";
                             $url .= isset($req["skip_confirmation"]) ? $skip_confirmation ? "/s2member-skip-confirmation" : "/s2member-skip-confirmation-no" : "";
                             $url = $url . "/" . $_url_e_file;
                             $url = $ssl ? preg_replace("/^https?/", "https", $url) : preg_replace("/^https?/", "http", $url);
                             return apply_filters("ws_plugin__s2member_file_download_access_url", $url, get_defined_vars());
                         } else {
                             if ($creating) {
                                 // Note: we don't URL encode unreserved chars. Improves media player compatibility.
                                 $_url_e_key = $key ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($key)) : "";
                                 $_url_e_storage = $storage ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($storage)) : "";
                                 $_url_e_file = c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($req["file_download"]));
                                 $_url_e_file = str_ireplace("%2F", "/", $_url_e_file);
                                 $url = isset($req["file_download_key"]) ? $key && $_url_e_key ? "&s2member_file_download_key=" . $_url_e_key : "" : "";
                                 $url .= isset($req["file_stream"]) ? $stream ? "&s2member_file_stream=yes" : "&s2member_file_stream=no" : "";
                                 $url .= isset($req["file_inline"]) ? $inline ? "&s2member_file_inline=yes" : "&s2member_file_inline=no" : "";
                                 $url .= isset($req["file_storage"]) ? $storage && $_url_e_storage ? "&s2member_file_storage=" . $_url_e_storage : "" : "";
                                 $url .= isset($req["file_remote"]) ? $remote ? "&s2member_file_remote=yes" : "&s2member_file_remote=no" : "";
                                 $url .= isset($req["skip_confirmation"]) ? $skip_confirmation ? "&s2member_skip_confirmation=yes" : "&s2member_skip_confirmation=no" : "";
                                 $url = site_url("/?" . ltrim($url . "&s2member_file_download=/" . $_url_e_file, "&"));
                                 $url = $ssl ? preg_replace("/^https?/", "https", $url) : preg_replace("/^https?/", "http", $url);
                                 return apply_filters("ws_plugin__s2member_file_download_access_url", $url, get_defined_vars());
                             } else {
                                 if ($serving) {
                                     @set_time_limit(0);
                                     @ini_set("zlib.output_compression", 0);
                                     if (function_exists("apache_setenv")) {
                                         @apache_setenv("no-gzip", "1");
                                     }
                                     while (@ob_end_clean()) {
                                     }
                                     if ($range) {
                                         if (strpos($range, "=") === FALSE) {
                                             status_header(416);
                                             nocache_headers();
                                             header("Content-Encoding:");
                                             header("Accept-Ranges: bytes");
                                             header("Content-Type: " . $mimetype);
                                             header("Content-Length: " . $length);
                                             header("Content-Disposition: " . $disposition);
                                             exit;
                                         }
                                         list($range_type, $byte_range) = preg_split("/\\s*\\=\\s*/", $range, 2);
                                         $range_type = strtolower(trim($range_type));
                                         $byte_range = trim($byte_range);
                                         if ($range_type !== "bytes") {
                                             status_header(416);
                                             nocache_headers();
                                             header("Content-Encoding:");
                                             header("Accept-Ranges: bytes");
                                             header("Content-Type: " . $mimetype);
                                             header("Content-Length: " . $length);
                                             header("Content-Disposition: " . $disposition);
                                             exit;
                                         }
                                         $byte_ranges = preg_split("/\\s*,\\s*/", $byte_range);
                                         if (strpos($byte_ranges[0], "-") === FALSE) {
                                             status_header(416);
                                             nocache_headers();
                                             header("Content-Encoding:");
                                             header("Accept-Ranges: bytes");
                                             header("Content-Type: " . $mimetype);
                                             header("Content-Length: " . $length);
                                             header("Content-Disposition: " . $disposition);
                                             exit;
                                         }
                                         // Only dealing with the first byte range. Others are simply ignored here.
                                         list($byte_range_start, $byte_range_stops) = preg_split("/\\s*\\-\\s*/", $byte_ranges[0], 2);
                                         $byte_range_start = trim($byte_range_start);
                                         $byte_range_stops = trim($byte_range_stops);
                                         $byte_range_start = $byte_range_start === "" ? NULL : (int) $byte_range_start;
                                         $byte_range_stops = $byte_range_stops === "" ? NULL : (int) $byte_range_stops;
                                         if (!isset($byte_range_start) && $byte_range_stops > 0 && $byte_range_stops <= $length) {
                                             $byte_range_start = $length - $byte_range_stops;
                                             $byte_range_stops = $length - 1;
                                         } else {
                                             if (!isset($byte_range_stops) && $byte_range_start >= 0 && $byte_range_start < $length - 1) {
                                                 $byte_range_stops = $length - 1;
                                             } else {
                                                 if (isset($byte_range_start, $byte_range_stops) && $byte_range_start >= 0 && $byte_range_start < $length - 1 && $byte_range_stops > $byte_range_start && $byte_range_stops <= $length - 1) {
                                                     // Nothing to do in this case, starts/stops already defined properly.
                                                 } else {
                                                     status_header(416);
                                                     nocache_headers();
                                                     header("Content-Encoding:");
                                                     header("Accept-Ranges: bytes");
                                                     header("Content-Type: " . $mimetype);
                                                     header("Content-Length: " . $length);
                                                     header("Content-Disposition: " . $disposition);
                                                     exit;
                                                 }
                                             }
                                         }
                                         // Range.
                                         status_header(206);
                                         nocache_headers();
                                         header("Content-Encoding:");
                                         header("Accept-Ranges: bytes");
                                         header("Content-Type: " . $mimetype);
                                         header("Content-Range: bytes " . $byte_range_start . "-" . $byte_range_stops . "/" . $length);
                                         $byte_range_size = $byte_range_stops - $byte_range_start + 1;
                                         header("Content-Length: " . $byte_range_size);
                                         header("Content-Disposition: " . $disposition);
                                     } else {
                                         status_header(200);
                                         nocache_headers();
                                         header("Content-Encoding:");
                                         header("Accept-Ranges: bytes");
                                         header("Content-Type: " . $mimetype);
                                         header("Content-Length: " . $length);
                                         header("Content-Disposition: " . $disposition);
                                     }
                                     if (is_resource($resource = fopen($file, "rb"))) {
                                         if ($range) {
                                             $_bytes_to_read = $byte_range_size;
                                             fseek($resource, $byte_range_start);
                                         } else {
                                             // Entire file.
                                             $_bytes_to_read = $length;
                                         }
                                         $chunk_size = apply_filters("ws_plugin__s2member_file_downloads_chunk_size", 2097152, get_defined_vars());
                                         while ($_bytes_to_read) {
                                             $_bytes_to_read -= $_reading = $_bytes_to_read > $chunk_size ? $chunk_size : $_bytes_to_read;
                                             echo fread($resource, $_reading);
                                             flush();
                                         }
                                         fclose($resource);
                                         unset($_bytes_to_read, $_reading);
                                     }
                                     exit;
                                 }
                             }
                         }
                     }
                 }
             }
         } else {
             if ($serving && $req["file_download"]) {
                 status_header(503);
                 header("Content-Type: text/html; charset=UTF-8");
                 while (@ob_end_clean()) {
                 }
                 // Clean any existing output buffers.
                 exit(_x('<strong>503: Access denied.</strong> Invalid File Download specs.', "s2member-front", "s2member"));
             } else {
                 if ($creating) {
                     return false;
                 }
             }
         }
     }
     do_action("ws_plugin__s2member_after_file_download_access", get_defined_vars());
     return $creating ? false : null;
 }
Example #16
0
 /**
  * Adds Custom Fields to the admin Profile editing page.
  *
  * @package s2Member\Users_List
  * @since 3.5
  *
  * @attaches-to ``add_action("edit_user_profile");``
  * @attaches-to ``add_action("show_user_profile");``
  *
  * @param obj $user Expects a `WP_User` object passed in by the Action Hook.
  * @return null
  */
 public static function users_list_edit_cols($user = FALSE)
 {
     global $current_site, $current_blog;
     foreach (array_keys(get_defined_vars()) as $__v) {
         $__refs[$__v] =& ${$__v};
     }
     do_action("ws_plugin__s2member_before_users_list_edit_cols", get_defined_vars());
     unset($__refs, $__v);
     $current_user = is_user_logged_in() ? wp_get_current_user() : false;
     // Current User.
     if (is_object($user) && !empty($user->ID) && ($user_id = $user->ID) && is_object($current_user) && !empty($current_user->ID)) {
         $role = c_ws_plugin__s2member_user_access::user_access_role($user);
         // This User's current WordPress Role.
         $level = c_ws_plugin__s2member_user_access::user_access_level($user);
         // User's Access Level for s2Member.
         if (current_user_can("edit_users") && (!is_multisite() || is_super_admin() || is_user_member_of_blog($user_id))) {
             echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
             echo '<h3 style="position:relative;"><img src="' . esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . '/images/large-icon.png" title="s2Member (a Membership management system for WordPress)" alt="" style="position:absolute; top:-15px; right:0; border:0;" />s2Member Configuration &amp; Profile Fields' . (is_multisite() ? ' (for this Blog)' : '') . '</h3>' . "\n";
             echo '<table class="form-table">' . "\n";
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_before", get_defined_vars());
             unset($__refs, $__v);
             if (is_multisite() && is_super_admin()) {
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action("ws_plugin__s2member_during_users_list_edit_cols_before_originating_blog", get_defined_vars());
                 unset($__refs, $__v);
                 echo '<tr>' . "\n";
                 echo '<th><label for="ws-plugin--s2member-profile-s2member-originating-blog">Originating Blog ID#:</label> <a href="#" onclick="alert(\'On a Multisite Network, this is how s2Member keeps track of which Blog each User/Member originated from. So this ID#, is automatically associated with a Blog in your Network, matching the User\\\'s point of origin. ~ ONLY a Super Admin can modify this.\\n\\nOn a Multisite Blog Farm, the Originating Blog ID# for your own Customers, will ALWAYS be associated with your (Main Site). It is NOT likely that you\\\'ll need to modify this manually, but s2Member makes it available; just in case.\\n\\n*Tip* - If you add Users (and/or Blogs) with the `Super Admin` Network Administration panel inside WordPress, then you WILL need to set everything manually. s2Member does NOT tamper with automation routines whenever YOU (as a Super Administrator) are working in that area.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
                 echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_originating_blog" id="ws-plugin--s2member-profile-s2member-originating-blog" value="' . format_to_edit(get_user_meta($user_id, "s2member_originating_blog", true)) . '" class="regular-text" /></td>' . "\n";
                 echo '</tr>' . "\n";
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action("ws_plugin__s2member_during_users_list_edit_cols_after_originating_blog", get_defined_vars());
                 unset($__refs, $__v);
             }
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_before_subscr_gateway", get_defined_vars());
             unset($__refs, $__v);
             echo '<tr>' . "\n";
             echo '<th><label for="ws-plugin--s2member-profile-s2member-subscr-gateway">Paid Subscr. Gateway:</label> <a href="#" onclick="alert(\'A Payment Gateway code is associated with the Paid Subscr. ID below. A Paid Subscription ID (or a Buy Now Transaction ID) is only valid for paid Members. Also known as (a Recurring Profile ID, a ClickBank Receipt #, a Google Order ID, an AliPay Trade No.). This will be filled automatically by s2Member.\\n\\nThis field will be empty for Free Subscribers, and/or anyone who is NOT paying you. This field is only editable for Customer Service purposes; just in case you ever need to update the Paid Subscr. Gateway/ID manually.\\n\\nThe value of Paid Subscr. ID, can be a PayPal Standard `Subscription ID`, or a PayPal Pro `Recurring Profile ID`, or a PayPal `Transaction ID`; depending on the type of sale. Your PayPal account will supply this information. If you\\\'re using Google Wallet, use the Google Order ID. ClickBank provides a Receipt #, ccBill provides a Subscription ID, Authorize.Net provides a Subscription ID, and AliPay provides a Transaction ID. The general rule is... IF there\\\'s a Subscription ID, use that! If there\\\'s NOT, use the Transaction ID.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
             echo '<td><select name="ws_plugin__s2member_profile_s2member_subscr_gateway" id="ws-plugin--s2member-profile-s2member-subscr-gateway" style="width:25em;"><option value=""></option>' . "\n";
             foreach (apply_filters("ws_plugin__s2member_profile_s2member_subscr_gateways", array("paypal" => "PayPal (code: paypal)"), get_defined_vars()) as $gateway => $gateway_name) {
                 echo '<option value="' . esc_attr($gateway) . '"' . ($gateway === get_user_option("s2member_subscr_gateway", $user_id) ? ' selected="selected"' : '') . '>' . esc_html($gateway_name) . '</option>' . "\n";
             }
             echo '</select>' . "\n";
             echo '</td>' . "\n";
             echo '</tr>' . "\n";
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_after_subscr_gateway", get_defined_vars());
             unset($__refs, $__v);
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_before_subscr_id", get_defined_vars());
             unset($__refs, $__v);
             echo '<tr>' . "\n";
             echo '<th><label for="ws-plugin--s2member-profile-s2member-subscr-id">Paid Subscr. ID:</label> <a href="#" onclick="alert(\'A Paid Subscription ID (or a Buy Now Transaction ID) is only valid for paid Members. Also known as (a Recurring Profile ID, a ClickBank Receipt #, a Google Order ID, an AliPay Trade No.). This will be filled automatically by s2Member.\\n\\nThis field will be empty for Free Subscribers, and/or anyone who is NOT paying you. This field is only editable for Customer Service purposes; just in case you ever need to update the Paid Subscr. Gateway/ID manually.\\n\\nThe value of Paid Subscr. ID, can be a PayPal Standard `Subscription ID`, or a PayPal Pro `Recurring Profile ID`, or a PayPal `Transaction ID`; depending on the type of sale. Your PayPal account will supply this information. If you\\\'re using Google Wallet, use the Google Order ID. ClickBank provides a Receipt #, ccBill provides a Subscription ID, Authorize.Net provides a Subscription ID, and AliPay provides a Transaction ID. The general rule is... IF there\\\'s a Subscription ID, use that! If there\\\'s NOT, use the Transaction ID.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
             echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_subscr_id" id="ws-plugin--s2member-profile-s2member-subscr-id" value="' . format_to_edit(get_user_option("s2member_subscr_id", $user_id)) . '" class="regular-text" /></td>' . "\n";
             echo '</tr>' . "\n";
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_after_subscr_id", get_defined_vars());
             unset($__refs, $__v);
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_before_custom", get_defined_vars());
             unset($__refs, $__v);
             echo '<tr>' . "\n";
             echo '<th><label for="ws-plugin--s2member-profile-s2member-custom">Custom Value:</label> <a href="#" onclick="alert(\'A Paid Subscription is always associated with a Custom String that is passed through the custom=\\\'\\\'' . c_ws_plugin__s2member_utils_strings::esc_js_sq(esc_attr($_SERVER["HTTP_HOST"]), 3) . '\\\'\\\' attribute of your Shortcode. This Custom Value, MUST always start with your domain name. However, you can also pipe delimit additional values after your domain, if you need to.\\n\\nFor example:\\n' . c_ws_plugin__s2member_utils_strings::esc_js_sq(esc_attr($_SERVER["HTTP_HOST"]), 3) . '|cv1|cv2|cv3\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
             echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_custom" id="ws-plugin--s2member-profile-s2member-custom" value="' . format_to_edit(get_user_option("s2member_custom", $user_id)) . '" class="regular-text" /></td>' . "\n";
             echo '</tr>' . "\n";
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_after_custom", get_defined_vars());
             unset($__refs, $__v);
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_before_registration_ip", get_defined_vars());
             unset($__refs, $__v);
             echo '<tr>' . "\n";
             echo '<th><label for="ws-plugin--s2member-profile-s2member-registration-ip">Registration IP:</label> <a href="#" onclick="alert(\'This is the IP Address the User had at the time of registration. If you don\\\'t know the User\\\'s IP Address, just leave this blank. If this is left empty, s2Member will make attempts in the future to grab the User\\\'s IP Address.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
             echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_registration_ip" id="ws-plugin--s2member-profile-s2member-registration-ip" value="' . format_to_edit(get_user_option("s2member_registration_ip", $user_id)) . '" class="regular-text" /></td>' . "\n";
             echo '</tr>' . "\n";
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_after_registration_ip", get_defined_vars());
             unset($__refs, $__v);
             if (!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) {
                 foreach ($user->allcaps as $cap => $cap_enabled) {
                     if (preg_match("/^access_s2member_ccap_/", $cap)) {
                         $ccaps[] = preg_replace("/^access_s2member_ccap_/", "", $cap);
                     }
                 }
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action("ws_plugin__s2member_during_users_list_edit_cols_before_ccaps", get_defined_vars());
                 unset($__refs, $__v);
                 echo '<tr>' . "\n";
                 echo '<th><label for="ws-plugin--s2member-profile-s2member-ccaps">Custom Capabilities:</label> <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member -› API Scripting -› Custom Capabilities.' . (is_multisite() ? '\\n\\nCustom Capabilities are assigned on a per-Blog basis. So having a set of Custom Capabilities for one Blog, and having NO Custom Capabilities on another Blog - is very common. This is how permissions are designed to work.' : '') . '\'); return false;" tabindex="-1">[?]</a>' . (is_multisite() ? '<br /><small>(for this Blog)</small>' : '') . '</th>' . "\n";
                 echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_ccaps" id="ws-plugin--s2member-profile-s2member-ccaps" value="' . format_to_edit(!empty($ccaps) ? implode(",", $ccaps) : "") . '" class="regular-text" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \\-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" /></td>' . "\n";
                 echo '</tr>' . "\n";
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action("ws_plugin__s2member_during_users_list_edit_cols_after_ccaps", get_defined_vars());
                 unset($__refs, $__v);
             }
             if (!$user->has_cap("administrator")) {
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action("ws_plugin__s2member_during_users_list_edit_cols_before_auto_eot_time", get_defined_vars());
                 unset($__refs, $__v);
                 echo '<tr>' . "\n";
                 $auto_eot_time = get_user_option("s2member_auto_eot_time", $user_id);
                 $auto_eot_time = $auto_eot_time ? date("D M j, Y g:i a T", $auto_eot_time) : "";
                 echo '<th><label for="ws-plugin--s2member-profile-s2member-auto-eot-time">Automatic EOT Time:</label> <a href="#" onclick="alert(\'EOT = End Of Term. ( i.e. Account Expiration / Termination. ).\\n\\nIf you leave this empty, s2Member will configure an EOT Time automatically, based on the paid Subscription associated with this account. In other words, if a paid Subscription expires, is cancelled, terminated, refunded, reversed, or charged back to you; s2Member will deal with the EOT automatically.\\n\\nThat being said, if you would rather take control over this, you can. If you type in a date manually, s2Member will obey the Auto-EOT Time that you\\\'ve given, no matter what. In other words, you can force certain Members to expire automatically, at a time that you specify. s2Member will obey.\\n\\nValid formats for Automatic EOT Time:\\n\\nmm/dd/yyyy\\nyyyy-mm-dd\\n+1 year\\n+2 weeks\\n+2 months\\n+10 minutes\\nnext thursday\\ntomorrow\\ntoday\\n\\n* anything compatible with PHP\\\'s strtotime() function.\'); return false;" tabindex="-1">[?]</a>' . ($auto_eot_time ? '<br /><small>(<a href="http://en.wikipedia.org/wiki/Coordinated_Universal_Time" target="_blank" rel="external">Universal Time / GMT</a>)</small>' : '') . '</th>' . "\n";
                 echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_auto_eot_time" id="ws-plugin--s2member-profile-s2member-auto-eot-time" value="' . format_to_edit($auto_eot_time) . '" class="regular-text" /></td>' . "\n";
                 echo '</tr>' . "\n";
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action("ws_plugin__s2member_during_users_list_edit_cols_after_auto_eot_time", get_defined_vars());
                 unset($__refs, $__v);
                 if (c_ws_plugin__s2member_utils_conds::pro_is_installed()) {
                     foreach (array_keys(get_defined_vars()) as $__v) {
                         $__refs[$__v] =& ${$__v};
                     }
                     do_action("ws_plugin__s2member_during_users_list_edit_cols_before_reset_pass_resend", get_defined_vars());
                     unset($__refs, $__v);
                     echo '<tr>' . "\n";
                     echo '<th><label for="ws-plugin--s2member-profile-reset-pass-resend">Reset Password &amp; Resend Welcome Email Message:</label> <a href="#" onclick="alert(\'Checking this box will tell s2Member to reset this User\\\'s password and then reprocess the New User Email Notification message against this User\\\'s account. This way they\\\'ll get an email message with their Username/Password.\\n\\nThis can be helpful in cases where a User/Member missed the original email message for some reason.\\n\\nThe User\\\'s password is reset to a new auto-generated password by default. However, you can provide a custom password by entering a new password of your choosing in the field above — provided by WordPress itself.\\n\\nIt is also possible to customize the New User Email Notification message with s2Member. Please see: `Dashboard -› s2Member -› General Options -› Email Configuration -› New User Notifications`.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
                     echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_reset_pass_resend" id="ws-plugin--s2member-profile-reset-pass-resend" value="1" /> Yes, reset password &amp; resend welcome email message to this User.</label></td>' . "\n";
                     echo '</tr>' . "\n";
                     foreach (array_keys(get_defined_vars()) as $__v) {
                         $__refs[$__v] =& ${$__v};
                     }
                     do_action("ws_plugin__s2member_during_users_list_edit_cols_after_reset_pass_resend", get_defined_vars());
                     unset($__refs, $__v);
                 }
             }
             if (c_ws_plugin__s2member_list_servers::list_servers_integrated()) {
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action("ws_plugin__s2member_during_users_list_edit_cols_before_opt_in", get_defined_vars());
                 unset($__refs, $__v);
                 echo '<tr>' . "\n";
                 echo '<th><label for="ws-plugin--s2member-profile-opt-in">Re-process List Servers:</label> <a href="#" onclick="alert(\'You have at least one List Server integrated with s2Member. Would you like to re-process a confirmation request for this User? If not, just leave the box un-checked.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
                 echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_opt_in" id="ws-plugin--s2member-profile-opt-in" value="1" /> Yes, send a mailing list confirmation email to this User.</label></td>' . "\n";
                 echo '</tr>' . "\n";
                 foreach (array_keys(get_defined_vars()) as $__v) {
                     $__refs[$__v] =& ${$__v};
                 }
                 do_action("ws_plugin__s2member_during_users_list_edit_cols_after_opt_in", get_defined_vars());
                 unset($__refs, $__v);
                 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_out_transitions"]) {
                     if ($custom_reg_auto_op_outs = c_ws_plugin__s2member_utils_strings::wrap_deep($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_outs"], "/^", "\$/i")) {
                         if (c_ws_plugin__s2member_utils_arrays::in_regex_array("user-role-change", $custom_reg_auto_op_outs) || c_ws_plugin__s2member_utils_arrays::in_regex_array("modification", $custom_reg_auto_op_outs)) {
                             foreach (array_keys(get_defined_vars()) as $__v) {
                                 $__refs[$__v] =& ${$__v};
                             }
                             do_action("ws_plugin__s2member_during_users_list_edit_cols_before_auto_opt_out_transitions", get_defined_vars());
                             unset($__refs, $__v);
                             echo '<tr>' . "\n";
                             echo '<th><label for="ws-plugin--s2member-custom-reg-auto-opt-out-transitions">Allow List Transitioning:</label> <a href="#" onclick="alert(\'You\\\'ve configured s2Member with List Transitions enabled. By leaving this box checked, s2Member will Transition the User\\\'s mailing list subscription(s) automatically. For example, if a Member is demoted from Level #2, down to Level #1; s2Member will add them to the Level #1 List(s) after it removes them from the Level #2 List(s).\\n\\nDepending on your configuration of s2Member, a transition may ONLY occur if s2Member IS able to successfully remove them from an existing List. In other words, if they are currently NOT subscribed to any List(s), s2Member may NOT transition them to any new Lists (depending on your configuration).\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
                             echo '<td><label><input type="checkbox" name="ws_plugin__s2member_custom_reg_auto_opt_out_transitions" id="ws-plugin--s2member-custom-reg-auto-opt-out-transitions" value="1" checked="checked" /> Yes, automatically transition this User\'s mailing list subscription(s) when/if I change their Role.</label></td>' . "\n";
                             echo '</tr>' . "\n";
                             foreach (array_keys(get_defined_vars()) as $__v) {
                                 $__refs[$__v] =& ${$__v};
                             }
                             do_action("ws_plugin__s2member_during_users_list_edit_cols_after_auto_opt_out_transitions", get_defined_vars());
                             unset($__refs, $__v);
                         }
                     }
                 }
             }
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_before_ip_restrictions", get_defined_vars());
             unset($__refs, $__v);
             echo '<tr>' . "\n";
             echo '<th><label for="ws-plugin--s2member-profile-ip-restrictions">Reset IP Restrictions:</label> <a href="#" onclick="alert(\'A single Username is only valid for a certain number of unique IP addresses (as configured in your s2Member -› General Options). Once that limit is reached, s2Member assumes there has been a security breach. At that time, s2Member will place a temporary ban (preventing access).\\n\\nIf you have spoken to a legitimate Customer that is receiving an error upon logging in (ex: 503 / too many IP addresses), you can remove this temporary ban by checking the box below. If the abusive behavior continues, s2Member will automatically re-instate IP Restrictions in the future. If you would like to gain further control over IP Restrictions, please check your General Options panel for s2Member.\'); return false;" tabindex="-1">[?]</a></th>' . "\n";
             echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_ip_restrictions" id="ws-plugin--s2member-profile-ip-restrictions" value="1" /> Yes, delete/reset IP Restrictions associated with this Username.</label>' . (c_ws_plugin__s2member_ip_restrictions::specific_ip_restriction_at_or_above_max(strtolower($user->user_login)) || c_ws_plugin__s2member_ip_restrictions::specific_ip_restriction_breached_security(strtolower($user->user_login)) ? '<br /><em>*WARNING* this User is at (or above) max allowable IP addresses (based on your IP Restrictions).</em>' : '<br /><em>*Note* this User is NOT currently banned by any of your IP Restrictions.</em>') . '</td>' . "\n";
             echo '</tr>' . "\n";
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_after_ip_restrictions", get_defined_vars());
             unset($__refs, $__v);
             if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"]) {
                 // Only if configured.
                 if ($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level($level, "administrative")) {
                     echo '<tr>' . "\n";
                     echo '<td colspan="2">' . "\n";
                     echo '<div style="height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
                     echo '</td>' . "\n";
                     echo '</tr>' . "\n";
                     $fields = get_user_option("s2member_custom_fields", $user_id);
                     // Existing fields.
                     foreach (array_keys(get_defined_vars()) as $__v) {
                         $__refs[$__v] =& ${$__v};
                     }
                     do_action("ws_plugin__s2member_during_users_list_edit_cols_before_custom_fields", get_defined_vars());
                     unset($__refs, $__v);
                     foreach (json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field) {
                         foreach (array_keys(get_defined_vars()) as $__v) {
                             $__refs[$__v] =& ${$__v};
                         }
                         do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_before", get_defined_vars());
                         unset($__refs, $__v);
                         if (in_array($field["id"], $fields_applicable)) {
                             $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
                             $field_id_class = preg_replace("/_/", "-", $field_var);
                             foreach (array_keys(get_defined_vars()) as $__v) {
                                 $__refs[$__v] =& ${$__v};
                             }
                             if (apply_filters("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_display", true, get_defined_vars())) {
                                 if (!empty($field["section"]) && $field["section"] === "yes") {
                                     // Starts a new section?
                                     echo '<tr><td colspan="2"><div class="ws-plugin--s2member-profile-divider-section' . (!empty($field["sectitle"]) ? '-title' : '') . '">' . (!empty($field["sectitle"]) ? $field["sectitle"] : '') . '</div></td></tr>';
                                 }
                                 echo '<tr>' . "\n";
                                 echo '<th><label for="ws-plugin--s2member-profile-' . esc_attr($field_id_class) . '">' . (preg_match("/^(checkbox|pre_checkbox)\$/", $field["type"]) ? ucwords(preg_replace("/_/", " ", $field_var)) : $field["label"]) . ':</label></th>' . "\n";
                                 echo '<td>' . c_ws_plugin__s2member_custom_reg_fields::custom_field_gen(__FUNCTION__, $field, "ws_plugin__s2member_profile_", "ws-plugin--s2member-profile-", "", preg_match("/^(text|textarea|select|selects)\$/", $field["type"]) ? "width:99%;" : "", "", "", $fields, $fields[$field_var], "administrative") . '</td>' . "\n";
                                 echo '</tr>' . "\n";
                             }
                             unset($__refs, $__v);
                         }
                         foreach (array_keys(get_defined_vars()) as $__v) {
                             $__refs[$__v] =& ${$__v};
                         }
                         do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_after", get_defined_vars());
                         unset($__refs, $__v);
                     }
                     foreach (array_keys(get_defined_vars()) as $__v) {
                         $__refs[$__v] =& ${$__v};
                     }
                     do_action("ws_plugin__s2member_during_users_list_edit_cols_after_custom_fields", get_defined_vars());
                     unset($__refs, $__v);
                     echo '<tr>' . "\n";
                     echo '<td colspan="2">' . "\n";
                     echo '<div style="height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
                     echo '</td>' . "\n";
                     echo '</tr>' . "\n";
                 }
             }
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_before_notes", get_defined_vars());
             unset($__refs, $__v);
             echo '<tr>' . "\n";
             echo '<th><label for="ws-plugin--s2member-profile-s2member-notes">Administrative Notes:</label> <a href="#" onclick="alert(\'This is for Administrative purposes. You can keep a list of Notations about this account. These Notations are private; Users/Members will never see these.\\n\\n*Note* The s2Member software may `append` Notes to this field occasionally, under special circumstances. For example, when/if s2Member demotes a paid Member to a Free Subscriber, s2Member will leave a Note in this field.\'); return false;" tabindex="-1">[?]</a><br /><br /><small>These Notations are private; Users/Members will never see any of these notes.</small></th>' . "\n";
             echo '<td><textarea name="ws_plugin__s2member_profile_s2member_notes" id="ws-plugin--s2member-profile-s2member-notes" rows="5" wrap="off" spellcheck="false" style="width:99%;">' . format_to_edit(get_user_option("s2member_notes", $user_id)) . '</textarea></td>' . "\n";
             echo '</tr>' . "\n";
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_after_notes", get_defined_vars());
             unset($__refs, $__v);
             foreach (array_keys(get_defined_vars()) as $__v) {
                 $__refs[$__v] =& ${$__v};
             }
             do_action("ws_plugin__s2member_during_users_list_edit_cols_after", get_defined_vars());
             unset($__refs, $__v);
             echo '</table>' . "\n";
             echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
         } else {
             if ($current_user->ID === $user->ID) {
                 if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"]) {
                     if ($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level($level, "profile")) {
                         echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
                         echo '<h3>' . _x("Additional Profile Fields", "s2member-front", "s2member") . (is_multisite() ? ' ' . _x("(for this site)", "s2member-front", "s2member") : "") . '</h3>' . "\n";
                         echo '<table class="form-table">' . "\n";
                         foreach (array_keys(get_defined_vars()) as $__v) {
                             $__refs[$__v] =& ${$__v};
                         }
                         do_action("ws_plugin__s2member_during_users_list_edit_cols_before", get_defined_vars());
                         unset($__refs, $__v);
                         $fields = get_user_option("s2member_custom_fields", $user_id);
                         // Existing fields.
                         foreach (array_keys(get_defined_vars()) as $__v) {
                             $__refs[$__v] =& ${$__v};
                         }
                         do_action("ws_plugin__s2member_during_users_list_edit_cols_before_custom_fields", get_defined_vars());
                         unset($__refs, $__v);
                         foreach (json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field) {
                             foreach (array_keys(get_defined_vars()) as $__v) {
                                 $__refs[$__v] =& ${$__v};
                             }
                             do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_before", get_defined_vars());
                             unset($__refs, $__v);
                             if (in_array($field["id"], $fields_applicable)) {
                                 $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
                                 $field_id_class = preg_replace("/_/", "-", $field_var);
                                 foreach (array_keys(get_defined_vars()) as $__v) {
                                     $__refs[$__v] =& ${$__v};
                                 }
                                 if (apply_filters("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_display", true, get_defined_vars())) {
                                     if (!empty($field["section"]) && $field["section"] === "yes") {
                                         // Starts a new section?
                                         echo '<tr><td colspan="2"><div class="ws-plugin--s2member-profile-divider-section' . (!empty($field["sectitle"]) ? '-title' : '') . '">' . (!empty($field["sectitle"]) ? $field["sectitle"] : '') . '</div></td></tr>';
                                     }
                                     echo '<tr>' . "\n";
                                     echo '<th><label for="ws-plugin--s2member-profile-' . esc_attr($field_id_class) . '">' . (preg_match("/^(checkbox|pre_checkbox)\$/", $field["type"]) ? ucwords(preg_replace("/_/", " ", $field_var)) : $field["label"]) . ':</label></th>' . "\n";
                                     echo '<td>' . c_ws_plugin__s2member_custom_reg_fields::custom_field_gen(__FUNCTION__, $field, "ws_plugin__s2member_profile_", "ws-plugin--s2member-profile-", "", preg_match("/^(text|textarea|select|selects)\$/", $field["type"]) ? "width:99%;" : "", "", "", $fields, $fields[$field_var], "profile") . '</td>' . "\n";
                                     echo '</tr>' . "\n";
                                 }
                                 unset($__refs, $__v);
                             }
                             foreach (array_keys(get_defined_vars()) as $__v) {
                                 $__refs[$__v] =& ${$__v};
                             }
                             do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_after", get_defined_vars());
                             unset($__refs, $__v);
                         }
                         foreach (array_keys(get_defined_vars()) as $__v) {
                             $__refs[$__v] =& ${$__v};
                         }
                         do_action("ws_plugin__s2member_during_users_list_edit_cols_after_custom_fields", get_defined_vars());
                         unset($__refs, $__v);
                         foreach (array_keys(get_defined_vars()) as $__v) {
                             $__refs[$__v] =& ${$__v};
                         }
                         do_action("ws_plugin__s2member_during_users_list_edit_cols_after", get_defined_vars());
                         unset($__refs, $__v);
                         echo '</table>' . "\n";
                         echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>' . "\n";
                     }
                 }
             }
         }
     }
     foreach (array_keys(get_defined_vars()) as $__v) {
         $__refs[$__v] =& ${$__v};
     }
     do_action("ws_plugin__s2member_after_users_list_edit_cols", get_defined_vars());
     unset($__refs, $__v);
     return;
 }
Example #17
0
 /**
  * Retrieves a unique array of Singular IDs in the database, within specific term IDs.
  *
  * Only returns Singular IDs that are within the ``$terms`` passed through this function.
  *
  * @package s2Member\Utilities
  * @since 110912
  *
  * @param array $terms Required. An array of term IDs.
  * @return array Unique array of all Singular IDs *(as integers)* within the ``$terms`` passed through this function.
  */
 public static function get_singular_ids_in_terms($terms = FALSE)
 {
     global $wpdb;
     // Need this global DB object reference here.
     if (!empty($terms) && is_array($terms) && is_array($singular_ids = $wpdb->get_col("SELECT `object_id` FROM `" . $wpdb->term_relationships . "` WHERE `term_taxonomy_id` IN (SELECT `term_taxonomy_id` FROM `" . $wpdb->term_taxonomy . "` WHERE `term_id` IN('" . implode("','", $terms) . "'))"))) {
         $singular_ids = c_ws_plugin__s2member_utils_arrays::force_integers($singular_ids);
     }
     return !empty($singular_ids) && is_array($singular_ids) ? array_unique($singular_ids) : array();
 }
Example #18
0
 /**
  * Verifies an s2Member-generated signature; in a full URL, a partial URI, or in just a query string.
  *
  * @package s2Member\Utilities
  * @since 111106
  *
  * @param string $url_uri_query A full URL, a partial URI, or just a query string. Must have an s2Member-generated signature to validate.
  * @param bool $check_time Optional. Defaults to false. If true, s2Member will also check if the signature has expired, based on ``$exp_secs``.
  * @param string|int $exp_secs Optional. Defaults to (int)10. If ``$check_time`` is true, s2Member will check if the signature has expired, based on ``$exp_secs``.
  * @param string $sig_var Optional. The name of the s2Member-generated signature variable. Defaults to `_s2member_sig`.
  * @return bool True if the s2Member-generated signature is OK, else false.
  */
 public static function s2member_sig_ok($url_uri_query = FALSE, $check_time = FALSE, $exp_secs = FALSE, $sig_var = FALSE)
 {
     $url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim((string) $url_uri_query, false, '?&=');
     if (preg_match('/^(?:[a-z]+\\:\\/\\/|\\/)/i', $url_uri_query)) {
         // Is this a full URL or a partial URI?
         $query = trim(c_ws_plugin__s2member_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY), '?&=');
     }
     $check_time = (bool) $check_time;
     // Check time?
     $exp_secs = is_numeric($exp_secs) ? (int) $exp_secs : 10;
     $sig_var = $sig_var && is_string($sig_var) ? $sig_var : '_s2member_sig';
     $key = c_ws_plugin__s2member_utils_encryption::key();
     // Obtain key.
     if (preg_match_all('/' . preg_quote($sig_var, '/') . '\\=([0-9]+)-([^&$]+)/', $query, $sigs)) {
         $query = c_ws_plugin__s2member_utils_urls::remove_s2member_sigs($query, $sig_var);
         wp_parse_str($query, $vars);
         // Parse the query string into an array of ``$vars``.
         $vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings(c_ws_plugin__s2member_utils_strings::trim_deep($vars));
         $vars = serialize(c_ws_plugin__s2member_utils_arrays::ksort_deep($vars));
         $i = count($sigs[1]) - 1;
         // Last one.
         $time = $sigs[1][$i];
         // Timestamp.
         $sig = $sigs[2][$i];
         // Signature.
         $valid_sig = md5($key . $time . $vars);
         if ($check_time) {
             // This must NOT be older than ``$exp_secs`` seconds ago.
             return $sig === $valid_sig && $time >= strtotime('-' . $exp_secs . ' seconds');
         }
         return $sig === $valid_sig;
     }
     return false;
     // False, it's NOT ok.
 }
 /**
  * Verifies an s2Member-generated signature; in a full URL, a partial URI, or in just a query string.
  *
  * @package s2Member\Utilities
  * @since 111106
  *
  * @param str $url_uri_query A full URL, a partial URI, or just a query string. Must have an s2Member-generated signature to validate.
  * @param bool $check_time Optional. Defaults to false. If true, s2Member 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, s2Member will check if the signature has expired, based on ``$exp_secs``.
  * @param str $sig_var Optional. The name of the s2Member-generated signature variable. Defaults to `_s2member_sig`.
  * @return bool True if the s2Member-generated signature is OK, else false.
  */
 public static function s2member_sig_ok($url_uri_query = FALSE, $check_time = FALSE, $exp_secs = FALSE, $sig_var = FALSE)
 {
     $url_uri_query = $query = c_ws_plugin__s2member_utils_strings::trim((string) $url_uri_query, false, "?&=");
     if (preg_match("/^(?:[a-z]+\\:\\/\\/|\\/)/i", $url_uri_query)) {
         $query = trim(c_ws_plugin__s2member_utils_urls::parse_url($url_uri_query, PHP_URL_QUERY), "?&=");
     }
     /**/
     $check_time = $check_time ? true : false;
     $exp_secs = is_numeric($exp_secs) ? (int) $exp_secs : 10;
     $sig_var = $sig_var && is_string($sig_var) ? $sig_var : "_s2member_sig";
     /**/
     $key = c_ws_plugin__s2member_utils_encryption::key();
     /**/
     if (preg_match_all("/" . preg_quote($sig_var, "/") . "\\=([0-9]+)-([^&\$]+)/", $query, $sigs)) {
         $query = c_ws_plugin__s2member_utils_urls::remove_s2member_sigs($query, $sig_var);
         /**/
         wp_parse_str($query, $vars);
         $vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings(c_ws_plugin__s2member_utils_strings::trim_deep($vars));
         $vars = serialize(c_ws_plugin__s2member_utils_arrays::ksort_deep($vars));
         /**/
         ($time = $sigs[1][$i = count($sigs[1]) - 1]) . ($sig = $sigs[2][$i]) . ($valid_sig = md5($key . $time . $vars));
         /**/
         if ($check_time) {
             return $sig === $valid_sig && $time >= strtotime("-" . $exp_secs . " seconds");
         } else {
             /* Ignoring time? Just need to compare signatures in this case. */
             return $sig === $valid_sig;
         }
     } else {
         /* Return false. No ``$query``, or no ``$sigs``. */
         return false;
     }
 }
 /**
  * Handles Download Access permissions.
  *
  * @package s2Member\Files
  * @since 3.5
  *
  * @attaches-to ``add_action("init");``
  * @also-called-by API Function {@link s2Member\API_Functions\s2member_file_download_url()}, w/ ``$create_file_download_url`` param.
  *
  * @param array $create_file_download_url Optional. If this function is called directly, we can pass arguments through this array.
  * 	Possible array elements: `file_download` *(required)*, `file_download_key`, `file_stream`, `file_inline`, `file_storage`, `file_remote`, `file_ssl`, `file_rewrite`, `file_rewrite_base`, `skip_confirmation`, `url_to_storage_source`, `count_against_user`, `check_user`.
  * @return null|str If called directly with ``$create_file_download_url``, returns a string with the URL, based on configuration.
  * 	Else, this function may exit script execution after serving a File Download.
  */
 public static function check_file_download_access($create_file_download_url = FALSE)
 {
     eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
     do_action("ws_plugin__s2member_before_file_download_access", get_defined_vars());
     unset($__refs, $__v);
     /* Unset defined __refs, __v. */
     /**/
     $_g = !empty($_GET) ? $_GET : array();
     $_g = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_g));
     /**/
     $creating = is_array($create = $create_file_download_url) ? true : false;
     $serving = !$creating ? true : false;
     /**/
     $req["file_download"] = $creating ? @$create["file_download"] : @$_g["s2member_file_download"];
     $req["file_download_key"] = $creating ? @$create["file_download_key"] : @$_g["s2member_file_download_key"];
     /**/
     $req["file_stream"] = $creating ? @$create["file_stream"] : @$_g["s2member_file_stream"];
     $req["file_inline"] = $creating ? @$create["file_inline"] : @$_g["s2member_file_inline"];
     $req["file_storage"] = $creating ? @$create["file_storage"] : @$_g["s2member_file_storage"];
     $req["file_remote"] = $creating ? @$create["file_remote"] : @$_g["s2member_file_remote"];
     $req["file_ssl"] = $creating ? @$create["file_ssl"] : @$_g["s2member_file_ssl"];
     /**/
     $req["file_rewrite"] = $creating ? @$create["file_rewrite"] : null;
     $req["file_rewrite_base"] = $creating ? @$create["file_rewrite_base"] : null;
     /**/
     $req["skip_confirmation"] = $creating ? @$create["skip_confirmation"] : null;
     $req["url_to_storage_source"] = $creating ? @$create["url_to_storage_source"] : null;
     $req["count_against_user"] = $creating ? @$create["count_against_user"] : null;
     $req["check_user"] = $creating ? @$create["check_user"] : null;
     /**/
     if ($req["file_download"] && is_string($req["file_download"]) && ($req["file_download"] = trim($req["file_download"], "/"))) {
         if (strpos($req["file_download"], "..") === false && strpos(basename($req["file_download"]), ".") !== 0) {
             $using_amazon_s3_storage = (!$req["file_storage"] || strcasecmp((string) $req["file_storage"], "s3") === 0) && c_ws_plugin__s2member_utils_conds::using_amazon_s3_storage() ? true : false;
             $using_amazon_cf_storage = (!$req["file_storage"] || strcasecmp((string) $req["file_storage"], "cf") === 0) && c_ws_plugin__s2member_utils_conds::using_amazon_cf_storage() ? true : false;
             $using_amazon_storage = $using_amazon_s3_storage || $using_amazon_cf_storage ? true : false;
             /**/
             $excluded = apply_filters("ws_plugin__s2member_check_file_download_access_excluded", false, get_defined_vars());
             $valid_file_download_key = $req["file_download_key"] && is_string($req["file_download_key"]) ? c_ws_plugin__s2member_files_in::check_file_download_key($req["file_download"], $req["file_download_key"]) : false;
             $checking_user = $excluded || $valid_file_download_key || $creating && (!isset($req["check_user"]) || !filter_var($req["check_user"], FILTER_VALIDATE_BOOLEAN)) && (!isset($req["count_against_user"]) || !filter_var($req["count_against_user"], FILTER_VALIDATE_BOOLEAN)) ? false : true;
             $updating_user_counter = !$checking_user || $creating && (!isset($req["count_against_user"]) || !filter_var($req["count_against_user"], FILTER_VALIDATE_BOOLEAN)) ? false : true;
             /**/
             if (($serving || $creating) && $checking_user) {
                 if (!$using_amazon_storage && !file_exists($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $req["file_download"])) {
                     if ($serving) {
                         status_header(404) . header("Content-Type: text/html; charset=utf-8") . eval('while (@ob_end_clean ());') . exit(_x('<strong>404: Sorry, file not found.</strong> Please contact Support for assistance.', "s2member-front", "s2member"));
                     } else {
                         /* Else return false. */
                         return false;
                     }
                 } else {
                     if ($req["file_download_key"] && is_string($req["file_download_key"]) && !$valid_file_download_key) {
                         if ($serving) {
                             status_header(503) . header("Content-Type: text/html; charset=utf-8") . eval('while (@ob_end_clean ());') . exit(_x('<strong>503 ( Invalid Key ):</strong> Sorry, your access to this file has expired. Please contact Support for assistance.', "s2member-front", "s2member"));
                         } else {
                             /* Else return false. */
                             return false;
                         }
                     } else {
                         if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"] || ($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads()) === false) {
                             if ($serving) {
                                 if (!has_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization")) {
                                     add_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization", 10, 2);
                                 }
                             }
                             /**/
                             if ($creating) {
                                 if (has_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization")) {
                                     remove_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization", 10, 2);
                                 }
                             }
                             /**/
                             if (isset($file_downloads_enabled_by_site_owner, $min_level_4_downloads) && $file_downloads_enabled_by_site_owner === false || ($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads()) === false) {
                                 if ($serving) {
                                     status_header(503) . header("Content-Type: text/html; charset=utf-8") . eval('while (@ob_end_clean ());') . exit(_x('<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <code>s2Member -> Download Options -> Basic Download Restrictions</code>.', "s2member-front", "s2member"));
                                 } else {
                                     /* Else return false. */
                                     return false;
                                 }
                             } else {
                                 if (!is_object($user = apply_filters("ws_plugin__s2member_check_file_download_access_user", is_user_logged_in() ? wp_get_current_user() : false, get_defined_vars())) || empty($user->ID) || !($user_id = $user->ID) || !is_array($user_file_downloads = c_ws_plugin__s2member_files::user_downloads($user)) || !$user->has_cap("administrator") && (!$user_file_downloads["allowed"] || !$user_file_downloads["allowed_days"])) {
                                     if (preg_match("/^access[_\\-]s2member[_\\-]level([0-9]+)\\//", $req["file_download"], $m) && strlen($req_level = $m[1]) && (!is_object($user) || empty($user->ID) || !$user->has_cap("access_s2member_level" . $req_level))) {
                                         if ($serving) {
                                             c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars("file", $req["file_download"], "level", $req_level, $_SERVER["REQUEST_URI"]) . exit;
                                         } else {
                                             /* Else return false. */
                                             return false;
                                         }
                                     } else {
                                         if (preg_match("/^access[_\\-]s2member[_\\-]ccap[_\\-](.+?)\\//", $req["file_download"], $m) && strlen($req_ccap = preg_replace("/-/", "_", $m[1])) && (!is_object($user) || empty($user->ID) || !$user->has_cap("access_s2member_ccap_" . $req_ccap))) {
                                             if ($serving) {
                                                 c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars("file", $req["file_download"], "ccap", $req_ccap, $_SERVER["REQUEST_URI"]) . exit;
                                             } else {
                                                 /* Else return false. */
                                                 return false;
                                             }
                                         } else {
                                             if ($serving) {
                                                 c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars("file", $req["file_download"], "level", $min_level_4_downloads, $_SERVER["REQUEST_URI"]) . exit;
                                             } else {
                                                 /* Else return false. */
                                                 return false;
                                             }
                                         }
                                     }
                                 } else {
                                     if (preg_match("/^access[_\\-]s2member[_\\-]level([0-9]+)\\//", $req["file_download"], $m) && strlen($req_level = $m[1]) && !$user->has_cap("access_s2member_level" . $req_level)) {
                                         if ($serving) {
                                             c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars("file", $req["file_download"], "level", $req_level, $_SERVER["REQUEST_URI"]) . exit;
                                         } else {
                                             /* Else return false. */
                                             return false;
                                         }
                                     } else {
                                         if (preg_match("/^access[_\\-]s2member[_\\-]ccap[_\\-](.+?)\\//", $req["file_download"], $m) && strlen($req_ccap = preg_replace("/-/", "_", $m[1])) && !$user->has_cap("access_s2member_ccap_" . $req_ccap)) {
                                             if ($serving) {
                                                 c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars("file", $req["file_download"], "ccap", $req_ccap, $_SERVER["REQUEST_URI"]) . exit;
                                             } else {
                                                 /* Else return false. */
                                                 return false;
                                             }
                                         } else {
                                             if ($serving || $creating) {
                                                 $user_previous_file_downloads = 0;
                                                 $user_already_downloaded_this_file = $user_already_downloaded_a_streaming_variation_of_this_file = false;
                                                 /**/
                                                 $user_file_download_access_log = is_array($user_file_download_access_log = get_user_option("s2member_file_download_access_log", $user_id)) ? $user_file_download_access_log : array();
                                                 $user_file_download_access_arc = is_array($user_file_download_access_arc = get_user_option("s2member_file_download_access_arc", $user_id)) ? $user_file_download_access_arc : array();
                                                 /**/
                                                 $streaming_file_extns = c_ws_plugin__s2member_utils_strings::preg_quote_deep($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["streaming_file_extns"], "/");
                                                 $streaming_variations = "/\\.(" . implode("|", $streaming_file_extns) . ")\$/i";
                                                 /**/
                                                 foreach ($user_file_download_access_log as $user_file_download_access_log_entry_key => $user_file_download_access_log_entry) {
                                                     if (isset($user_file_download_access_log_entry["date"], $user_file_download_access_log_entry["file"])) {
                                                         if (strtotime($user_file_download_access_log_entry["date"]) < strtotime("-" . $user_file_downloads["allowed_days"] . " days")) {
                                                             unset($user_file_download_access_log[$user_file_download_access_log_entry_key]);
                                                             $user_file_download_access_arc[] = $user_file_download_access_log_entry;
                                                         } else {
                                                             if (strtotime($user_file_download_access_log_entry["date"]) >= strtotime("-" . $user_file_downloads["allowed_days"] . " days")) {
                                                                 $user_previous_file_downloads++;
                                                                 /* Previous files always count against this User/Member. */
                                                                 /**/
                                                                 $_user_file_download_access_log_entry =& $user_file_download_access_log[$user_file_download_access_log_entry_key];
                                                                 $_user_already_downloaded_this_file = $_user_already_downloaded_a_streaming_variation_of_this_file = false;
                                                                 /**/
                                                                 if ($user_file_download_access_log_entry["file"] === $req["file_download"]) {
                                                                     $user_already_downloaded_this_file = $_user_already_downloaded_this_file = true;
                                                                 } else {
                                                                     if (preg_replace($streaming_variations, "", $user_file_download_access_log_entry["file"]) === preg_replace($streaming_variations, "", $req["file_download"])) {
                                                                         $user_already_downloaded_this_file = $_user_already_downloaded_this_file = $user_already_downloaded_a_streaming_variation_of_this_file = $_user_already_downloaded_a_streaming_variation_of_this_file = true;
                                                                     }
                                                                 }
                                                                 /**/
                                                                 if ($updating_user_counter && ($_user_already_downloaded_this_file || $_user_already_downloaded_a_streaming_variation_of_this_file)) {
                                                                     $_user_file_download_access_log_entry["ltime"] = time();
                                                                     /**/
                                                                     if (!empty($user_file_download_access_log_entry["counter"])) {
                                                                         $_user_file_download_access_log_entry["counter"] = (int) $user_file_download_access_log_entry["counter"] + 1;
                                                                     } else {
                                                                         /* Backward compatiility here. Default value to `1`, if this is NOT even set yet. */
                                                                         $_user_file_download_access_log_entry["counter"] = 1 + 1;
                                                                     }
                                                                 }
                                                             }
                                                         }
                                                     } else {
                                                         /* Weed out empty log entries. Some older versions of s2Member may have corrupt/empty log entries. */
                                                         unset($user_file_download_access_log[$user_file_download_access_log_entry_key]);
                                                     }
                                                     /* Remove. */
                                                 }
                                                 if ($updating_user_counter && !$user_already_downloaded_this_file && !$user_already_downloaded_a_streaming_variation_of_this_file) {
                                                     $user_file_download_access_log[] = array("date" => date("Y-m-d"), "time" => time(), "ltime" => time(), "file" => $req["file_download"], "counter" => 1);
                                                 }
                                                 /**/
                                                 if ($user_previous_file_downloads >= $user_file_downloads["allowed"] && !$user_already_downloaded_this_file && !$user_already_downloaded_a_streaming_variation_of_this_file && !$user->has_cap("administrator")) {
                                                     if ($serving) {
                                                         wp_redirect(add_query_arg(urlencode_deep(array("_s2member_seeking" => array("type" => "file", "file" => $req["file_download"], "_uri" => base64_encode($_SERVER["REQUEST_URI"])), "s2member_seeking" => "file-" . $req["file_download"])), get_page_link($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"])), apply_filters("ws_plugin__s2member_content_redirect_status", 301, get_defined_vars())) . exit;
                                                     } else {
                                                         /* Else return false. */
                                                         return false;
                                                     }
                                                 } else {
                                                     if ($updating_user_counter) {
                                                         update_user_option($user_id, "s2member_file_download_access_log", c_ws_plugin__s2member_utils_arrays::array_unique($user_file_download_access_log)) . update_user_option($user_id, "s2member_file_download_access_arc", c_ws_plugin__s2member_utils_arrays::array_unique($user_file_download_access_arc));
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             } else {
                 if (!$using_amazon_storage && !file_exists($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $req["file_download"])) {
                     if ($serving) {
                         status_header(404) . header("Content-Type: text/html; charset=utf-8") . eval('while (@ob_end_clean ());') . exit(_x('<strong>404: Sorry, file not found.</strong> Please contact Support for assistance.', "s2member-front", "s2member"));
                     } else {
                         /* Else return false. */
                         return false;
                     }
                 }
             }
             /**/
             if ($serving || $creating) {
                 $basename = basename($req["file_download"]);
                 $mimetypes = parse_ini_file(dirname(dirname(dirname(__FILE__))) . "/includes/mime-types.ini");
                 $extension = strtolower(substr($req["file_download"], strrpos($req["file_download"], ".") + 1));
                 /**/
                 $key = $req["file_download_key"] && is_string($req["file_download_key"]) ? $req["file_download_key"] : false;
                 /**/
                 $stream = isset($req["file_stream"]) ? filter_var($req["file_stream"], FILTER_VALIDATE_BOOLEAN) : (in_array($extension, preg_split("/[\r\n\t\\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_stream_extensions"])) ? true : false);
                 $inline = !$stream && isset($req["file_inline"]) ? filter_var($req["file_inline"], FILTER_VALIDATE_BOOLEAN) : ($stream || in_array($extension, preg_split("/[\r\n\t\\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_inline_extensions"])) ? true : false);
                 $ssl = isset($req["file_ssl"]) ? filter_var($req["file_ssl"], FILTER_VALIDATE_BOOLEAN) : (is_ssl() ? true : false);
                 $storage = $req["file_storage"] && is_string($req["file_storage"]) ? strtolower($req["file_storage"]) : false;
                 $remote = isset($req["file_remote"]) ? filter_var($req["file_remote"], FILTER_VALIDATE_BOOLEAN) : false;
                 /**/
                 $rewrite_base_guess = dirname($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]) . "/" . c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"]);
                 $rewrite_base = $req["file_rewrite_base"] && is_string($req["file_rewrite_base"]) ? $req["file_rewrite_base"] : false;
                 $rewrite = $rewriting = !$rewrite_base && isset($req["file_rewrite"]) ? filter_var($req["file_rewrite"], FILTER_VALIDATE_BOOLEAN) : ($rewrite_base ? true : false);
                 /**/
                 $skip_confirmation = isset($req["skip_confirmation"]) ? filter_var($req["skip_confirmation"], FILTER_VALIDATE_BOOLEAN) : false;
                 $url_to_storage_source = isset($req["url_to_storage_source"]) ? filter_var($req["url_to_storage_source"], FILTER_VALIDATE_BOOLEAN) : false;
                 /**/
                 $pathinfo = !$using_amazon_storage ? pathinfo($file = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $req["file_download"]) : array();
                 $mimetype = $mimetypes[$extension] ? $mimetypes[$extension] : "application/octet-stream";
                 $length = !$using_amazon_storage && $file ? filesize($file) : -1;
                 /**/
                 eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
                 do_action("ws_plugin__s2member_during_file_download_access", get_defined_vars());
                 unset($__refs, $__v);
                 /* Unset defined __refs, __v. */
                 /**/
                 if ($using_amazon_s3_storage && ($serving || $creating && $url_to_storage_source)) {
                     if ($serving) {
                         wp_redirect(c_ws_plugin__s2member_files_in::amazon_s3_url($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype)) . exit;
                     } else {
                         /* Else return File Download URL. */
                         return apply_filters("ws_plugin__s2member_file_download_access_url", c_ws_plugin__s2member_files_in::amazon_s3_url($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype), get_defined_vars());
                     }
                 } else {
                     if ($using_amazon_cf_storage && ($serving || $creating && $url_to_storage_source)) {
                         if ($serving) {
                             wp_redirect(c_ws_plugin__s2member_files_in::amazon_cf_url($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype)) . exit;
                         } else {
                             /* Else return File Download URL. */
                             return apply_filters("ws_plugin__s2member_file_download_access_url", c_ws_plugin__s2member_files_in::amazon_cf_url($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype), get_defined_vars());
                         }
                     } else {
                         if ($creating && $rewriting) {
                             $url = $rewrite_base ? rtrim($rewrite_base, "/") : rtrim($rewrite_base_guess, "/");
                             $url .= isset($req["file_download_key"]) ? $key ? "/s2member-file-download-key-" . $key : "" : "";
                             $url .= isset($req["file_stream"]) ? $stream ? "/s2member-file-stream" : "/s2member-file-stream-no" : "";
                             $url .= isset($req["file_inline"]) ? $inline ? "/s2member-file-inline" : "/s2member-file-inline-no" : "";
                             $url .= isset($req["file_storage"]) ? $storage ? "/s2member-file-storage-" . $storage : "" : "";
                             $url .= isset($req["file_remote"]) ? $remote ? "/s2member-file-remote" : "/s2member-file-remote-no" : "";
                             $url .= isset($req["skip_confirmation"]) ? $skip_confirmation ? "/s2member-skip-confirmation" : "/s2member-skip-confirmation-no" : "";
                             /**/
                             $url = $url . "/" . $req["file_download"];
                             $url = $ssl ? preg_replace("/^https?/", "https", $url) : preg_replace("/^https?/", "http", $url);
                             /**/
                             return apply_filters("ws_plugin__s2member_file_download_access_url", $url, get_defined_vars());
                         } else {
                             if ($creating) {
                                 /* Note: we don't URL encode unreserved chars. Improves media player compatibility. */
                                 $_url_e_key = $key ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($key)) : "";
                                 $_url_e_storage = $storage ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($storage)) : "";
                                 $_url_e_file = c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($req["file_download"]));
                                 /**/
                                 $url = isset($req["file_download_key"]) ? $key && $_url_e_key ? "&s2member_file_download_key=" . $_url_e_key : "" : "";
                                 $url .= isset($req["file_stream"]) ? $stream ? "&s2member_file_stream=yes" : "&s2member_file_stream=no" : "";
                                 $url .= isset($req["file_inline"]) ? $inline ? "&s2member_file_inline=yes" : "&s2member_file_inline=no" : "";
                                 $url .= isset($req["file_storage"]) ? $storage && $_url_e_storage ? "&s2member_file_storage=" . $_url_e_storage : "" : "";
                                 $url .= isset($req["file_remote"]) ? $remote ? "&s2member_file_remote=yes" : "&s2member_file_remote=no" : "";
                                 $url .= isset($req["skip_confirmation"]) ? $skip_confirmation ? "&s2member_skip_confirmation=yes" : "&s2member_skip_confirmation=no" : "";
                                 /**/
                                 $url = site_url("/?" . ltrim($url . "&s2member_file_download=/" . $_url_e_file, "&"));
                                 $url = $ssl ? preg_replace("/^https?/", "https", $url) : preg_replace("/^https?/", "http", $url);
                                 /**/
                                 return apply_filters("ws_plugin__s2member_file_download_access_url", $url, get_defined_vars());
                             } else {
                                 @set_time_limit(0) . @ini_set("zlib.output_compression", 0);
                                 /**/
                                 status_header(200);
                                 /**/
                                 header("Content-Encoding:");
                                 header("Accept-Ranges: none");
                                 header("Content-Type: " . $mimetype);
                                 header("Expires: " . gmdate("D, d M Y H:i:s", strtotime("-1 week")) . " GMT");
                                 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
                                 header("Cache-Control: no-cache, must-revalidate, max-age=0");
                                 header("Cache-Control: post-check=0, pre-check=0", false);
                                 header("Pragma: no-cache");
                                 /**/
                                 header('Content-Disposition: ' . ($inline ? "inline" : "attachment") . '; filename="' . $basename . '"');
                                 /**/
                                 eval('while (@ob_end_clean ());');
                                 /**/
                                 $_chunk_file = $_SERVER["SERVER_PROTOCOL"] === "HTTP/1.1" && preg_match("/apache/i", $_SERVER["SERVER_SOFTWARE"]) ? true : false;
                                 /**/
                                 if ($length && apply_filters("ws_plugin__s2member_chunk_file_downloads", $_chunk_file, get_defined_vars()) && is_resource($resource = fopen($file, "rb"))) {
                                     $_chunk_size = apply_filters("ws_plugin__s2member_chunk_file_downloads_w_chunk_size", 2097152, get_defined_vars());
                                     /**/
                                     if (apply_filters("ws_plugin__s2member_chunk_file_downloads_w_content_length", true, get_defined_vars())) {
                                         header("Content-Length: " . $length);
                                     }
                                     /**/
                                     header("Transfer-Encoding: chunked");
                                     /**/
                                     while (!feof($resource) && ($chunk_size = strlen($data = fread($resource, $_chunk_size)))) {
                                         eval('echo dechex ($chunk_size) . "\\r\\n". $data . "\\r\\n"; @flush ();');
                                     }
                                     /**/
                                     fclose($resource) . exit("0\r\n\r\n");
                                 } else {
                                     if ($length && apply_filters("ws_plugin__s2member_flush_file_downloads", true, get_defined_vars()) && is_resource($resource = fopen($file, "rb"))) {
                                         $_flush_size = apply_filters("ws_plugin__s2member_flush_file_downloads_w_flush_size", 2097152, get_defined_vars());
                                         /**/
                                         if (apply_filters("ws_plugin__s2member_flush_file_downloads_w_content_length", true, get_defined_vars())) {
                                             header("Content-Length: " . $length);
                                         }
                                         /**/
                                         while (!feof($resource) && ($flush_size = strlen($data = fread($resource, $_flush_size)))) {
                                             eval('echo $data; @flush ();');
                                         }
                                     } else {
                                         if ($length) {
                                             @ini_set("memory_limit", WP_MAX_MEMORY_LIMIT);
                                             header("Content-Length: " . $length) . exit(file_get_contents($file));
                                         } else {
                                             header("Content-Length: 0") . exit;
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         } else {
             if ($serving && $req["file_download"]) {
                 status_header(503) . header("Content-Type: text/html; charset=utf-8") . eval('while (@ob_end_clean ());') . exit(_x('<strong>503: Access denied.</strong> Invalid File Download specs.', "s2member-front", "s2member"));
             } else {
                 if ($creating) {
                     return false;
                 }
             }
         }
     }
     /**/
     do_action("ws_plugin__s2member_after_file_download_access", get_defined_vars());
     /**/
     return $creating ? false : null;
 }