PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

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

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