PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 111003
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v111003
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 111003, at includes/classes/sp-access.inc.php

177 lines 9.2 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 $sp_ids Comma-delimited list of Specific Post/Page IDs *( numerical )*.
37 * @param int $hours Optional. An 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 (($sp_ids = preg_replace ("/[^0-9;,]/", "", $sp_ids)) && ($leading_id = preg_replace ("/^([0-9]+)(.*?)$/", "$1", $sp_ids)) && $hours)
48 {
49 $sp_access = c_ws_plugin__s2member_utils_encryption::encrypt ("sp_time_hours:.:|:.:" . $sp_ids . ":.:|:.:" . strtotime ("now") . ":.:|:.:" . $hours);
50 $sp_access_link = add_query_arg ("s2member_sp_access", urlencode ($sp_access), get_permalink ($leading_id));
51 /**/
52 if ($shrink && ($shorter_url = c_ws_plugin__s2member_utils_urls::shorten ($sp_access_link)))
53 return apply_filters ("ws_plugin__s2member_sp_access_link_gen", $shorter_url . "#" . $_SERVER["HTTP_HOST"], get_defined_vars ());
54 /**/
55 else /* Else use the long one; shortening may fail when/if an API server is down periodically. */
56 return apply_filters ("ws_plugin__s2member_sp_access_link_gen", $sp_access_link, get_defined_vars ());
57 }
58 /**/
59 return false;
60 }
61 /**
62 * Generates Specific Post/Page Access links via AJAX.
63 *
64 * @package s2Member\SP_Access
65 * @since 3.5
66 *
67 * @attaches-to: ``add_action("wp_ajax_ws_plugin__s2member_sp_access_link_via_ajax");``
68 *
69 * @return null Exits script execution after returning data for AJAX caller.
70 */
71 public static function sp_access_link_via_ajax ()
72 {
73 do_action ("ws_plugin__s2member_before_sp_access_link_via_ajax", get_defined_vars ());
74 /**/
75 if (current_user_can ("create_users")) /* Check priveledges as well. */
76 if (!empty ($_POST["ws_plugin__s2member_sp_access_link_via_ajax"]) && ($nonce = $_POST["ws_plugin__s2member_sp_access_link_via_ajax"]) && wp_verify_nonce ($nonce, "ws-plugin--s2member-sp-access-link-via-ajax") && ($_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"]))
77 echo apply_filters ("ws_plugin__s2member_sp_access_link_via_ajax", c_ws_plugin__s2member_sp_access::sp_access_link_gen ($_p["s2member_sp_access_link_ids"], $_p["s2member_sp_access_link_hours"]), get_defined_vars ());
78 /**/
79 exit (); /* Clean exit. */
80 }
81 /**
82 * Handles Specific Post/Page Access authentication.
83 *
84 * @package s2Member\SP_Access
85 * @since 3.5
86 *
87 * @param int|str $sp_id Numeric Post/Page ID in WordPress®.
88 * @param bool $read_only Optional. Defaults to false. If ``$read_only = true``,
89 * no session cookies are set, no IP Restrictions are checked, and script execution is not exited on Link failure.
90 * In other words, with ``$read_only = true``, this function will simply return true or false.
91 * @return null|bool Always returns true if access is indeed allowed in one way or another.
92 * If access is denied with ``$read_only = true`` simply return false.
93 * If access is denied with ``$read_only = false``, return false;
94 * but if a Specific Post/Page Access Link is currently being used,
95 * we exit with a warning about Access Link expiration instead.
96 */
97 public static function sp_access ($sp_id = FALSE, $read_only = FALSE)
98 {
99 do_action ("ws_plugin__s2member_before_sp_access", get_defined_vars ());
100 /**/
101 $excluded = apply_filters ("ws_plugin__s2member_sp_access_excluded", false, get_defined_vars ());
102 /**/
103 if ($excluded || current_user_can (apply_filters ("ws_plugin__s2member_sp_access_excluded_cap", "edit_posts", get_defined_vars ())))
104 return apply_filters ("ws_plugin__s2member_sp_access", true, get_defined_vars ());
105 /**/
106 else if ($sp_id && ((!empty ($_GET["s2member_sp_access"]) && is_array ($sp_access_values = (array)trim (stripslashes ($_GET["s2member_sp_access"])))) || (is_array ($sp_access_values = c_ws_plugin__s2member_sp_access::sp_access_session ()) && !empty ($sp_access_values))))
107 {
108 foreach ($sp_access_values as $sp_access_value) /* Supports multiple access values in a session. */
109 {
110 if (is_array ($sp_access = preg_split ("/\:\.\:\|\:\.\:/", c_ws_plugin__s2member_utils_encryption::decrypt ($sp_access_value))))
111 {
112 if (count ($sp_access) === 4 && $sp_access[0] === "sp_time_hours" && in_array ($sp_id, preg_split ("/[\r\n\t\s;,]+/", $sp_access[1])))
113 {
114 if ($sp_access[2] <= strtotime ("now") && ($sp_access[2] + ($sp_access[3] * 3600)) >= strtotime ("now"))
115 {
116 if (!$read_only && !empty ($_GET["s2member_sp_access"])) /* Cookie session. */
117 c_ws_plugin__s2member_sp_access::sp_access_session ($_GET["s2member_sp_access"]);
118 /**/
119 if ($read_only || c_ws_plugin__s2member_ip_restrictions::ip_restrictions_ok ($_SERVER["REMOTE_ADDR"], $sp_access_value))
120 return apply_filters ("ws_plugin__s2member_sp_access", true, get_defined_vars ());
121 }
122 }
123 }
124 }
125 /**/
126 if (!$read_only && !empty ($_GET["s2member_sp_access"])) /* If this is a Specific Post/Page Link? */
127 {
128 echo _x ('<strong>Your Link Expired:</strong><br />Please contact Support if you need assistance.', "s2member-front", "s2member");
129 /**/
130 exit (); /* $_GET["s2member_sp_access"] has expired. Or it is simply invalid. */
131 }
132 /**/
133 return apply_filters ("ws_plugin__s2member_sp_access", false, get_defined_vars ());
134 }
135 /**/
136 else
137 return apply_filters ("ws_plugin__s2member_sp_access", false, get_defined_vars ());
138 }
139 /**
140 * Handles Specific Post/Page sessions, by writing access values into a cookie.
141 *
142 * Can be used to add a new value to the session, and/or to return the current set of values in the session.
143 *
144 * @package s2Member\SP_Access
145 * @since 3.5
146 *
147 * @param str $add_sp_access_value Encrypted Specific Post/Page Access value.
148 * @return array Array of Specific Post/Page Access values.
149 */
150 public static function sp_access_session ($add_sp_access_value = FALSE)
151 {
152 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
153 do_action ("ws_plugin__s2member_before_sp_access_session", get_defined_vars ());
154 unset ($__refs, $__v); /* Unset defined __refs, __v. */
155 /**/
156 $sp_access_values = (!empty ($_COOKIE["s2member_sp_access"])) ? preg_split ("/\:\.\:\|\:\.\:/", $_COOKIE["s2member_sp_access"]) : array ();
157 /**/
158 if ($add_sp_access_value && !in_array ($add_sp_access_value, $sp_access_values)) /* If it's not in the session already. */
159 {
160 $sp_access_values[] = $add_sp_access_value; /* Add an access value, and update the delimited session cookie. */
161 $sp_access_values = array_unique ($sp_access_values); /* Keep this array unique; disallow double-stacking. */
162 /**/
163 $cookie = implode (":.:|:.:", $sp_access_values); /* Implode the access values into a delimited string. */
164 $cookie = (strlen ($cookie) >= 4096) ? $add_sp_access_value : $cookie; /* Max cookie size is 4kbs. */
165 /**/
166 setcookie ("s2member_sp_access", $cookie, time () + 31556926, COOKIEPATH, COOKIE_DOMAIN) . setcookie ("s2member_sp_access", $cookie, time () + 31556926, SITECOOKIEPATH, COOKIE_DOMAIN) . ($_COOKIE["s2member_sp_access"] = $cookie);
167 /**/
168 eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
169 do_action ("ws_plugin__s2member_during_sp_access_session", get_defined_vars ());
170 unset ($__refs, $__v); /* Unset defined __refs, __v. */
171 }
172 /**/
173 return apply_filters ("ws_plugin__s2member_sp_access_session", $sp_access_values, get_defined_vars ());
174 }
175 }
176 }
177 ?>