PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/plugins/s2member/includes/classes/sp-access.inc.php

https://gitlab.com/Gashler/dp
PHP | 180 lines | 94 code | 19 blank | 67 comment | 46 complexity | 57c03c5a6feedd126ff426575907861c MD5 | raw file
  1. <?php
  2. /**
  3. * Specific Post/Page Access routines.
  4. *
  5. * Copyright: © 2009-2011
  6. * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
  7. * (coded in the USA)
  8. *
  9. * Released under the terms of the GNU General Public License.
  10. * You should have received a copy of the GNU General Public License,
  11. * along with this software. In the main directory, see: /licensing/
  12. * If not, see: {@link http://www.gnu.org/licenses/}.
  13. *
  14. * @package s2Member\SP_Access
  15. * @since 3.5
  16. */
  17. if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
  18. exit ("Do not access this file directly.");
  19. if (!class_exists ("c_ws_plugin__s2member_sp_access"))
  20. {
  21. /**
  22. * Specific Post/Page Access routines.
  23. *
  24. * @package s2Member\SP_Access
  25. * @since 3.5
  26. */
  27. class c_ws_plugin__s2member_sp_access
  28. {
  29. /**
  30. * Generates Specific Post/Page Access links.
  31. *
  32. * @package s2Member\SP_Access
  33. * @since 3.5
  34. *
  35. * @param str|int $sp_ids Comma-delimited list of Specific Post/Page IDs *(numerical)*.
  36. * @param int|str $hours Optional. A numeric expiration time for this link, in hours. Defaults to `72`.
  37. * @param bool $shrink Optional. Defaults to true. If false, the raw link will NOT be processed by the tinyURL API.
  38. * @return str|bool A Specific Post/Page Access Link, or false on failure.
  39. */
  40. public static function sp_access_link_gen ($sp_ids = FALSE, $hours = 72, $shrink = TRUE)
  41. {
  42. foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
  43. do_action ("ws_plugin__s2member_before_sp_access_link_gen", get_defined_vars ());
  44. unset /* Unset defined __refs, __v. */ ($__refs, $__v);
  45. if ((is_string ($sp_ids) || is_numeric ($sp_ids)) && ($sp_ids = preg_replace ("/[^0-9;,]/", "", $sp_ids)) && ($leading_id = preg_replace ("/^([0-9]+).*$/", "$1", $sp_ids)) && is_numeric ($hours))
  46. {
  47. $sp_access = c_ws_plugin__s2member_utils_encryption::encrypt ("sp_time_hours:.:|:.:" . $sp_ids . ":.:|:.:" . strtotime ("now") . ":.:|:.:" . $hours);
  48. $sp_access_link = add_query_arg ("s2member_sp_access", urlencode ($sp_access), get_permalink ($leading_id)); // Generate long URL/link.
  49. if ($shrink && ($shorter_url = c_ws_plugin__s2member_utils_urls::shorten ($sp_access_link)))
  50. $sp_access_link = $shorter_url . "#" . $_SERVER["HTTP_HOST"];
  51. }
  52. return apply_filters ("ws_plugin__s2member_sp_access_link_gen", ((!empty ($sp_access_link)) ? $sp_access_link : false), get_defined_vars ());
  53. }
  54. /**
  55. * Generates Specific Post/Page Access links via AJAX.
  56. *
  57. * @package s2Member\SP_Access
  58. * @since 3.5
  59. *
  60. * @attaches-to ``add_action("wp_ajax_ws_plugin__s2member_sp_access_link_via_ajax");``
  61. *
  62. * @return null Exits script execution after returning data for AJAX caller.
  63. */
  64. public static function sp_access_link_via_ajax ()
  65. {
  66. do_action ("ws_plugin__s2member_before_sp_access_link_via_ajax", get_defined_vars ());
  67. status_header (200); // Send a 200 OK status header.
  68. header ("Content-Type: text/plain; charset=UTF-8"); // Content-Type with UTF-8.
  69. while (@ob_end_clean ()); // Clean any existing output buffers.
  70. if (current_user_can ("create_users")) // Check privileges as well. Ability to create Users?
  71. if (!empty ($_POST["ws_plugin__s2member_sp_access_link_via_ajax"]) && is_string ($nonce = $_POST["ws_plugin__s2member_sp_access_link_via_ajax"]) && wp_verify_nonce ($nonce, "ws-plugin--s2member-sp-access-link-via-ajax"))
  72. if (($_p = c_ws_plugin__s2member_utils_strings::trim_deep (stripslashes_deep ($_POST))) && isset ($_p["s2member_sp_access_link_ids"], $_p["s2member_sp_access_link_hours"]))
  73. $sp_access_link = c_ws_plugin__s2member_sp_access::sp_access_link_gen ((string)$_p["s2member_sp_access_link_ids"], (string)$_p["s2member_sp_access_link_hours"]);
  74. exit (apply_filters ("ws_plugin__s2member_sp_access_link_via_ajax", ((!empty ($sp_access_link)) ? $sp_access_link : ""), get_defined_vars ()));
  75. }
  76. /**
  77. * Handles Specific Post/Page Access authentication.
  78. *
  79. * @package s2Member\SP_Access
  80. * @since 3.5
  81. *
  82. * @param int|str $sp_id Numeric Post/Page ID in WordPress®.
  83. * @param bool $read_only Optional. Defaults to false. If ``$read_only = true``,
  84. * no session cookies are set, no IP Restrictions are checked, and script execution is not exited on Link failure.
  85. * In other words, with ``$read_only = true``, this function will simply return true or false.
  86. * @return null|bool Always returns `true` if access is indeed allowed in one way or another.
  87. * If access is denied with ``$read_only = true`` simply return false. If access is denied with ``$read_only = false``, return false; but if a Specific Post/Page Access Link is currently being used, we exit with a warning about Access Link expiration here.
  88. */
  89. public static function sp_access ($sp_id = FALSE, $read_only = FALSE)
  90. {
  91. do_action ("ws_plugin__s2member_before_sp_access", get_defined_vars ());
  92. $excluded = apply_filters ("ws_plugin__s2member_sp_access_excluded", false, get_defined_vars ());
  93. if ($excluded || current_user_can (apply_filters ("ws_plugin__s2member_sp_access_excluded_cap", "edit_posts", get_defined_vars ())))
  94. return apply_filters ("ws_plugin__s2member_sp_access", true, get_defined_vars (), "auth-via-exclusion");
  95. else if ($sp_id && is_numeric ($sp_id) && ((!empty ($_GET["s2member_sp_access"]) && ($_g["s2member_sp_access"] = trim (stripslashes ((string)$_GET["s2member_sp_access"]))) && is_array ($sp_access_values = array ($_g["s2member_sp_access"]))) || is_array ($sp_access_values = c_ws_plugin__s2member_sp_access::sp_access_session ())) && !empty ($sp_access_values))
  96. {
  97. foreach ($sp_access_values as $sp_access_value) // Supports multiple access values in a session. We go through each of them.
  98. {
  99. if (is_array ($sp_access = preg_split ("/\:\.\:\|\:\.\:/", c_ws_plugin__s2member_utils_encryption::decrypt ($sp_access_value))))
  100. {
  101. if (count ($sp_access) === 4 && $sp_access[0] === "sp_time_hours" && in_array ($sp_id, preg_split ("/[\r\n\t\s;,]+/", $sp_access[1])))
  102. {
  103. if (is_numeric ($sp_access[2]) && is_numeric ($sp_access[3]) && $sp_access[2] <= strtotime ("now") && ($sp_access[2] + ($sp_access[3] * 3600)) >= strtotime ("now"))
  104. {
  105. if (!$read_only && !empty ($_g["s2member_sp_access"])) // Add to session?
  106. c_ws_plugin__s2member_sp_access::sp_access_session ($_g["s2member_sp_access"]);
  107. if ($read_only || c_ws_plugin__s2member_ip_restrictions::ip_restrictions_ok ($_SERVER["REMOTE_ADDR"], $sp_access_value))
  108. return apply_filters ("ws_plugin__s2member_sp_access", true, get_defined_vars (), "auth-via-link-session");
  109. }
  110. }
  111. }
  112. }
  113. // Otherwise, authentication was NOT possible via link or session.
  114. if (!$read_only && /* A Specific Post/Page Link? */ !empty ($_g["s2member_sp_access"]))
  115. {
  116. status_header (503);
  117. header ("Content-Type: text/html; charset=UTF-8");
  118. while (@ob_end_clean ()); // Clean any existing output buffers.
  119. exit (_x ('<strong>Your Link Expired:</strong><br />Please contact Support if you need assistance.', "s2member-front", "s2member"));
  120. }
  121. else // Else return false here.
  122. return apply_filters ("ws_plugin__s2member_sp_access", false, get_defined_vars (), "no-auth-via-link-session");
  123. }
  124. else // Else return false here.
  125. return apply_filters ("ws_plugin__s2member_sp_access", false, get_defined_vars (), "no-auth-no-link-session");
  126. }
  127. /**
  128. * Handles Specific Post/Page sessions, by writing access values into a cookie.
  129. *
  130. * Can be used to add a new value to the session, and/or to return the current set of values in the session.
  131. *
  132. * @package s2Member\SP_Access
  133. * @since 3.5
  134. *
  135. * @param str $add_sp_access_value Encrypted Specific Post/Page Access value.
  136. * @return array Array of Specific Post/Page Access values.
  137. */
  138. public static function sp_access_session ($add_sp_access_value = FALSE)
  139. {
  140. foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
  141. do_action ("ws_plugin__s2member_before_sp_access_session", get_defined_vars ());
  142. unset /* Unset defined __refs, __v. */ ($__refs, $__v);
  143. $sp_access_values = (!empty ($_COOKIE["s2member_sp_access"])) ? preg_split ("/\:\.\:\|\:\.\:/", (string)$_COOKIE["s2member_sp_access"]) : array ();
  144. if ($add_sp_access_value && is_string ($add_sp_access_value) && !in_array /* Not in session? */ ($add_sp_access_value, $sp_access_values))
  145. {
  146. $sp_access_values[] = $add_sp_access_value; // Add an access value, and update the delimited session cookie.
  147. $sp_access_values = array_unique ($sp_access_values); // Keep this array unique; disallow double-stacking.
  148. $cookie = implode (":.:|:.:", $sp_access_values); // Implode the access values into a delimited string.
  149. $cookie = (strlen ($cookie) >= 4096) ? $add_sp_access_value : $cookie; // Max cookie size is 4kbs.
  150. setcookie ("s2member_sp_access", $cookie, time () + 31556926, COOKIEPATH, COOKIE_DOMAIN);
  151. setcookie ("s2member_sp_access", $cookie, time () + 31556926, SITECOOKIEPATH, COOKIE_DOMAIN);
  152. $_COOKIE["s2member_sp_access"] = $cookie; // Real-time cookie updates.
  153. foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
  154. do_action ("ws_plugin__s2member_during_sp_access_session", get_defined_vars ());
  155. unset /* Unset defined __refs, __v. */ ($__refs, $__v);
  156. }
  157. return apply_filters ("ws_plugin__s2member_sp_access_session", $sp_access_values, get_defined_vars ());
  158. }
  159. }
  160. }
  161. ?>