PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 111011
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v111011
260917 260913 260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 111216 111220 120213 All 189 releases
s2member / includes / classes / sp-access.inc.php

sp-access.inc.php in s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions 111011, at includes/classes/sp-access.inc.php

181 lines 10.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 /**/
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 str|int $sp_ids Comma-delimited list of Specific Post/Page IDs *( numerical )*.
37 * @param int|str $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 eval ('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); /* Unset defined __refs, __v. */
46 /**/
47 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))
48 {
49 $sp_access = c_ws_plugin__s2member_utils_encryption::encrypt ("sp_time_hours:.:|:.:" . $sp_ids . ":.:|:.:" . strtotime ("now") . ":.:|:.:" . $hours);
50 /**/
51 $sp_access_link = add_query_arg ("s2member_sp_access", urlencode ($sp_access), get_permalink ($leading_id)); /* Generate long URL/link. */
52 /**/
53 if ($shrink && ($shorter_url = c_ws_plugin__s2member_utils_urls::shorten ($sp_access_link)))
54 $sp_access_link = $shorter_url . "#" . $_SERVER["HTTP_HOST"];
55 }
56 /**/
57 return apply_filters ("ws_plugin__s2member_sp_access_link_gen", ((!empty ($sp_access_link)) ? $sp_access_link : false), get_defined_vars ());
58 }
59 /**
60 * Generates Specific Post/Page Access links via AJAX.
61 *
62 * @package s2Member\SP_Access
63 * @since 3.5
64 *
65 * @attaches-to: ``add_action("wp_ajax_ws_plugin__s2member_sp_access_link_via_ajax");``
66 *
67 * @return null Exits script execution after returning data for AJAX caller.
68 */
69 public static function sp_access_link_via_ajax ()
70 {
71 do_action ("ws_plugin__s2member_before_sp_access_link_via_ajax", get_defined_vars ());
72 /**/
73 status_header (200); /* Send a 200 OK status header. */
74 header ("Content-Type: text/plain; charset=utf-8"); /* Content-Type with UTF-8. */
75 eval ('while (@ob_end_clean ());'); /* End/clean all output buffers that may exist. */
76 /**/
77 if (current_user_can ("create_users")) /* Check priveledges as well. Ability to create Users? */
78 /**/
79 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"))
80 /**/
81 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"]))
82 $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"]);
83 /**/
84 exit (apply_filters ("ws_plugin__s2member_sp_access_link_via_ajax", ((!empty ($sp_access_link)) ? $sp_access_link : ""), get_defined_vars ()));
85 }
86 /**
87 * Handles Specific Post/Page Access authentication.
88 *
89 * @package s2Member\SP_Access
90 * @since 3.5
91 *
92 * @param int|str $sp_id Numeric Post/Page ID in WordPress®.
93 * @param bool $read_only Optional. Defaults to false. If ``$read_only = true``,
94 * no session cookies are set, no IP Restrictions are checked, and script execution is not exited on Link failure.
95 * In other words, with ``$read_only = true``, this function will simply return true or false.
96 * @return null|bool Always returns `true` if access is indeed allowed in one way or another.
97 * 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.
98 */
99 public static function sp_access ($sp_id = FALSE, $read_only = FALSE)
100 {
101 do_action ("ws_plugin__s2member_before_sp_access", get_defined_vars ());
102 /**/
103 $excluded = apply_filters ("ws_plugin__s2member_sp_access_excluded", false, get_defined_vars ());
104 /**/
105 if ($excluded || current_user_can (apply_filters ("ws_plugin__s2member_sp_access_excluded_cap", "edit_posts", get_defined_vars ())))
106 return apply_filters ("ws_plugin__s2member_sp_access", true, get_defined_vars (), "auth-via-exclusion");
107 /**/
108 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))
109 {
110 foreach ($sp_access_values as $sp_access_value) /* Supports multiple access values in a session. We go through each of them. */
111 {
112 if (is_array ($sp_access = preg_split ("/\:\.\:\|\:\.\:/", c_ws_plugin__s2member_utils_encryption::decrypt ($sp_access_value))))
113 {
114 if (count ($sp_access) === 4 && $sp_access[0] === "sp_time_hours" && in_array ($sp_id, preg_split ("/[\r\n\t\s;,]+/", $sp_access[1])))
115 {
116 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"))
117 {
118 if (!$read_only && !empty ($_g["s2member_sp_access"])) /* Add to session? */
119 c_ws_plugin__s2member_sp_access::sp_access_session ($_g["s2member_sp_access"]);
120 /**/
121 if ($read_only || c_ws_plugin__s2member_ip_restrictions::ip_restrictions_ok ($_SERVER["REMOTE_ADDR"], $sp_access_value))
122 return apply_filters ("ws_plugin__s2member_sp_access", true, get_defined_vars (), "auth-via-link-session");
123 }
124 }
125 }
126 }
127 /* Otherwise, authentication was NOT possible via link or session. */
128 if (!$read_only && /* A Specific Post/Page Link? */ !empty ($_g["s2member_sp_access"]))
129 {
130 status_header (503) . header ("Content-Type: text/html; charset=utf-8");
131 eval ('while (@ob_end_clean ());'); /* End/clean all output buffers that may exist. */
132 exit (_x ('<strong>Your Link Expired:</strong><br />Please contact Support if you need assistance.', "s2member-front", "s2member"));
133 }
134 else /* Else return false here. */
135 return apply_filters ("ws_plugin__s2member_sp_access", false, get_defined_vars (), "no-auth-via-link-session");
136 }
137 /**/
138 else /* Else return false here. */
139 return apply_filters ("ws_plugin__s2member_sp_access", false, get_defined_vars (), "no-auth-no-link-session");
140 }
141 /**
142 * Handles Specific Post/Page sessions, by writing access values into a cookie.
143 *
144 * Can be used to add a new value to the session, and/or to return the current set of values in the session.
145 *
146 * @package s2Member\SP_Access
147 * @since 3.5
148 *
149 * @param str $add_sp_access_value Encrypted Specific Post/Page Access value.
150 * @return array Array of Specific Post/Page Access values.
151 */
152 public static function sp_access_session ($add_sp_access_value = FALSE)
153 {
154 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
155 do_action ("ws_plugin__s2member_before_sp_access_session", get_defined_vars ());
156 unset ($__refs, $__v); /* Unset defined __refs, __v. */
157 /**/
158 $sp_access_values = (!empty ($_COOKIE["s2member_sp_access"])) ? preg_split ("/\:\.\:\|\:\.\:/", (string)$_COOKIE["s2member_sp_access"]) : array ();
159 /**/
160 if ($add_sp_access_value && is_string ($add_sp_access_value) && !in_array /* Not in session? */ ($add_sp_access_value, $sp_access_values))
161 {
162 $sp_access_values[] = $add_sp_access_value; /* Add an access value, and update the delimited session cookie. */
163 $sp_access_values = array_unique ($sp_access_values); /* Keep this array unique; disallow double-stacking. */
164 /**/
165 $cookie = implode (":.:|:.:", $sp_access_values); /* Implode the access values into a delimited string. */
166 $cookie = (strlen ($cookie) >= 4096) ? $add_sp_access_value : $cookie; /* Max cookie size is 4kbs. */
167 /**/
168 setcookie ("s2member_sp_access", $cookie, time () + 31556926, COOKIEPATH, COOKIE_DOMAIN);
169 setcookie ("s2member_sp_access", $cookie, time () + 31556926, SITECOOKIEPATH, COOKIE_DOMAIN);
170 $_COOKIE["s2member_sp_access"] = $cookie; /* Real-time cookie updates. */
171 /**/
172 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
173 do_action ("ws_plugin__s2member_during_sp_access_session", get_defined_vars ());
174 unset ($__refs, $__v); /* Unset defined __refs, __v. */
175 }
176 /**/
177 return apply_filters ("ws_plugin__s2member_sp_access_session", $sp_access_values, get_defined_vars ());
178 }
179 }
180 }
181 ?>