s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) - Version 3.1.3

Version Description

  • Bug fix. Comparison between $_SERVER["HTTP_HOST"] and a PayPal Custom/Proxy was failing on some servers that force a host port number into the $_SERVER["HTTP_HOST"] environment variable. MediaTemple does this. If you're hosted by MediaTemple, and you're using the s2Member Pro Module, you should upgrade to v3.1.3+.
  • Bug fix. The WP_Http class, which is responsible for handling cURL, ExtHTTP, and/or fopen functionality for connections to PayPal, was defaulting to a 5 second stream timeout. Under certain conditions, this was too low ( i.e. slow responses from PayPal, and/or a WordPress MySQL database ). The default timeout has now been increased to 20 seconds; which is designed to give high priority status to IPN processing routines; thereby reducing the chances of a connection timeout considerably, and improving the overall reliability of the s2Member checkout experience.
  • Localhost support. s2Member now supports "localhost" installations of WordPress; tested against WAMP and MAMP. Thanks to ScriptyGoddess for reporting this, and for her assistance with testing against her MAMP installation.
  • General UI cleanup. In particular, the PayPal Option panels have been cleaned up a bit; making these important panels "less intimidating" to site owners that are brand new to s2Member.
  • Support for File Download Restrictions, based on specific Member Level Sub-directories. For full details, please check your WP Dashboard, under: s2Member -> API Scripting -> "Custom Capability and Member Level Files".
  • The file /includes/s2member.js is now a development source file. The live version is now optimized, inside: /includes/s2member-min.js. This helps to further reduce the s2Member footprint.
  • Virtual terminal support (txn_type=virtual_terminal) has been added to the s2Member IPN processor. This provides developers with access to Hooks/Filters on Virtual Terminal transactions.
  • Internal optimization of s2member.css. These optimizations are designed to further reduce the footprint of s2Member.
  • Bug fix. A bug was discovered in the PayPal IPN routines; specifically with payment_status. Under the right conditions, it was possible for a declined echeck payment to slip through with a Failed payment status. s2Member v3.1.3+ corrects this bug.
Download this release

Release Info

Developer PriMoThemes
Plugin Icon 128x128 s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members)
Version 3.1.3
Comparing to
See all releases

Code changes from version 3.1.2 to 3.1.3

Files changed (35) hide show
  1. includes/functions/activate-deactivate.inc.php +19 -19
  2. includes/functions/constants.inc.php +5 -5
  3. includes/functions/css-js-w-globals.inc.php +18 -14
  4. includes/functions/file-download-access.inc.php +15 -5
  5. includes/functions/is-systematic.inc.php +6 -10
  6. includes/functions/menu-pages.inc.php +11 -3
  7. includes/functions/nocache.inc.php +1 -1
  8. includes/functions/page-level-access.inc.php +2 -6
  9. includes/functions/paypal-button.inc.php +2 -2
  10. includes/functions/paypal-notify.inc.php +49 -13
  11. includes/functions/paypal-return.inc.php +30 -26
  12. includes/functions/paypal-utilities.inc.php +4 -4
  13. includes/functions/register-access.inc.php +1 -1
  14. includes/functions/tracking-codes.inc.php +4 -4
  15. includes/functions/utilities.inc.php +53 -1
  16. includes/mailchimp/nc-mcapi.inc.php +3 -2
  17. includes/menu-pages/api-ops.inc.php +12 -12
  18. includes/menu-pages/code-samples/level-file-downloads.php +5 -0
  19. includes/menu-pages/down-ops.inc.php +1 -1
  20. includes/menu-pages/menu-pages-min.js +1 -0
  21. includes/menu-pages/menu-pages-s-min.js +1 -0
  22. includes/menu-pages/menu-pages-s.js +31 -30
  23. includes/menu-pages/menu-pages.css +5 -0
  24. includes/menu-pages/menu-pages.js +33 -33
  25. includes/menu-pages/paypal-buttons.inc.php +67 -67
  26. includes/menu-pages/paypal-ops.inc.php +39 -17
  27. includes/menu-pages/scripting.inc.php +12 -3
  28. includes/menu-pages/start.inc.php +2 -2
  29. includes/menu-pages/trk-ops.inc.php +8 -8
  30. includes/s2member-min.js +1 -0
  31. includes/s2member.js +0 -5
  32. includes/syscon.inc.php +0 -5
  33. includes/templates/options/paypal-currencies.html +24 -24
  34. readme.txt +15 -3
  35. s2member.php +8 -8
includes/functions/activate-deactivate.inc.php CHANGED
@@ -12,7 +12,7 @@ If not, see: <http://www.gnu.org/licenses/>.
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
- exit ("Do not access this file directly.");
16
  /*
17
  Check existing installations that have not been re-activated.
18
  Attach to: add_action("admin_init");
@@ -138,9 +138,7 @@ if (!function_exists ("ws_plugin__s2member_activate"))
138
  if (!is_array (get_option ("ws_plugin__s2member_options")))
139
  update_option ("ws_plugin__s2member_options", array ());
140
  /**/
141
- update_option ("ws_plugin__s2member_activated_version", WS_PLUGIN__S2MEMBER_VERSION);
142
- /**/
143
- if (get_option ("ws_plugin__s2member_configured")) /* If they already have s2Member configured, read the Changelog. */
144
  {
145
  $notice = '<strong>s2Member</strong> has been <strong>re-activated</strong>, with the latest version.<br />';
146
  $notice .= 'You now have version ' . WS_PLUGIN__S2MEMBER_VERSION . '. Your existing configuration remains.<br />';
@@ -154,6 +152,8 @@ if (!function_exists ("ws_plugin__s2member_activate"))
154
  ws_plugin__s2member_enqueue_admin_notice ($notice, array ("plugins.php", "ws-plugin--s2member-options"));
155
  }
156
  /**/
 
 
157
  do_action ("ws_plugin__s2member_after_activation", get_defined_vars ());
158
  /**/
159
  return;
@@ -175,10 +175,10 @@ if (!function_exists ("ws_plugin__s2member_deactivate"))
175
  $role = &get_role ("subscriber");
176
  $role->remove_cap ("access_s2member_level0");
177
  /**/
178
- remove_role ("s2member_level1");
179
- remove_role ("s2member_level2");
180
- remove_role ("s2member_level3");
181
- remove_role ("s2member_level4");
182
  /**/
183
  $role = &get_role ("administrator");
184
  $role->remove_cap ("access_s2member_level0");
@@ -212,33 +212,33 @@ if (!function_exists ("ws_plugin__s2member_deactivate"))
212
  {
213
  if (file_exists ($htaccess = $files_dir . "/.htaccess"))
214
  if (is_writable ($htaccess))
215
- unlink ($htaccess);
216
  /**/
217
- @rmdir ($files_dir);
218
  }
219
  /**/
220
  if (is_dir ($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"]))
221
  {
222
  if (file_exists ($htaccess = $logs_dir . "/.htaccess"))
223
  if (is_writable ($htaccess))
224
- unlink ($htaccess);
225
  /**/
226
  if (file_exists ($log = $logs_dir . "/paypal-ipn.log"))
227
  if (is_writable ($log))
228
- unlink ($log);
229
  /**/
230
  if (file_exists ($log = $logs_dir . "/paypal-rtn.log"))
231
  if (is_writable ($log))
232
- unlink ($log);
233
  /**/
234
- @rmdir ($logs_dir);
235
  }
236
  /**/
237
- delete_option ("ws_plugin__s2member_activated_version");
238
- delete_option ("ws_plugin__s2member_configured");
239
- delete_option ("ws_plugin__s2member_cache");
240
- delete_option ("ws_plugin__s2member_notices");
241
- delete_option ("ws_plugin__s2member_options");
242
  /**/
243
  do_action ("ws_plugin__s2member_during_deactivation", get_defined_vars ());
244
  }
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
+ exit("Do not access this file directly.");
16
  /*
17
  Check existing installations that have not been re-activated.
18
  Attach to: add_action("admin_init");
138
  if (!is_array (get_option ("ws_plugin__s2member_options")))
139
  update_option ("ws_plugin__s2member_options", array ());
140
  /**/
141
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["configured"]) /* If already configured, read the Changelog. */
 
 
142
  {
143
  $notice = '<strong>s2Member</strong> has been <strong>re-activated</strong>, with the latest version.<br />';
144
  $notice .= 'You now have version ' . WS_PLUGIN__S2MEMBER_VERSION . '. Your existing configuration remains.<br />';
152
  ws_plugin__s2member_enqueue_admin_notice ($notice, array ("plugins.php", "ws-plugin--s2member-options"));
153
  }
154
  /**/
155
+ update_option ("ws_plugin__s2member_activated_version", WS_PLUGIN__S2MEMBER_VERSION);
156
+ /**/
157
  do_action ("ws_plugin__s2member_after_activation", get_defined_vars ());
158
  /**/
159
  return;
175
  $role = &get_role ("subscriber");
176
  $role->remove_cap ("access_s2member_level0");
177
  /**/
178
+ remove_role("s2member_level1");
179
+ remove_role("s2member_level2");
180
+ remove_role("s2member_level3");
181
+ remove_role("s2member_level4");
182
  /**/
183
  $role = &get_role ("administrator");
184
  $role->remove_cap ("access_s2member_level0");
212
  {
213
  if (file_exists ($htaccess = $files_dir . "/.htaccess"))
214
  if (is_writable ($htaccess))
215
+ unlink($htaccess);
216
  /**/
217
+ @rmdir($files_dir);
218
  }
219
  /**/
220
  if (is_dir ($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"]))
221
  {
222
  if (file_exists ($htaccess = $logs_dir . "/.htaccess"))
223
  if (is_writable ($htaccess))
224
+ unlink($htaccess);
225
  /**/
226
  if (file_exists ($log = $logs_dir . "/paypal-ipn.log"))
227
  if (is_writable ($log))
228
+ unlink($log);
229
  /**/
230
  if (file_exists ($log = $logs_dir . "/paypal-rtn.log"))
231
  if (is_writable ($log))
232
+ unlink($log);
233
  /**/
234
+ @rmdir($logs_dir);
235
  }
236
  /**/
237
+ delete_option("ws_plugin__s2member_activated_version");
238
+ delete_option("ws_plugin__s2member_configured");
239
+ delete_option("ws_plugin__s2member_cache");
240
+ delete_option("ws_plugin__s2member_notices");
241
+ delete_option("ws_plugin__s2member_options");
242
  /**/
243
  do_action ("ws_plugin__s2member_during_deactivation", get_defined_vars ());
244
  }
includes/functions/constants.inc.php CHANGED
@@ -12,7 +12,7 @@ If not, see: <http://www.gnu.org/licenses/>.
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
- exit ("Do not access this file directly.");
16
  /*
17
  Define several API Constants for s2Member.
18
  Note that these are duplicated into the JavaScript API as well.
@@ -32,7 +32,7 @@ if (!function_exists ("ws_plugin__s2member_constants"))
32
  $login_redirection_override = ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"]) ? /* Only when applicable. */
33
  ws_plugin__s2member_fill_login_redirect_rc_vars ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"], $current_user) : "";
34
  /**/
35
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
36
  do_action ("ws_plugin__s2member_during_constants", get_defined_vars ());
37
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
38
  /**/
@@ -207,14 +207,14 @@ if (!function_exists ("ws_plugin__s2member_constant_metas"))
207
  foreach ($results as $r) /* Fill in the array we need. */
208
  if ($r->meta_key === "s2member_file_download_access_log")
209
  $m["s2member_file_download_access_log"] = (array)maybe_unserialize ($r->meta_value);
210
- else if ($result->meta_key === "s2member_custom_fields")
211
  $m["s2member_custom_fields"] = (array)maybe_unserialize ($r->meta_value);
212
  else if ($r->meta_key === "s2member_subscr_id")
213
  $m["s2member_subscr_id"] = (string)$r->meta_value;
214
- else if ($result->meta_key === "s2member_custom")
215
  $m["s2member_custom"] = (string)$r->meta_value;
216
  /**/
217
- eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
218
  do_action ("ws_plugin__s2member_during_constant_metas", get_defined_vars ());
219
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
220
  }
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
+ exit("Do not access this file directly.");
16
  /*
17
  Define several API Constants for s2Member.
18
  Note that these are duplicated into the JavaScript API as well.
32
  $login_redirection_override = ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"]) ? /* Only when applicable. */
33
  ws_plugin__s2member_fill_login_redirect_rc_vars ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"], $current_user) : "";
34
  /**/
35
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
36
  do_action ("ws_plugin__s2member_during_constants", get_defined_vars ());
37
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
38
  /**/
207
  foreach ($results as $r) /* Fill in the array we need. */
208
  if ($r->meta_key === "s2member_file_download_access_log")
209
  $m["s2member_file_download_access_log"] = (array)maybe_unserialize ($r->meta_value);
210
+ else if ($r->meta_key === "s2member_custom_fields")
211
  $m["s2member_custom_fields"] = (array)maybe_unserialize ($r->meta_value);
212
  else if ($r->meta_key === "s2member_subscr_id")
213
  $m["s2member_subscr_id"] = (string)$r->meta_value;
214
+ else if ($r->meta_key === "s2member_custom")
215
  $m["s2member_custom"] = (string)$r->meta_value;
216
  /**/
217
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
218
  do_action ("ws_plugin__s2member_during_constant_metas", get_defined_vars ());
219
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
220
  }
includes/functions/css-js-w-globals.inc.php CHANGED
@@ -12,7 +12,7 @@ If not, see: <http://www.gnu.org/licenses/>.
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
- exit("Do not access this file directly.");
16
  /*
17
  Function adds styles to the header.
18
  This function is also fired in the admin area.
@@ -49,15 +49,17 @@ if (!function_exists ("ws_plugin__s2member_css"))
49
  /**/
50
  if ($_GET["ws_plugin__s2member_css"])
51
  {
52
- header("Content-Type: text/css; charset=utf-8");
53
- header("Expires: " . gmdate ("D, d M Y H:i:s", strtotime ("+1 week")) . " GMT");
54
- header("Last-Modified: " . gmdate ("D, d M Y H:i:s") . " GMT");
55
- header("Cache-Control: max-age=604800");
56
- header("Pragma: public");
57
  /**/
58
  $u = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"];
59
  $i = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/images";
60
  /**/
 
 
61
  include_once dirname (dirname (__FILE__)) . "/s2member.css";
62
  /**/
63
  do_action ("ws_plugin__s2member_during_css", get_defined_vars ());
@@ -86,7 +88,7 @@ if (!function_exists ("ws_plugin__s2member_add_js_w_globals"))
86
  {
87
  $a = get_defined_constants (true);
88
  $c = (array)$a["user"];
89
- unset($a);
90
  /**/
91
  foreach ($c as $k => $v)
92
  if (preg_match ("/^S2MEMBER_/i", $k))
@@ -122,11 +124,11 @@ if (!function_exists ("ws_plugin__s2member_js_w_globals"))
122
  /**/
123
  if ($_GET["ws_plugin__s2member_js_w_globals"])
124
  {
125
- header("Content-Type: text/javascript; charset=utf-8");
126
- header("Expires: " . gmdate ("D, d M Y H:i:s", strtotime ("+1 week")) . " GMT");
127
- header("Last-Modified: " . gmdate ("D, d M Y H:i:s") . " GMT");
128
- header("Cache-Control: max-age=604800");
129
- header("Pragma: public");
130
  /**/
131
  $g = "var S2MEMBER_VERSION = '" . ws_plugin__s2member_esc_sq (S2MEMBER_VERSION) . "',"; /* Since 3.0. */
132
  /**/
@@ -194,12 +196,14 @@ if (!function_exists ("ws_plugin__s2member_js_w_globals"))
194
  $g .= "S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON0 = '" . ws_plugin__s2member_esc_sq (S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON0) . "',";
195
  $g .= "S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS0 = '" . ws_plugin__s2member_esc_sq (S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS0) . "',";
196
  /**/
197
- $g = trim ($g, " ,") . ";" . "\n"; /* Trim & add semicolon. */
198
  /**/
199
  $u = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"];
200
  $i = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/images";
201
  /**/
202
- include_once dirname (dirname (__FILE__)) . "/s2member.js";
 
 
203
  /**/
204
  do_action ("ws_plugin__s2member_during_js_w_globals", get_defined_vars ());
205
  /**/
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
+ exit ("Do not access this file directly.");
16
  /*
17
  Function adds styles to the header.
18
  This function is also fired in the admin area.
49
  /**/
50
  if ($_GET["ws_plugin__s2member_css"])
51
  {
52
+ header ("Content-Type: text/css; charset=utf-8");
53
+ header ("Expires: " . gmdate ("D, d M Y H:i:s", strtotime ("+1 week")) . " GMT");
54
+ header ("Last-Modified: " . gmdate ("D, d M Y H:i:s") . " GMT");
55
+ header ("Cache-Control: max-age=604800");
56
+ header ("Pragma: public");
57
  /**/
58
  $u = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"];
59
  $i = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/images";
60
  /**/
61
+ ob_start ("ws_plugin__s2member_compress_css"); /* Compress. */
62
+ /**/
63
  include_once dirname (dirname (__FILE__)) . "/s2member.css";
64
  /**/
65
  do_action ("ws_plugin__s2member_during_css", get_defined_vars ());
88
  {
89
  $a = get_defined_constants (true);
90
  $c = (array)$a["user"];
91
+ unset ($a);
92
  /**/
93
  foreach ($c as $k => $v)
94
  if (preg_match ("/^S2MEMBER_/i", $k))
124
  /**/
125
  if ($_GET["ws_plugin__s2member_js_w_globals"])
126
  {
127
+ header ("Content-Type: text/javascript; charset=utf-8");
128
+ header ("Expires: " . gmdate ("D, d M Y H:i:s", strtotime ("+1 week")) . " GMT");
129
+ header ("Last-Modified: " . gmdate ("D, d M Y H:i:s") . " GMT");
130
+ header ("Cache-Control: max-age=604800");
131
+ header ("Pragma: public");
132
  /**/
133
  $g = "var S2MEMBER_VERSION = '" . ws_plugin__s2member_esc_sq (S2MEMBER_VERSION) . "',"; /* Since 3.0. */
134
  /**/
196
  $g .= "S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON0 = '" . ws_plugin__s2member_esc_sq (S2MEMBER_CURRENT_USER_VALUE_FOR_PP_ON0) . "',";
197
  $g .= "S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS0 = '" . ws_plugin__s2member_esc_sq (S2MEMBER_CURRENT_USER_VALUE_FOR_PP_OS0) . "',";
198
  /**/
199
+ $g = trim ($g, " ,") . ";"; /* Trim & add semicolon. */
200
  /**/
201
  $u = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"];
202
  $i = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/images";
203
  /**/
204
+ echo $g . "\n"; /* Add a line break before inclusion. */
205
+ /**/
206
+ include_once dirname (dirname (__FILE__)) . "/s2member-min.js";
207
  /**/
208
  do_action ("ws_plugin__s2member_during_js_w_globals", get_defined_vars ());
209
  /**/
includes/functions/file-download-access.inc.php CHANGED
@@ -181,13 +181,23 @@ if (!function_exists ("ws_plugin__s2member_check_file_download_access"))
181
  && wp_redirect (add_query_arg (array ("s2member_file_download_req" => $_GET["s2member_file_download"]), get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"]))) !== "nill")
182
  exit ();
183
  /**/
184
- else if (preg_match ("/^access[_\-]s2member[_\-](.+?)\//", $_GET["s2member_file_download"])) /* Custom Capability? */
185
  {
186
- list ($cap_req) = preg_split ("/\//", $_GET["s2member_file_download"], 2); /* Which Capability does this require? */
187
- $cap_req = preg_replace ("/-/", "_", $cap_req); /* Supports (optional) dashed sub-folders instead of underscores. */
188
  /**/
189
- if (!$current_user->has_cap ($cap_req) /* Ok, so we've got a Custom Capability required. Do they have permission? */
190
- && wp_redirect (add_query_arg (array ("s2member_cap_req" => $cap_req, "s2member_file_download_req" => $_GET["s2member_file_download"]), get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]))) !== "nill")
 
 
 
 
 
 
 
 
 
 
191
  exit ();
192
  }
193
  /**/
181
  && wp_redirect (add_query_arg (array ("s2member_file_download_req" => $_GET["s2member_file_download"]), get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"]))) !== "nill")
182
  exit ();
183
  /**/
184
+ else if (preg_match ("/^access[_\-]s2member[_\-]level([0-9]+)\//", $_GET["s2member_file_download"])) /* Level required? */
185
  {
186
+ list ($level_req) = preg_split ("/\//", $_GET["s2member_file_download"], 2); /* Which Level does this require? */
187
+ $level_req = preg_replace ("/[^0-9]/", "", $level_req);
188
  /**/
189
+ if (!$current_user->has_cap ("access_s2member_level" . $level_req) /* Ok, do they have permission? */
190
+ && wp_redirect (add_query_arg (array ("s2member_level_req" => $level_req, "s2member_file_download_req" => $_GET["s2member_file_download"]), get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]))) !== "nill")
191
+ exit ();
192
+ }
193
+ /**/
194
+ else if (preg_match ("/^access[_\-]s2member[_\-]ccap[_\-](.+?)\//", $_GET["s2member_file_download"])) /* Custom Capability? */
195
+ {
196
+ list ($ccap_req) = preg_split ("/\//", $_GET["s2member_file_download"], 2); /* Which Capability does this require? */
197
+ $ccap_req = preg_replace ("/-/", "_", $ccap_req);
198
+ /**/
199
+ if (!$current_user->has_cap ($ccap_req) /* Ok, do they have permission? */
200
+ && wp_redirect (add_query_arg (array ("s2member_ccap_req" => $ccap_req, "s2member_file_download_req" => $_GET["s2member_file_download"]), get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]))) !== "nill")
201
  exit ();
202
  }
203
  /**/
includes/functions/is-systematic.inc.php CHANGED
@@ -12,7 +12,7 @@ If not, see: <http://www.gnu.org/licenses/>.
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
- exit("Do not access this file directly.");
16
  /*
17
  Function that determines whether we are on a systematic use page.
18
  */
@@ -30,11 +30,11 @@ if (!function_exists ("ws_plugin__s2member_is_systematic_use_page"))
30
  {
31
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
32
  }
33
- else if (preg_match ("/^cli$/i", PHP_SAPI))
34
  {
35
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
36
  }
37
- else if ($_SERVER["REMOTE_ADDR"] === $_SERVER["SERVER_ADDR"])
38
  {
39
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
40
  }
@@ -50,11 +50,7 @@ if (!function_exists ("ws_plugin__s2member_is_systematic_use_page"))
50
  {
51
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
52
  }
53
- else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"] /* Special login redirection URLs are also systematic. */
54
- && ($login_redirection_override = ws_plugin__s2member_fill_login_redirect_rc_vars ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"]))/**/
55
- && ($login_redirect_path = @parse_url ($login_redirection_override, PHP_URL_PATH)) && ($login_redirect_query = @parse_url ($login_redirection_override, PHP_URL_QUERY)) !== "nill"/**/
56
- && ($login_redirect_uri = (($login_redirect_query) ? $login_redirect_path . "?" . $login_redirect_query : $login_redirect_path))/**/
57
- && preg_match ("/^" . preg_quote ($login_redirect_uri, "/") . "$/", $_SERVER["REQUEST_URI"]))
58
  {
59
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
60
  }
@@ -62,9 +58,9 @@ if (!function_exists ("ws_plugin__s2member_is_systematic_use_page"))
62
  {
63
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
64
  }
65
- else if (preg_match ("/^s2member/", $_SERVER["QUERY_STRING"]) && ($_SERVER["REQUEST_URI"] === "/" || rtrim (strtolower ("http://" . $_SERVER["HTTP_HOST"]) . $_SERVER["REQUEST_URI"], "/") === rtrim (strtolower (get_bloginfo ("url")), "/")))
66
  {
67
- return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ())); /* Only true when the request starts with /?s2member from the root URL of the domain, or from the install. */
68
  }
69
  else /* Otherwise, we return false. */
70
  {
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
+ exit ("Do not access this file directly.");
16
  /*
17
  Function that determines whether we are on a systematic use page.
18
  */
30
  {
31
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
32
  }
33
+ else if (preg_match ("/^CLI$/i", PHP_SAPI))
34
  {
35
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
36
  }
37
+ else if ($_SERVER["REMOTE_ADDR"] === $_SERVER["SERVER_ADDR"] && !preg_match ("/^localhost(\:[0-9]+)?$/i", $_SERVER["HTTP_HOST"]))
38
  {
39
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
40
  }
50
  {
51
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
52
  }
53
+ else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"] && ($login_redirection_override = ws_plugin__s2member_fill_login_redirect_rc_vars ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"])) && ($login_redirect_path = parse_url ($login_redirection_override, PHP_URL_PATH)) !== "nill" && ($login_redirect_query = parse_url ($login_redirection_override, PHP_URL_QUERY)) !== "nill" && ($login_redirect_uri = (($login_redirect_query) ? $login_redirect_path . "?" . $login_redirect_query : $login_redirect_path)) && preg_match ("/^" . preg_quote ($login_redirect_uri, "/") . "$/", $_SERVER["REQUEST_URI"]))
 
 
 
 
54
  {
55
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
56
  }
58
  {
59
  return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
60
  }
61
+ else if (preg_match ("/^s2member/", $_SERVER["QUERY_STRING"]) && (parse_url ($_SERVER["REQUEST_URI"], PHP_URL_PATH) === "/" || parse_url (rtrim ($_SERVER["REQUEST_URI"], "/"), PHP_URL_PATH) === parse_url (rtrim (get_bloginfo ("url"), "/"), PHP_URL_PATH)))
62
  {
63
+ return ($is_systematic = apply_filters ("ws_plugin__s2member_is_systematic_use_page", true, get_defined_vars ()));
64
  }
65
  else /* Otherwise, we return false. */
66
  {
includes/functions/menu-pages.inc.php CHANGED
@@ -117,7 +117,7 @@ if (!function_exists ("ws_plugin__s2member_add_admin_options"))
117
  add_submenu_page ("ws-plugin--s2member-options", "s2Member Information", "s2Member Info", "edit_plugins", "ws-plugin--s2member-info", "ws_plugin__s2member_info_page");
118
  /**/
119
  if (apply_filters ("ws_plugin__s2member_during_add_admin_options_add_start_page", true, get_defined_vars ()))
120
- add_submenu_page ("ws-plugin--s2member-options", "s2Member Quick Start Guide", "Quick Start Guide", "edit_plugins", "ws-plugin--s2member-start", "ws_plugin__s2member_start_page");
121
  }
122
  /**/
123
  do_action ("ws_plugin__s2member_after_add_admin_options", get_defined_vars ());
@@ -218,8 +218,11 @@ if (!function_exists ("ws_plugin__s2member_menu_pages_js"))
218
  $u = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"];
219
  $i = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/images";
220
  /**/
221
- include_once dirname (dirname (__FILE__)) . "/menu-pages/menu-pages.js";
222
- @include_once dirname (dirname (__FILE__)) . "/menu-pages/menu-pages-s.js";
 
 
 
223
  /**/
224
  do_action ("ws_plugin__s2member_during_menu_pages_js", get_defined_vars ());
225
  /**/
@@ -250,7 +253,12 @@ if (!function_exists ("ws_plugin__s2member_menu_pages_css"))
250
  $u = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"];
251
  $i = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/images";
252
  /**/
 
 
253
  include_once dirname (dirname (__FILE__)) . "/menu-pages/menu-pages.css";
 
 
 
254
  @include_once dirname (dirname (__FILE__)) . "/menu-pages/menu-pages-s.css";
255
  /**/
256
  do_action ("ws_plugin__s2member_during_menu_pages_css", get_defined_vars ());
117
  add_submenu_page ("ws-plugin--s2member-options", "s2Member Information", "s2Member Info", "edit_plugins", "ws-plugin--s2member-info", "ws_plugin__s2member_info_page");
118
  /**/
119
  if (apply_filters ("ws_plugin__s2member_during_add_admin_options_add_start_page", true, get_defined_vars ()))
120
+ add_submenu_page ("ws-plugin--s2member-options", "s2Member Quick-Start Guide", "Quick-Start Guide", "edit_plugins", "ws-plugin--s2member-start", "ws_plugin__s2member_start_page");
121
  }
122
  /**/
123
  do_action ("ws_plugin__s2member_after_add_admin_options", get_defined_vars ());
218
  $u = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"];
219
  $i = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/images";
220
  /**/
221
+ include_once dirname (dirname (__FILE__)) . "/menu-pages/menu-pages-min.js";
222
+ /**/
223
+ echo "\n"; /* Add a line break before inclusion of this file. */
224
+ /**/
225
+ @include_once dirname (dirname (__FILE__)) . "/menu-pages/menu-pages-s-min.js";
226
  /**/
227
  do_action ("ws_plugin__s2member_during_menu_pages_js", get_defined_vars ());
228
  /**/
253
  $u = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"];
254
  $i = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/images";
255
  /**/
256
+ ob_start("ws_plugin__s2member_compress_css"); /* Compress. */
257
+ /**/
258
  include_once dirname (dirname (__FILE__)) . "/menu-pages/menu-pages.css";
259
+ /**/
260
+ echo "\n"; /* Add a line break before inclusion of this file. */
261
+ /**/
262
  @include_once dirname (dirname (__FILE__)) . "/menu-pages/menu-pages-s.css";
263
  /**/
264
  do_action ("ws_plugin__s2member_during_menu_pages_css", get_defined_vars ());
includes/functions/nocache.inc.php CHANGED
@@ -64,7 +64,7 @@ if (!function_exists ("ws_plugin__s2member_nocache_constants"))
64
  do_action ("ws_plugin__s2member_before_nocache_constants", get_defined_vars ());
65
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
66
  /**/
67
- if (!$_GET["qcAC"] && ($nocache || is_user_logged_in () || (preg_match ("/^s2member/", $_SERVER["QUERY_STRING"]) && ($_SERVER["REQUEST_URI"] === "/" || rtrim (strtolower ("http://" . $_SERVER["HTTP_HOST"]) . $_SERVER["REQUEST_URI"], "/") === rtrim (strtolower (get_bloginfo ("url")), "/")))))
68
  {
69
  define ("QUICK_CACHE_ALLOWED", false) . define ("DONOTCACHEPAGE", true);
70
  /**/
64
  do_action ("ws_plugin__s2member_before_nocache_constants", get_defined_vars ());
65
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
66
  /**/
67
+ if (!$_GET["qcAC"] && ($nocache || is_user_logged_in () || (preg_match ("/^s2member/", $_SERVER["QUERY_STRING"]) && (parse_url ($_SERVER["REQUEST_URI"], PHP_URL_PATH) === "/" || parse_url (rtrim ($_SERVER["REQUEST_URI"], "/"), PHP_URL_PATH) === parse_url (rtrim (get_bloginfo ("url"), "/"), PHP_URL_PATH)))))
68
  {
69
  define ("QUICK_CACHE_ALLOWED", false) . define ("DONOTCACHEPAGE", true);
70
  /**/
includes/functions/page-level-access.inc.php CHANGED
@@ -12,7 +12,7 @@ If not, see: <http://www.gnu.org/licenses/>.
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
- exit ("Do not access this file directly.");
16
  /*
17
  Function for handling Page Level Access permissions.
18
  Attach to: add_action("template_redirect");
@@ -34,11 +34,7 @@ if (!function_exists ("ws_plugin__s2member_check_page_level_access"))
34
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"] && $page_ID == $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"] && ws_plugin__s2member_nocache_constants (true) !== "nill" && (!$current_user || !current_user_can ("access_s2member_level0")) && $page_ID != $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"] && wp_redirect (add_query_arg ("s2member_level_req", "0", get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]))) !== "nill")
35
  exit ();
36
  /**/
37
- else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"] /* This is also protected. */
38
- && ($login_redirection_override = ws_plugin__s2member_fill_login_redirect_rc_vars ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"]))/**/
39
- && ($login_redirect_path = @parse_url ($login_redirection_override, PHP_URL_PATH)) && ($login_redirect_query = @parse_url ($login_redirection_override, PHP_URL_QUERY)) !== "nill"/**/
40
- && ($login_redirect_uri = (($login_redirect_query) ? $login_redirect_path . "?" . $login_redirect_query : $login_redirect_path))/**/
41
- && preg_match ("/^" . preg_quote ($login_redirect_uri, "/") . "$/", $_SERVER["REQUEST_URI"]) && ws_plugin__s2member_nocache_constants (true) !== "nill" && (!$current_user || !current_user_can ("access_s2member_level0")) && $page_ID != $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"] && wp_redirect (add_query_arg ("s2member_level_req", "0", get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]))) !== "nill")
42
  exit ();
43
  /**/
44
  else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"] && $page_ID == $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"] && ws_plugin__s2member_nocache_constants (true) !== "nill" && (!$current_user || !current_user_can ("access_s2member_level0")) && $page_ID != $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"] && wp_redirect (add_query_arg ("s2member_level_req", "0", get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]))) !== "nill")
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
+ exit("Do not access this file directly.");
16
  /*
17
  Function for handling Page Level Access permissions.
18
  Attach to: add_action("template_redirect");
34
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"] && $page_ID == $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"] && ws_plugin__s2member_nocache_constants (true) !== "nill" && (!$current_user || !current_user_can ("access_s2member_level0")) && $page_ID != $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"] && wp_redirect (add_query_arg ("s2member_level_req", "0", get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]))) !== "nill")
35
  exit ();
36
  /**/
37
+ else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"] && ($login_redirection_override = ws_plugin__s2member_fill_login_redirect_rc_vars ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_override"])) && ($login_redirect_path = parse_url ($login_redirection_override, PHP_URL_PATH)) !== "nill" && ($login_redirect_query = parse_url ($login_redirection_override, PHP_URL_QUERY)) !== "nill" && ($login_redirect_uri = (($login_redirect_query) ? $login_redirect_path . "?" . $login_redirect_query : $login_redirect_path)) && preg_match ("/^" . preg_quote ($login_redirect_uri, "/") . "$/", $_SERVER["REQUEST_URI"]) && ws_plugin__s2member_nocache_constants (true) !== "nill" && (!$current_user || !current_user_can ("access_s2member_level0")) && $page_ID != $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"] && wp_redirect (add_query_arg ("s2member_level_req", "0", get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]))) !== "nill")
 
 
 
 
38
  exit ();
39
  /**/
40
  else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"] && $page_ID == $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"] && ws_plugin__s2member_nocache_constants (true) !== "nill" && (!$current_user || !current_user_can ("access_s2member_level0")) && $page_ID != $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"] && wp_redirect (add_query_arg ("s2member_level_req", "0", get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]))) !== "nill")
includes/functions/paypal-button.inc.php CHANGED
@@ -76,7 +76,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_button"))
76
  $code = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url"))), $code);
77
  $code = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_notify=1")), $code);
78
  $code = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_return=1")), $code);
79
- $code = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr (strtolower ($_SERVER["HTTP_HOST"]))), $code);
80
  /**/
81
  $code = preg_replace ('/ name\="item_name" value\="(.*?)"/', ' name="item_name" value="' . ws_plugin__s2member_esc_ds (esc_attr ($attr["desc"])) . '"', $code);
82
  $code = preg_replace ('/ name\="item_number" value\="(.*?)"/', ' name="item_number" value="' . ws_plugin__s2member_esc_ds (esc_attr ($attr["sp_ids_exp"])) . '"', $code);
@@ -105,7 +105,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_button"))
105
  $code = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url"))), $code); /* This brings them back to Front Page. */
106
  $code = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_notify=1")), $code);
107
  $code = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_return=1")), $code);
108
- $code = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr (strtolower ($_SERVER["HTTP_HOST"]))), $code);
109
  $code = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ($attr["level"])), $code);
110
  /**/
111
  $code = preg_replace ('/ \<\!--(\<input type\="hidden" name\="(amount|src|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)--\>/', " $1", $code);
76
  $code = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url"))), $code);
77
  $code = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_notify=1")), $code);
78
  $code = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_return=1")), $code);
79
+ $code = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $code);
80
  /**/
81
  $code = preg_replace ('/ name\="item_name" value\="(.*?)"/', ' name="item_name" value="' . ws_plugin__s2member_esc_ds (esc_attr ($attr["desc"])) . '"', $code);
82
  $code = preg_replace ('/ name\="item_number" value\="(.*?)"/', ' name="item_number" value="' . ws_plugin__s2member_esc_ds (esc_attr ($attr["sp_ids_exp"])) . '"', $code);
105
  $code = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url"))), $code); /* This brings them back to Front Page. */
106
  $code = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_notify=1")), $code);
107
  $code = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_return=1")), $code);
108
+ $code = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $code);
109
  $code = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ($attr["level"])), $code);
110
  /**/
111
  $code = preg_replace ('/ \<\!--(\<input type\="hidden" name\="(amount|src|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)--\>/', " $1", $code);
includes/functions/paypal-notify.inc.php CHANGED
@@ -43,11 +43,14 @@ if (!function_exists ("ws_plugin__s2member_paypal_notify"))
43
  $paypal["s2member_log"][] = "s2Member POST vars verified through a POST back to PayPal®.";
44
  /**/
45
  $paypal["custom"] = (!$paypal["custom"]) ? ws_plugin__s2member_paypal_custom ($paypal["recurring_payment_id"]) : $paypal["custom"];
 
 
 
46
  /* Notifications following the PayPal® Pro format for recurring payments, do NOT carry the "custom" value, so we do a lookup.
47
  This is only crucial for one IPN call in Standard Integration: `txn_type=recurring_payment_suspended_due_to_max_failed_payment`.
48
  In Pro Integrations, we just need to make sure the "custom" field is assigned for each account during on-site checkout.
49
  This way the "custom" value will always be available when it needs to be; for both Standard and Pro services. */
50
- if (preg_match ("/^" . preg_quote ($_SERVER["HTTP_HOST"], "/") . "/i", $paypal["custom"])) /* Matches originating host? */
51
  { /* The business address validation was removed from this routine, because PayPal® always fills that with the primary
52
  email address. In cases where an alternate PayPal® address is being paid, validation was not possible. */
53
  $paypal["s2member_log"][] = "s2Member originating domain ( _SERVER[HTTP_HOST] ) validated.";
@@ -59,13 +62,42 @@ if (!function_exists ("ws_plugin__s2member_paypal_notify"))
59
  {
60
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
61
  /*
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  Express Checkout transactions.
63
  This is not really necessary. It is only here because this txn_type could
64
  be necessary in a future release of s2Member. For now, it's just a fill-in.
65
  These Hooks/Filters will remain, so you can use them now; if you need to.
66
  */
67
- if (/**/preg_match ("/^express_checkout$/i", $paypal["txn_type"])/**/
68
- && $paypal["item_number"] && $paypal["payer_email"] && $paypal["txn_id"]/**/)
 
69
  {
70
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
71
  do_action ("ws_plugin__s2member_during_paypal_notify_before_express_checkout", get_defined_vars ());
@@ -93,7 +125,8 @@ if (!function_exists ("ws_plugin__s2member_paypal_notify"))
93
  These Hooks/Filters will remain, so you can use them now; if you need to.
94
  */
95
  else if (/**/preg_match ("/^cart$/i", $paypal["txn_type"])/**/
96
- && $paypal["item_number1"] && $paypal["payer_email"] && $paypal["txn_id"]/**/)
 
97
  {
98
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
99
  do_action ("ws_plugin__s2member_during_paypal_notify_before_cart", get_defined_vars ());
@@ -119,6 +152,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_notify"))
119
  */
120
  else if (/**/preg_match ("/^web_accept$/i", $paypal["txn_type"])/**/
121
  && preg_match ("/^sp\:[0-9,]+\:[0-9]+$/", $paypal["item_number"])/**/
 
122
  && $paypal["payer_email"] && $paypal["txn_id"]/**/)
123
  {
124
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
@@ -241,8 +275,9 @@ if (!function_exists ("ws_plugin__s2member_paypal_notify"))
241
  ( option_name1, option_selection1 ); which allow account modifications.
242
  */
243
  else if (/**/preg_match ("/^(web_accept|subscr_signup)$/i", $paypal["txn_type"])/**/
244
- && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["txn_id"]))/**/
245
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
 
 
246
  && $paypal["payer_email"]/**/)
247
  {
248
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
@@ -483,11 +518,11 @@ if (!function_exists ("ws_plugin__s2member_paypal_notify"))
483
  These Hooks/Filters will remain, so you can use them now; if you need to.
484
  */
485
  else if (/**/preg_match ("/^recurring_payment_profile_created$/i", $paypal["txn_type"])/**/
486
- && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["recurring_payment_id"]))/**/
487
  && ($paypal["item_number"] || ($paypal["item_number"] = ws_plugin__s2member_paypal_pro_item_number ($paypal)))/**/
488
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
 
489
  && ($paypal["item_name"] || ($paypal["item_name"] = $paypal["product_name"]))/**/)
490
- /* The "payer_email" is not passed in: recurring_payment_profile_created ?? */
491
  {
492
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
493
  do_action ("ws_plugin__s2member_during_paypal_notify_before_recurring_payment_profile_created", get_defined_vars ());
@@ -576,9 +611,10 @@ if (!function_exists ("ws_plugin__s2member_paypal_notify"))
576
  We need these to update: `s2member_last_payment_time`.
577
  */
578
  else if (/**/preg_match ("/^(subscr_payment|recurring_payment)$/i", $paypal["txn_type"])/**/
579
- && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["recurring_payment_id"]))/**/
580
  && ($paypal["item_number"] || ($paypal["item_number"] = ws_plugin__s2member_paypal_pro_item_number ($paypal)))/**/
581
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
 
 
582
  && ($paypal["item_name"] || ($paypal["item_name"] = $paypal["product_name"]))/**/
583
  && $paypal["payer_email"] && $paypal["txn_id"] && $paypal["mc_gross"]/**/)
584
  {
@@ -641,9 +677,9 @@ if (!function_exists ("ws_plugin__s2member_paypal_notify"))
641
  These Hooks/Filters will remain, so you can use them now; if you need to.
642
  */
643
  else if (/**/preg_match ("/^(subscr_failed|recurring_payment_failed|recurring_payment_skipped)$/i", $paypal["txn_type"])/**/
644
- && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["recurring_payment_id"]))/**/
645
  && ($paypal["item_number"] || ($paypal["item_number"] = ws_plugin__s2member_paypal_pro_item_number ($paypal)))/**/
646
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
 
647
  && ($paypal["item_name"] || ($paypal["item_name"] = $paypal["product_name"]))/**/
648
  && $paypal["payer_email"]/**/)
649
  {
@@ -675,11 +711,11 @@ if (!function_exists ("ws_plugin__s2member_paypal_notify"))
675
  */
676
  else if (/**/preg_match ("/^(subscr_cancel|recurring_payment_profile_cancel)$/i", $paypal["txn_type"])/**/
677
  && !(preg_match ("/^recurring_payment_profile_cancel$/i", $paypal["txn_type"]) && preg_match ("/^failed$/i", $paypal["initial_payment_status"]))/**/
678
- && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["recurring_payment_id"]))/**/
679
  && ($paypal["item_number"] || ($paypal["item_number"] = ws_plugin__s2member_paypal_pro_item_number ($paypal)))/**/
680
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
681
  && ($paypal["period1"] || ($paypal["period1"] = ws_plugin__s2member_paypal_pro_period1 ($paypal)))/**/
682
  && ($paypal["period3"] || ($paypal["period3"] = ws_plugin__s2member_paypal_pro_period3 ($paypal)))/**/
 
683
  && $paypal["payer_email"]/**/)
684
  {
685
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
@@ -728,9 +764,9 @@ if (!function_exists ("ws_plugin__s2member_paypal_notify"))
728
  || (preg_match ("/^recurring_payment_profile_cancel$/i", $paypal["txn_type"]) && preg_match ("/^failed$/i", $paypal["initial_payment_status"]))/**/
729
  || (preg_match ("/^new_case$/i", $paypal["txn_type"]) && preg_match ("/^chargeback$/i", $paypal["case_type"]))/**/
730
  || (!$paypal["txn_type"] && preg_match ("/^(refunded|reversed)$/i", $paypal["payment_status"]))/**/)/**/
731
- && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["recurring_payment_id"]) || ($paypal["subscr_id"] = $paypal["parent_txn_id"]))/**/
732
  && ($paypal["item_number"] || ($paypal["item_number"] = ws_plugin__s2member_paypal_pro_item_number ($paypal)))/**/
733
- && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/)
 
734
  {
735
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
736
  do_action ("ws_plugin__s2member_during_paypal_notify_before_subscr_eot", get_defined_vars ());
@@ -873,7 +909,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_notify"))
873
  }
874
  else
875
  {
876
- $paypal["s2member_log"][] = "Ignoring this IPN request. The txn_type does not require any action on the part of s2Member.";
877
  }
878
  }
879
  else /* Else a custom conditional has been applied by filters. */
43
  $paypal["s2member_log"][] = "s2Member POST vars verified through a POST back to PayPal®.";
44
  /**/
45
  $paypal["custom"] = (!$paypal["custom"]) ? ws_plugin__s2member_paypal_custom ($paypal["recurring_payment_id"]) : $paypal["custom"];
46
+ /**/
47
+ $payment_status_issues = "/^(failed|denied|expired|refunded|reversed|reversal|canceled_reversal|voided)$/i";
48
+ /**/
49
  /* Notifications following the PayPal® Pro format for recurring payments, do NOT carry the "custom" value, so we do a lookup.
50
  This is only crucial for one IPN call in Standard Integration: `txn_type=recurring_payment_suspended_due_to_max_failed_payment`.
51
  In Pro Integrations, we just need to make sure the "custom" field is assigned for each account during on-site checkout.
52
  This way the "custom" value will always be available when it needs to be; for both Standard and Pro services. */
53
+ if (preg_match ("/^" . preg_quote (preg_replace ("/\:([0-9]+)$/", "", $_SERVER["HTTP_HOST"]), "/") . "/i", $paypal["custom"]))
54
  { /* The business address validation was removed from this routine, because PayPal® always fills that with the primary
55
  email address. In cases where an alternate PayPal® address is being paid, validation was not possible. */
56
  $paypal["s2member_log"][] = "s2Member originating domain ( _SERVER[HTTP_HOST] ) validated.";
62
  {
63
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
64
  /*
65
+ Virtual Terminal transactions.
66
+ This is not really necessary. It is only here because this txn_type could
67
+ be necessary in a future release of s2Member. For now, it's just a fill-in.
68
+ These Hooks/Filters will remain, so you can use them now; if you need to.
69
+ */
70
+ if (/**/preg_match ("/^virtual_terminal$/i", $paypal["txn_type"])/**/
71
+ && !preg_match ($payment_status_issues, $paypal["payment_status"])/**/
72
+ && $paypal["txn_id"]/**/)
73
+ {
74
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
75
+ do_action ("ws_plugin__s2member_during_paypal_notify_before_virtual_terminal", get_defined_vars ());
76
+ unset ($__refs, $__v); /* Unset defined __refs, __v. */
77
+ /**/
78
+ $paypal["s2member_log"][] = "s2Member txn_type identified as virtual_terminal.";
79
+ /**/
80
+ $processing = $during = true; /* Yes, we ARE processing this. */
81
+ /**/
82
+ $paypal["s2member_log"][] = "The txn_type does not require any action on the part of s2Member.";
83
+ /**/
84
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
85
+ do_action ("ws_plugin__s2member_during_paypal_notify_during_virtual_terminal", get_defined_vars ());
86
+ unset ($__refs, $__v); /* Unset defined __refs, __v. */
87
+ /**/
88
+ eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
89
+ do_action ("ws_plugin__s2member_during_paypal_notify_after_virtual_terminal", get_defined_vars ());
90
+ unset ($__refs, $__v); /* Unset defined __refs, __v. */
91
+ }
92
+ /*
93
  Express Checkout transactions.
94
  This is not really necessary. It is only here because this txn_type could
95
  be necessary in a future release of s2Member. For now, it's just a fill-in.
96
  These Hooks/Filters will remain, so you can use them now; if you need to.
97
  */
98
+ else if (/**/preg_match ("/^express_checkout$/i", $paypal["txn_type"])/**/
99
+ && !preg_match ($payment_status_issues, $paypal["payment_status"])/**/
100
+ && $paypal["txn_id"]/**/)
101
  {
102
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
103
  do_action ("ws_plugin__s2member_during_paypal_notify_before_express_checkout", get_defined_vars ());
125
  These Hooks/Filters will remain, so you can use them now; if you need to.
126
  */
127
  else if (/**/preg_match ("/^cart$/i", $paypal["txn_type"])/**/
128
+ && !preg_match ($payment_status_issues, $paypal["payment_status"])/**/
129
+ && $paypal["txn_id"]/**/)
130
  {
131
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
132
  do_action ("ws_plugin__s2member_during_paypal_notify_before_cart", get_defined_vars ());
152
  */
153
  else if (/**/preg_match ("/^web_accept$/i", $paypal["txn_type"])/**/
154
  && preg_match ("/^sp\:[0-9,]+\:[0-9]+$/", $paypal["item_number"])/**/
155
+ && !preg_match ($payment_status_issues, $paypal["payment_status"])/**/
156
  && $paypal["payer_email"] && $paypal["txn_id"]/**/)
157
  {
158
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
275
  ( option_name1, option_selection1 ); which allow account modifications.
276
  */
277
  else if (/**/preg_match ("/^(web_accept|subscr_signup)$/i", $paypal["txn_type"])/**/
 
278
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
279
+ && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["txn_id"]))/**/
280
+ && !preg_match ($payment_status_issues, $paypal["payment_status"])/**/
281
  && $paypal["payer_email"]/**/)
282
  {
283
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
518
  These Hooks/Filters will remain, so you can use them now; if you need to.
519
  */
520
  else if (/**/preg_match ("/^recurring_payment_profile_created$/i", $paypal["txn_type"])/**/
 
521
  && ($paypal["item_number"] || ($paypal["item_number"] = ws_plugin__s2member_paypal_pro_item_number ($paypal)))/**/
522
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
523
+ && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["recurring_payment_id"]))/**/
524
  && ($paypal["item_name"] || ($paypal["item_name"] = $paypal["product_name"]))/**/)
525
+ /* "payer_email" is not passed in `recurring_payment_profile_created` ?? */
526
  {
527
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
528
  do_action ("ws_plugin__s2member_during_paypal_notify_before_recurring_payment_profile_created", get_defined_vars ());
611
  We need these to update: `s2member_last_payment_time`.
612
  */
613
  else if (/**/preg_match ("/^(subscr_payment|recurring_payment)$/i", $paypal["txn_type"])/**/
 
614
  && ($paypal["item_number"] || ($paypal["item_number"] = ws_plugin__s2member_paypal_pro_item_number ($paypal)))/**/
615
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
616
+ && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["recurring_payment_id"]))/**/
617
+ && !preg_match ($payment_status_issues, $paypal["payment_status"]) /* Status OK? */
618
  && ($paypal["item_name"] || ($paypal["item_name"] = $paypal["product_name"]))/**/
619
  && $paypal["payer_email"] && $paypal["txn_id"] && $paypal["mc_gross"]/**/)
620
  {
677
  These Hooks/Filters will remain, so you can use them now; if you need to.
678
  */
679
  else if (/**/preg_match ("/^(subscr_failed|recurring_payment_failed|recurring_payment_skipped)$/i", $paypal["txn_type"])/**/
 
680
  && ($paypal["item_number"] || ($paypal["item_number"] = ws_plugin__s2member_paypal_pro_item_number ($paypal)))/**/
681
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
682
+ && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["recurring_payment_id"]))/**/
683
  && ($paypal["item_name"] || ($paypal["item_name"] = $paypal["product_name"]))/**/
684
  && $paypal["payer_email"]/**/)
685
  {
711
  */
712
  else if (/**/preg_match ("/^(subscr_cancel|recurring_payment_profile_cancel)$/i", $paypal["txn_type"])/**/
713
  && !(preg_match ("/^recurring_payment_profile_cancel$/i", $paypal["txn_type"]) && preg_match ("/^failed$/i", $paypal["initial_payment_status"]))/**/
 
714
  && ($paypal["item_number"] || ($paypal["item_number"] = ws_plugin__s2member_paypal_pro_item_number ($paypal)))/**/
715
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
716
  && ($paypal["period1"] || ($paypal["period1"] = ws_plugin__s2member_paypal_pro_period1 ($paypal)))/**/
717
  && ($paypal["period3"] || ($paypal["period3"] = ws_plugin__s2member_paypal_pro_period3 ($paypal)))/**/
718
+ && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["recurring_payment_id"]))/**/
719
  && $paypal["payer_email"]/**/)
720
  {
721
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
764
  || (preg_match ("/^recurring_payment_profile_cancel$/i", $paypal["txn_type"]) && preg_match ("/^failed$/i", $paypal["initial_payment_status"]))/**/
765
  || (preg_match ("/^new_case$/i", $paypal["txn_type"]) && preg_match ("/^chargeback$/i", $paypal["case_type"]))/**/
766
  || (!$paypal["txn_type"] && preg_match ("/^(refunded|reversed)$/i", $paypal["payment_status"]))/**/)/**/
 
767
  && ($paypal["item_number"] || ($paypal["item_number"] = ws_plugin__s2member_paypal_pro_item_number ($paypal)))/**/
768
+ && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
769
+ && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["recurring_payment_id"]) || ($paypal["subscr_id"] = $paypal["parent_txn_id"]))/**/)
770
  {
771
  eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
772
  do_action ("ws_plugin__s2member_during_paypal_notify_before_subscr_eot", get_defined_vars ());
909
  }
910
  else
911
  {
912
+ $paypal["s2member_log"][] = "Ignoring this IPN request. The txn_type/status does not require any action on the part of s2Member.";
913
  }
914
  }
915
  else /* Else a custom conditional has been applied by filters. */
includes/functions/paypal-return.inc.php CHANGED
@@ -12,7 +12,7 @@ If not, see: <http://www.gnu.org/licenses/>.
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
- exit("Do not access this file directly.");
16
  /*
17
  Handles PayPal® Return URL processing.
18
  This is used ONLY in PayPal® Standard Integration.
@@ -31,14 +31,16 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
31
  $paypal["s2member_log"][] = "Return-Data received on: " . date ("D M j, Y g:i:s a T");
32
  $paypal["s2member_log"][] = "s2Member POST vars verified through a POST back to PayPal®.";
33
  /**/
34
- if (preg_match ("/^" . preg_quote ($_SERVER["HTTP_HOST"], "/") . "/i", $paypal["custom"])) /* Matches originating host? */
 
 
35
  { /* The business address validation was removed from this routine, because PayPal® always fills that with the primary
36
  email address. In cases where an alternate PayPal® address is being paid, validation was not possible. */
37
  $paypal["s2member_log"][] = "s2Member originating domain ( _SERVER[HTTP_HOST] ) validated.";
38
  /*
39
  Custom conditionals can be applied by filters.
40
  */
41
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
42
  if (!apply_filters ("ws_plugin__s2member_during_paypal_return_conditionals", false, get_defined_vars ()))
43
  {
44
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
@@ -47,9 +49,10 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
47
  */
48
  if (/**/preg_match ("/^web_accept$/i", $paypal["txn_type"])/**/
49
  && preg_match ("/^sp\:[0-9,]+\:[0-9]+$/", $paypal["item_number"])/**/
 
50
  && $paypal["txn_id"]/**/)
51
  {
52
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
53
  do_action ("ws_plugin__s2member_during_paypal_return_before_sp_access", get_defined_vars ());
54
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
55
  /**/
@@ -80,13 +83,13 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
80
  }
81
  }
82
  /**/
83
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
84
  do_action ("ws_plugin__s2member_during_paypal_return_during_sp_access", get_defined_vars ());
85
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
86
  /**/
87
  $paypal["s2member_log"][] = "Redirecting Customer to the Specific Post/Page.";
88
  /**/
89
- header("Location: " . $sp_access_url);
90
  }
91
  else /* Otherwise, the ID must have been invalid. Or the Post/Page was deleted. */
92
  {
@@ -100,7 +103,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
100
  echo '</script>' . "\n";
101
  }
102
  /**/
103
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
104
  do_action ("ws_plugin__s2member_during_paypal_return_after_sp_access", get_defined_vars ());
105
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
106
  }
@@ -110,12 +113,13 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
110
  ( option_name1, option_selection1 ); which allow account modifications.
111
  */
112
  else if (/**/preg_match ("/^(web_accept|subscr_signup|subscr_payment)$/i", $paypal["txn_type"])/**/
 
113
  && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["txn_id"]))/**/
114
- && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/)
115
  { /* With Auto-Return/PDT, PayPal will send subscr_payment instead of subscr_signup to the return URL.
116
  So we need to look for (web_accept|subscr_signup|subscr_payment), and treat them as the same. */
117
  /**/
118
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
119
  do_action ("ws_plugin__s2member_during_paypal_return_before_subscr_signup", get_defined_vars ());
120
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
121
  /**/
@@ -129,7 +133,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
129
  /* This advanced method is required whenever a Subscription that is already completed, or was never setup to recur in the first place needs to be modified. PayPal® will not allow the
130
  modify=2 parameter to be used in those scenarios, because technically there is nothing to update. The only thing to be updated is the account. */
131
  {
132
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
133
  do_action ("ws_plugin__s2member_during_paypal_return_before_subscr_signup_w_update_vars", get_defined_vars ());
134
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
135
  /**/
@@ -166,7 +170,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
166
  /**/
167
  $paypal["s2member_log"][] = "s2Member Level/Capabilities updated w/ advanced update routines.";
168
  /**/
169
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
170
  do_action ("ws_plugin__s2member_during_paypal_return_during_subscr_signup_w_update_vars", get_defined_vars ());
171
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
172
  /**/
@@ -201,7 +205,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
201
  echo '</script>' . "\n";
202
  }
203
  /**/
204
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
205
  do_action ("ws_plugin__s2member_during_paypal_return_after_subscr_signup_w_update_vars", get_defined_vars ());
206
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
207
  }
@@ -210,7 +214,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
210
  */
211
  else /* Else this is a normal Subscription signup, we are not updating an existing Subscription. */
212
  {
213
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
214
  do_action ("ws_plugin__s2member_during_paypal_return_before_subscr_signup_wo_update_vars", get_defined_vars ());
215
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
216
  /**/
@@ -224,7 +228,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
224
  /**/
225
  $paypal["s2member_log"][] = "Registration Cookies set on (web_accept|subscr_signup|subscr_payment) w/o update vars.";
226
  /**/
227
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
228
  do_action ("ws_plugin__s2member_during_paypal_return_during_subscr_signup_wo_update_vars", get_defined_vars ());
229
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
230
  /**/
@@ -235,12 +239,12 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
235
  echo "window.location = '" . esc_js (add_query_arg ("action", "register", wp_login_url ())) . "';" . "\n";
236
  echo '</script>' . "\n";
237
  /**/
238
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
239
  do_action ("ws_plugin__s2member_during_paypal_return_after_subscr_signup_wo_update_vars", get_defined_vars ());
240
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
241
  }
242
  /**/
243
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
244
  do_action ("ws_plugin__s2member_during_paypal_return_after_subscr_signup", get_defined_vars ());
245
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
246
  }
@@ -251,7 +255,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
251
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
252
  && $paypal["subscr_id"]/**/)
253
  {
254
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
255
  do_action ("ws_plugin__s2member_during_paypal_return_before_subscr_modify", get_defined_vars ());
256
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
257
  /**/
@@ -285,7 +289,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
285
  /**/
286
  $paypal["s2member_log"][] = "s2Member Level/Capabilities updated on Subscription modification.";
287
  /**/
288
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
289
  do_action ("ws_plugin__s2member_during_paypal_return_during_subscr_modify", get_defined_vars ());
290
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
291
  /**/
@@ -320,18 +324,18 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
320
  echo '</script>' . "\n";
321
  }
322
  /**/
323
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
324
  do_action ("ws_plugin__s2member_during_paypal_return_after_subscr_modify", get_defined_vars ());
325
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
326
  }
327
  else
328
  {
329
- $paypal["s2member_log"][] = "Unexpected txn_type. The PayPal® txn_type did not match a required action.";
330
  /**/
331
  $paypal["s2member_log"][] = "Redirecting Customer to the Login Page, due to an error that occurred.";
332
  /**/
333
  echo '<script type="text/javascript">' . "\n";
334
- echo "alert('ERROR: Unexpected txn_type. Please contact Support for assistance.\\n\\nThe PayPal® txn_type did not match a required action.');" . "\n";
335
  echo "window.location = '" . esc_js (wp_login_url ()) . "';";
336
  echo '</script>' . "\n";
337
  }
@@ -353,13 +357,13 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
353
  }
354
  else if (!isset ($_GET["tx"]) && (empty ($_POST) || $_POST["auth"]))
355
  {
356
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
357
  do_action ("ws_plugin__s2member_during_paypal_return_before_no_return_data", get_defined_vars ());
358
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
359
  /**/
360
  $paypal["s2member_log"][] = "No Return-Data from PayPal®. Customer must wait for Email Confirmation.";
361
  /**/
362
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
363
  do_action ("ws_plugin__s2member_during_paypal_return_during_no_return_data", get_defined_vars ());
364
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
365
  /**/
@@ -371,7 +375,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
371
  echo "window.location = '" . esc_js (get_bloginfo ("url")) . "';";
372
  echo '</script>' . "\n";
373
  /**/
374
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
375
  do_action ("ws_plugin__s2member_during_paypal_return_after_no_return_data", get_defined_vars ());
376
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
377
  }
@@ -399,14 +403,14 @@ if (!function_exists ("ws_plugin__s2member_paypal_return"))
399
  if (is_writable ($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"]))
400
  file_put_contents ($logs_dir . "/paypal-rtn.log", var_export ($paypal, true) . "\n\n", FILE_APPEND);
401
  /**/
402
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
403
  do_action ("ws_plugin__s2member_during_paypal_return", get_defined_vars ());
404
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
405
  /**/
406
  exit ();
407
  }
408
  /**/
409
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
410
  do_action ("ws_plugin__s2member_after_paypal_return", get_defined_vars ());
411
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
412
  }
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
+ exit ("Do not access this file directly.");
16
  /*
17
  Handles PayPal® Return URL processing.
18
  This is used ONLY in PayPal® Standard Integration.
31
  $paypal["s2member_log"][] = "Return-Data received on: " . date ("D M j, Y g:i:s a T");
32
  $paypal["s2member_log"][] = "s2Member POST vars verified through a POST back to PayPal®.";
33
  /**/
34
+ $payment_status_issues = "/^(failed|denied|expired|refunded|reversed|reversal|canceled_reversal|voided)$/i";
35
+ /**/
36
+ if (preg_match ("/^" . preg_quote (preg_replace ("/\:([0-9]+)$/", "", $_SERVER["HTTP_HOST"]), "/") . "/i", $paypal["custom"]))
37
  { /* The business address validation was removed from this routine, because PayPal® always fills that with the primary
38
  email address. In cases where an alternate PayPal® address is being paid, validation was not possible. */
39
  $paypal["s2member_log"][] = "s2Member originating domain ( _SERVER[HTTP_HOST] ) validated.";
40
  /*
41
  Custom conditionals can be applied by filters.
42
  */
43
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
44
  if (!apply_filters ("ws_plugin__s2member_during_paypal_return_conditionals", false, get_defined_vars ()))
45
  {
46
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
49
  */
50
  if (/**/preg_match ("/^web_accept$/i", $paypal["txn_type"])/**/
51
  && preg_match ("/^sp\:[0-9,]+\:[0-9]+$/", $paypal["item_number"])/**/
52
+ && !preg_match ($payment_status_issues, $paypal["payment_status"])/**/
53
  && $paypal["txn_id"]/**/)
54
  {
55
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
56
  do_action ("ws_plugin__s2member_during_paypal_return_before_sp_access", get_defined_vars ());
57
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
58
  /**/
83
  }
84
  }
85
  /**/
86
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
87
  do_action ("ws_plugin__s2member_during_paypal_return_during_sp_access", get_defined_vars ());
88
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
89
  /**/
90
  $paypal["s2member_log"][] = "Redirecting Customer to the Specific Post/Page.";
91
  /**/
92
+ header ("Location: " . $sp_access_url);
93
  }
94
  else /* Otherwise, the ID must have been invalid. Or the Post/Page was deleted. */
95
  {
103
  echo '</script>' . "\n";
104
  }
105
  /**/
106
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
107
  do_action ("ws_plugin__s2member_during_paypal_return_after_sp_access", get_defined_vars ());
108
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
109
  }
113
  ( option_name1, option_selection1 ); which allow account modifications.
114
  */
115
  else if (/**/preg_match ("/^(web_accept|subscr_signup|subscr_payment)$/i", $paypal["txn_type"])/**/
116
+ && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
117
  && ($paypal["subscr_id"] || ($paypal["subscr_id"] = $paypal["txn_id"]))/**/
118
+ && !preg_match ($payment_status_issues, $paypal["payment_status"])/**/)
119
  { /* With Auto-Return/PDT, PayPal will send subscr_payment instead of subscr_signup to the return URL.
120
  So we need to look for (web_accept|subscr_signup|subscr_payment), and treat them as the same. */
121
  /**/
122
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
123
  do_action ("ws_plugin__s2member_during_paypal_return_before_subscr_signup", get_defined_vars ());
124
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
125
  /**/
133
  /* This advanced method is required whenever a Subscription that is already completed, or was never setup to recur in the first place needs to be modified. PayPal® will not allow the
134
  modify=2 parameter to be used in those scenarios, because technically there is nothing to update. The only thing to be updated is the account. */
135
  {
136
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
137
  do_action ("ws_plugin__s2member_during_paypal_return_before_subscr_signup_w_update_vars", get_defined_vars ());
138
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
139
  /**/
170
  /**/
171
  $paypal["s2member_log"][] = "s2Member Level/Capabilities updated w/ advanced update routines.";
172
  /**/
173
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
174
  do_action ("ws_plugin__s2member_during_paypal_return_during_subscr_signup_w_update_vars", get_defined_vars ());
175
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
176
  /**/
205
  echo '</script>' . "\n";
206
  }
207
  /**/
208
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
209
  do_action ("ws_plugin__s2member_during_paypal_return_after_subscr_signup_w_update_vars", get_defined_vars ());
210
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
211
  }
214
  */
215
  else /* Else this is a normal Subscription signup, we are not updating an existing Subscription. */
216
  {
217
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
218
  do_action ("ws_plugin__s2member_during_paypal_return_before_subscr_signup_wo_update_vars", get_defined_vars ());
219
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
220
  /**/
228
  /**/
229
  $paypal["s2member_log"][] = "Registration Cookies set on (web_accept|subscr_signup|subscr_payment) w/o update vars.";
230
  /**/
231
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
232
  do_action ("ws_plugin__s2member_during_paypal_return_during_subscr_signup_wo_update_vars", get_defined_vars ());
233
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
234
  /**/
239
  echo "window.location = '" . esc_js (add_query_arg ("action", "register", wp_login_url ())) . "';" . "\n";
240
  echo '</script>' . "\n";
241
  /**/
242
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
243
  do_action ("ws_plugin__s2member_during_paypal_return_after_subscr_signup_wo_update_vars", get_defined_vars ());
244
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
245
  }
246
  /**/
247
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
248
  do_action ("ws_plugin__s2member_during_paypal_return_after_subscr_signup", get_defined_vars ());
249
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
250
  }
255
  && preg_match ("/^[1-4](\:|$)([a-z_0-9,]+)?(\:)?([0-9]+ [A-Z])?$/", $paypal["item_number"])/**/
256
  && $paypal["subscr_id"]/**/)
257
  {
258
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
259
  do_action ("ws_plugin__s2member_during_paypal_return_before_subscr_modify", get_defined_vars ());
260
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
261
  /**/
289
  /**/
290
  $paypal["s2member_log"][] = "s2Member Level/Capabilities updated on Subscription modification.";
291
  /**/
292
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
293
  do_action ("ws_plugin__s2member_during_paypal_return_during_subscr_modify", get_defined_vars ());
294
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
295
  /**/
324
  echo '</script>' . "\n";
325
  }
326
  /**/
327
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
328
  do_action ("ws_plugin__s2member_during_paypal_return_after_subscr_modify", get_defined_vars ());
329
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
330
  }
331
  else
332
  {
333
+ $paypal["s2member_log"][] = "Unexpected txn_type. The PayPal® txn_type/status did not match a required action.";
334
  /**/
335
  $paypal["s2member_log"][] = "Redirecting Customer to the Login Page, due to an error that occurred.";
336
  /**/
337
  echo '<script type="text/javascript">' . "\n";
338
+ echo "alert('ERROR: Unexpected txn_type/status. Please contact Support for assistance.\\n\\nThe PayPal® txn_type/status did not match a required action.');" . "\n";
339
  echo "window.location = '" . esc_js (wp_login_url ()) . "';";
340
  echo '</script>' . "\n";
341
  }
357
  }
358
  else if (!isset ($_GET["tx"]) && (empty ($_POST) || $_POST["auth"]))
359
  {
360
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
361
  do_action ("ws_plugin__s2member_during_paypal_return_before_no_return_data", get_defined_vars ());
362
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
363
  /**/
364
  $paypal["s2member_log"][] = "No Return-Data from PayPal®. Customer must wait for Email Confirmation.";
365
  /**/
366
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
367
  do_action ("ws_plugin__s2member_during_paypal_return_during_no_return_data", get_defined_vars ());
368
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
369
  /**/
375
  echo "window.location = '" . esc_js (get_bloginfo ("url")) . "';";
376
  echo '</script>' . "\n";
377
  /**/
378
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
379
  do_action ("ws_plugin__s2member_during_paypal_return_after_no_return_data", get_defined_vars ());
380
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
381
  }
403
  if (is_writable ($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"]))
404
  file_put_contents ($logs_dir . "/paypal-rtn.log", var_export ($paypal, true) . "\n\n", FILE_APPEND);
405
  /**/
406
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
407
  do_action ("ws_plugin__s2member_during_paypal_return", get_defined_vars ());
408
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
409
  /**/
410
  exit ();
411
  }
412
  /**/
413
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
414
  do_action ("ws_plugin__s2member_after_paypal_return", get_defined_vars ());
415
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
416
  }
includes/functions/paypal-utilities.inc.php CHANGED
@@ -41,7 +41,7 @@ if (!function_exists ("ws_plugin__s2member_paypal_postvars"))
41
  /**/
42
  $endpoint = ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com";
43
  /**/
44
- if (preg_match ("/^SUCCESS/i", ($response = trim (ws_plugin__s2member_remote ("https://" . $endpoint . "/cgi-bin/webscr", $postback)))))
45
  {
46
  foreach (preg_split ("/[\r\n]+/", preg_replace ("/^SUCCESS/i", "", $response)) as $varline)
47
  {
@@ -67,15 +67,15 @@ if (!function_exists ("ws_plugin__s2member_paypal_postvars"))
67
  /**/
68
  $endpoint = ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com";
69
  /**/
70
- if ($_GET["s2member_paypal_proxy"] && ws_plugin__s2member_decrypt ($_GET["s2member_paypal_proxy_verification"]) === $_SERVER["HTTP_HOST"])
71
  {
72
  return apply_filters ("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars ());
73
  }
74
- else if ($_GET["s2member_paypal_proxy"] && $_GET["s2member_paypal_proxy_verification"] === md5 (ws_plugin__s2member_xencrypt ($_SERVER["HTTP_HOST"])))
75
  {
76
  return apply_filters ("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars ());
77
  }
78
- else if (strtolower (trim (ws_plugin__s2member_remote ("https://" . $endpoint . "/cgi-bin/webscr", $postback))) === "verified")
79
  {
80
  return apply_filters ("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars ());
81
  }
41
  /**/
42
  $endpoint = ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com";
43
  /**/
44
+ if (preg_match ("/^SUCCESS/i", ($response = trim (ws_plugin__s2member_remote ("https://" . $endpoint . "/cgi-bin/webscr", $postback, array ("timeout" => 20))))))
45
  {
46
  foreach (preg_split ("/[\r\n]+/", preg_replace ("/^SUCCESS/i", "", $response)) as $varline)
47
  {
67
  /**/
68
  $endpoint = ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com";
69
  /**/
70
+ if ($_GET["s2member_paypal_proxy"] && preg_match ("/^" . preg_quote (preg_replace ("/\:[0-9]+$/", "", $_SERVER["HTTP_HOST"]), "/") . "(\:[0-9]+)?$/i", ws_plugin__s2member_decrypt ($_GET["s2member_paypal_proxy_verification"])))
71
  {
72
  return apply_filters ("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars ());
73
  }
74
+ else if ($_GET["s2member_paypal_proxy"] && $_GET["s2member_paypal_proxy_verification"] === md5 (ws_plugin__s2member_xencrypt (preg_replace ("/\:[0-9]+$/", "", $_SERVER["HTTP_HOST"]))))
75
  {
76
  return apply_filters ("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars ());
77
  }
78
+ else if (strtolower (trim (ws_plugin__s2member_remote ("https://" . $endpoint . "/cgi-bin/webscr", $postback, array ("timeout" => 20)))) === "verified")
79
  {
80
  return apply_filters ("ws_plugin__s2member_paypal_postvars", $postvars, get_defined_vars ());
81
  }
includes/functions/register-access.inc.php CHANGED
@@ -361,7 +361,7 @@ if (!function_exists ("ws_plugin__s2member_configure_user_registration"))
361
  if (($transient = md5 ("s2member_transient_ipn_subscr_payment_" . $subscr_id)) && is_array ($subscr_payment = get_transient ($transient)))
362
  {
363
  $proxy = array ("s2member_paypal_notify" => "1", "s2member_paypal_proxy" => "s2member_transient_ipn_subscr_payment");
364
- ws_plugin__s2member_remote (add_query_arg ($proxy, get_bloginfo ("url")), stripslashes_deep ($subscr_payment));
365
  delete_transient ($transient);
366
  }
367
  /**/
361
  if (($transient = md5 ("s2member_transient_ipn_subscr_payment_" . $subscr_id)) && is_array ($subscr_payment = get_transient ($transient)))
362
  {
363
  $proxy = array ("s2member_paypal_notify" => "1", "s2member_paypal_proxy" => "s2member_transient_ipn_subscr_payment");
364
+ ws_plugin__s2member_remote (add_query_arg ($proxy, get_bloginfo ("url")), stripslashes_deep ($subscr_payment), array ("timeout" => 20));
365
  delete_transient ($transient);
366
  }
367
  /**/
includes/functions/tracking-codes.inc.php CHANGED
@@ -45,9 +45,9 @@ if (!function_exists ("ws_plugin__s2member_display_signup_tracking_codes"))
45
  do_action ("ws_plugin__s2member_during_display_signup_tracking_codes", get_defined_vars ());
46
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
47
  /**/
48
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["is_multisite_farm"])
49
  {
50
- echo $code . "\n"; /* No PHP allowed here. */
51
  }
52
  else /* Otherwise, it's safe to allow PHP code. */
53
  {
@@ -109,9 +109,9 @@ if (!function_exists ("ws_plugin__s2member_display_sp_tracking_codes"))
109
  do_action ("ws_plugin__s2member_during_display_sp_tracking_codes", get_defined_vars ());
110
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
111
  /**/
112
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["is_multisite_farm"])
113
  {
114
- echo $code . "\n"; /* No PHP allowed here. */
115
  }
116
  else /* Otherwise, it's safe to allow PHP code. */
117
  {
45
  do_action ("ws_plugin__s2member_during_display_signup_tracking_codes", get_defined_vars ());
46
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
47
  /**/
48
+ if (ws_plugin__s2member_is_multisite_farm ())
49
  {
50
+ echo $code . "\n"; /* No PHP here. */
51
  }
52
  else /* Otherwise, it's safe to allow PHP code. */
53
  {
109
  do_action ("ws_plugin__s2member_during_display_sp_tracking_codes", get_defined_vars ());
110
  unset ($__refs, $__v); /* Unset defined __refs, __v. */
111
  /**/
112
+ if (ws_plugin__s2member_is_multisite_farm ())
113
  {
114
+ echo $code . "\n"; /* No PHP here. */
115
  }
116
  else /* Otherwise, it's safe to allow PHP code. */
117
  {
includes/functions/utilities.inc.php CHANGED
@@ -12,7 +12,7 @@ If not, see: <http://www.gnu.org/licenses/>.
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
- exit ("Do not access this file directly.");
16
  /*
17
  Function that handles a remote request.
18
  This extends wp_remote_request() through the `WP_Http` class.
@@ -207,6 +207,16 @@ if (!function_exists ("ws_plugin__s2member_trim_quot_deep"))
207
  }
208
  }
209
  /*
 
 
 
 
 
 
 
 
 
 
210
  Function checks if a post is in a child category.
211
  */
212
  if (!function_exists ("ws_plugin__s2member_in_descendant_category"))
@@ -506,4 +516,46 @@ if (!function_exists ("ws_plugin__s2member_form_whips_2_url"))
506
  return false;
507
  }
508
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
509
  ?>
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
+ exit("Do not access this file directly.");
16
  /*
17
  Function that handles a remote request.
18
  This extends wp_remote_request() through the `WP_Http` class.
207
  }
208
  }
209
  /*
210
+ Determines whether or not this is a Multisite Farm.
211
+ */
212
+ if (!function_exists ("ws_plugin__s2member_is_multisite_farm"))
213
+ {
214
+ function ws_plugin__s2member_is_multisite_farm ()
215
+ {
216
+ return (is_multisite () && defined ("MULTISITE_FARM") && MULTISITE_FARM);
217
+ }
218
+ }
219
+ /*
220
  Function checks if a post is in a child category.
221
  */
222
  if (!function_exists ("ws_plugin__s2member_in_descendant_category"))
516
  return false;
517
  }
518
  }
519
+ /*
520
+ Functions that handles CSS compression routines.
521
+ */
522
+ if (!function_exists ("ws_plugin__s2member_compress_css"))
523
+ {
524
+ function ws_plugin__s2member_compress_css ($css = FALSE)
525
+ {
526
+ $c6 = "/(\:#| #)([A-Z0-9]{6})/i";
527
+ $css = preg_replace ("/\/\*(.*?)\*\//s", "", $css);
528
+ $css = preg_replace ("/[\r\n\t]+/", "", $css);
529
+ $css = preg_replace ("/ {2,}/", " ", $css);
530
+ $css = preg_replace ("/ , | ,|, /", ",", $css);
531
+ $css = preg_replace ("/ \> | \>|\> /", ">", $css);
532
+ $css = preg_replace ("/\[ /", "[", $css);
533
+ $css = preg_replace ("/ \]/", "]", $css);
534
+ $css = preg_replace ("/ \!\= | \!\=|\!\= /", "!=", $css);
535
+ $css = preg_replace ("/ \|\= | \|\=|\|\= /", "|=", $css);
536
+ $css = preg_replace ("/ \^\= | \^\=|\^\= /", "^=", $css);
537
+ $css = preg_replace ("/ \$\= | \$\=|\$\= /", "$=", $css);
538
+ $css = preg_replace ("/ \*\= | \*\=|\*\= /", "*=", $css);
539
+ $css = preg_replace ("/ ~\= | ~\=|~\= /", "~=", $css);
540
+ $css = preg_replace ("/ \= | \=|\= /", "=", $css);
541
+ $css = preg_replace ("/ \+ | \+|\+ /", "+", $css);
542
+ $css = preg_replace ("/ ~ | ~|~ /", "~", $css);
543
+ $css = preg_replace ("/ \{ | \{|\{ /", "{", $css);
544
+ $css = preg_replace ("/ \} | \}|\} /", "}", $css);
545
+ $css = preg_replace ("/ \: | \:|\: /", ":", $css);
546
+ $css = preg_replace ("/ ; | ;|; /", ";", $css);
547
+ $css = preg_replace ("/;\}/", "}", $css);
548
+ /**/
549
+ return preg_replace_callback ($c6, "ws_plugin__s2member_compress_css_c3", $css);
550
+ }
551
+ }
552
+ if (!function_exists ("ws_plugin__s2member_compress_css_c3"))
553
+ {
554
+ function ws_plugin__s2member_compress_css_c3 ($m = FALSE)
555
+ {
556
+ if ($m[2][0] === $m[2][1] && $m[2][2] === $m[2][3] && $m[2][4] === $m[2][5])
557
+ return $m[1] . $m[2][0] . $m[2][2] . $m[2][4];
558
+ return $m[0];
559
+ }
560
+ }
561
  ?>
includes/mailchimp/nc-mcapi.inc.php CHANGED
@@ -21,9 +21,9 @@ class NC_MCAPI {
21
  var $apiUrl;
22
 
23
  /**
24
- * Default to a 300 second timeout on server calls
25
  */
26
- var $timeout = 300;
27
 
28
  /**
29
  * Default to a 8K chunk size
@@ -1740,6 +1740,7 @@ class NC_MCAPI {
1740
  $host_uri = $host . $this->apiUrl["path"] . "?" . $this->apiUrl["query"] . "&method=" . urlencode ($method);
1741
  $url = ($this->secure) ? "https://" . $host_uri : "http://" . $host_uri;
1742
  $args["user-agent"] = "MCAPI/" . $this->version;
 
1743
  $params["apikey"] = $this->api_key;
1744
  $post_vars = $params;
1745
 
21
  var $apiUrl;
22
 
23
  /**
24
+ * Default to a 5 second timeout on server calls
25
  */
26
+ var $timeout = 5;
27
 
28
  /**
29
  * Default to a 8K chunk size
1740
  $host_uri = $host . $this->apiUrl["path"] . "?" . $this->apiUrl["query"] . "&method=" . urlencode ($method);
1741
  $url = ($this->secure) ? "https://" . $host_uri : "http://" . $host_uri;
1742
  $args["user-agent"] = "MCAPI/" . $this->version;
1743
+ $args["timeout"] = $this->timeout;
1744
  $params["apikey"] = $this->api_key;
1745
  $post_vars = $params;
1746
 
includes/menu-pages/api-ops.inc.php CHANGED
@@ -80,11 +80,11 @@ if (apply_filters ("ws_plugin__s2member_during_api_ops_page_during_left_sections
80
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
81
  echo '<ul>' . "\n";
82
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
83
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . $_SERVER["HTTP_HOST"] . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
84
  echo '</ul>' . "\n";
85
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
86
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
87
- echo '<code>custom="' . $_SERVER["HTTP_HOST"] . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
88
  echo '</td>' . "\n";
89
  /**/
90
  echo '</tr>' . "\n";
@@ -136,11 +136,11 @@ if (apply_filters ("ws_plugin__s2member_during_api_ops_page_during_left_sections
136
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
137
  echo '<ul>' . "\n";
138
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
139
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . $_SERVER["HTTP_HOST"] . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
140
  echo '</ul>' . "\n";
141
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
142
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
143
- echo '<code>custom="' . $_SERVER["HTTP_HOST"] . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
144
  echo '</td>' . "\n";
145
  /**/
146
  echo '</tr>' . "\n";
@@ -196,11 +196,11 @@ if (apply_filters ("ws_plugin__s2member_during_api_ops_page_during_left_sections
196
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
197
  echo '<ul>' . "\n";
198
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
199
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . $_SERVER["HTTP_HOST"] . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
200
  echo '</ul>' . "\n";
201
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
202
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
203
- echo '<code>custom="' . $_SERVER["HTTP_HOST"] . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
204
  echo '</td>' . "\n";
205
  /**/
206
  echo '</tr>' . "\n";
@@ -254,11 +254,11 @@ if (apply_filters ("ws_plugin__s2member_during_api_ops_page_during_left_sections
254
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
255
  echo '<ul>' . "\n";
256
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
257
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode. like this: <code>custom="' . $_SERVER["HTTP_HOST"] . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
258
  echo '</ul>' . "\n";
259
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
260
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
261
- echo '<code>custom="' . $_SERVER["HTTP_HOST"] . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
262
  echo '</td>' . "\n";
263
  /**/
264
  echo '</tr>' . "\n";
@@ -315,11 +315,11 @@ if (apply_filters ("ws_plugin__s2member_during_api_ops_page_during_left_sections
315
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
316
  echo '<ul>' . "\n";
317
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
318
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . $_SERVER["HTTP_HOST"] . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
319
  echo '</ul>' . "\n";
320
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
321
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
322
- echo '<code>custom="' . $_SERVER["HTTP_HOST"] . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
323
  echo '</td>' . "\n";
324
  /**/
325
  echo '</tr>' . "\n";
@@ -376,11 +376,11 @@ if (apply_filters ("ws_plugin__s2member_during_api_ops_page_during_left_sections
376
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
377
  echo '<ul>' . "\n";
378
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
379
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . $_SERVER["HTTP_HOST"] . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
380
  echo '</ul>' . "\n";
381
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
382
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
383
- echo '<code>custom="' . $_SERVER["HTTP_HOST"] . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
384
  echo '</td>' . "\n";
385
  /**/
386
  echo '</tr>' . "\n";
80
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
81
  echo '<ul>' . "\n";
82
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
83
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
84
  echo '</ul>' . "\n";
85
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
86
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
87
+ echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
88
  echo '</td>' . "\n";
89
  /**/
90
  echo '</tr>' . "\n";
136
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
137
  echo '<ul>' . "\n";
138
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
139
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
140
  echo '</ul>' . "\n";
141
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
142
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
143
+ echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
144
  echo '</td>' . "\n";
145
  /**/
146
  echo '</tr>' . "\n";
196
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
197
  echo '<ul>' . "\n";
198
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
199
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
200
  echo '</ul>' . "\n";
201
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
202
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
203
+ echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
204
  echo '</td>' . "\n";
205
  /**/
206
  echo '</tr>' . "\n";
254
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
255
  echo '<ul>' . "\n";
256
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
257
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode. like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
258
  echo '</ul>' . "\n";
259
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
260
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
261
+ echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
262
  echo '</td>' . "\n";
263
  /**/
264
  echo '</tr>' . "\n";
315
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
316
  echo '<ul>' . "\n";
317
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
318
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
319
  echo '</ul>' . "\n";
320
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
321
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
322
+ echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
323
  echo '</td>' . "\n";
324
  /**/
325
  echo '</tr>' . "\n";
376
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
377
  echo '<ul>' . "\n";
378
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
379
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
380
  echo '</ul>' . "\n";
381
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
382
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
383
+ echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
384
  echo '</td>' . "\n";
385
  /**/
386
  echo '</tr>' . "\n";
includes/menu-pages/code-samples/level-file-downloads.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ http://www.example.com/?s2member_file_download=access-s2member-level0/tiger.doc
2
+ http://www.example.com/?s2member_file_download=access-s2member-level1/zebra.pdf
3
+ http://www.example.com/?s2member_file_download=access-s2member-level2/elephant.doc
4
+ http://www.example.com/?s2member_file_download=access-s2member-level3/rhino.pdf
5
+ http://www.example.com/?s2member_file_download=access-s2member-level4/lion.doc
includes/menu-pages/down-ops.inc.php CHANGED
@@ -38,7 +38,7 @@ if (apply_filters ("ws_plugin__s2member_during_down_ops_page_during_left_section
38
  {
39
  do_action ("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_restrictions", get_defined_vars ());
40
  /**/
41
- echo '<div class="ws-menu-page-group" title="Protected File Downloads">' . "\n";
42
  /**/
43
  echo '<div class="ws-menu-page-section ws-plugin--s2member-restrictions-section">' . "\n";
44
  echo '<h3>File Download Restrictions ( required, if providing access to protected files )</h3>' . "\n";
38
  {
39
  do_action ("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_restrictions", get_defined_vars ());
40
  /**/
41
+ echo '<div class="ws-menu-page-group" title="Basic Download Restrictions">' . "\n";
42
  /**/
43
  echo '<div class="ws-menu-page-section ws-plugin--s2member-restrictions-section">' . "\n";
44
  echo '<h3>File Download Restrictions ( required, if providing access to protected files )</h3>' . "\n";
includes/menu-pages/menu-pages-min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(a){a("div.ws-menu-page-group").each(function(c){var b="<ins>+</ins>",d=a(this),e=d.attr("title");var f=a('<div class="ws-menu-page-group-header">'+b+e+"</div>");f.css({"z-index":100-c});f.insertBefore(d),d.hide(),f.click(function(){var g=a("ins",this),h=a(this).next();if(h.css("display")==="none"){a(this).addClass("open"),g.html("-"),h.show()}else{a(this).removeClass("open"),g.html("+"),h.hide()}return false});if(c===0){a('<div class="ws-menu-page-groups-show">+</div>').insertBefore(f).click(function(){a("div.ws-menu-page-group-header").each(function(){var g=a("ins",this),h=a(this).next();a(this).addClass("open"),g.html("-"),h.show();return});return false});a('<div class="ws-menu-page-groups-hide">-</div>').insertBefore(f).click(function(){a("div.ws-menu-page-group-header").each(function(){var g=a("ins",this),h=a(this).next();a(this).removeClass("open"),g.html("+"),h.hide();return});return false})}if(d.attr("default-state")==="open"){f.trigger("click")}return});a("div.ws-menu-page-hr:first").css({"margin-top":"10px","margin-bottom":"20px"});a("div.ws-menu-page-section:first > h3").css({"margin-top":"0"});a("div.ws-menu-page-group > div.ws-menu-page-section:first-child > h3").css({"margin-top":"0"});a("div.ws-menu-page-group-header:first").css({"margin-top":"0","margin-right":"140px"});a("div.ws-menu-page-group:first").css({"margin-right":"145px"});a("div.ws-menu-page-readme > div.readme > div.section:last-child").css({"border-bottom-width":"0"});a("input.ws-menu-page-media-btn").filter(function(){return(a(this).attr("rel"))?true:false}).click(function(){$this=a(this),window.send_to_editor=function(d){var e,c;if((e=a("input#"+$this.attr("rel"))).length>0){var b=e.css("background-color"),f=a.trim(a(d).attr("src"));f=(!f)?a.trim(a("img",d).attr("src")):f;e.val(f),e.css({"background-color":"#FFFFCC"}),setTimeout(function(){e.css({"background-color":b})},2000);tb_remove();return}else{if((c=a("textarea#"+$this.attr("rel"))).length>0){var b=c.css("background-color"),f=a.trim(a(d).attr("src"));f=(!f)?a.trim(a("img",d).attr("src")):f;c.val(a.trim(c.val())+"\n"+f),c.css({"background-color":"#FFFFCC"}),setTimeout(function(){c.css({"background-color":b})},2000);tb_remove();return}}};tb_show("","./media-upload.php?type=image&TB_iframe=true");return false})});
includes/menu-pages/menu-pages-s-min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(b){var a=esc_html=function(c){return String(c).replace(/"/g,"&quot;").replace(/\</g,"&lt;").replace(/\>/g,"&gt;")};if(location.href.match(/page\=ws-plugin--s2member-options/)){ws_plugin__s2member_generateSecurityKey=function(){var f=function(h,g){h=(arguments.length<1)?0:h;g=(arguments.length<2)?2147483647:g;return Math.floor(Math.random()*(g-h+1))+h};var e="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()";for(var d=0,c="";d<56;d++){c+=e.substr(f(0,e.length-1),1)}b("input#ws-plugin--s2member-sec-encryption-key").val(c);return false};ws_plugin__s2member_enableSecurityKey=function(){if(confirm("Edit Key? Are you sure?\nThis could break your installation!\n\n*Note* If you've been testing s2Member, feel free to change this Key before you go live. Just don't go live, and then change it. You'll have some very unhappy Customers. Data corruption WILL occur!\n\nFor your safety, s2Member keeps a history of the last 10 Keys that you've used. If you get yourself into a real situation, s2Member will let you revert back to a previous Key.")){b("input#ws-plugin--s2member-sec-encryption-key").attr("disabled",false)}return false};ws_plugin__s2member_securityKeyHistory=function(){b("div#ws-plugin--s2member-sec-encryption-key-history").toggle();return false}}else{if(location.href.match(/page\=ws-plugin--s2member-paypal-ops/)){b("select#ws-plugin--s2member-auto-eot-system-enabled").change(function(){var d=b(this),e=d.val();var c=b("p#ws-plugin--s2member-auto-eot-system-enabled-via-cron");if(e==2){c.show()}else{c.hide()}})}else{if(location.href.match(/page\=ws-plugin--s2member-els-ops/)){b("select#ws-plugin--s2member-custom-reg-opt-in").change(function(){var e=b(this),f=e.val();var d=b("tr.ws-plugin--s2member-custom-reg-opt-in-label-row");var c=b("img.ws-plugin--s2member-custom-reg-opt-in-label-prev-img");if(f<=0){d.css("display","none"),c.attr("src",c.attr("src").replace(/\/checked\.png$/,"/unchecked.png"))}else{if(f==1){d.css("display",""),c.attr("src",c.attr("src").replace(/\/unchecked\.png$/,"/checked.png"))}else{if(f==2){d.css("display",""),c.attr("src",c.attr("src").replace(/\/checked\.png$/,"/unchecked.png"))}}}})}else{if(location.href.match(/page\=ws-plugin--s2member-paypal-buttons/)){b("select#ws-plugin--s2member-level1-term, select#ws-plugin--s2member-level2-term, select#ws-plugin--s2member-level3-term, select#ws-plugin--s2member-level4-term, select#ws-plugin--s2member-modification-term").change(function(){var d=this.id.replace(/^ws-plugin--s2member-(.+?)-term$/g,"$1");var c=(b(this).val().split("-")[2].replace(/[^0-1BN]/g,"")==="BN")?1:0;b("p#ws-plugin--s2member-"+d+"-trial-line").css("display",(c?"none":""));b("span#ws-plugin--s2member-"+d+"-trial-then").css("display",(c?"none":""));b("span#ws-plugin--s2member-"+d+"-20p-rule").css("display",(c?"none":""));(c)?b("input#ws-plugin--s2member-"+form+"-trial-period").val(0):null});b("input#ws-plugin--s2member-level1-ccaps, input#ws-plugin--s2member-level2-ccaps, input#ws-plugin--s2member-level3-ccaps, input#ws-plugin--s2member-level4-ccaps, input#ws-plugin--s2member-modification-ccaps").keyup(function(){this.value=b.trim(b.trim(this.value).replace(/[ \-]/g,"_").replace(/[^A-Z_0-9,]/gi,"").toLowerCase())});ws_plugin__s2member_paypalButtonGenerate=function(f){var c='[s2Member-PayPal-Button %%attrs%% image="default" /]',q="",t={};t.level0='<?php echo ws_plugin__s2member_esc_sq ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level0_label"]); ?>';t.level1='<?php echo ws_plugin__s2member_esc_sq ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level1_label"]); ?>';t.level2='<?php echo ws_plugin__s2member_esc_sq ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level2_label"]); ?>';t.level3='<?php echo ws_plugin__s2member_esc_sq ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level3_label"]); ?>';t.level4='<?php echo ws_plugin__s2member_esc_sq ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level4_label"]); ?>';var o=b("input#ws-plugin--s2member-"+f+"-shortcode");var g=b("textarea#ws-plugin--s2member-"+f+"-button");var k=b("select#ws-plugin--s2member-modification-level");var h=(f==="modification")?k.val().split(":",2)[1]:f.replace(/^level/,"");var l=t["level"+h].replace(/"/g,"");var d=b("input#ws-plugin--s2member-"+f+"-trial-period").val().replace(/[^0-9]/g,"");var j=b("select#ws-plugin--s2member-"+f+"-trial-term").val().replace(/[^A-Z]/g,"");var m=b("input#ws-plugin--s2member-"+f+"-amount").val().replace(/[^0-9\.]/g,"");var s=b("select#ws-plugin--s2member-"+f+"-term").val().split("-")[0].replace(/[^0-9]/g,"");var u=b("select#ws-plugin--s2member-"+f+"-term").val().split("-")[1].replace(/[^A-Z]/g,"");var r=b("select#ws-plugin--s2member-"+f+"-term").val().split("-")[2].replace(/[^0-1BN]/g,"");var e=b.trim(b("input#ws-plugin--s2member-"+f+"-page-style").val().replace(/"/g,""));var i=b("select#ws-plugin--s2member-"+f+"-currency").val().replace(/[^A-Z]/g,"");var n=b.trim(b.trim(b("input#ws-plugin--s2member-"+f+"-ccaps").val()).replace(/[ \-]/g,"_").replace(/[^A-Z_0-9,]/gi,"").toLowerCase());d=(r==="BN")?"0":d;var p=(r==="BN"&&u!=="L")?h+":"+n+":"+s+" "+u:h+":"+n;p=p.replace(/\:+$/g,"");if(j==="D"&&d>7){alert("Oops, a slight problem:\n\nMaximum Free Days is: 7.\nIf you want to offer more than 7 days free, please choose Weeks or Months from the drop-down.");return false}else{if(j==="W"&&d>52){alert("Oops, a slight problem:\n\nMaximum Free Weeks is: 52.\nIf you want to offer more than 52 weeks free, please choose Months from the drop-down.");return false}else{if(j==="M"&&d>12){alert("Oops, a slight problem:\n\nMaximum Free Months is: 12.\nIf you want to offer more than 12 months free, please choose Years from the drop-down.");return false}else{if(j==="Y"&&d>1){alert("Oops, a slight problem:\n\nMax Trial Period Years is: 1. *This is a PayPal® limitation.");return false}else{if(!m||isNaN(m)||m<0.01){alert("Oops, a slight problem:\n\nAmount must be >= 0.01");return false}else{if(m>10000){alert("Oops, a slight problem:\n\nMaximum amount is: 10000.00");return false}}}}}}g.val(g.val().replace(/ \<\!--(\<input type\="hidden" name\="(amount|src|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)--\>/g," $1"));(parseInt(d)<=0)?g.val(g.val().replace(/ (\<input type\="hidden" name\="(a1|p1|t1)" value\="(.*?)" \/\>)/g," <!--$1-->")):null;(r==="BN")?g.val(g.val().replace(/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g," $1_xclick$3")):null;(r==="BN")?g.val(g.val().replace(/ (\<input type\="hidden" name\="(src|sra|a1|p1|t1|a3|p3|t3)" value\="(.*?)" \/\>)/g," <!--$1-->")):null;(r!=="BN")?g.val(g.val().replace(/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g," $1_xclick-subscriptions$3")):null;(r!=="BN")?g.val(g.val().replace(/ (\<input type\="hidden" name\="amount" value\="(.*?)" \/\>)/g," <!--$1-->")):null;q+='level="'+a(h)+'" ccaps="'+a(n)+'" desc="'+a(l)+'" ps="'+a(e)+'" cc="'+a(i)+'" custom="<?php echo esc_attr ($_SERVER["HTTP_HOST"]); ?>"';q+=' tp="'+a(d)+'" tt="'+a(j)+'" ra="'+a(m)+'" rp="'+a(s)+'" rt="'+a(u)+'" rr="'+a(r)+'"';q+=(f==="modification")?' modify="1"':"";o.val(c.replace(/%%attrs%%/,q));g.val(g.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+a(l)+'"'));g.val(g.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+a(p)+'"'));g.val(g.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+a(e)+'"'));g.val(g.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+a(i)+'"'));g.val(g.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo esc_attr ($_SERVER["HTTP_HOST"]); ?>"'));g.val(g.val().replace(/ name\="modify" value\="(.*?)"/,' name="modify" value="'+((f==="modification")?"1":"0")+'"'));g.val(g.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+a(m)+'"'));g.val(g.val().replace(/ name\="src" value\="(.*?)"/,' name="src" value="'+a(r)+'"'));g.val(g.val().replace(/ name\="p1" value\="(.*?)"/,' name="p1" value="'+a(d)+'"'));g.val(g.val().replace(/ name\="t1" value\="(.*?)"/,' name="t1" value="'+a(j)+'"'));g.val(g.val().replace(/ name\="a3" value\="(.*?)"/,' name="a3" value="'+a(m)+'"'));g.val(g.val().replace(/ name\="p3" value\="(.*?)"/,' name="p3" value="'+a(s)+'"'));g.val(g.val().replace(/ name\="t3" value\="(.*?)"/,' name="t3" value="'+a(u)+'"'));b("div#ws-plugin--s2member-"+f+"-button-prev").html(g.val().replace(/\<form/,'<form target="_blank"').replace(/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0); \?\>/g,""));(f==="modification")?alert("Your Modification Button has been generated.\nPlease copy/paste the Shortcode Format into your Login Welcome Page, or wherever you feel it would be most appropriate."):alert("Your Button has been generated.\nPlease copy/paste the Shortcode Format into your Membership Options Page.");o.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalSpButtonGenerate=function(){var q='[s2Member-PayPal-Button %%attrs%% image="default" /]',p="";var n=b("input#ws-plugin--s2member-sp-shortcode");var e=b("textarea#ws-plugin--s2member-sp-button");var f=b("select#ws-plugin--s2member-sp-leading-id").val().replace(/[^0-9]/g,"");var h=b("select#ws-plugin--s2member-sp-additional-ids").val()||[];var o=b("select#ws-plugin--s2member-sp-hours").val().replace(/[^0-9]/g,"");var k=b("input#ws-plugin--s2member-sp-amount").val().replace(/[^0-9\.]/g,"");var j=b.trim(b("input#ws-plugin--s2member-sp-desc").val().replace(/"/g,""));var m=b.trim(b("input#ws-plugin--s2member-sp-page-style").val().replace(/"/g,""));var d=b("select#ws-plugin--s2member-sp-currency").val().replace(/[^A-Z]/g,"");if(!f){alert("Oops, a slight problem:\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the menu, it's because you've not configured s2Member for Specific Post/Page Access yet. See: s2Member -> General Options -> Specific Post/Page Access Restrictions.");return false}else{if(!k||isNaN(k)||k<0.01){alert("Oops, a slight problem:\n\nAmount must be >= 0.01");return false}else{if(k>10000){alert("Oops, a slight problem:\n\nMaximum amount is: 10000.00");return false}else{if(!j){alert("Oops, a slight problem:\n\nPlease type a Description for this Button.");return false}}}}for(var g=0,c=f;g<h.length;g++){if(h[g]&&h[g]!==f){c+=","+h[g]}}var l="sp:"+c+":"+o;p+='ids="'+a(c)+'" exp="'+a(o)+'" desc="'+a(j)+'" ps="'+a(m)+'" cc="'+a(d)+'"';p+=' custom="<?php echo esc_attr ($_SERVER["HTTP_HOST"]); ?>" ra="'+a(k)+'" sp="1"';n.val(q.replace(/%%attrs%%/,p));e.val(e.val().replace(/ name\="item_name" value\="(.*?)"/,' name="item_name" value="'+a(j)+'"'));e.val(e.val().replace(/ name\="item_number" value\="(.*?)"/,' name="item_number" value="'+a(l)+'"'));e.val(e.val().replace(/ name\="page_style" value\="(.*?)"/,' name="page_style" value="'+a(m)+'"'));e.val(e.val().replace(/ name\="currency_code" value\="(.*?)"/,' name="currency_code" value="'+a(d)+'"'));e.val(e.val().replace(/ name\="custom" value\="(.*?)"/,' name="custom" value="<?php echo esc_attr ($_SERVER["HTTP_HOST"]); ?>"'));e.val(e.val().replace(/ name\="amount" value\="(.*?)"/,' name="amount" value="'+a(k)+'"'));b("div#ws-plugin--s2member-sp-button-prev").html(e.val().replace(/\<form/,'<form target="_blank"'));alert("Your Button has been generated.\nPlease copy/paste the Shortcode Format into your Membership Options Page.");n.each(function(){this.focus(),this.select()});return false};ws_plugin__s2member_paypalSpLinkGenerate=function(){var j=b("select#ws-plugin--s2member-sp-link-leading-id").val().replace(/[^0-9]/g,"");var h=b("select#ws-plugin--s2member-sp-link-additional-ids").val()||[];var c=b("select#ws-plugin--s2member-sp-link-hours").val().replace(/[^0-9]/g,"");var d=b("p#ws-plugin--s2member-sp-link"),g=b("img#ws-plugin--s2member-sp-link-loading");if(!j){alert("Oops, a slight problem:\n\nPlease select a Leading Post/Page.\n\n*Tip* If there are no Posts/Pages in the menu, it's because you've not configured s2Member for Specific Post/Page Access yet. See: s2Member -> General Options -> Specific Post/Page Access Restrictions.");return false}for(var e=0,f=j;e<h.length;e++){if(h[e]&&h[e]!==j){f+=","+h[e]}}d.hide(),g.show(),b.post(ajaxurl,{action:"s2member_sp_access_link",s2member_sp_access_link:'<?php echo ws_plugin__s2member_esc_sq (wp_create_nonce ("ws-plugin--s2member-sp-access-link")); ?>',s2member_sp_access_link_ids:f,s2member_sp_access_link_hours:c},function(i){d.show().html('<a href="'+a(i)+'" target="_blank" rel="external">'+esc_html(i)+"</a>"),g.hide()});return false}}}}}});
includes/menu-pages/menu-pages-s.js CHANGED
@@ -12,6 +12,11 @@ These routines are all specific to this software.
12
  */
13
  jQuery (document).ready (function($)
14
  {
 
 
 
 
 
15
  if (location.href.match (/page\=ws-plugin--s2member-options/))
16
  {
17
  ws_plugin__s2member_generateSecurityKey = function() /* Generates a unique Security Key. */
@@ -113,7 +118,7 @@ jQuery (document).ready (function($)
113
  var modLevel = $ ('select#ws-plugin--s2member-modification-level');
114
  /**/
115
  var level = (button === 'modification') ? modLevel.val ().split (':', 2)[1] : button.replace (/^level/, '');
116
- var label = labels['level' + level].replace (/"/g, "'"); /* Label cannot contain double-quotes. */
117
  var trialPeriod = $ ('input#ws-plugin--s2member-' + button + '-trial-period').val ().replace (/[^0-9]/g, '');
118
  var trialTerm = $ ('select#ws-plugin--s2member-' + button + '-trial-term').val ().replace (/[^A-Z]/g, '');
119
  var regAmount = $ ('input#ws-plugin--s2member-' + button + '-amount').val ().replace (/[^0-9\.]/g, '');
@@ -165,29 +170,27 @@ jQuery (document).ready (function($)
165
  (regRecur !== 'BN') ? code.val (code.val ().replace (/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g, " $1_xclick-subscriptions$3")) : null;
166
  (regRecur !== 'BN') ? code.val (code.val ().replace (/ (\<input type\="hidden" name\="amount" value\="(.*?)" \/\>)/g, " <!--$1-->")) : null;
167
  /**/
168
- shortCodeTemplateAttrs += 'level="' + level + '" ccaps="' + cCaps + '" desc="' + label + '" ps="' + pageStyle + '" cc="' + currencyCode + '" custom="<?php echo $_SERVER["HTTP_HOST"]; ?>"';
169
- shortCodeTemplateAttrs += ' tp="' + trialPeriod + '" tt="' + trialTerm + '" ra="' + regAmount + '" rp="' + regPeriod + '" rt="' + regTerm + '" rr="' + regRecur + '"';
170
- shortCodeTemplateAttrs += (button === 'modification') ? ' modify="1"' : ''; /* For modification buttons. */
171
  shortCode.val (shortCodeTemplate.replace (/%%attrs%%/, shortCodeTemplateAttrs));
172
  /**/
173
- code.val (code.val ().replace (/ name\="item_name" value\="(.*?)"/, ' name="item_name" value="' + label + '"'));
174
- code.val (code.val ().replace (/ name\="item_number" value\="(.*?)"/, ' name="item_number" value="' + levelCcapsPer + '"'));
175
- code.val (code.val ().replace (/ name\="page_style" value\="(.*?)"/, ' name="page_style" value="' + pageStyle + '"'));
176
- code.val (code.val ().replace (/ name\="currency_code" value\="(.*?)"/, ' name="currency_code" value="' + currencyCode + '"'));
177
- code.val (code.val ().replace (/ name\="custom" value\="(.*?)"/, ' name="custom" value="<?php echo $_SERVER["HTTP_HOST"]; ?>"'));
178
- code.val (code.val ().replace (/ name\="modify" value\="(.*?)"/, ' name="modify" value="' + ((button === 'modification') ? '1' : '0') + '"'));
179
- code.val (code.val ().replace (/ name\="amount" value\="(.*?)"/, ' name="amount" value="' + regAmount + '"'));
180
- code.val (code.val ().replace (/ name\="src" value\="(.*?)"/, ' name="src" value="' + regRecur + '"'));
181
- code.val (code.val ().replace (/ name\="p1" value\="(.*?)"/, ' name="p1" value="' + trialPeriod + '"'));
182
- code.val (code.val ().replace (/ name\="t1" value\="(.*?)"/, ' name="t1" value="' + trialTerm + '"'));
183
- code.val (code.val ().replace (/ name\="a3" value\="(.*?)"/, ' name="a3" value="' + regAmount + '"'));
184
- code.val (code.val ().replace (/ name\="p3" value\="(.*?)"/, ' name="p3" value="' + regPeriod + '"'));
185
- code.val (code.val ().replace (/ name\="t3" value\="(.*?)"/, ' name="t3" value="' + regTerm + '"'));
186
  /**/
187
  $ ('div#ws-plugin--s2member-' + button + '-button-prev').html (code.val ().replace (/\<form/, '<form target="_blank"').replace (/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0); \?\>/g, ''));
188
  /**/
189
- <?php do_action ("ws_plugin__s2member_during_menu_pages_js_during_paypal_button_generate", get_defined_vars ()); ?>
190
- /**/
191
  (button === 'modification') ? alert ('Your Modification Button has been generated.\nPlease copy/paste the Shortcode Format into your Login Welcome Page, or wherever you feel it would be most appropriate.') : alert ('Your Button has been generated.\nPlease copy/paste the Shortcode Format into your Membership Options Page.');
192
  /**/
193
  shortCode.each (function() /* Focus and select the recommended Shortcode. */
@@ -240,21 +243,19 @@ jQuery (document).ready (function($)
240
  /**/
241
  var spIdsHours = 'sp:' + ids + ':' + hours; /* Combined sp:ids:expiration hours. */
242
  /**/
243
- shortCodeTemplateAttrs += 'ids="' + ids + '" exp="' + hours + '" desc="' + desc + '" ps="' + pageStyle + '" cc="' + currencyCode + '"';
244
- shortCodeTemplateAttrs += ' custom="<?php echo $_SERVER["HTTP_HOST"]; ?>" ra="' + regAmount + '" sp="1"';
245
  shortCode.val (shortCodeTemplate.replace (/%%attrs%%/, shortCodeTemplateAttrs));
246
  /**/
247
- code.val (code.val ().replace (/ name\="item_name" value\="(.*?)"/, ' name="item_name" value="' + desc + '"'));
248
- code.val (code.val ().replace (/ name\="item_number" value\="(.*?)"/, ' name="item_number" value="' + spIdsHours + '"'));
249
- code.val (code.val ().replace (/ name\="page_style" value\="(.*?)"/, ' name="page_style" value="' + pageStyle + '"'));
250
- code.val (code.val ().replace (/ name\="currency_code" value\="(.*?)"/, ' name="currency_code" value="' + currencyCode + '"'));
251
- code.val (code.val ().replace (/ name\="custom" value\="(.*?)"/, ' name="custom" value="<?php echo $_SERVER["HTTP_HOST"]; ?>"'));
252
- code.val (code.val ().replace (/ name\="amount" value\="(.*?)"/, ' name="amount" value="' + regAmount + '"'));
253
  /**/
254
  $ ('div#ws-plugin--s2member-sp-button-prev').html (code.val ().replace (/\<form/, '<form target="_blank"'));
255
  /**/
256
- <?php do_action ("ws_plugin__s2member_during_menu_pages_js_during_paypal_sp_button_generate", get_defined_vars ()); ?>
257
- /**/
258
  alert ('Your Button has been generated.\nPlease copy/paste the Shortcode Format into your Membership Options Page.');
259
  /**/
260
  shortCode.each (function() /* Focus and select the recommended Shortcode. */
@@ -284,7 +285,7 @@ jQuery (document).ready (function($)
284
  /**/
285
  $link.hide (), $loading.show (), $.post (ajaxurl, {action: 's2member_sp_access_link', s2member_sp_access_link: '<?php echo ws_plugin__s2member_esc_sq (wp_create_nonce ("ws-plugin--s2member-sp-access-link")); ?>', s2member_sp_access_link_ids: ids, s2member_sp_access_link_hours: hours}, function(response)
286
  {
287
- $link.show ().html ('<a href="' + response + '" target="_blank" rel="external">' + response + '</a>'), $loading.hide ();
288
  });
289
  /**/
290
  return false;
12
  */
13
  jQuery (document).ready (function($)
14
  {
15
+ var esc_attr = esc_html = function(str) /* Convert special characters. */
16
+ {
17
+ return String (str).replace (/"/g, '&quot;').replace (/\</g, '&lt;').replace (/\>/g, '&gt;');
18
+ };
19
+ /**/
20
  if (location.href.match (/page\=ws-plugin--s2member-options/))
21
  {
22
  ws_plugin__s2member_generateSecurityKey = function() /* Generates a unique Security Key. */
118
  var modLevel = $ ('select#ws-plugin--s2member-modification-level');
119
  /**/
120
  var level = (button === 'modification') ? modLevel.val ().split (':', 2)[1] : button.replace (/^level/, '');
121
+ var label = labels['level' + level].replace (/"/g, ""); /* Labels may NOT contain any double-quotes. */
122
  var trialPeriod = $ ('input#ws-plugin--s2member-' + button + '-trial-period').val ().replace (/[^0-9]/g, '');
123
  var trialTerm = $ ('select#ws-plugin--s2member-' + button + '-trial-term').val ().replace (/[^A-Z]/g, '');
124
  var regAmount = $ ('input#ws-plugin--s2member-' + button + '-amount').val ().replace (/[^0-9\.]/g, '');
170
  (regRecur !== 'BN') ? code.val (code.val ().replace (/ (\<input type\="hidden" name\="cmd" value\=")(.*?)(" \/\>)/g, " $1_xclick-subscriptions$3")) : null;
171
  (regRecur !== 'BN') ? code.val (code.val ().replace (/ (\<input type\="hidden" name\="amount" value\="(.*?)" \/\>)/g, " <!--$1-->")) : null;
172
  /**/
173
+ shortCodeTemplateAttrs += 'level="' + esc_attr (level) + '" ccaps="' + esc_attr (cCaps) + '" desc="' + esc_attr (label) + '" ps="' + esc_attr (pageStyle) + '" cc="' + esc_attr (currencyCode) + '" custom="<?php echo esc_attr ($_SERVER["HTTP_HOST"]); ?>"';
174
+ shortCodeTemplateAttrs += ' tp="' + esc_attr (trialPeriod) + '" tt="' + esc_attr (trialTerm) + '" ra="' + esc_attr (regAmount) + '" rp="' + esc_attr (regPeriod) + '" rt="' + esc_attr (regTerm) + '" rr="' + esc_attr (regRecur) + '"';
175
+ shortCodeTemplateAttrs += (button === 'modification') ? ' modify="1"' : ''; /* For Modification Buttons. */
176
  shortCode.val (shortCodeTemplate.replace (/%%attrs%%/, shortCodeTemplateAttrs));
177
  /**/
178
+ code.val (code.val ().replace (/ name\="item_name" value\="(.*?)"/, ' name="item_name" value="' + esc_attr (label) + '"'));
179
+ code.val (code.val ().replace (/ name\="item_number" value\="(.*?)"/, ' name="item_number" value="' + esc_attr (levelCcapsPer) + '"'));
180
+ code.val (code.val ().replace (/ name\="page_style" value\="(.*?)"/, ' name="page_style" value="' + esc_attr (pageStyle) + '"'));
181
+ code.val (code.val ().replace (/ name\="currency_code" value\="(.*?)"/, ' name="currency_code" value="' + esc_attr (currencyCode) + '"'));
182
+ code.val (code.val ().replace (/ name\="custom" value\="(.*?)"/, ' name="custom" value="<?php echo esc_attr ($_SERVER["HTTP_HOST"]); ?>"'));
183
+ code.val (code.val ().replace (/ name\="modify" value\="(.*?)"/, ' name="modify" value="' + ( (button === 'modification') ? '1' : '0') + '"'));
184
+ code.val (code.val ().replace (/ name\="amount" value\="(.*?)"/, ' name="amount" value="' + esc_attr (regAmount) + '"'));
185
+ code.val (code.val ().replace (/ name\="src" value\="(.*?)"/, ' name="src" value="' + esc_attr (regRecur) + '"'));
186
+ code.val (code.val ().replace (/ name\="p1" value\="(.*?)"/, ' name="p1" value="' + esc_attr (trialPeriod) + '"'));
187
+ code.val (code.val ().replace (/ name\="t1" value\="(.*?)"/, ' name="t1" value="' + esc_attr (trialTerm) + '"'));
188
+ code.val (code.val ().replace (/ name\="a3" value\="(.*?)"/, ' name="a3" value="' + esc_attr (regAmount) + '"'));
189
+ code.val (code.val ().replace (/ name\="p3" value\="(.*?)"/, ' name="p3" value="' + esc_attr (regPeriod) + '"'));
190
+ code.val (code.val ().replace (/ name\="t3" value\="(.*?)"/, ' name="t3" value="' + esc_attr (regTerm) + '"'));
191
  /**/
192
  $ ('div#ws-plugin--s2member-' + button + '-button-prev').html (code.val ().replace (/\<form/, '<form target="_blank"').replace (/\<\?php echo S2MEMBER_CURRENT_USER_VALUE_FOR_PP_(ON0|OS0); \?\>/g, ''));
193
  /**/
 
 
194
  (button === 'modification') ? alert ('Your Modification Button has been generated.\nPlease copy/paste the Shortcode Format into your Login Welcome Page, or wherever you feel it would be most appropriate.') : alert ('Your Button has been generated.\nPlease copy/paste the Shortcode Format into your Membership Options Page.');
195
  /**/
196
  shortCode.each (function() /* Focus and select the recommended Shortcode. */
243
  /**/
244
  var spIdsHours = 'sp:' + ids + ':' + hours; /* Combined sp:ids:expiration hours. */
245
  /**/
246
+ shortCodeTemplateAttrs += 'ids="' + esc_attr (ids) + '" exp="' + esc_attr (hours) + '" desc="' + esc_attr (desc) + '" ps="' + esc_attr (pageStyle) + '" cc="' + esc_attr (currencyCode) + '"';
247
+ shortCodeTemplateAttrs += ' custom="<?php echo esc_attr ($_SERVER["HTTP_HOST"]); ?>" ra="' + esc_attr (regAmount) + '" sp="1"';
248
  shortCode.val (shortCodeTemplate.replace (/%%attrs%%/, shortCodeTemplateAttrs));
249
  /**/
250
+ code.val (code.val ().replace (/ name\="item_name" value\="(.*?)"/, ' name="item_name" value="' + esc_attr (desc) + '"'));
251
+ code.val (code.val ().replace (/ name\="item_number" value\="(.*?)"/, ' name="item_number" value="' + esc_attr (spIdsHours) + '"'));
252
+ code.val (code.val ().replace (/ name\="page_style" value\="(.*?)"/, ' name="page_style" value="' + esc_attr (pageStyle) + '"'));
253
+ code.val (code.val ().replace (/ name\="currency_code" value\="(.*?)"/, ' name="currency_code" value="' + esc_attr (currencyCode) + '"'));
254
+ code.val (code.val ().replace (/ name\="custom" value\="(.*?)"/, ' name="custom" value="<?php echo esc_attr ($_SERVER["HTTP_HOST"]); ?>"'));
255
+ code.val (code.val ().replace (/ name\="amount" value\="(.*?)"/, ' name="amount" value="' + esc_attr (regAmount) + '"'));
256
  /**/
257
  $ ('div#ws-plugin--s2member-sp-button-prev').html (code.val ().replace (/\<form/, '<form target="_blank"'));
258
  /**/
 
 
259
  alert ('Your Button has been generated.\nPlease copy/paste the Shortcode Format into your Membership Options Page.');
260
  /**/
261
  shortCode.each (function() /* Focus and select the recommended Shortcode. */
285
  /**/
286
  $link.hide (), $loading.show (), $.post (ajaxurl, {action: 's2member_sp_access_link', s2member_sp_access_link: '<?php echo ws_plugin__s2member_esc_sq (wp_create_nonce ("ws-plugin--s2member-sp-access-link")); ?>', s2member_sp_access_link_ids: ids, s2member_sp_access_link_hours: hours}, function(response)
287
  {
288
+ $link.show ().html ('<a href="' + esc_attr (response) + '" target="_blank" rel="external">' + esc_html (response) + '</a>'), $loading.hide ();
289
  });
290
  /**/
291
  return false;
includes/menu-pages/menu-pages.css CHANGED
@@ -17,6 +17,11 @@ div.ws-menu-page
17
  margin-bottom: 20px;
18
  background: url('<?php echo $i; ?>/brand-bg.png') no-repeat top right;
19
  }
 
 
 
 
 
20
  div.ws-menu-page > h2
21
  {
22
  padding-right: 0;
17
  margin-bottom: 20px;
18
  background: url('<?php echo $i; ?>/brand-bg.png') no-repeat top right;
19
  }
20
+ div.ws-menu-page a.ws-dotted-link
21
+ {
22
+ text-decoration: none;
23
+ border-bottom: 1px dotted;
24
+ }
25
  div.ws-menu-page > h2
26
  {
27
  padding-right: 0;
includes/menu-pages/menu-pages.js CHANGED
@@ -10,53 +10,53 @@ If not, see: <http://www.gnu.org/licenses/>.
10
  /*
11
  These routines address common layout styles for menu pages.
12
  */
13
- jQuery(document).ready (function($)
14
  {
15
- $('div.ws-menu-page-group').each (function(index)
16
  {
17
- var ins = '<ins>+</ins>', group = $(this), title = group.attr ('title');
18
  /**/
19
- var header = $('<div class="ws-menu-page-group-header">' + ins + title + '</div>');
20
  /**/
21
  header.css ({'z-index': 100 - index}); /* Stack them sequentially, top to bottom. */
22
  /**/
23
  header.insertBefore (group), group.hide (), header.click (function()
24
  {
25
- var ins = $('ins', this), group = $(this).next ();
26
  /**/
27
  if (group.css ('display') === 'none')
28
  {
29
- $(this).addClass ('open'), ins.html ('-'), group.show ();
30
  }
31
  else
32
  {
33
- $(this).removeClass ('open'), ins.html ('+'), group.hide ();
34
  }
35
  /**/
36
  return false;
37
  });
38
  if (index === 0) /* These are the buttons for showing/hiding all groups. */
39
  {
40
- $('<div class="ws-menu-page-groups-show">+</div>').insertBefore (header).click (function()
41
  {
42
- $('div.ws-menu-page-group-header').each (function()
43
  {
44
- var ins = $('ins', this), group = $(this).next ();
45
  /**/
46
- $(this).addClass ('open'), ins.html ('-'), group.show ();
47
  /**/
48
  return;
49
  });
50
  /**/
51
  return false;
52
  });
53
- $('<div class="ws-menu-page-groups-hide">-</div>').insertBefore (header).click (function()
54
  {
55
- $('div.ws-menu-page-group-header').each (function()
56
  {
57
- var ins = $('ins', this), group = $(this).next ();
58
  /**/
59
- $(this).removeClass ('open'), ins.html ('+'), group.hide ();
60
  /**/
61
  return;
62
  });
@@ -71,32 +71,32 @@ jQuery(document).ready (function($)
71
  return;
72
  });
73
  /**/
74
- $('div.ws-menu-page-hr:first').css ({'margin-top': '10px', 'margin-bottom': '20px'});
75
  /**/
76
- $('div.ws-menu-page-section:first > h3').css ({'margin-top': '0'});
77
  /**/
78
- $('div.ws-menu-page-group > div.ws-menu-page-section:first-child > h3').css ({'margin-top': '0'});
79
- $('div.ws-menu-page-group-header:first').css ({'margin-top': '0', 'margin-right': '140px'});
80
- $('div.ws-menu-page-group:first').css ({'margin-right': '145px'});
81
  /**/
82
- $('div.ws-menu-page-readme > div.readme > div.section:last-child').css ({'border-bottom-width': '0'});
83
  /**/
84
- $('input.ws-menu-page-media-btn').filter (function() /* Only those that have a rel attribute. */
85
  {
86
- return ($(this).attr ('rel')) ? true : false; /* Must have rel targeting an input id. */
87
  })/**/
88
  .click (function() /* Attach click events to media buttons with send_to_editor(). */
89
  {
90
- $this = $(this), window.send_to_editor = function(html)
91
  {
92
  var $inp, $txt; /* Looking for input|textarea. */
93
  /**/
94
- if (($inp = $('input#' + $this.attr ('rel'))).length > 0)
95
  {
96
- var oBg = $inp.css ('background-color'), src = $.trim ($(html).attr ('src'));
97
- src = (!src) ? $.trim ($('img', html).attr ('src')) : src;
98
  /**/
99
- $inp.val (src), $inp.css ({'background-color': '#FFFFCC'}), setTimeout(function()
100
  {
101
  $inp.css ({'background-color': oBg});
102
  }, 2000);
@@ -105,12 +105,12 @@ jQuery(document).ready (function($)
105
  /**/
106
  return;
107
  }
108
- else if (($txt = $('textarea#' + $this.attr ('rel'))).length > 0)
109
  {
110
- var oBg = $txt.css ('background-color'), src = $.trim ($(html).attr ('src'));
111
- src = (!src) ? $.trim ($('img', html).attr ('src')) : src;
112
  /**/
113
- $txt.val ($.trim ($txt.val ()) + '\n' + src), $txt.css ({'background-color': '#FFFFCC'}), setTimeout(function()
114
  {
115
  $txt.css ({'background-color': oBg});
116
  }, 2000);
@@ -121,7 +121,7 @@ jQuery(document).ready (function($)
121
  }
122
  };
123
  /**/
124
- tb_show('', './media-upload.php?type=image&TB_iframe=true');
125
  /**/
126
  return false;
127
  });
10
  /*
11
  These routines address common layout styles for menu pages.
12
  */
13
+ jQuery (document).ready (function($)
14
  {
15
+ $ ('div.ws-menu-page-group').each (function(index)
16
  {
17
+ var ins = '<ins>+</ins>', group = $ (this), title = group.attr ('title');
18
  /**/
19
+ var header = $ ('<div class="ws-menu-page-group-header">' + ins + title + '</div>');
20
  /**/
21
  header.css ({'z-index': 100 - index}); /* Stack them sequentially, top to bottom. */
22
  /**/
23
  header.insertBefore (group), group.hide (), header.click (function()
24
  {
25
+ var ins = $ ('ins', this), group = $ (this).next ();
26
  /**/
27
  if (group.css ('display') === 'none')
28
  {
29
+ $ (this).addClass ('open'), ins.html ('-'), group.show ();
30
  }
31
  else
32
  {
33
+ $ (this).removeClass ('open'), ins.html ('+'), group.hide ();
34
  }
35
  /**/
36
  return false;
37
  });
38
  if (index === 0) /* These are the buttons for showing/hiding all groups. */
39
  {
40
+ $ ('<div class="ws-menu-page-groups-show">+</div>').insertBefore (header).click (function()
41
  {
42
+ $ ('div.ws-menu-page-group-header').each (function()
43
  {
44
+ var ins = $ ('ins', this), group = $ (this).next ();
45
  /**/
46
+ $ (this).addClass ('open'), ins.html ('-'), group.show ();
47
  /**/
48
  return;
49
  });
50
  /**/
51
  return false;
52
  });
53
+ $ ('<div class="ws-menu-page-groups-hide">-</div>').insertBefore (header).click (function()
54
  {
55
+ $ ('div.ws-menu-page-group-header').each (function()
56
  {
57
+ var ins = $ ('ins', this), group = $ (this).next ();
58
  /**/
59
+ $ (this).removeClass ('open'), ins.html ('+'), group.hide ();
60
  /**/
61
  return;
62
  });
71
  return;
72
  });
73
  /**/
74
+ $ ('div.ws-menu-page-hr:first').css ({'margin-top': '10px', 'margin-bottom': '20px'});
75
  /**/
76
+ $ ('div.ws-menu-page-section:first > h3').css ({'margin-top': '0'});
77
  /**/
78
+ $ ('div.ws-menu-page-group > div.ws-menu-page-section:first-child > h3').css ({'margin-top': '0'});
79
+ $ ('div.ws-menu-page-group-header:first').css ({'margin-top': '0', 'margin-right': '140px'});
80
+ $ ('div.ws-menu-page-group:first').css ({'margin-right': '145px'});
81
  /**/
82
+ $ ('div.ws-menu-page-readme > div.readme > div.section:last-child').css ({'border-bottom-width': '0'});
83
  /**/
84
+ $ ('input.ws-menu-page-media-btn').filter (function() /* Only those that have a rel attribute. */
85
  {
86
+ return ($ (this).attr ('rel')) ? true : false; /* Must have rel targeting an input id. */
87
  })/**/
88
  .click (function() /* Attach click events to media buttons with send_to_editor(). */
89
  {
90
+ $this = $ (this), window.send_to_editor = function(html)
91
  {
92
  var $inp, $txt; /* Looking for input|textarea. */
93
  /**/
94
+ if (($inp = $ ('input#' + $this.attr ('rel'))).length > 0)
95
  {
96
+ var oBg = $inp.css ('background-color'), src = $.trim ($ (html).attr ('src'));
97
+ src = (!src) ? $.trim ($ ('img', html).attr ('src')) : src;
98
  /**/
99
+ $inp.val (src), $inp.css ({'background-color': '#FFFFCC'}), setTimeout (function()
100
  {
101
  $inp.css ({'background-color': oBg});
102
  }, 2000);
105
  /**/
106
  return;
107
  }
108
+ else if (($txt = $ ('textarea#' + $this.attr ('rel'))).length > 0)
109
  {
110
+ var oBg = $txt.css ('background-color'), src = $.trim ($ (html).attr ('src'));
111
+ src = (!src) ? $.trim ($ ('img', html).attr ('src')) : src;
112
  /**/
113
+ $txt.val ($.trim ($txt.val ()) + '\n' + src), $txt.css ({'background-color': '#FFFFCC'}), setTimeout (function()
114
  {
115
  $txt.css ({'background-color': oBg});
116
  }, 2000);
121
  }
122
  };
123
  /**/
124
+ tb_show ('', './media-upload.php?type=image&TB_iframe=true');
125
  /**/
126
  return false;
127
  });
includes/menu-pages/paypal-buttons.inc.php CHANGED
@@ -12,7 +12,7 @@ If not, see: <http://www.gnu.org/licenses/>.
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
- exit ("Do not access this file directly.");
16
  /*
17
  PayPal® Button Generating page.
18
  */
@@ -70,21 +70,21 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_buttons_page_during_left_s
70
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_level1_buttons_before_shortcode", get_defined_vars ());
71
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
72
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.html"));
73
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
74
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", "1", $ws_plugin__s2member_temp_s);
75
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level1_label"]), $ws_plugin__s2member_temp_s);
76
  echo '<input id="ws-plugin--s2member-level1-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
77
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
78
  echo '<textarea id="ws-plugin--s2member-level1-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
79
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.html"));
80
- $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com"), $ws_plugin__s2member_temp_s);
81
- $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]), $ws_plugin__s2member_temp_s);
82
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level1_label"]), $ws_plugin__s2member_temp_s);
83
- $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url")), $ws_plugin__s2member_temp_s);
84
- $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_notify=1"), $ws_plugin__s2member_temp_s);
85
- $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_return=1"), $ws_plugin__s2member_temp_s);
86
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
87
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", "1", $ws_plugin__s2member_temp_s);
88
  echo format_to_edit ($ws_plugin__s2member_temp_s);
89
  echo '</textarea><br />' . "\n";
90
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
@@ -141,21 +141,21 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_buttons_page_during_left_s
141
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_level2_buttons_before_shortcode", get_defined_vars ());
142
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
143
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.html"));
144
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
145
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", "2", $ws_plugin__s2member_temp_s);
146
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level2_label"]), $ws_plugin__s2member_temp_s);
147
  echo '<input id="ws-plugin--s2member-level2-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
148
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
149
  echo '<textarea id="ws-plugin--s2member-level2-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
150
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.html"));
151
- $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com"), $ws_plugin__s2member_temp_s);
152
- $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]), $ws_plugin__s2member_temp_s);
153
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level2_label"]), $ws_plugin__s2member_temp_s);
154
- $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url")), $ws_plugin__s2member_temp_s);
155
- $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_notify=1"), $ws_plugin__s2member_temp_s);
156
- $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_return=1"), $ws_plugin__s2member_temp_s);
157
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
158
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", "2", $ws_plugin__s2member_temp_s);
159
  echo format_to_edit ($ws_plugin__s2member_temp_s);
160
  echo '</textarea><br />' . "\n";
161
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
@@ -212,21 +212,21 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_buttons_page_during_left_s
212
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_level3_buttons_before_shortcode", get_defined_vars ());
213
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
214
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.html"));
215
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
216
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", "3", $ws_plugin__s2member_temp_s);
217
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level3_label"]), $ws_plugin__s2member_temp_s);
218
  echo '<input id="ws-plugin--s2member-level3-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
219
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
220
  echo '<textarea id="ws-plugin--s2member-level3-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
221
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.html"));
222
- $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com"), $ws_plugin__s2member_temp_s);
223
- $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]), $ws_plugin__s2member_temp_s);
224
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level3_label"]), $ws_plugin__s2member_temp_s);
225
- $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url")), $ws_plugin__s2member_temp_s);
226
- $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_notify=1"), $ws_plugin__s2member_temp_s);
227
- $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_return=1"), $ws_plugin__s2member_temp_s);
228
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
229
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", "3", $ws_plugin__s2member_temp_s);
230
  echo format_to_edit ($ws_plugin__s2member_temp_s);
231
  echo '</textarea><br />' . "\n";
232
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
@@ -283,21 +283,21 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_buttons_page_during_left_s
283
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_level4_buttons_before_shortcode", get_defined_vars ());
284
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
285
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.html"));
286
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
287
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", "4", $ws_plugin__s2member_temp_s);
288
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level4_label"]), $ws_plugin__s2member_temp_s);
289
  echo '<input id="ws-plugin--s2member-level4-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
290
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
291
  echo '<textarea id="ws-plugin--s2member-level4-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
292
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.html"));
293
- $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com"), $ws_plugin__s2member_temp_s);
294
- $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]), $ws_plugin__s2member_temp_s);
295
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level4_label"]), $ws_plugin__s2member_temp_s);
296
- $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url")), $ws_plugin__s2member_temp_s);
297
- $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_notify=1"), $ws_plugin__s2member_temp_s);
298
- $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_return=1"), $ws_plugin__s2member_temp_s);
299
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
300
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", "4", $ws_plugin__s2member_temp_s);
301
  echo format_to_edit ($ws_plugin__s2member_temp_s);
302
  echo '</textarea><br />' . "\n";
303
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
@@ -359,22 +359,22 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_buttons_page_during_left_s
359
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
360
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.html"));
361
  $ws_plugin__s2member_temp_s = preg_replace ("/\/]$/", 'modify="1" /]', $ws_plugin__s2member_temp_s);
362
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
363
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", "2", $ws_plugin__s2member_temp_s);
364
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level2_label"]), $ws_plugin__s2member_temp_s);
365
  echo '<input id="ws-plugin--s2member-modification-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
366
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
367
  echo '<textarea id="ws-plugin--s2member-modification-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
368
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.html"));
369
  $ws_plugin__s2member_temp_s = preg_replace ('/name\="modify" value\="(.*?)"/', 'name="modify" value="1"', $ws_plugin__s2member_temp_s);
370
- $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com"), $ws_plugin__s2member_temp_s);
371
- $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]), $ws_plugin__s2member_temp_s);
372
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level2_label"]), $ws_plugin__s2member_temp_s);
373
- $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url")), $ws_plugin__s2member_temp_s);
374
- $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_notify=1"), $ws_plugin__s2member_temp_s);
375
- $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_return=1"), $ws_plugin__s2member_temp_s);
376
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
377
- $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", "2", $ws_plugin__s2member_temp_s);
378
  echo format_to_edit ($ws_plugin__s2member_temp_s);
379
  echo '</textarea><br />' . "\n";
380
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
@@ -412,8 +412,8 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_buttons_page_during_left_s
412
  echo 'Button Code<br />For Cancellations:<br /><br />' . "\n";
413
  echo '<div id="ws-plugin--s2member-cancellation-button-prev">' . "\n";
414
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-cancellation-button.html"));
415
- $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com"), $ws_plugin__s2member_temp_s);
416
- $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]), $ws_plugin__s2member_temp_s);
417
  echo preg_replace ("/\<a/", '<a target="_blank"', $ws_plugin__s2member_temp_s);
418
  echo '</div>' . "\n";
419
  echo '</label>' . "\n";
@@ -437,8 +437,8 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_buttons_page_during_left_s
437
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
438
  echo '<textarea id="ws-plugin--s2member-cancellation-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
439
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-cancellation-button.html"));
440
- $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com"), $ws_plugin__s2member_temp_s);
441
- $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]), $ws_plugin__s2member_temp_s);
442
  echo format_to_edit ($ws_plugin__s2member_temp_s);
443
  echo '</textarea><br />' . "\n";
444
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
@@ -528,17 +528,17 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_buttons_page_during_left_s
528
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_sp_buttons_before_shortcode", get_defined_vars ());
529
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
530
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-sp-checkout-button-shortcode.html"));
531
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
532
  echo '<input id="ws-plugin--s2member-sp-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
533
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
534
  echo '<textarea id="ws-plugin--s2member-sp-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
535
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-sp-checkout-button.html"));
536
- $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com"), $ws_plugin__s2member_temp_s);
537
- $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]), $ws_plugin__s2member_temp_s);
538
- $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url")), $ws_plugin__s2member_temp_s);
539
- $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_notify=1"), $ws_plugin__s2member_temp_s);
540
- $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (get_bloginfo ("url") . "/?s2member_paypal_return=1"), $ws_plugin__s2member_temp_s);
541
- $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (strtolower ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
542
  echo format_to_edit ($ws_plugin__s2member_temp_s);
543
  echo '</textarea><br />' . "\n";
544
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
+ exit("Do not access this file directly.");
16
  /*
17
  PayPal® Button Generating page.
18
  */
70
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_level1_buttons_before_shortcode", get_defined_vars ());
71
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
72
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.html"));
73
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
74
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ("1")), $ws_plugin__s2member_temp_s);
75
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level1_label"])), $ws_plugin__s2member_temp_s);
76
  echo '<input id="ws-plugin--s2member-level1-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
77
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
78
  echo '<textarea id="ws-plugin--s2member-level1-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
79
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.html"));
80
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", ws_plugin__s2member_esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
81
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
82
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level1_label"])), $ws_plugin__s2member_temp_s);
83
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url"))), $ws_plugin__s2member_temp_s);
84
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_notify=1")), $ws_plugin__s2member_temp_s);
85
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_return=1")), $ws_plugin__s2member_temp_s);
86
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
87
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ("1")), $ws_plugin__s2member_temp_s);
88
  echo format_to_edit ($ws_plugin__s2member_temp_s);
89
  echo '</textarea><br />' . "\n";
90
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
141
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_level2_buttons_before_shortcode", get_defined_vars ());
142
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
143
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.html"));
144
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
145
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ("2")), $ws_plugin__s2member_temp_s);
146
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level2_label"])), $ws_plugin__s2member_temp_s);
147
  echo '<input id="ws-plugin--s2member-level2-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
148
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
149
  echo '<textarea id="ws-plugin--s2member-level2-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
150
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.html"));
151
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", ws_plugin__s2member_esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
152
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
153
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level2_label"])), $ws_plugin__s2member_temp_s);
154
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url"))), $ws_plugin__s2member_temp_s);
155
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_notify=1")), $ws_plugin__s2member_temp_s);
156
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_return=1")), $ws_plugin__s2member_temp_s);
157
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
158
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ("2")), $ws_plugin__s2member_temp_s);
159
  echo format_to_edit ($ws_plugin__s2member_temp_s);
160
  echo '</textarea><br />' . "\n";
161
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
212
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_level3_buttons_before_shortcode", get_defined_vars ());
213
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
214
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.html"));
215
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
216
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ("3")), $ws_plugin__s2member_temp_s);
217
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level3_label"])), $ws_plugin__s2member_temp_s);
218
  echo '<input id="ws-plugin--s2member-level3-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
219
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
220
  echo '<textarea id="ws-plugin--s2member-level3-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
221
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.html"));
222
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", ws_plugin__s2member_esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
223
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
224
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level3_label"])), $ws_plugin__s2member_temp_s);
225
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url"))), $ws_plugin__s2member_temp_s);
226
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_notify=1")), $ws_plugin__s2member_temp_s);
227
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_return=1")), $ws_plugin__s2member_temp_s);
228
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
229
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ("3")), $ws_plugin__s2member_temp_s);
230
  echo format_to_edit ($ws_plugin__s2member_temp_s);
231
  echo '</textarea><br />' . "\n";
232
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
283
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_level4_buttons_before_shortcode", get_defined_vars ());
284
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
285
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.html"));
286
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
287
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ("4")), $ws_plugin__s2member_temp_s);
288
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level4_label"])), $ws_plugin__s2member_temp_s);
289
  echo '<input id="ws-plugin--s2member-level4-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
290
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
291
  echo '<textarea id="ws-plugin--s2member-level4-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
292
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.html"));
293
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", ws_plugin__s2member_esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
294
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
295
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level4_label"])), $ws_plugin__s2member_temp_s);
296
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url"))), $ws_plugin__s2member_temp_s);
297
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_notify=1")), $ws_plugin__s2member_temp_s);
298
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_return=1")), $ws_plugin__s2member_temp_s);
299
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
300
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ("4")), $ws_plugin__s2member_temp_s);
301
  echo format_to_edit ($ws_plugin__s2member_temp_s);
302
  echo '</textarea><br />' . "\n";
303
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
359
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
360
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-checkout-button-shortcode.html"));
361
  $ws_plugin__s2member_temp_s = preg_replace ("/\/]$/", 'modify="1" /]', $ws_plugin__s2member_temp_s);
362
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
363
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ("2")), $ws_plugin__s2member_temp_s);
364
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level2_label"])), $ws_plugin__s2member_temp_s);
365
  echo '<input id="ws-plugin--s2member-modification-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
366
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
367
  echo '<textarea id="ws-plugin--s2member-modification-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
368
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-checkout-button.html"));
369
  $ws_plugin__s2member_temp_s = preg_replace ('/name\="modify" value\="(.*?)"/', 'name="modify" value="1"', $ws_plugin__s2member_temp_s);
370
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", ws_plugin__s2member_esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
371
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
372
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level_label%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level2_label"])), $ws_plugin__s2member_temp_s);
373
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url"))), $ws_plugin__s2member_temp_s);
374
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_notify=1")), $ws_plugin__s2member_temp_s);
375
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_return=1")), $ws_plugin__s2member_temp_s);
376
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
377
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%level%%/", ws_plugin__s2member_esc_ds (esc_attr ("2")), $ws_plugin__s2member_temp_s);
378
  echo format_to_edit ($ws_plugin__s2member_temp_s);
379
  echo '</textarea><br />' . "\n";
380
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
412
  echo 'Button Code<br />For Cancellations:<br /><br />' . "\n";
413
  echo '<div id="ws-plugin--s2member-cancellation-button-prev">' . "\n";
414
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-cancellation-button.html"));
415
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", ws_plugin__s2member_esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
416
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
417
  echo preg_replace ("/\<a/", '<a target="_blank"', $ws_plugin__s2member_temp_s);
418
  echo '</div>' . "\n";
419
  echo '</label>' . "\n";
437
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
438
  echo '<textarea id="ws-plugin--s2member-cancellation-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
439
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-cancellation-button.html"));
440
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", ws_plugin__s2member_esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
441
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
442
  echo format_to_edit ($ws_plugin__s2member_temp_s);
443
  echo '</textarea><br />' . "\n";
444
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
528
  do_action ("ws_plugin__s2member_during_paypal_buttons_page_during_left_sections_during_sp_buttons_before_shortcode", get_defined_vars ());
529
  echo '<strong>WordPress® Shortcode:</strong> ( recommended for both the WordPress® Visual &amp; HTML Editors )<br />' . "\n";
530
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/shortcodes/paypal-sp-checkout-button-shortcode.html"));
531
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
532
  echo '<input id="ws-plugin--s2member-sp-shortcode" type="text" value="' . format_to_edit ($ws_plugin__s2member_temp_s) . '" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;" /><br /><br />' . "\n";
533
  echo '<strong>Resulting PayPal® Button Code:</strong> ( ultimately, your Shortcode will produce this snippet )<br />' . "\n";
534
  echo '<textarea id="ws-plugin--s2member-sp-button" rows="8" wrap="off" onclick="this.select ();" style="font-family:Consolas, monospace; width:99%;">';
535
  $ws_plugin__s2member_temp_s = trim (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-sp-checkout-button.html"));
536
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%endpoint%%/", ws_plugin__s2member_esc_ds (esc_attr (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? "www.sandbox.paypal.com" : "www.paypal.com")), $ws_plugin__s2member_temp_s);
537
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%paypal_business%%/", ws_plugin__s2member_esc_ds (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $ws_plugin__s2member_temp_s);
538
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%cancel_return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url"))), $ws_plugin__s2member_temp_s);
539
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%notify_url%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_notify=1")), $ws_plugin__s2member_temp_s);
540
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%return%%/", ws_plugin__s2member_esc_ds (esc_attr (get_bloginfo ("url") . "/?s2member_paypal_return=1")), $ws_plugin__s2member_temp_s);
541
+ $ws_plugin__s2member_temp_s = preg_replace ("/%%domain%%/", ws_plugin__s2member_esc_ds (esc_attr ($_SERVER["HTTP_HOST"])), $ws_plugin__s2member_temp_s);
542
  echo format_to_edit ($ws_plugin__s2member_temp_s);
543
  echo '</textarea><br />' . "\n";
544
  echo '&uarr; Use this more advanced Code if you\'re building a theme or plugin that integrates with s2Member.' . "\n";
includes/menu-pages/paypal-ops.inc.php CHANGED
@@ -12,7 +12,7 @@ If not, see: <http://www.gnu.org/licenses/>.
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
- exit("Do not access this file directly.");
16
  /*
17
  PayPal® Options page.
18
  */
@@ -42,15 +42,15 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_secti
42
  /**/
43
  echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-email-section">' . "\n";
44
  echo '<a href="https://www.paypal.com/us/mrb/pal=K8S5Y97AKWYY8" target="_blank"><img src="' . $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . '/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>' . "\n";
45
- echo '<h3>PayPal® EMail Address ( required, please customize this )</h3>' . "\n";
46
  echo '<p>This plugin works in conjunction with <a href="https://www.paypal.com/us/mrb/pal=K8S5Y97AKWYY8" target="_blank" rel="external">PayPal® Website Payments Standard</a>, for businesses. You do NOT need a PayPal® Pro account. You just need to upgrade your Personal PayPal® account to a Business status, which is free. A PayPal® account can be <a href="http://pages.ebay.com/help/buy/questions/upgrade-paypal-account.html" target="_blank" rel="external">upgraded</a> from a Personal account to a Business account, simply by going to the `Profile` button under the `My Account` tab, selecting the `Personal Business Information` button, and then clicking the `Upgrade Your Account` button.</p>' . "\n";
47
  do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details", get_defined_vars ());
48
  /**/
49
- echo '<table class="form-table">' . "\n";
50
  echo '<tbody>' . "\n";
51
  echo '<tr>' . "\n";
52
  /**/
53
- echo '<th>' . "\n";
54
  echo '<label for="ws-plugin--s2member-paypal-business">' . "\n";
55
  echo 'Your PayPal® EMail Address:' . "\n";
56
  echo '</label>' . "\n";
@@ -69,8 +69,16 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_secti
69
  do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details_after_business", get_defined_vars ());
70
  /**/
71
  echo '<tr>' . "\n";
 
 
72
  /**/
73
- echo '<th>' . "\n";
 
 
 
 
 
 
74
  echo '<label for="ws-plugin--s2member-paypal-sandbox">' . "\n";
75
  echo 'Sandbox Testing?' . "\n";
76
  echo '</label>' . "\n";
@@ -105,6 +113,8 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_secti
105
  echo '</tbody>' . "\n";
106
  echo '</table>' . "\n";
107
  /**/
 
 
108
  echo '<p><em><strong>*Sandbox Tip*</strong> If you\'re testing your site through a PayPal® Sandbox account, please remember that Email Confirmations from s2Member will NOT be received after a test purchase. s2Member sends its Confirmation Emails to the PayPal® Email Address of the Customer. Since PayPal® Sandbox addresses are usually bogus ( for testing ), you will have to run live transactions before Email Confirmations from s2Member are received. That being said, all other s2Member functionality CAN be tested through a PayPal® Sandbox account. Email Confirmations are the only hang-up.</em></p>' . "\n";
109
  do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details_after_sandbox_tip", get_defined_vars ());
110
  echo '</div>' . "\n";
@@ -125,18 +135,24 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_secti
125
  echo '<p>Log into your PayPal® account and navigate to this section:<br /><code>Account Profile -> Instant Payment Notification Preferences</code></p>' . "\n";
126
  echo '<p>Edit your IPN settings &amp; turn IPN Notifications: <strong><code>On</code></strong></p>' . "\n";
127
  echo '<p>You\'ll need your IPN URL, which is:<br /><code>' . get_bloginfo ("url") . '/?s2member_paypal_notify=1</code></p>' . "\n";
 
 
 
 
128
  echo '<p><em><strong>*Quick Tip*</strong> In addition to the default IPN Settings inside your PayPal® account, the IPN URL is also set on a per-transaction basis by the special PayPal® Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal® account, that\'s OK. s2Member dynamically sets the IPN URL for each transaction. The result is that the IPN URL configured from within your PayPal® account, becomes the default, which is then overwritten on a per-transaction basis. In fact, PayPal® recently updated their system to support IPN URL preservation. One PayPal® account can handle multiple sites, all using different IPN URLs.</em></p>' . "\n";
129
  do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_quick_tip", get_defined_vars ());
130
- echo '<p><em><strong>*More Information*</strong> You\'ll be happy to know that s2Member handles cancellations, expirations, failed payments, terminations ( e.g. refunds &amp; chargebacks ) for you automatically. If you log into your PayPal® account and cancel a Member\'s Subscription, or, if the Member logs into their PayPal® account and cancels their own Subscription, s2Member will be notified of these important changes and react accordingly through the PayPal® IPN service that runs silently behind-the-scene. The PayPal® IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds &amp; chargeback reversals are supported through the IPN service. If you issue a refund to an unhappy Customer through PayPal®, s2Member will be notified, and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically ( based on your configuration ). The communication from PayPal® -> s2Member is seamless.</em></p>' . "\n";
131
- echo '<p><em><strong>*2010 PayPal® Accounts*</strong> s2Member has been updated to support newer PayPal® accounts ( those opened after Oct 15th, 2009 ). Newer PayPal® accounts do NOT send a <strong>IPN</strong>/<code>subscr_eot</code> in all cases. s2Member deals with this gracefully, by keeping a record of payments/periods/changes, and monitoring other signals sent by PayPal® over an extended period. This allows s2Member to take control of the situation at the appropriate time. The communication from PayPal® -> s2Member is seamless; even in PayPal® accounts created after October 15th, 2009. You can learn more about <code>subscr_eot</code> changes <a href="https://www.x.com/search.jspa?q=subscr+eot" target="_blank" rel="external">here</a>.</em></p>' . "\n";
132
  /**/
133
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
134
  /**/
135
- echo '<h3>IPN w/ Proxy Key ( optional, for 3rd-party integrations )</h3>' . "\n";
 
136
  echo '<p>If you\'re using a 3rd-party application that needs to POST simulated IPN transactions to your s2Member installation, you can use this alternate IPN URL, which includes a Proxy Key. This encrypted Proxy Key verifies incoming data being received by s2Member\'s IPN processor. You can change <em>[proxy-reference]</em> to whatever you like. The <em>[proxy-reference]</em> value is required, but it will only be reflected in s2Member\'s IPN log.</p>' . "\n";
137
- echo '<input type="text" value="' . format_to_edit (get_bloginfo ("url") . "/?s2member_paypal_notify=1&s2member_paypal_proxy=[proxy-reference]&s2member_paypal_proxy_verification=" . urlencode (md5 (ws_plugin__s2member_xencrypt ($_SERVER["HTTP_HOST"])))) . '" style="width:99%;" />' . "\n";
138
- echo '<p><em>Any 3rd-party application that is sending IPN transactions to your s2Member installation, must ALWAYS include the <code>custom</code> POST variable, and that variable must always start with ( <code>' . esc_html ($_SERVER["HTTP_HOST"]) . '</code> ). In addition, the <code>item_number</code> variable, must always match a format that s2Member looks for. Generally speaking, the <code>item_number</code> should = <code>1, 2, 3, or 4</code>. However, s2Member also uses some advanced formats in this field. Just to be sure, we suggest creating a PayPal® Button with the s2Member Button Generator, and then taking a look at the Full Button Code to see how s2Member expects <code>item_number</code> to be formatted.</em></p>' . "\n";
139
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn", get_defined_vars ());
 
140
  echo '</div>' . "\n";
141
  /**/
142
  echo '</div>' . "\n";
@@ -156,8 +172,6 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_secti
156
  echo '<p>Turn the Auto-Return feature: <strong><code>On</code></strong></p>' . "\n";
157
  echo '<p>You\'ll need your Auto-Return URL, which is:<br /><code>' . get_bloginfo ("url") . '/?s2member_paypal_return=1</code></p>' . "\n";
158
  echo '<p>You MUST also enable PDT ( Payment Data Transfer ): <strong><code>On</code></strong><br /><em>You\'ll be issued an Identity Token that you MUST enter below.</em></p>' . "\n";
159
- echo '<p><em><strong>*Quick Tip*</strong> In addition to your default PayPal® account configuration, the Auto-Return URL is also set on a per-transaction basis from within the special PayPal® Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal® account, that\'s OK. s2Member dynamically sets the Auto-Return URL for each transaction. The result is that the Auto-Return URL configured from within your PayPal® account, becomes the default, which is then overwritten on a per-transaction basis.</em></p>' . "\n";
160
- do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt_after_quick_tip", get_defined_vars ());
161
  do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt", get_defined_vars ());
162
  /**/
163
  echo '<table class="form-table">' . "\n";
@@ -181,6 +195,14 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_secti
181
  echo '</tr>' . "\n";
182
  echo '</tbody>' . "\n";
183
  echo '</table>' . "\n";
 
 
 
 
 
 
 
 
184
  echo '</div>' . "\n";
185
  /**/
186
  echo '</div>' . "\n";
@@ -272,11 +294,11 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_secti
272
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
273
  echo '<ul>' . "\n";
274
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
275
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . $_SERVER["HTTP_HOST"] . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
276
  echo '</ul>' . "\n";
277
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
278
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
279
- echo '<code>custom="' . $_SERVER["HTTP_HOST"] . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
280
  echo '</td>' . "\n";
281
  /**/
282
  echo '</tr>' . "\n";
@@ -367,11 +389,11 @@ if (apply_filters ("ws_plugin__s2member_during_paypal_ops_page_during_left_secti
367
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
368
  echo '<ul>' . "\n";
369
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
370
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . $_SERVER["HTTP_HOST"] . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
371
  echo '</ul>' . "\n";
372
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
373
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
374
- echo '<code>custom="' . $_SERVER["HTTP_HOST"] . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
375
  echo '</td>' . "\n";
376
  /**/
377
  echo '</tr>' . "\n";
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
+ exit ("Do not access this file directly.");
16
  /*
17
  PayPal® Options page.
18
  */
42
  /**/
43
  echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-email-section">' . "\n";
44
  echo '<a href="https://www.paypal.com/us/mrb/pal=K8S5Y97AKWYY8" target="_blank"><img src="' . $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . '/images/paypal-logo.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>' . "\n";
45
+ echo '<h3>PayPal® Account Details ( required, please customize these )</h3>' . "\n";
46
  echo '<p>This plugin works in conjunction with <a href="https://www.paypal.com/us/mrb/pal=K8S5Y97AKWYY8" target="_blank" rel="external">PayPal® Website Payments Standard</a>, for businesses. You do NOT need a PayPal® Pro account. You just need to upgrade your Personal PayPal® account to a Business status, which is free. A PayPal® account can be <a href="http://pages.ebay.com/help/buy/questions/upgrade-paypal-account.html" target="_blank" rel="external">upgraded</a> from a Personal account to a Business account, simply by going to the `Profile` button under the `My Account` tab, selecting the `Personal Business Information` button, and then clicking the `Upgrade Your Account` button.</p>' . "\n";
47
  do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details", get_defined_vars ());
48
  /**/
49
+ echo '<table class="form-table" style="margin:0;">' . "\n";
50
  echo '<tbody>' . "\n";
51
  echo '<tr>' . "\n";
52
  /**/
53
+ echo '<th style="padding-top:0;">' . "\n";
54
  echo '<label for="ws-plugin--s2member-paypal-business">' . "\n";
55
  echo 'Your PayPal® EMail Address:' . "\n";
56
  echo '</label>' . "\n";
69
  do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details_after_business", get_defined_vars ());
70
  /**/
71
  echo '<tr>' . "\n";
72
+ echo '</tbody>' . "\n";
73
+ echo '</table>' . "\n";
74
  /**/
75
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
76
+ /**/
77
+ echo '<table class="form-table" style="margin:0;">' . "\n";
78
+ echo '<tbody>' . "\n";
79
+ echo '<tr>' . "\n";
80
+ /**/
81
+ echo '<th style="padding-top:0;">' . "\n";
82
  echo '<label for="ws-plugin--s2member-paypal-sandbox">' . "\n";
83
  echo 'Sandbox Testing?' . "\n";
84
  echo '</label>' . "\n";
113
  echo '</tbody>' . "\n";
114
  echo '</table>' . "\n";
115
  /**/
116
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
117
+ /**/
118
  echo '<p><em><strong>*Sandbox Tip*</strong> If you\'re testing your site through a PayPal® Sandbox account, please remember that Email Confirmations from s2Member will NOT be received after a test purchase. s2Member sends its Confirmation Emails to the PayPal® Email Address of the Customer. Since PayPal® Sandbox addresses are usually bogus ( for testing ), you will have to run live transactions before Email Confirmations from s2Member are received. That being said, all other s2Member functionality CAN be tested through a PayPal® Sandbox account. Email Confirmations are the only hang-up.</em></p>' . "\n";
119
  do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_account_details_after_sandbox_tip", get_defined_vars ());
120
  echo '</div>' . "\n";
135
  echo '<p>Log into your PayPal® account and navigate to this section:<br /><code>Account Profile -> Instant Payment Notification Preferences</code></p>' . "\n";
136
  echo '<p>Edit your IPN settings &amp; turn IPN Notifications: <strong><code>On</code></strong></p>' . "\n";
137
  echo '<p>You\'ll need your IPN URL, which is:<br /><code>' . get_bloginfo ("url") . '/?s2member_paypal_notify=1</code></p>' . "\n";
138
+ do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn", get_defined_vars ());
139
+ /**/
140
+ echo '<h3>More Information ( <a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-details\').toggle(); return false;" class="ws-dotted-link">click here</a> )</h3>' . "\n";
141
+ echo '<div id="ws-plugin--s2member-paypal-ipn-details" style="display:none;">' . "\n";
142
  echo '<p><em><strong>*Quick Tip*</strong> In addition to the default IPN Settings inside your PayPal® account, the IPN URL is also set on a per-transaction basis by the special PayPal® Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal® account, that\'s OK. s2Member dynamically sets the IPN URL for each transaction. The result is that the IPN URL configured from within your PayPal® account, becomes the default, which is then overwritten on a per-transaction basis. In fact, PayPal® recently updated their system to support IPN URL preservation. One PayPal® account can handle multiple sites, all using different IPN URLs.</em></p>' . "\n";
143
  do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_quick_tip", get_defined_vars ());
144
+ echo '<p><em><strong>*IPN Communications*</strong> You\'ll be happy to know that s2Member handles cancellations, expirations, failed payments, terminations ( e.g. refunds &amp; chargebacks ) for you automatically. If you log into your PayPal® account and cancel a Member\'s Subscription, or, if the Member logs into their PayPal® account and cancels their own Subscription, s2Member will be notified of these important changes and react accordingly through the PayPal® IPN service that runs silently behind-the-scene. The PayPal® IPN service will notify s2Member whenever a Member\'s payments have been failing, and/or whenever a Member\'s Subscription has expired for any reason. Even refunds &amp; chargeback reversals are supported through the IPN service. If you issue a refund to an unhappy Customer through PayPal®, s2Member will be notified, and the account for that Customer will either be demoted to a Free Subscriber, or deleted automatically ( based on your configuration ). The communication from PayPal® -> s2Member is seamless.</em></p>' . "\n";
145
+ echo '</div>' . "\n";
146
  /**/
147
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
148
  /**/
149
+ echo '<h3>IPN w/ Proxy Key ( <a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-proxy-details\').toggle(); return false;" class="ws-dotted-link">optional, for 3rd-party integrations</a> )</h3>' . "\n";
150
+ echo '<div id="ws-plugin--s2member-paypal-ipn-proxy-details" style="display:none;">' . "\n";
151
  echo '<p>If you\'re using a 3rd-party application that needs to POST simulated IPN transactions to your s2Member installation, you can use this alternate IPN URL, which includes a Proxy Key. This encrypted Proxy Key verifies incoming data being received by s2Member\'s IPN processor. You can change <em>[proxy-reference]</em> to whatever you like. The <em>[proxy-reference]</em> value is required, but it will only be reflected in s2Member\'s IPN log.</p>' . "\n";
152
+ echo '<input type="text" value="' . format_to_edit (get_bloginfo ("url") . "/?s2member_paypal_notify=1&s2member_paypal_proxy=[proxy-reference]&s2member_paypal_proxy_verification=" . urlencode (md5 (ws_plugin__s2member_xencrypt (preg_replace ("/\:[0-9]+$/", "", $_SERVER["HTTP_HOST"]))))) . '" style="width:99%;" />' . "\n";
153
+ echo '<p><em>Any 3rd-party application that is sending IPN transactions to your s2Member installation, must ALWAYS include the <code>custom</code> POST variable, and that variable must always start with ( <code>' . esc_html ($_SERVER["HTTP_HOST"]) . '</code> ). In addition, the <code>item_number</code> variable, must always match a format that s2Member looks for. Generally speaking, the <code>item_number</code> should be <code>1, 2, 3, or 4</code>, indicating a specific s2Member Level #. However, s2Member also uses some advanced formats in this field. Just to be sure, we suggest creating a PayPal® Button with the s2Member Button Generator, and then taking a look at the Full Button Code to see how s2Member expects <code>item_number</code> to be formatted.</em></p>' . "\n";
154
+ do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_proxy", get_defined_vars ());
155
+ echo '</div>' . "\n";
156
  echo '</div>' . "\n";
157
  /**/
158
  echo '</div>' . "\n";
172
  echo '<p>Turn the Auto-Return feature: <strong><code>On</code></strong></p>' . "\n";
173
  echo '<p>You\'ll need your Auto-Return URL, which is:<br /><code>' . get_bloginfo ("url") . '/?s2member_paypal_return=1</code></p>' . "\n";
174
  echo '<p>You MUST also enable PDT ( Payment Data Transfer ): <strong><code>On</code></strong><br /><em>You\'ll be issued an Identity Token that you MUST enter below.</em></p>' . "\n";
 
 
175
  do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt", get_defined_vars ());
176
  /**/
177
  echo '<table class="form-table">' . "\n";
195
  echo '</tr>' . "\n";
196
  echo '</tbody>' . "\n";
197
  echo '</table>' . "\n";
198
+ /**/
199
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
200
+ /**/
201
+ echo '<h3>More Information ( <a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-pdt-details\').toggle(); return false;" class="ws-dotted-link">click here</a> )</h3>' . "\n";
202
+ echo '<div id="ws-plugin--s2member-paypal-pdt-details" style="display:none;">' . "\n";
203
+ echo '<p><em><strong>*Quick Tip*</strong> In addition to your default PayPal® account configuration, the Auto-Return URL is also set on a per-transaction basis from within the special PayPal® Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal® account, that\'s OK. s2Member dynamically sets the Auto-Return URL for each transaction. The result is that the Auto-Return URL configured from within your PayPal® account, becomes the default, which is then overwritten on a per-transaction basis.</em></p>' . "\n";
204
+ do_action ("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_pdt_after_quick_tip", get_defined_vars ());
205
+ echo '</div>' . "\n";
206
  echo '</div>' . "\n";
207
  /**/
208
  echo '</div>' . "\n";
294
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
295
  echo '<ul>' . "\n";
296
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
297
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
298
  echo '</ul>' . "\n";
299
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
300
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
301
+ echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
302
  echo '</td>' . "\n";
303
  /**/
304
  echo '</tr>' . "\n";
389
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
390
  echo '<ul>' . "\n";
391
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
392
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
393
  echo '</ul>' . "\n";
394
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
395
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
396
+ echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
397
  echo '</td>' . "\n";
398
  /**/
399
  echo '</tr>' . "\n";
includes/menu-pages/scripting.inc.php CHANGED
@@ -112,7 +112,7 @@ if (apply_filters ("ws_plugin__s2member_during_scripting_page_during_left_sectio
112
  {
113
  do_action ("ws_plugin__s2member_during_scripting_page_during_left_sections_before_custom_capability_files", get_defined_vars ());
114
  /**/
115
- echo '<div class="ws-menu-page-group" title="Custom Capability Files">' . "\n";
116
  /**/
117
  echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-capability-files-section">' . "\n";
118
  echo '<h3>Restricting Files, Based On Custom Capabilities</h3>' . "\n";
@@ -124,10 +124,19 @@ if (apply_filters ("ws_plugin__s2member_during_scripting_page_during_left_sectio
124
  /**/
125
  echo '<p><strong>Custom Capabilities:</strong> ( music,videos )</p>' . "\n";
126
  echo '<p>Sub-Directory: <code>/s2member-files/access-s2member-ccap-music</code><br />Sub-Directory: <code>/s2member-files/access-s2member-ccap-videos</code></p>' . "\n";
127
- echo '<p>Proteced File: <code>/s2member-files/access-s2member-ccap-music/file.mp3</code><br />Proteced File: <code>/s2member-files/access-s2member-ccap-videos/file.avi</code></p>' . "\n";
128
  echo '<p>Now, here are some link examples, using Custom Capability Sub-directories:</p>' . "\n";
129
  echo '<p>' . highlight_string (file_get_contents (dirname (__FILE__) . "/code-samples/ccap-file-downloads.php"), true) . '</p>' . "\n";
130
  echo '<p><em>These links will ONLY work for Members who are logged-in, with the proper Capabilities.</em></p>' . "\n";
 
 
 
 
 
 
 
 
 
131
  echo '</div>' . "\n";
132
  /**/
133
  echo '</div>' . "\n";
@@ -197,7 +206,7 @@ if (apply_filters ("ws_plugin__s2member_during_scripting_page_during_left_sectio
197
  echo '<div class="ws-menu-page-section ws-plugin--s2member-api-constants-section">' . "\n";
198
  echo '<h3>You Have Access To PHP Constants ( some PHP scripting required )</h3>' . "\n";
199
  echo '<p>A Constant, is an identifier ( name ) for a simple value in PHP scripting. Below is a comprehensive list that includes all of the PHP defined Constants available to you. All of these Constants are also available through JavaScript as Global Variables. Example code has been provided in the documentation below. If you\'re a web developer, we suggest using some of these Constants in the creation of your Login Welcome Page; which is described in the s2Member General Options Panel. It is not required mind you, but you can get pretty creative with the Login Welcome Page, if you know a little PHP.</p>' . "\n";
200
- echo '<p>For example, you might use `S2MEMBER_CURRENT_USER_ACCESS_LABEL` to display the type of membership the Customer has. Or, you could use `S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL` to provide Customers\' with an easy way to update their Membership Profile. If you get stuck on this, you might want to check out Elance.com. You can hire a freelancer to do this for you. It\'s about a $100 job. There are many other possibilities; <em>limitless actually!</em></p>' . "\n";
201
  do_action ("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_constants", get_defined_vars ());
202
  /**/
203
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
112
  {
113
  do_action ("ws_plugin__s2member_during_scripting_page_during_left_sections_before_custom_capability_files", get_defined_vars ());
114
  /**/
115
+ echo '<div class="ws-menu-page-group" title="Custom Capability &amp; Member Level Files">' . "\n";
116
  /**/
117
  echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-capability-files-section">' . "\n";
118
  echo '<h3>Restricting Files, Based On Custom Capabilities</h3>' . "\n";
124
  /**/
125
  echo '<p><strong>Custom Capabilities:</strong> ( music,videos )</p>' . "\n";
126
  echo '<p>Sub-Directory: <code>/s2member-files/access-s2member-ccap-music</code><br />Sub-Directory: <code>/s2member-files/access-s2member-ccap-videos</code></p>' . "\n";
127
+ echo '<p>Protected File: <code>/s2member-files/access-s2member-ccap-music/file.mp3</code><br />Protected File: <code>/s2member-files/access-s2member-ccap-videos/file.avi</code></p>' . "\n";
128
  echo '<p>Now, here are some link examples, using Custom Capability Sub-directories:</p>' . "\n";
129
  echo '<p>' . highlight_string (file_get_contents (dirname (__FILE__) . "/code-samples/ccap-file-downloads.php"), true) . '</p>' . "\n";
130
  echo '<p><em>These links will ONLY work for Members who are logged-in, with the proper Capabilities.</em></p>' . "\n";
131
+ /**/
132
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
133
+ /**/
134
+ echo '<p><strong>Membership Levels:</strong> ( this also works fine )</p>' . "\n";
135
+ echo '<p>Sub-Directory: <code>/s2member-files/access-s2member-level0</code><br />Sub-Directory: <code>/s2member-files/access-s2member-level1</code><br />Sub-Directory: <code>/s2member-files/access-s2member-level2</code><br />Sub-Directory: <code>/s2member-files/access-s2member-level3</code><br />Sub-Directory: <code>/s2member-files/access-s2member-level4</code></p>' . "\n";
136
+ echo '<p>Protected File: <code>/s2member-files/access-s2member-level0/tiger.doc</code><br />Protected File: <code>/s2member-files/access-s2member-level1/zebra.pdf</code><br />Protected File: <code>/s2member-files/access-s2member-level2/elephant.doc</code><br />Protected File: <code>/s2member-files/access-s2member-level3/rhino.pdf</code><br />Protected File: <code>/s2member-files/access-s2member-level4/lion.doc</code></p>' . "\n";
137
+ echo '<p>Now, here are some link examples, using Member Level Sub-directories:</p>' . "\n";
138
+ echo '<p>' . highlight_string (file_get_contents (dirname (__FILE__) . "/code-samples/level-file-downloads.php"), true) . '</p>' . "\n";
139
+ echo '<p><em>These links will ONLY work for Members who are logged-in, with an adequate Membership Level.</em></p>' . "\n";
140
  echo '</div>' . "\n";
141
  /**/
142
  echo '</div>' . "\n";
206
  echo '<div class="ws-menu-page-section ws-plugin--s2member-api-constants-section">' . "\n";
207
  echo '<h3>You Have Access To PHP Constants ( some PHP scripting required )</h3>' . "\n";
208
  echo '<p>A Constant, is an identifier ( name ) for a simple value in PHP scripting. Below is a comprehensive list that includes all of the PHP defined Constants available to you. All of these Constants are also available through JavaScript as Global Variables. Example code has been provided in the documentation below. If you\'re a web developer, we suggest using some of these Constants in the creation of your Login Welcome Page; which is described in the s2Member General Options Panel. It is not required mind you, but you can get pretty creative with the Login Welcome Page, if you know a little PHP.</p>' . "\n";
209
+ echo '<p>For example, you might use `S2MEMBER_CURRENT_USER_ACCESS_LABEL` to display the type of Membership a Customer has. Or, you could use `S2MEMBER_CURRENT_USER_PROFILE_MODIFICATION_PAGE_URL` to provide Customers\' with an easy way to update their Membership Profile. If you get stuck on this, you might want to check out Elance.com. You can hire a freelancer to do this for you. It\'s about a $100 job. There are many other possibilities; <em>limitless actually!</em></p>' . "\n";
210
  do_action ("ws_plugin__s2member_during_scripting_page_during_left_sections_during_api_constants", get_defined_vars ());
211
  /**/
212
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
includes/menu-pages/start.inc.php CHANGED
@@ -12,14 +12,14 @@ If not, see: <http://www.gnu.org/licenses/>.
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
- exit ("Do not access this file directly.");
16
  /*
17
  Flow Of Events page.
18
  */
19
  echo '<div class="wrap ws-menu-page">' . "\n";
20
  /**/
21
  echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
22
- echo '<h2><div>Developed by <a href="' . ws_plugin__s2member_parse_readme_value ("Plugin URI") . '" target="_blank"><img src="' . $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . '/images/brand-light.png" alt="." /></a></div>s2Member / Quick Start Guide</h2>' . "\n";
23
  /**/
24
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
25
  /**/
12
  Direct access denial.
13
  */
14
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
15
+ exit("Do not access this file directly.");
16
  /*
17
  Flow Of Events page.
18
  */
19
  echo '<div class="wrap ws-menu-page">' . "\n";
20
  /**/
21
  echo '<div id="icon-plugins" class="icon32"><br /></div>' . "\n";
22
+ echo '<h2><div>Developed by <a href="' . ws_plugin__s2member_parse_readme_value ("Plugin URI") . '" target="_blank"><img src="' . $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . '/images/brand-light.png" alt="." /></a></div>s2Member / Quick-Start Guide</h2>' . "\n";
23
  /**/
24
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
25
  /**/
includes/menu-pages/trk-ops.inc.php CHANGED
@@ -42,7 +42,7 @@ if (apply_filters ("ws_plugin__s2member_during_trk_ops_page_during_left_sections
42
  /**/
43
  echo '<div class="ws-menu-page-section ws-plugin--s2member-signup-tracking-section">' . "\n";
44
  echo '<h3>Membership Signup Tracking Codes ( optional )</h3>' . "\n";
45
- echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML' . ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["is_multisite_farm"]) ? ' and/or PHP' : '') . ' code that you enter below, will be loaded up in a web browser, after a Customer returns from a successful Signup through PayPal®. Tracking Codes are only displayed/processed one time for each Customer. s2Member will display your Tracking Codes in one of three possible locations... <strong>1.</strong> If possible, on the Registration Form, after returning from PayPal®. <strong>2.</strong> Otherwise, if possible, on the Login Form after Registration is completed. <strong>3.</strong> Otherwise, in the footer of your WordPress® theme, after the Customer\'s very first Login.</p>' . "\n";
46
  echo '<p>Signup Tracking Codes are displayed for all types of Membership Level Access. Including: Recurring Subscriptions ( with or without a free trial period ), Non-Recurring Subscriptions ( with or without a free trial period ), Lifetime Subscriptions, and even Fixed-Term Subscriptions. All of these are supported by s2Member\'s Button/Form Generators, and all of these are supported here.</p>' . "\n";
47
  do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_signup_tracking", get_defined_vars ());
48
  /**/
@@ -61,7 +61,7 @@ if (apply_filters ("ws_plugin__s2member_during_trk_ops_page_during_left_sections
61
  /**/
62
  echo '<td>' . "\n";
63
  echo '<textarea name="ws_plugin__s2member_signup_tracking_codes" id="ws-plugin--s2member-signup-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["signup_tracking_codes"]) . '</textarea><br />' . "\n";
64
- echo 'Any valid XHTML / JavaScript' . ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["is_multisite_farm"]) ? ' ( or even PHP )' : '') . ' code will work just fine here. Just try not to put anything here that would actually be visible to the Customer. Things like 1x1 pixel images that load up silently and/or JavaScript tracking routines will be fine. Google® Analytics code works just fine, AdSense® performance tracking, as well as Yahoo® tracking and other affiliate network codes are all OK here.<br /><br />' . "\n";
65
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
66
  echo '<ul>' . "\n";
67
  echo '<li><code>%%subscr_id%%</code> = The PayPal® Subscription ID, which remains constant throughout any &amp; all future payments. [ <a href="#" onclick="alert(\'There is one exception. If you are selling Lifetime or Fixed-Term ( non-recurring ) access, using Buy Now functionality; the %%subscr_id%% is actually set to the Transaction ID for the purchase.\\n\\nPayPal® does not provide a specific Subscription ID for Buy Now purchases. Since Lifetime &amp; Fixed-Term Subscriptions are NOT recurring ( i.e. there is only ONE payment ), using the Transaction ID as the Subscription ID is a graceful way to deal with this minor conflict.\'); return false;">?</a> ]</li>' . "\n";
@@ -80,11 +80,11 @@ if (apply_filters ("ws_plugin__s2member_during_trk_ops_page_during_left_sections
80
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
81
  echo '<ul>' . "\n";
82
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
83
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . $_SERVER["HTTP_HOST"] . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
84
  echo '</ul>' . "\n";
85
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
86
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
87
- echo '<code>custom="' . $_SERVER["HTTP_HOST"] . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
88
  echo '</td>' . "\n";
89
  /**/
90
  echo '</tr>' . "\n";
@@ -105,7 +105,7 @@ if (apply_filters ("ws_plugin__s2member_during_trk_ops_page_during_left_sections
105
  /**/
106
  echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-tracking-section">' . "\n";
107
  echo '<h3>Tracking Codes For Specific Post/Page Access ( optional )</h3>' . "\n";
108
- echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML' . ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["is_multisite_farm"]) ? ' and/or PHP' : '') . ' code that you enter below, will be loaded up in a web browser, after a Customer returns from a successful transaction at PayPal®; specifically for Post/Page Access. These Codes are NOT injected for any type of Member Level Access. These are only for Specific Post/Page transactions. The Tracking Codes that you enter below, will be displayed in the footer section of your WordPress® theme, after a Customer returns from PayPal®.</p>' . "\n";
109
  do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_sp_tracking", get_defined_vars ());
110
  /**/
111
  echo '<table class="form-table">' . "\n";
@@ -123,7 +123,7 @@ if (apply_filters ("ws_plugin__s2member_during_trk_ops_page_during_left_sections
123
  /**/
124
  echo '<td>' . "\n";
125
  echo '<textarea name="ws_plugin__s2member_sp_tracking_codes" id="ws-plugin--s2member-sp-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_tracking_codes"]) . '</textarea><br />' . "\n";
126
- echo 'Any valid XHTML / JavaScript' . ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["is_multisite_farm"]) ? ' ( or even PHP )' : '') . ' code will work just fine here. Just try not to put anything here that would actually be visible to the Customer. Things like 1x1 pixel images that load up silently and/or JavaScript tracking routines will be fine. Google® Analytics code works just fine, AdSense® performance tracking, as well as Yahoo® tracking and other affiliate network codes are all OK here.<br /><br />' . "\n";
127
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
128
  echo '<ul>' . "\n";
129
  echo '<li><code>%%txn_id%%</code> = The PayPal® Transaction ID. PayPal® assigns a unique identifier for every purchase.</li>' . "\n";
@@ -138,11 +138,11 @@ if (apply_filters ("ws_plugin__s2member_during_trk_ops_page_during_left_sections
138
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
139
  echo '<ul>' . "\n";
140
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
141
- echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . $_SERVER["HTTP_HOST"] . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
142
  echo '</ul>' . "\n";
143
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
144
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
145
- echo '<code>custom="' . $_SERVER["HTTP_HOST"] . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
146
  echo '</td>' . "\n";
147
  /**/
148
  echo '</tr>' . "\n";
42
  /**/
43
  echo '<div class="ws-menu-page-section ws-plugin--s2member-signup-tracking-section">' . "\n";
44
  echo '<h3>Membership Signup Tracking Codes ( optional )</h3>' . "\n";
45
+ echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML' . ((ws_plugin__s2member_is_multisite_farm ()) ? '' : ' and/or PHP') . ' code that you enter below, will be loaded up in a web browser, after a Customer returns from a successful Signup through PayPal®. Tracking Codes are only displayed/processed one time for each Customer. s2Member will display your Tracking Codes in one of three possible locations... <strong>1.</strong> If possible, on the Registration Form, after returning from PayPal®. <strong>2.</strong> Otherwise, if possible, on the Login Form after Registration is completed. <strong>3.</strong> Otherwise, in the footer of your WordPress® theme, after the Customer\'s very first Login.</p>' . "\n";
46
  echo '<p>Signup Tracking Codes are displayed for all types of Membership Level Access. Including: Recurring Subscriptions ( with or without a free trial period ), Non-Recurring Subscriptions ( with or without a free trial period ), Lifetime Subscriptions, and even Fixed-Term Subscriptions. All of these are supported by s2Member\'s Button/Form Generators, and all of these are supported here.</p>' . "\n";
47
  do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_signup_tracking", get_defined_vars ());
48
  /**/
61
  /**/
62
  echo '<td>' . "\n";
63
  echo '<textarea name="ws_plugin__s2member_signup_tracking_codes" id="ws-plugin--s2member-signup-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["signup_tracking_codes"]) . '</textarea><br />' . "\n";
64
+ echo 'Any valid XHTML / JavaScript' . ((ws_plugin__s2member_is_multisite_farm ()) ? '' : ' ( or even PHP )') . ' code will work just fine here. Just try not to put anything here that would actually be visible to the Customer. Things like 1x1 pixel images that load up silently and/or JavaScript tracking routines will be fine. Google® Analytics code works just fine, AdSense® performance tracking, as well as Yahoo® tracking and other affiliate network codes are all OK here.<br /><br />' . "\n";
65
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
66
  echo '<ul>' . "\n";
67
  echo '<li><code>%%subscr_id%%</code> = The PayPal® Subscription ID, which remains constant throughout any &amp; all future payments. [ <a href="#" onclick="alert(\'There is one exception. If you are selling Lifetime or Fixed-Term ( non-recurring ) access, using Buy Now functionality; the %%subscr_id%% is actually set to the Transaction ID for the purchase.\\n\\nPayPal® does not provide a specific Subscription ID for Buy Now purchases. Since Lifetime &amp; Fixed-Term Subscriptions are NOT recurring ( i.e. there is only ONE payment ), using the Transaction ID as the Subscription ID is a graceful way to deal with this minor conflict.\'); return false;">?</a> ]</li>' . "\n";
80
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
81
  echo '<ul>' . "\n";
82
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
83
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
84
  echo '</ul>' . "\n";
85
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
86
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
87
+ echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
88
  echo '</td>' . "\n";
89
  /**/
90
  echo '</tr>' . "\n";
105
  /**/
106
  echo '<div class="ws-menu-page-section ws-plugin--s2member-sp-tracking-section">' . "\n";
107
  echo '<h3>Tracking Codes For Specific Post/Page Access ( optional )</h3>' . "\n";
108
+ echo '<p>If you use affiliate software, a list server, tracking codes from advertising networks, or the like; you\'ll want to read this section. The HTML' . ((ws_plugin__s2member_is_multisite_farm ()) ? '' : ' and/or PHP') . ' code that you enter below, will be loaded up in a web browser, after a Customer returns from a successful transaction at PayPal®; specifically for Post/Page Access. These Codes are NOT injected for any type of Member Level Access. These are only for Specific Post/Page transactions. The Tracking Codes that you enter below, will be displayed in the footer section of your WordPress® theme, after a Customer returns from PayPal®.</p>' . "\n";
109
  do_action ("ws_plugin__s2member_during_trk_ops_page_during_left_sections_during_sp_tracking", get_defined_vars ());
110
  /**/
111
  echo '<table class="form-table">' . "\n";
123
  /**/
124
  echo '<td>' . "\n";
125
  echo '<textarea name="ws_plugin__s2member_sp_tracking_codes" id="ws-plugin--s2member-sp-tracking-codes" rows="8" wrap="off" spellcheck="false" style="font-family:Consolas, monospace;">' . format_to_edit ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sp_tracking_codes"]) . '</textarea><br />' . "\n";
126
+ echo 'Any valid XHTML / JavaScript' . ((ws_plugin__s2member_is_multisite_farm ()) ? '' : ' ( or even PHP )') . ' code will work just fine here. Just try not to put anything here that would actually be visible to the Customer. Things like 1x1 pixel images that load up silently and/or JavaScript tracking routines will be fine. Google® Analytics code works just fine, AdSense® performance tracking, as well as Yahoo® tracking and other affiliate network codes are all OK here.<br /><br />' . "\n";
127
  echo '<strong>You can also use these special Replacement Codes if you need them:</strong>' . "\n";
128
  echo '<ul>' . "\n";
129
  echo '<li><code>%%txn_id%%</code> = The PayPal® Transaction ID. PayPal® assigns a unique identifier for every purchase.</li>' . "\n";
138
  echo '<strong>Custom Replacement Codes can also be inserted using these instructions:</strong>' . "\n";
139
  echo '<ul>' . "\n";
140
  echo '<li><code>%%cv0%%</code> = The domain of your site, which is passed through the `custom` attribute in your Shortcode.</li>' . "\n";
141
+ echo '<li><code>%%cv1%%</code> = If you need to track additional custom variables, you can pipe delimit them into the `custom` attribute, inside your Shortcode, like this: <code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|cv1|cv2|cv3"</code>. You can have an unlimited number of custom variables that track IP addresses, affiliate IDs, etc. In some cases you may need to use PHP code to insert a value into the custom field dynamically. Obviously this is for advanced webmasters, but the functionality has been made available for those who need it.</li>' . "\n";
142
  echo '</ul>' . "\n";
143
  echo '<strong>This example uses cv1 to track a User\'s IP address:</strong><br />' . "\n";
144
  echo '<em>( The IP address could be referenced using <code>%%cv1%%</code> )</em><br />' . "\n";
145
+ echo '<code>custom="' . esc_html ($_SERVER["HTTP_HOST"]) . '|&lt;?php echo $_SERVER["REMOTE_ADDR"]; ?&gt;"</code>' . "\n";
146
  echo '</td>' . "\n";
147
  /**/
148
  echo '</tr>' . "\n";
includes/s2member-min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(a){ws_plugin__s2member_unique_files_downloaded=[];if(S2MEMBER_CURRENT_USER_IS_LOGGED_IN&&S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY<S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED){a("a[href*=s2member_file_download]").click(function(){if(!this.href.match(/file_download_key\=(.+)/)){var b="** Please Confirm This File Download **\n\n";b+="You've downloaded "+S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY+" protected file"+((S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY<1||S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY>1)?"s":"")+" in the last "+S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS+" days.\n\n";b+="You're entitled to "+((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED)?"UNLIMITED downloads though ( so, no worries ).":S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED+" unique downloads every "+S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS+" day period.");if(confirm(b)){if(a.inArray(this.href,ws_plugin__s2member_unique_files_downloaded)===-1){ws_plugin__s2member_unique_files_downloaded.push(this.href),S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY++}return true}else{return false}}})}if(location.href.match(/\/wp-login\.php/)){a("div#login > form#registerform").submit(function(){var b="",c="";a(":input[aria-required=true]",this).each(function(){if(!a.trim(a(this).val())&&(c=a.trim(a.trim(a(this).parent("label").html()).split(/[\r\n\t\<]+/,1)[0].replace(/\*/,"")))){b+="• "+c+"\n"}});if(b=a.trim(b)){alert("Oops, you missed something:\n\n"+b);return false}return true})}if(location.href.match(/\/\?s2member_profile\=1/)){a("form#ws-plugin--s2member-profile").submit(function(){var b="",c="";a(":input[aria-required=true]",this).each(function(){if(!a.trim(a(this).val())&&(c=a.trim(a.trim(a("strong",a(this).parent("label")).html()).split(/[\r\n\t\<]+/,1)[0].replace(/\*/,"")))){b+="• "+c+"\n"}});if(b=a.trim(b)){alert("Oops, you missed something:\n\n"+b);return false}return true})}});
includes/s2member.js CHANGED
@@ -8,11 +8,6 @@ along with this software. In the main directory, see: /licensing/
8
  If not, see: <http://www.gnu.org/licenses/>.
9
  */
10
  /*
11
- Global variables, duplicated from PHP / API Constants.
12
- These are inserted dynamically.
13
- */
14
- <?php echo $g; ?>
15
- /*
16
  Other scripting routines handled on document ready state.
17
  Note: There is only one global variable here ( no conflicts ).
18
  ws_plugin__s2member_unique_files_downloaded
8
  If not, see: <http://www.gnu.org/licenses/>.
9
  */
10
  /*
 
 
 
 
 
11
  Other scripting routines handled on document ready state.
12
  Note: There is only one global variable here ( no conflicts ).
13
  ws_plugin__s2member_unique_files_downloaded
includes/syscon.inc.php CHANGED
@@ -18,11 +18,6 @@ Direct access denial.
18
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
19
  exit ("Do not access this file directly.");
20
  /*
21
- Detect if this is WordPress® with Multisite/Networking.
22
- */
23
- if (($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["is_multisite"] = ((function_exists ("is_multisite") && is_multisite ()) || function_exists ("wpmu_current_site"))) && ((defined ("MULTISITE_FARM") && MULTISITE_FARM) || file_exists (dirname (dirname (__FILE__)) . "/multisite.farm")))
24
- $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["is_multisite_farm"] = true;
25
- /*
26
  Determine the full url to the directory this plugin resides in.
27
  */
28
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] = content_url () . preg_replace ("/^(.*?)(\/" . preg_quote (basename (WP_CONTENT_DIR), "/") . ")/", "", preg_replace ("/" . preg_quote (DIRECTORY_SEPARATOR, "/") . "/", "/", dirname (dirname (__FILE__))));
18
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
19
  exit ("Do not access this file directly.");
20
  /*
 
 
 
 
 
21
  Determine the full url to the directory this plugin resides in.
22
  */
23
  $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] = content_url () . preg_replace ("/^(.*?)(\/" . preg_quote (basename (WP_CONTENT_DIR), "/") . ")/", "", preg_replace ("/" . preg_quote (DIRECTORY_SEPARATOR, "/") . "/", "/", dirname (dirname (__FILE__))));
includes/templates/options/paypal-currencies.html CHANGED
@@ -1,26 +1,26 @@
1
  <optgroup label="Currency">
2
- <option value="USD" title="U.S. Dollar">USD</option>
3
- <option value="AUD" title="Australian Dollar">AUD</option>
4
- <option value="BRL" title="Brazilian Real">BRL</option>
5
- <option value="CAD" title="Canadian Dollar">CAD</option>
6
- <option value="CZK" title="Czech Koruna">CZK</option>
7
- <option value="DKK" title="Danish Krone">DKK</option>
8
- <option value="EUR" title="Euro">EUR</option>
9
- <option value="HKD" title="Hong Kong Dollar">HKD</option>
10
- <option value="HUF" title="Hungarian Forint">HUF</option>
11
- <option value="ILS" title="Israeli New Sheqel">ILS</option>
12
- <option value="JPY" title="Japanese Yen">JPY</option>
13
- <option value="MYR" title="Malaysian Ringgit">MYR</option>
14
- <option value="MXN" title="Mexican Peso">MXN</option>
15
- <option value="NOK" title="Norwegian Krone">NOK</option>
16
- <option value="NZD" title="New Zealand Dollar">NZD</option>
17
- <option value="PHP" title="Philippine Peso">PHP</option>
18
- <option value="PLN" title="Polish Zloty">PLN</option>
19
- <option value="GBP" title="Pound Sterling">GBP</option>
20
- <option value="SGD" title="Singapore Dollar">SGD</option>
21
- <option value="SEK" title="Swedish Krona">SEK</option>
22
- <option value="CHF" title="Swiss Franc">CHF</option>
23
- <option value="TWD" title="Taiwan New Dollar">TWD</option>
24
- <option value="THB" title="Thai Baht">THB</option>
25
- <option value="USD" title="U.S. Dollar">USD</option>
26
  </optgroup>
1
  <optgroup label="Currency">
2
+ <option value="USD" title="$ / U.S. Dollar">USD</option>
3
+ <option value="AUD" title="$ / Australian Dollar">AUD</option>
4
+ <option value="BRL" title="R$ / Brazilian Real">BRL</option>
5
+ <option value="CAD" title="$ / Canadian Dollar">CAD</option>
6
+ <option value="CZK" title="Kč / Czech Koruna">CZK</option>
7
+ <option value="DKK" title="kr / Danish Krone">DKK</option>
8
+ <option value="EUR" title="€ / Euro">EUR</option>
9
+ <option value="HKD" title="$ / Hong Kong Dollar">HKD</option>
10
+ <option value="HUF" title="Ft / Hungarian Forint">HUF</option>
11
+ <option value="ILS" title="₪ / Israeli New Sheqel">ILS</option>
12
+ <option value="JPY" title="¥ / Japanese Yen">JPY</option>
13
+ <option value="MYR" title="RM / Malaysian Ringgit">MYR</option>
14
+ <option value="MXN" title="$ / Mexican Peso">MXN</option>
15
+ <option value="NOK" title="kr / Norwegian Krone">NOK</option>
16
+ <option value="NZD" title="$ / New Zealand Dollar">NZD</option>
17
+ <option value="PHP" title="Php / Philippine Peso">PHP</option>
18
+ <option value="PLN" title="zł / Polish Zloty">PLN</option>
19
+ <option value="GBP" title="£ / Pound Sterling">GBP</option>
20
+ <option value="SGD" title="$ / Singapore Dollar">SGD</option>
21
+ <option value="SEK" title="kr / Swedish Krona">SEK</option>
22
+ <option value="CHF" title="CHF / Swiss Franc">CHF</option>
23
+ <option value="TWD" title="NT$ / Taiwan New Dollar">TWD</option>
24
+ <option value="THB" title="฿ / Thai Baht">THB</option>
25
+ <option value="USD" title="$ / U.S. Dollar">USD</option>
26
  </optgroup>
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member ( Membership w/ PayPal® Integration ) also works w/ BuddyPress ===
2
 
3
- Version: 3.1.2
4
- Stable tag: 3.1.2
5
  Framework: WS-P-3.0
6
 
7
  SSL Compatible: yes
@@ -156,8 +156,19 @@ Not yet. This is coming soon though. It will be included in a future release of
156
 
157
  == Changelog ==
158
 
 
 
 
 
 
 
 
 
 
 
 
159
  = 3.1.2 =
160
- * Updated minimum requirements to WordPress® 3.0.
161
 
162
  = 3.1.1 =
163
  * New feature. Now you can use `s2member_force_ssl -> yes` as a Custom Field with any Post/Page. This feature comes in handy if you need to force SSL on pages hosting PayPal® Pro Forms, implemented by the s2Member Pro Module. You can set `s2member_force_ssl -> yes` to force *https://*. If your server runs SSL over a special port number, or your server requires the port number to actually be in the URL ( i.e. HOST:port ), you can set `s2member_force_ssl -> 443`; or to whatever port you need. In addition to forcing *https://*, s2Member is also capable of forcing SSL compatibility in your theme, and in other quirky plugins. If your theme is NOT 100% compatible with SSL, s2Member can sometimes correct flaws automatically, but not always. For maximum compatibility with SSL, we recommend a premium WordPress® theme from PriMoThemes.com, or from another trusted source that states "SSL Compatible".
@@ -165,6 +176,7 @@ Not yet. This is coming soon though. It will be included in a future release of
165
  * Tweak. References to `$_SERVER["HTTPS"]` have been abandoned, in favor of `is_ssl()`, which is native to WordPress®.
166
  * Windows®. Although full testing on Windows® IIS is not completed, one bug report indicated a problem with `["dir_url"]`. This has been corrected in v3.1.1, using `DIRECTORY_SEPARATOR`.
167
  * Bug fix. PHP 5.3.x reference value on option filters. The `apply_filters()` call was changed to `apply_filters_ref_array()`. This has been corrected in v3.1.1.
 
168
 
169
  = 3.1 =
170
  * bbPress® compatiblity. There is a new internal Bridge that can be installed into bbPress® by s2Member. This new bbPress® (Bridge/plugin) makes it possible for s2Member Levels [0-4] to be converted into bbPress® "Members" on-the-fly, and it will guard your forums against unauthorized access; including forum registrations, which are redirected to your Membership Options Page for s2Member. To install this Bridge Integration, check your WordPress® Dashboard, under: `s2Member -> Bridge Integrations`.
1
  === s2Member ( Membership w/ PayPal® Integration ) also works w/ BuddyPress ===
2
 
3
+ Version: 3.1.3
4
+ Stable tag: 3.1.3
5
  Framework: WS-P-3.0
6
 
7
  SSL Compatible: yes
156
 
157
  == Changelog ==
158
 
159
+ = 3.1.3 =
160
+ * Bug fix. Comparison between `$_SERVER["HTTP_HOST"]` and a PayPal® Custom/Proxy was failing on some servers that force a host port number into the `$_SERVER["HTTP_HOST"]` environment variable. MediaTemple® does this. If you're hosted by MediaTemple®, and you're using the s2Member Pro Module, you should upgrade to v3.1.3+.
161
+ * Bug fix. The WP_Http class, which is responsible for handling cURL, ExtHTTP, and/or fopen functionality for connections to PayPal®, was defaulting to a `5` second stream timeout. Under certain conditions, this was too low ( i.e. slow responses from PayPal®, and/or a WordPress® MySQL database ). The default timeout has now been increased to `20` seconds; which is designed to give high priority status to IPN processing routines; thereby reducing the chances of a connection timeout considerably, and improving the overall reliability of the s2Member checkout experience.
162
+ * Localhost support. s2Member now supports "localhost" installations of WordPress®; tested against WAMP and MAMP. Thanks to [ScriptyGoddess](http://www.scriptygoddess.com/) for reporting this, and for her assistance with testing against her MAMP installation.
163
+ * General UI cleanup. In particular, the PayPal® Option panels have been cleaned up a bit; making these important panels "less intimidating" to site owners that are brand new to s2Member.
164
+ * Support for File Download Restrictions, based on specific Member Level Sub-directories. For full details, please check your WP Dashboard, under: `s2Member -> API Scripting -> "Custom Capability and Member Level Files"`.
165
+ * The file `/includes/s2member.js` is now a development source file. The live version is now optimized, inside: `/includes/s2member-min.js`. This helps to further reduce the s2Member footprint.
166
+ * Virtual terminal support `(txn_type=virtual_terminal)` has been added to the s2Member IPN processor. This provides developers with access to Hooks/Filters on Virtual Terminal transactions.
167
+ * Internal optimization of s2member.css. These optimizations are designed to further reduce the footprint of s2Member.
168
+ * Bug fix. A bug was discovered in the PayPal® IPN routines; specifically with `payment_status`. Under the right conditions, it was possible for a declined echeck payment to slip through with a `Failed` payment status. s2Member v3.1.3+ corrects this bug.
169
+
170
  = 3.1.2 =
171
+ * Updated minimum requirements to WordPress® 3.0+. There were changes in v3.1.1 that now require WP 3.0+ ( `apply_filters_ref_array` ). WordPress 2.9.2 is no longer compatible. If for some reason, you can't upgrade to WP 3.0, you can [grab older versions of s2Member here](http://wordpress.org/extend/plugins/s2member/download/).
172
 
173
  = 3.1.1 =
174
  * New feature. Now you can use `s2member_force_ssl -> yes` as a Custom Field with any Post/Page. This feature comes in handy if you need to force SSL on pages hosting PayPal® Pro Forms, implemented by the s2Member Pro Module. You can set `s2member_force_ssl -> yes` to force *https://*. If your server runs SSL over a special port number, or your server requires the port number to actually be in the URL ( i.e. HOST:port ), you can set `s2member_force_ssl -> 443`; or to whatever port you need. In addition to forcing *https://*, s2Member is also capable of forcing SSL compatibility in your theme, and in other quirky plugins. If your theme is NOT 100% compatible with SSL, s2Member can sometimes correct flaws automatically, but not always. For maximum compatibility with SSL, we recommend a premium WordPress® theme from PriMoThemes.com, or from another trusted source that states "SSL Compatible".
176
  * Tweak. References to `$_SERVER["HTTPS"]` have been abandoned, in favor of `is_ssl()`, which is native to WordPress®.
177
  * Windows®. Although full testing on Windows® IIS is not completed, one bug report indicated a problem with `["dir_url"]`. This has been corrected in v3.1.1, using `DIRECTORY_SEPARATOR`.
178
  * Bug fix. PHP 5.3.x reference value on option filters. The `apply_filters()` call was changed to `apply_filters_ref_array()`. This has been corrected in v3.1.1.
179
+ * Localhost support. s2Member now supports "localhost" installations of WordPress®; tested against WAMP and MAMP. Thanks to [ScriptyGoddess](http://www.scriptygoddess.com/) for reporting this, and for her assistance with testing against her MAMP installation.
180
 
181
  = 3.1 =
182
  * bbPress® compatiblity. There is a new internal Bridge that can be installed into bbPress® by s2Member. This new bbPress® (Bridge/plugin) makes it possible for s2Member Levels [0-4] to be converted into bbPress® "Members" on-the-fly, and it will guard your forums against unauthorized access; including forum registrations, which are redirected to your Membership Options Page for s2Member. To install this Bridge Integration, check your WordPress® Dashboard, under: `s2Member -> Bridge Integrations`.
s2member.php CHANGED
@@ -9,8 +9,8 @@ along with this software. In the main directory, see: /licensing/
9
  If not, see: <http://www.gnu.org/licenses/>.
10
  */
11
  /*
12
- Version: 3.1.2
13
- Stable tag: 3.1.2
14
  Framework: WS-P-3.0
15
 
16
  SSL Compatible: yes
@@ -43,14 +43,14 @@ Tags: membership, members, member, register, signup, paypal, pay pal, s2member,
43
  Direct access denial.
44
  */
45
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
46
- exit ("Do not access this file directly.");
47
  /*
48
  Define versions.
49
  */
50
- define ("WS_PLUGIN__S2MEMBER_VERSION", "3.1.2");
51
  define ("WS_PLUGIN__S2MEMBER_MIN_PHP_VERSION", "5.2");
52
  define ("WS_PLUGIN__S2MEMBER_MIN_WP_VERSION", "3.0");
53
- define ("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "1.0.5");
54
  /*
55
  Compatibility checks.
56
  */
@@ -60,7 +60,7 @@ if (version_compare (PHP_VERSION, WS_PLUGIN__S2MEMBER_MIN_PHP_VERSION, ">=") &&
60
  /*
61
  Hook before loaded.
62
  */
63
- do_action ("ws_plugin__s2member_before_loaded");
64
  /*
65
  System configuraton.
66
  */
@@ -72,7 +72,7 @@ if (version_compare (PHP_VERSION, WS_PLUGIN__S2MEMBER_MIN_PHP_VERSION, ">=") &&
72
  /*
73
  Hook after system config & hooks are loaded.
74
  */
75
- do_action ("ws_plugin__s2member_config_hooks_loaded");
76
  /*
77
  Load a possible Pro module, if/when available.
78
  */
@@ -88,7 +88,7 @@ if (version_compare (PHP_VERSION, WS_PLUGIN__S2MEMBER_MIN_PHP_VERSION, ">=") &&
88
  /*
89
  Hook after loaded.
90
  */
91
- do_action ("ws_plugin__s2member_after_loaded");
92
  }
93
  else if (is_admin ()) /* Admin compatibility errors. */
94
  {
9
  If not, see: <http://www.gnu.org/licenses/>.
10
  */
11
  /*
12
+ Version: 3.1.3
13
+ Stable tag: 3.1.3
14
  Framework: WS-P-3.0
15
 
16
  SSL Compatible: yes
43
  Direct access denial.
44
  */
45
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
46
+ exit("Do not access this file directly.");
47
  /*
48
  Define versions.
49
  */
50
+ define ("WS_PLUGIN__S2MEMBER_VERSION", "3.1.3");
51
  define ("WS_PLUGIN__S2MEMBER_MIN_PHP_VERSION", "5.2");
52
  define ("WS_PLUGIN__S2MEMBER_MIN_WP_VERSION", "3.0");
53
+ define ("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "1.0.9");
54
  /*
55
  Compatibility checks.
56
  */
60
  /*
61
  Hook before loaded.
62
  */
63
+ do_action("ws_plugin__s2member_before_loaded");
64
  /*
65
  System configuraton.
66
  */
72
  /*
73
  Hook after system config & hooks are loaded.
74
  */
75
+ do_action("ws_plugin__s2member_config_hooks_loaded");
76
  /*
77
  Load a possible Pro module, if/when available.
78
  */
88
  /*
89
  Hook after loaded.
90
  */
91
+ do_action("ws_plugin__s2member_after_loaded");
92
  }
93
  else if (is_admin ()) /* Admin compatibility errors. */
94
  {