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

Version Description

= v140328 =

(Maintenance Release) Upgrade immediately.

Download this release

Release Info

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

Code changes from version 140105 to 140328

Files changed (76) hide show
  1. .htaccess +4 -3
  2. checksum.txt +1 -1
  3. images/getresponse-logo.png +0 -0
  4. includes/.htaccess +6 -1
  5. includes/classes/auto-eots.inc.php +2 -0
  6. includes/classes/custom-reg-fields.inc.php +16 -8
  7. includes/classes/files-in.inc.php +25 -8
  8. includes/classes/installation.inc.php +8 -8
  9. includes/classes/list-servers.inc.php +89 -3
  10. includes/classes/login-redirects-r.inc.php +6 -2
  11. includes/classes/login-redirects.inc.php +16 -5
  12. includes/classes/paypal-notify-in-billing-agreement-signup.inc.php +80 -0
  13. includes/classes/paypal-notify-in-cart.inc.php +2 -4
  14. includes/classes/paypal-notify-in-express-checkout.inc.php +2 -4
  15. includes/classes/paypal-notify-in-merch-pmt.inc.php +80 -0
  16. includes/classes/paypal-notify-in-rec-profile-creation-w-level.inc.php +1 -1
  17. includes/classes/paypal-notify-in-send-money.inc.php +2 -4
  18. includes/classes/paypal-notify-in-sp-refund-reversal.inc.php +1 -1
  19. includes/classes/paypal-notify-in-subscr-modify-w-level.inc.php +6 -1
  20. includes/classes/paypal-notify-in-subscr-or-rp-cancellation-w-level.inc.php +3 -3
  21. includes/classes/paypal-notify-in-subscr-or-rp-eots-w-level.inc.php +17 -11
  22. includes/classes/paypal-notify-in-subscr-or-rp-payment-failed-w-level.inc.php +1 -1
  23. includes/classes/paypal-notify-in-subscr-or-rp-payment-w-level.inc.php +1 -1
  24. includes/classes/paypal-notify-in-subscr-or-wa-w-level.inc.php +6 -1
  25. includes/classes/paypal-notify-in-virtual-terminal.inc.php +2 -4
  26. includes/classes/paypal-notify-in-wa-ccaps-wo-level.inc.php +1 -1
  27. includes/classes/paypal-notify-in-web-accept-sp.inc.php +1 -1
  28. includes/classes/paypal-notify-in.inc.php +25 -8
  29. includes/classes/paypal-return-in-no-tx-data.inc.php +1 -1
  30. includes/classes/paypal-return-in-proxy-ty-email.inc.php +1 -1
  31. includes/classes/paypal-return-in-proxy-x-preview.inc.php +1 -1
  32. includes/classes/paypal-return-in-subscr-modify-w-level.inc.php +6 -1
  33. includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php +6 -1
  34. includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php +1 -1
  35. includes/classes/paypal-return-in-web-accept-sp.inc.php +1 -1
  36. includes/classes/paypal-return-in.inc.php +9 -5
  37. includes/classes/paypal-utilities.inc.php +43 -30
  38. includes/classes/registrations.inc.php +7 -1
  39. includes/classes/sc-if-conds-in.inc.php +76 -19
  40. includes/classes/sc-profile-in.inc.php +1 -1
  41. includes/classes/user-securities.inc.php +4 -1
  42. includes/classes/users-list.inc.php +4 -0
  43. includes/classes/utils-s2o.inc.php +4 -1
  44. includes/classes/utils-strings.inc.php +16 -0
  45. includes/classes/utils-users.inc.php +10 -7
  46. includes/codes.inc.php +7 -0
  47. includes/menu-pages/code-samples/current-user-downloads-allowed-is-unlimited.x-php +10 -3
  48. includes/menu-pages/code-samples/current-user-paid-registration-days-dripping.x-php +20 -3
  49. includes/menu-pages/code-samples/current-user-paid-registration-days.x-php +22 -3
  50. includes/menu-pages/code-samples/current-user-registration-days.x-php +22 -3
  51. includes/menu-pages/code-samples/s2drip-example1.x-php +26 -0
  52. includes/menu-pages/code-samples/s2member-paid-registration-time-examples.x-php +22 -1
  53. includes/menu-pages/code-samples/sc-current-user-can-full-access-farm.x-php +1 -3
  54. includes/menu-pages/code-samples/sc-current-user-can-full-access.x-php +1 -3
  55. includes/menu-pages/code-samples/sc-current-user-is-specific-content-else-farm.x-php +24 -0
  56. includes/menu-pages/code-samples/sc-current-user-is-specific-content-else.x-php +24 -0
  57. includes/menu-pages/code-samples/sc-is-user-logged-in-else-farm.x-php +5 -0
  58. includes/menu-pages/code-samples/sc-is-user-logged-in-else.x-php +5 -0
  59. includes/menu-pages/code-samples/sc-s2-conditional-nesting-else-farm.x-php +7 -0
  60. includes/menu-pages/code-samples/sc-s2-conditional-nesting-else.x-php +7 -0
  61. includes/menu-pages/code-samples/sc-s2-conditional-nesting-farm.x-php +5 -0
  62. includes/menu-pages/code-samples/sc-s2-conditional-nesting.x-php +1 -1
  63. includes/menu-pages/code-samples/sc-s2-conditional-supplements-3-farm.x-php +1 -1
  64. includes/menu-pages/code-samples/sc-s2-conditional-supplements-3.x-php +1 -1
  65. includes/menu-pages/down-ops.inc.php +29 -0
  66. includes/menu-pages/els-ops.inc.php +76 -4
  67. includes/menu-pages/menu-pages.css +3 -3
  68. includes/menu-pages/paypal-ops.inc.php +7 -6
  69. includes/menu-pages/res-ops.inc.php +32 -0
  70. includes/menu-pages/scripting.inc.php +54 -14
  71. includes/syscon.inc.php +16 -4
  72. includes/templates/cfg-files/s2member-files.php +15 -6
  73. includes/templates/cfg-files/s2member-logs.php +9 -1
  74. includes/translations/s2member.pot +788 -760
  75. readme.txt +38 -5
  76. s2member.php +4 -4
.htaccess CHANGED
@@ -1,4 +1,5 @@
1
- # Configuration of directory indexes.
2
- # For added security (set these explicitly).
3
  Options -Indexes
4
- DirectoryIndex index.php
 
 
 
 
 
1
  Options -Indexes
2
+ <IfModule dir_module>
3
+ DirectoryIndex disabled
4
+ DirectoryIndex index.php
5
+ </IfModule>
checksum.txt CHANGED
@@ -1 +1 @@
1
- dcd346ee3120bceb8a2baf42bb6a94de
1
+ 3d97d4d4213785bad33b96ffa9cba239
images/getresponse-logo.png ADDED
Binary file
includes/.htaccess CHANGED
@@ -1 +1,6 @@
1
- deny from all
 
 
 
 
 
1
+ <IfModule authz_core_module>
2
+ Require all denied
3
+ </IfModule>
4
+ <IfModule !authz_core_module>
5
+ deny from all
6
+ </IfModule>
includes/classes/auto-eots.inc.php CHANGED
@@ -130,6 +130,7 @@ if (!class_exists ("c_ws_plugin__s2member_auto_eots"))
130
  $custom = get_user_option ("s2member_custom", $user_id);
131
  $subscr_gateway = get_user_option ("s2member_subscr_gateway", $user_id);
132
  $subscr_id = get_user_option ("s2member_subscr_id", $user_id);
 
133
  $fields = get_user_option ("s2member_custom_fields", $user_id);
134
  $user_reg_ip = get_user_option ("s2member_registration_ip", $user_id);
135
 
@@ -153,6 +154,7 @@ if (!class_exists ("c_ws_plugin__s2member_auto_eots"))
153
 
154
  delete_user_option ($user_id, "s2member_custom");
155
  delete_user_option ($user_id, "s2member_subscr_id");
 
156
  delete_user_option ($user_id, "s2member_subscr_gateway");
157
 
158
  delete_user_option ($user_id, "s2member_ipn_signup_vars");
130
  $custom = get_user_option ("s2member_custom", $user_id);
131
  $subscr_gateway = get_user_option ("s2member_subscr_gateway", $user_id);
132
  $subscr_id = get_user_option ("s2member_subscr_id", $user_id);
133
+ $subscr_baid = get_user_option ("s2member_subscr_baid", $user_id);
134
  $fields = get_user_option ("s2member_custom_fields", $user_id);
135
  $user_reg_ip = get_user_option ("s2member_registration_ip", $user_id);
136
 
154
 
155
  delete_user_option ($user_id, "s2member_custom");
156
  delete_user_option ($user_id, "s2member_subscr_id");
157
+ delete_user_option ($user_id, "s2member_subscr_baid");
158
  delete_user_option ($user_id, "s2member_subscr_gateway");
159
 
160
  delete_user_option ($user_id, "s2member_ipn_signup_vars");
includes/classes/custom-reg-fields.inc.php CHANGED
@@ -108,7 +108,8 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
108
  {
109
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $option_line)
110
  {
111
- list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
 
112
  if($option_value === (string)$_value)
113
  {
114
  $gen = $option_label;
@@ -122,7 +123,8 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
122
  $selected_default_option = false;
123
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $option_line)
124
  {
125
- list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
 
126
  $gen .= '<option value="'.esc_attr($option_value).'"'.(((($option_default && !$_submission) || ($option_value === (string)$_value && !$selected_default_option)) && ($selected_default_option = true)) ? ' selected="selected"' : '').'>'.$option_label.'</option>';
127
  }
128
  $gen .= '</select>';
@@ -134,7 +136,8 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
134
  {
135
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $option_line)
136
  {
137
- list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
 
138
  if(in_array($option_value, (array)$_value))
139
  $gen .= $option_label.", ";
140
  }
@@ -148,7 +151,8 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
148
  $gen = '<select multiple="multiple" size="3"'.$common.'>';
149
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $option_line)
150
  {
151
- list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
 
152
  $gen .= '<option value="'.esc_attr($option_value).'"'.((($option_default && !$_submission) || in_array($option_value, (array)$_value)) ? ' selected="selected"' : '').'>'.$option_label.'</option>';
153
  }
154
  $gen .= '</select>';
@@ -184,7 +188,8 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
184
  {
185
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $i => $option_line)
186
  {
187
- list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
 
188
  if(in_array($option_value, (array)$_value))
189
  $gen .= $option_label.", ";
190
  }
@@ -201,7 +206,8 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
201
  {
202
  $common_i = preg_replace('/ id\="(.+?)"/', ' id="$1---'.($i).'"', $common);
203
 
204
- list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
 
205
 
206
  $gen .= ($i > 0) ? $sep : ''; // Separators can be filtered above.
207
  $gen .= '<input type="checkbox" value="'.esc_attr($option_value).'"';
@@ -216,7 +222,8 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
216
  {
217
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $i => $option_line)
218
  {
219
- list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
 
220
  if($option_value === (string)$_value)
221
  {
222
  $gen = $option_label;
@@ -233,7 +240,8 @@ if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
233
  {
234
  $common_i = preg_replace('/ id\="(.+?)"/', ' id="$1---'.($i).'"', $common);
235
 
236
- list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
 
237
 
238
  $gen .= ($i > 0) ? $sep : ''; // Separators can be filtered above.
239
  $gen .= '<input type="radio" value="'.esc_attr($option_value).'"';
108
  {
109
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $option_line)
110
  {
111
+ $option_value = $option_label = $option_default = "";
112
+ @list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
113
  if($option_value === (string)$_value)
114
  {
115
  $gen = $option_label;
123
  $selected_default_option = false;
124
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $option_line)
125
  {
126
+ $option_value = $option_label = $option_default = "";
127
+ @list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
128
  $gen .= '<option value="'.esc_attr($option_value).'"'.(((($option_default && !$_submission) || ($option_value === (string)$_value && !$selected_default_option)) && ($selected_default_option = true)) ? ' selected="selected"' : '').'>'.$option_label.'</option>';
129
  }
130
  $gen .= '</select>';
136
  {
137
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $option_line)
138
  {
139
+ $option_value = $option_label = $option_default = "";
140
+ @list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
141
  if(in_array($option_value, (array)$_value))
142
  $gen .= $option_label.", ";
143
  }
151
  $gen = '<select multiple="multiple" size="3"'.$common.'>';
152
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $option_line)
153
  {
154
+ $option_value = $option_label = $option_default = "";
155
+ @list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
156
  $gen .= '<option value="'.esc_attr($option_value).'"'.((($option_default && !$_submission) || in_array($option_value, (array)$_value)) ? ' selected="selected"' : '').'>'.$option_label.'</option>';
157
  }
158
  $gen .= '</select>';
188
  {
189
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $i => $option_line)
190
  {
191
+ $option_value = $option_label = $option_default = "";
192
+ @list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
193
  if(in_array($option_value, (array)$_value))
194
  $gen .= $option_label.", ";
195
  }
206
  {
207
  $common_i = preg_replace('/ id\="(.+?)"/', ' id="$1---'.($i).'"', $common);
208
 
209
+ $option_value = $option_label = $option_default = "";
210
+ @list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
211
 
212
  $gen .= ($i > 0) ? $sep : ''; // Separators can be filtered above.
213
  $gen .= '<input type="checkbox" value="'.esc_attr($option_value).'"';
222
  {
223
  foreach(preg_split("/[\r\n\t]+/", $field["options"]) as $i => $option_line)
224
  {
225
+ $option_value = $option_label = $option_default = "";
226
+ @list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
227
  if($option_value === (string)$_value)
228
  {
229
  $gen = $option_label;
240
  {
241
  $common_i = preg_replace('/ id\="(.+?)"/', ' id="$1---'.($i).'"', $common);
242
 
243
+ $option_value = $option_label = $option_default = "";
244
+ @list($option_value, $option_label, $option_default) = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/\|/", trim($option_line)));
245
 
246
  $gen .= ($i > 0) ? $sep : ''; // Separators can be filtered above.
247
  $gen .= '<input type="radio" value="'.esc_attr($option_value).'"';
includes/classes/files-in.inc.php CHANGED
@@ -124,7 +124,7 @@ if(!class_exists("c_ws_plugin__s2member_files_in"))
124
  return false;
125
  }
126
 
127
- else if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"] || ($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads()) === false)
128
  {
129
  if /* We only need remote functionality when/if we're actually serving. */($serving)
130
  if(!has_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization"))
@@ -134,7 +134,20 @@ if(!class_exists("c_ws_plugin__s2member_files_in"))
134
  if(has_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization"))
135
  remove_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization", 10, 2);
136
 
137
- if((isset($file_downloads_enabled_by_site_owner, $min_level_4_downloads) && $file_downloads_enabled_by_site_owner === false) || ($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads()) === false)
 
 
 
 
 
 
 
 
 
 
 
 
 
138
  {
139
  if /* We only need this section when/if we're actually serving. */($serving)
140
  {
@@ -370,6 +383,10 @@ if(!class_exists("c_ws_plugin__s2member_files_in"))
370
  if(function_exists("apache_setenv"))
371
  @apache_setenv("no-gzip", "1");
372
 
 
 
 
 
373
  while /* Cleans existing output buffers. */(@ob_end_clean());
374
 
375
  if /* Requesting a specific byte range? */($range)
@@ -378,7 +395,7 @@ if(!class_exists("c_ws_plugin__s2member_files_in"))
378
  {
379
  status_header(416);
380
  nocache_headers();
381
- header("Content-Encoding:");
382
  header("Accept-Ranges: bytes");
383
  header("Content-Type: ".$mimetype);
384
  header("Content-Length: ".$length);
@@ -394,7 +411,7 @@ if(!class_exists("c_ws_plugin__s2member_files_in"))
394
  {
395
  status_header(416);
396
  nocache_headers();
397
- header("Content-Encoding:");
398
  header("Accept-Ranges: bytes");
399
  header("Content-Type: ".$mimetype);
400
  header("Content-Length: ".$length);
@@ -407,7 +424,7 @@ if(!class_exists("c_ws_plugin__s2member_files_in"))
407
  {
408
  status_header(416);
409
  nocache_headers();
410
- header("Content-Encoding:");
411
  header("Accept-Ranges: bytes");
412
  header("Content-Type: ".$mimetype);
413
  header("Content-Length: ".$length);
@@ -440,7 +457,7 @@ if(!class_exists("c_ws_plugin__s2member_files_in"))
440
  {
441
  status_header(416);
442
  nocache_headers();
443
- header("Content-Encoding:");
444
  header("Accept-Ranges: bytes");
445
  header("Content-Type: ".$mimetype);
446
  header("Content-Length: ".$length);
@@ -450,7 +467,7 @@ if(!class_exists("c_ws_plugin__s2member_files_in"))
450
  // Range.
451
  status_header(206);
452
  nocache_headers();
453
- header("Content-Encoding:");
454
  header("Accept-Ranges: bytes");
455
  header("Content-Type: ".$mimetype);
456
  header("Content-Range: bytes ".$byte_range_start."-".$byte_range_stops."/".$length);
@@ -462,7 +479,7 @@ if(!class_exists("c_ws_plugin__s2member_files_in"))
462
  {
463
  status_header(200);
464
  nocache_headers();
465
- header("Content-Encoding:");
466
  header("Accept-Ranges: bytes");
467
  header("Content-Type: ".$mimetype);
468
  header("Content-Length: ".$length);
124
  return false;
125
  }
126
 
127
+ else // Default behavior; check file download access against the current user.
128
  {
129
  if /* We only need remote functionality when/if we're actually serving. */($serving)
130
  if(!has_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization"))
134
  if(has_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization"))
135
  remove_filter("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization", 10, 2);
136
 
137
+ if(!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"])
138
+ {
139
+ if /* We only need this section when/if we're actually serving. */($serving)
140
+ {
141
+ status_header(503);
142
+ header("Content-Type: text/html; charset=UTF-8");
143
+ while (@ob_end_clean ()); // Clean any existing output buffers.
144
+ exit(_x('<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <code>s2Member -› General Options -› Membership Options Page</code>.', "s2member-front", "s2member"));
145
+ }
146
+ else // Else return false.
147
+ return false;
148
+ }
149
+
150
+ else if(($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads()) === false)
151
  {
152
  if /* We only need this section when/if we're actually serving. */($serving)
153
  {
383
  if(function_exists("apache_setenv"))
384
  @apache_setenv("no-gzip", "1");
385
 
386
+ $content_encoding_header = "Content-Encoding:"; // Default value; standards compliant.
387
+ if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_content_encodong_none"])
388
+ $content_encoding_header = "Content-Encoding: none";
389
+
390
  while /* Cleans existing output buffers. */(@ob_end_clean());
391
 
392
  if /* Requesting a specific byte range? */($range)
395
  {
396
  status_header(416);
397
  nocache_headers();
398
+ header($content_encoding_header);
399
  header("Accept-Ranges: bytes");
400
  header("Content-Type: ".$mimetype);
401
  header("Content-Length: ".$length);
411
  {
412
  status_header(416);
413
  nocache_headers();
414
+ header($content_encoding_header);
415
  header("Accept-Ranges: bytes");
416
  header("Content-Type: ".$mimetype);
417
  header("Content-Length: ".$length);
424
  {
425
  status_header(416);
426
  nocache_headers();
427
+ header($content_encoding_header);
428
  header("Accept-Ranges: bytes");
429
  header("Content-Type: ".$mimetype);
430
  header("Content-Length: ".$length);
457
  {
458
  status_header(416);
459
  nocache_headers();
460
+ header($content_encoding_header);
461
  header("Accept-Ranges: bytes");
462
  header("Content-Type: ".$mimetype);
463
  header("Content-Length: ".$length);
467
  // Range.
468
  status_header(206);
469
  nocache_headers();
470
+ header($content_encoding_header);
471
  header("Accept-Ranges: bytes");
472
  header("Content-Type: ".$mimetype);
473
  header("Content-Range: bytes ".$byte_range_start."-".$byte_range_stops."/".$length);
479
  {
480
  status_header(200);
481
  nocache_headers();
482
+ header($content_encoding_header);
483
  header("Accept-Ranges: bytes");
484
  header("Content-Type: ".$mimetype);
485
  header("Content-Length: ".$length);
includes/classes/installation.inc.php CHANGED
@@ -78,37 +78,37 @@ if(!class_exists("c_ws_plugin__s2member_installation"))
78
  $like = "`meta_key` LIKE 's2member\_%' AND `meta_key` NOT LIKE '%s2member\_originating\_blog%'";
79
  $wpdb->query("UPDATE `".$wpdb->usermeta."` SET `meta_key` = CONCAT('".$wpdb->prefix."', `meta_key`) WHERE ".$like);
80
  }
81
-
82
  if /* Needs to be upgraded? */(!$v || !version_compare($v, "3.2.5", ">="))
83
  // Version 3.2.5 is where transient names were changed. They're prefixed now.
84
  {
85
  $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '\_transient\_%'");
86
  }
87
-
88
  if /* Needs to be upgraded? */(!$v || !version_compare($v, "3.2.6", ">="))
89
  // Version 3.2.6 fixed `s2member_ccaps_req` being stored empty and/or w/ one empty element in the array.
90
  {
91
  $wpdb->query("DELETE FROM `".$wpdb->postmeta."` WHERE `meta_key` = 's2member_ccaps_req' AND `meta_value` IN('','a:0:{}','a:1:{i:0;s:0:\"\";}')");
92
  }
93
-
94
  if(!$v || !version_compare($v, "110912", ">=") && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["filter_wp_query"] === array("all"))
95
  // s2Member v110912 changed the way the "all" option for Alternative Views was handled.
96
  {
97
  $notice = '<strong>IMPORTANT:</strong> This version of s2Member changes the way your <code>Alternative View Protections</code> work. Please review your options under: <code>s2Member -› Restriction Options -› Alternative View Protections</code>.';
98
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array("blog|network:plugins.php", "blog|network:ws-plugin--s2member-start", "blog|network:ws-plugin--s2member-mms-ops", "blog|network:ws-plugin--s2member-gen-ops", "blog|network:ws-plugin--s2member-res-ops"));
99
  }
100
-
101
  if($v && version_compare($v, "130316", "<=")) // This version disables logging by default.
102
  {
103
  c_ws_plugin__s2member_menu_pages::update_all_options(array("ws_plugin__s2member_gateway_debug_logs" => "0", "ws_plugin__s2member_gateway_debug_logs_extensive" => "0"), true, false, false, false, false);
104
-
105
  $notice = '<strong>IMPORTANT:</strong> This version of s2Member disables s2Member\'s debug logging by default (for added security). Please see: <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">s2Member -› Log Files (Debug) -› Configuration</a> for further details.';
106
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array("blog|network:plugins.php", "blog|network:ws-plugin--s2member-start", "blog|network:ws-plugin--s2member-mms-ops", "blog|network:ws-plugin--s2member-gen-ops", "blog|network:ws-plugin--s2member-res-ops"));
107
-
108
  $notice = '<strong>IMPORTANT / Regarding s2Member Security Badges:</strong> If debug logging is enabled, your site will no longer qualify for an s2Member Security Badge until you disable logging (and you MUST also download, and then delete any existing log files from the past). Please see KB Article: <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">s2Member Security Badges</a> for further details. If you have existing s2Member log files, you will need to delete those files from the server before your s2Member Security Badge can be re-enabled. s2Member stores log files here: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"])).'</code>. See also: <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">s2Member -› Log Files (Debug) -› Configuration</a> for further details.';
109
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array("blog|network:plugins.php", "blog|network:ws-plugin--s2member-start", "blog|network:ws-plugin--s2member-mms-ops", "blog|network:ws-plugin--s2member-gen-ops", "blog|network:ws-plugin--s2member-res-ops"));
110
  }
111
-
 
 
 
 
112
  $notice = '<strong>s2Member</strong> has been <strong>reactivated</strong>, with '.(($reactivation_reason === "levels") ? '<code>'.esc_html($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]).'</code> Membership Levels' : 'the latest version').'.<br />';
113
  $notice .= 'You now have version '.esc_html(WS_PLUGIN__S2MEMBER_VERSION).'. Your existing configuration remains.';
114
 
@@ -171,7 +171,7 @@ if(!class_exists("c_ws_plugin__s2member_installation"))
171
  c_ws_plugin__s2member_roles_caps::unlink_roles /* Unlink Roles/Caps. */();
172
 
173
  c_ws_plugin__s2member_files::remove_no_gzip_from_root_htaccess /* Remove GZIP exclusions. */();
174
-
175
  if(is_dir($files_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"]))
176
  {
177
  if(file_exists($htaccess = $files_dir."/.htaccess"))
78
  $like = "`meta_key` LIKE 's2member\_%' AND `meta_key` NOT LIKE '%s2member\_originating\_blog%'";
79
  $wpdb->query("UPDATE `".$wpdb->usermeta."` SET `meta_key` = CONCAT('".$wpdb->prefix."', `meta_key`) WHERE ".$like);
80
  }
 
81
  if /* Needs to be upgraded? */(!$v || !version_compare($v, "3.2.5", ">="))
82
  // Version 3.2.5 is where transient names were changed. They're prefixed now.
83
  {
84
  $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '\_transient\_%'");
85
  }
 
86
  if /* Needs to be upgraded? */(!$v || !version_compare($v, "3.2.6", ">="))
87
  // Version 3.2.6 fixed `s2member_ccaps_req` being stored empty and/or w/ one empty element in the array.
88
  {
89
  $wpdb->query("DELETE FROM `".$wpdb->postmeta."` WHERE `meta_key` = 's2member_ccaps_req' AND `meta_value` IN('','a:0:{}','a:1:{i:0;s:0:\"\";}')");
90
  }
 
91
  if(!$v || !version_compare($v, "110912", ">=") && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["filter_wp_query"] === array("all"))
92
  // s2Member v110912 changed the way the "all" option for Alternative Views was handled.
93
  {
94
  $notice = '<strong>IMPORTANT:</strong> This version of s2Member changes the way your <code>Alternative View Protections</code> work. Please review your options under: <code>s2Member -› Restriction Options -› Alternative View Protections</code>.';
95
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array("blog|network:plugins.php", "blog|network:ws-plugin--s2member-start", "blog|network:ws-plugin--s2member-mms-ops", "blog|network:ws-plugin--s2member-gen-ops", "blog|network:ws-plugin--s2member-res-ops"));
96
  }
 
97
  if($v && version_compare($v, "130316", "<=")) // This version disables logging by default.
98
  {
99
  c_ws_plugin__s2member_menu_pages::update_all_options(array("ws_plugin__s2member_gateway_debug_logs" => "0", "ws_plugin__s2member_gateway_debug_logs_extensive" => "0"), true, false, false, false, false);
100
+
101
  $notice = '<strong>IMPORTANT:</strong> This version of s2Member disables s2Member\'s debug logging by default (for added security). Please see: <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">s2Member -› Log Files (Debug) -› Configuration</a> for further details.';
102
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array("blog|network:plugins.php", "blog|network:ws-plugin--s2member-start", "blog|network:ws-plugin--s2member-mms-ops", "blog|network:ws-plugin--s2member-gen-ops", "blog|network:ws-plugin--s2member-res-ops"));
103
+
104
  $notice = '<strong>IMPORTANT / Regarding s2Member Security Badges:</strong> If debug logging is enabled, your site will no longer qualify for an s2Member Security Badge until you disable logging (and you MUST also download, and then delete any existing log files from the past). Please see KB Article: <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">s2Member Security Badges</a> for further details. If you have existing s2Member log files, you will need to delete those files from the server before your s2Member Security Badge can be re-enabled. s2Member stores log files here: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"])).'</code>. See also: <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">s2Member -› Log Files (Debug) -› Configuration</a> for further details.';
105
  c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array("blog|network:plugins.php", "blog|network:ws-plugin--s2member-start", "blog|network:ws-plugin--s2member-mms-ops", "blog|network:ws-plugin--s2member-gen-ops", "blog|network:ws-plugin--s2member-res-ops"));
106
  }
107
+ if($v && version_compare($v, "140128", "<=")) // This version introduces support for partial refunds.
108
+ {
109
+ if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,reversals") // `refunds,reversals` => `refunds,partial_refunds,reversals`
110
+ c_ws_plugin__s2member_menu_pages::update_all_options(array("ws_plugin__s2member_triggers_immediate_eot" => "refunds,partial_refunds,reversals"), true, false, false, false, false);
111
+ }
112
  $notice = '<strong>s2Member</strong> has been <strong>reactivated</strong>, with '.(($reactivation_reason === "levels") ? '<code>'.esc_html($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]).'</code> Membership Levels' : 'the latest version').'.<br />';
113
  $notice .= 'You now have version '.esc_html(WS_PLUGIN__S2MEMBER_VERSION).'. Your existing configuration remains.';
114
 
171
  c_ws_plugin__s2member_roles_caps::unlink_roles /* Unlink Roles/Caps. */();
172
 
173
  c_ws_plugin__s2member_files::remove_no_gzip_from_root_htaccess /* Remove GZIP exclusions. */();
174
+
175
  if(is_dir($files_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"]))
176
  {
177
  if(file_exists($htaccess = $files_dir."/.htaccess"))
includes/classes/list-servers.inc.php CHANGED
@@ -40,7 +40,7 @@ if (!class_exists ("c_ws_plugin__s2member_list_servers"))
40
  do_action ("ws_plugin__s2member_before_list_servers_integrated", get_defined_vars ());
41
 
42
  for /* Go through each Level; looking for a configured list. */ ($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
43
- if (!empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_mailchimp_list_ids"]) || !empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_aweber_list_ids"]))
44
  return apply_filters ("ws_plugin__s2member_list_servers_integrated", true, get_defined_vars ());
45
 
46
  return apply_filters ("ws_plugin__s2member_list_servers_integrated", false, get_defined_vars ());
@@ -94,9 +94,9 @@ if (!class_exists ("c_ws_plugin__s2member_list_servers"))
94
  {
95
  $mailchimp = array ("function" => __FUNCTION__, "func_get_args" => $args, "api_method" => "listSubscribe");
96
 
97
- if /* Trim this up. NO trailing white space. */ (($mailchimp["list"] = trim ($mailchimp_list)))
98
  {
99
- if /* Also contains Interest Groups? */ (strpos ($mailchimp["list"], "::") !== false)
100
  {
101
  list ($mailchimp["list_id"], $mailchimp["interest_groups_title"], $mailchimp["interest_groups"]) = preg_split ("/\:\:/", $mailchimp["list"], 3);
102
 
@@ -143,6 +143,45 @@ if (!class_exists ("c_ws_plugin__s2member_list_servers"))
143
  }
144
  }
145
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  if (!empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_aweber_list_ids"]))
147
  {
148
  foreach (preg_split ("/[\r\n\t\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_aweber_list_ids"]) as $aweber_list)
@@ -268,6 +307,53 @@ if (!class_exists ("c_ws_plugin__s2member_list_servers"))
268
  }
269
  }
270
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271
  if (!empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_aweber_list_ids"]))
272
  {
273
  foreach (preg_split ("/[\r\n\t\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_aweber_list_ids"]) as $aweber_list)
40
  do_action ("ws_plugin__s2member_before_list_servers_integrated", get_defined_vars ());
41
 
42
  for /* Go through each Level; looking for a configured list. */ ($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
43
+ if (!empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_mailchimp_list_ids"]) || !empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_getresponse_list_ids"]) || !empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $n . "_aweber_list_ids"]))
44
  return apply_filters ("ws_plugin__s2member_list_servers_integrated", true, get_defined_vars ());
45
 
46
  return apply_filters ("ws_plugin__s2member_list_servers_integrated", false, get_defined_vars ());
94
  {
95
  $mailchimp = array ("function" => __FUNCTION__, "func_get_args" => $args, "api_method" => "listSubscribe");
96
 
97
+ if (($mailchimp["list"] = trim ($mailchimp_list)))
98
  {
99
+ if (strpos ($mailchimp["list"], "::") !== false) // Also contains Interest Groups?
100
  {
101
  list ($mailchimp["list_id"], $mailchimp["interest_groups_title"], $mailchimp["interest_groups"]) = preg_split ("/\:\:/", $mailchimp["list"], 3);
102
 
143
  }
144
  }
145
 
146
+ if (!empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["getresponse_api_key"]) && !empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_getresponse_list_ids"]))
147
+ {
148
+ foreach (preg_split ("/[\r\n\t;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_getresponse_list_ids"]) as $getresponse_list)
149
+ {
150
+ $getresponse = array ("function" => __FUNCTION__, "func_get_args" => $args, "api_method" => "add_contact");
151
+
152
+ if (($getresponse["list_id"] = $getresponse["list"] = trim ($getresponse_list)))
153
+ {
154
+ $getresponse["api_headers"] = array("Content-Type" => "application/json");
155
+ $getresponse["api_params"] = array($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["getresponse_api_key"],
156
+ array("name" => trim($fname." ".$lname), "email" => $email, "ip" => $ip,
157
+ "campaign" => $getresponse["list_id"], "action" => "standard", "cycle_day" => 0,
158
+ "customs" => apply_filters ("ws_plugin__s2member_getresponse_customs_array", array(), get_defined_vars ())));
159
+ if(!$getresponse["api_params"][1]["ip"] || $getresponse["api_params"][1]["ip"] === "unknown") unset($getresponse["api_params"][1]["ip"]); // Remove if empty; causes API error.
160
+ $getresponse["api_request"] = json_encode(array("method" => $getresponse["api_method"], "params" => $getresponse["api_params"], "id" => uniqid("", TRUE)));
161
+
162
+ if (is_object($getresponse["api_response"] = // Post JSON-encoded request via getResponse API.
163
+ json_decode(c_ws_plugin__s2member_utils_urls::remote("https://api2.getresponse.com", $getresponse["api_request"],
164
+ array("headers" => $getresponse["api_headers"])))) && empty($getresponse["api_response"]->error)
165
+ && $getresponse["api_response"]->result->queued) $getresponse["api_success"] = $success = true;
166
+
167
+ $logt = c_ws_plugin__s2member_utilities::time_details ();
168
+ $logv = c_ws_plugin__s2member_utilities::ver_details ();
169
+ $logm = c_ws_plugin__s2member_utilities::mem_details ();
170
+ $log4 = $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] . "\nUser-Agent: " . $_SERVER["HTTP_USER_AGENT"];
171
+ $log4 = (is_multisite () && !is_main_site ()) ? ($_log4 = $current_blog->domain . $current_blog->path) . "\n" . $log4 : $log4;
172
+ $log2 = (is_multisite () && !is_main_site ()) ? "getresponse-api-4-" . trim (preg_replace ("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "getresponse-api.log";
173
+
174
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"])
175
+ if (is_dir ($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"]))
176
+ if (is_writable ($logs_dir) && c_ws_plugin__s2member_utils_logs::archive_oversize_log_files ())
177
+ file_put_contents ($logs_dir . "/" . $log2,
178
+ "LOG ENTRY: ".$logt . "\n" . $logv . "\n" . $logm . "\n" . $log4 . "\n" .
179
+ c_ws_plugin__s2member_utils_logs::conceal_private_info(var_export ($getresponse, true)) . "\n\n",
180
+ FILE_APPEND);
181
+ }
182
+ }
183
+ }
184
+
185
  if (!empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_aweber_list_ids"]))
186
  {
187
  foreach (preg_split ("/[\r\n\t\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_aweber_list_ids"]) as $aweber_list)
307
  }
308
  }
309
 
310
+ if (!empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["getresponse_api_key"]) && !empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_getresponse_list_ids"]))
311
+ {
312
+ foreach (preg_split ("/[\r\n\t;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_getresponse_list_ids"]) as $getresponse_list)
313
+ {
314
+ $getresponse = array ("function" => __FUNCTION__, "func_get_args" => $args, "api_method" => "get_contacts");
315
+
316
+ if (($getresponse["list_id"] = $getresponse["list"] = trim ($getresponse_list)))
317
+ {
318
+ $getresponse["api_headers"] = array("Content-Type" => "application/json");
319
+ $getresponse["api_params"] = array($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["getresponse_api_key"],
320
+ array("campaigns" => array($getresponse["list_id"]), "email" => array("EQUALS" => $email)));
321
+ $getresponse["api_request"] = json_encode(array("method" => $getresponse["api_method"], "params" => $getresponse["api_params"], "id" => uniqid("", TRUE)));
322
+
323
+ if (is_object($getresponse["api_response"] = // Post JSON-encoded request via getResponse API.
324
+ json_decode(c_ws_plugin__s2member_utils_urls::remote("https://api2.getresponse.com", $getresponse["api_request"],
325
+ array("headers" => $getresponse["api_headers"])))) && empty($getresponse["api_response"]->error)
326
+ && ($getresponse["api_response_contact_ids"] = array_keys((array)$getresponse["api_response"]->result))
327
+ && ($getresponse["api_response_contact_id"] = $getresponse["api_response_contact_ids"][0]))
328
+ {
329
+ $getresponse["api_method"] = "delete_contact"; // Update method now.
330
+ $getresponse["api_headers"] = array("Content-Type" => "application/json");
331
+ $getresponse["api_params"] = array($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["getresponse_api_key"], array("contact" => $getresponse["api_response_contact_id"]));
332
+ $getresponse["api_request"] = json_encode(array("method" => $getresponse["api_method"], "params" => $getresponse["api_params"], "id" => uniqid("", TRUE)));
333
+
334
+ if (is_object($getresponse["api_response"] = // Post JSON-encoded request via getResponse API.
335
+ json_decode(c_ws_plugin__s2member_utils_urls::remote("https://api2.getresponse.com", $getresponse["api_request"],
336
+ array("headers" => $getresponse["api_headers"])))) && empty($getresponse["api_response"]->error)
337
+ && $getresponse["api_response"]->result->deleted) $getresponse["api_success"] = $success = true;
338
+ }
339
+ $logt = c_ws_plugin__s2member_utilities::time_details ();
340
+ $logv = c_ws_plugin__s2member_utilities::ver_details ();
341
+ $logm = c_ws_plugin__s2member_utilities::mem_details ();
342
+ $log4 = $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] . "\nUser-Agent: " . $_SERVER["HTTP_USER_AGENT"];
343
+ $log4 = (is_multisite () && !is_main_site ()) ? ($_log4 = $current_blog->domain . $current_blog->path) . "\n" . $log4 : $log4;
344
+ $log2 = (is_multisite () && !is_main_site ()) ? "getresponse-api-4-" . trim (preg_replace ("/[^a-z0-9]/i", "-", $_log4), "-") . ".log" : "getresponse-api.log";
345
+
346
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["gateway_debug_logs"])
347
+ if (is_dir ($logs_dir = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["logs_dir"]))
348
+ if (is_writable ($logs_dir) && c_ws_plugin__s2member_utils_logs::archive_oversize_log_files ())
349
+ file_put_contents ($logs_dir . "/" . $log2,
350
+ "LOG ENTRY: ".$logt . "\n" . $logv . "\n" . $logm . "\n" . $log4 . "\n" .
351
+ c_ws_plugin__s2member_utils_logs::conceal_private_info(var_export ($getresponse, true)) . "\n\n",
352
+ FILE_APPEND);
353
+ }
354
+ }
355
+ }
356
+
357
  if (!empty ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_aweber_list_ids"]))
358
  {
359
  foreach (preg_split ("/[\r\n\t\s;,]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_aweber_list_ids"]) as $aweber_list)
includes/classes/login-redirects-r.inc.php CHANGED
@@ -59,8 +59,12 @@ if (!class_exists ("c_ws_plugin__s2member_login_redirects_r"))
59
  if($redirect_to && is_string ($redirect_to) && strpos($redirect_to, "wp-admin") === FALSE)
60
  {
61
  $redirect_to = preg_replace("/^https\:\/\//i", "http://", $redirect_to);
62
- if(stripos($redirect_to, "http://") !== 0) // Force an absolute URL in this case.
63
- $redirect_to = home_url($redirect_to, "http");
 
 
 
 
64
  }
65
  return $redirect_to;
66
  }
59
  if($redirect_to && is_string ($redirect_to) && strpos($redirect_to, "wp-admin") === FALSE)
60
  {
61
  $redirect_to = preg_replace("/^https\:\/\//i", "http://", $redirect_to);
62
+ if(stripos($redirect_to, "http://") !== 0) // Force absolute.
63
+ {
64
+ $home_path = trim((string)@parse_url(home_url('/'), PHP_URL_PATH), '/');
65
+ $http_home_base = trim(preg_replace('/\/'.preg_quote($home_path, '/').'\/$/', '', home_url('/', 'http')), '/');
66
+ $redirect_to = $http_home_base.'/'.ltrim($redirect_to, '/');
67
+ }
68
  }
69
  return $redirect_to;
70
  }
includes/classes/login-redirects.inc.php CHANGED
@@ -60,14 +60,18 @@ if (!class_exists ("c_ws_plugin__s2member_login_redirects"))
60
 
61
  if (($ok = true) && !is_super_admin ($user_id) && $username !== "demo" // Exclude super admins, the `demo` user, and anyone who can edit posts.
62
  && !apply_filters ("ws_plugin__s2member_disable_login_ip_restrictions", (($user->has_cap ("edit_posts")) ? true : false), get_defined_vars ()))
63
- $ok = c_ws_plugin__s2member_ip_restrictions::ip_restrictions_ok ($_SERVER["REMOTE_ADDR"], $username);
64
 
65
  if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_always_http"]) // Alter value of `redirect_to`?
66
  if(!empty ($_REQUEST["redirect_to"]) && is_string ($_REQUEST["redirect_to"]) && strpos($_REQUEST["redirect_to"], "wp-admin") === FALSE)
67
  {
68
  $_REQUEST["redirect_to"] = preg_replace("/^https\:\/\//i", "http://", $_REQUEST["redirect_to"]);
69
  if(stripos($_REQUEST["redirect_to"], "http://") !== 0) // Force an absolute URL in this case.
70
- $_REQUEST["redirect_to"] = home_url($_REQUEST["redirect_to"], "http");
 
 
 
 
71
  }
72
  if (($redirect = apply_filters ("ws_plugin__s2member_login_redirect", (($user->has_cap ("edit_posts")) ? false : true), get_defined_vars ())))
73
  {
@@ -84,14 +88,21 @@ if (!class_exists ("c_ws_plugin__s2member_login_redirects"))
84
  else if ($redirection_url = c_ws_plugin__s2member_login_redirects::login_redirection_url ($user))
85
  $redirect = $redirection_url; // Special redirection URL (overrides LWP).
86
 
87
- else // Else we use the Login Welcome Page configured for s2Member.
 
88
  $redirect = get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"]);
89
 
 
 
90
  if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_always_http"])
91
  {
92
  $redirect = preg_replace("/^https\:\/\//i", "http://", $redirect);
93
- if(stripos($redirect, "http://") !== 0) // Force an absolute URL in this case.
94
- $redirect = home_url($redirect, "http");
 
 
 
 
95
  }
96
  wp_redirect($redirect).exit();
97
  }
60
 
61
  if (($ok = true) && !is_super_admin ($user_id) && $username !== "demo" // Exclude super admins, the `demo` user, and anyone who can edit posts.
62
  && !apply_filters ("ws_plugin__s2member_disable_login_ip_restrictions", (($user->has_cap ("edit_posts")) ? true : false), get_defined_vars ()))
63
+ $ok = c_ws_plugin__s2member_ip_restrictions::ip_restrictions_ok ($_SERVER["REMOTE_ADDR"], strtolower($username));
64
 
65
  if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_always_http"]) // Alter value of `redirect_to`?
66
  if(!empty ($_REQUEST["redirect_to"]) && is_string ($_REQUEST["redirect_to"]) && strpos($_REQUEST["redirect_to"], "wp-admin") === FALSE)
67
  {
68
  $_REQUEST["redirect_to"] = preg_replace("/^https\:\/\//i", "http://", $_REQUEST["redirect_to"]);
69
  if(stripos($_REQUEST["redirect_to"], "http://") !== 0) // Force an absolute URL in this case.
70
+ {
71
+ $home_path = trim((string)@parse_url(home_url('/'), PHP_URL_PATH), '/');
72
+ $http_home_base = trim(preg_replace('/\/'.preg_quote($home_path, '/').'\/$/', '', home_url('/', 'http')), '/');
73
+ $_REQUEST["redirect_to"] = $http_home_base.'/'.ltrim($_REQUEST["redirect_to"], '/');
74
+ }
75
  }
76
  if (($redirect = apply_filters ("ws_plugin__s2member_login_redirect", (($user->has_cap ("edit_posts")) ? false : true), get_defined_vars ())))
77
  {
88
  else if ($redirection_url = c_ws_plugin__s2member_login_redirects::login_redirection_url ($user))
89
  $redirect = $redirection_url; // Special redirection URL (overrides LWP).
90
 
91
+ else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"])
92
+ // Else we use the Login Welcome Page configured for s2Member.
93
  $redirect = get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"]);
94
 
95
+ else $redirect = home_url("/"); // Default to the home page.
96
+
97
  if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_redirection_always_http"])
98
  {
99
  $redirect = preg_replace("/^https\:\/\//i", "http://", $redirect);
100
+ if(stripos($redirect, "http://") !== 0) // Force absolute.
101
+ {
102
+ $home_path = trim((string)@parse_url(home_url('/'), PHP_URL_PATH), '/');
103
+ $http_home_base = trim(preg_replace('/\/'.preg_quote($home_path, '/').'\/$/', '', home_url('/', 'http')), '/');
104
+ $redirect = $http_home_base.'/'.ltrim($redirect, '/');
105
+ }
106
  }
107
  wp_redirect($redirect).exit();
108
  }
includes/classes/paypal-notify-in-billing-agreement-signup.inc.php ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * s2Member's PayPal IPN handler (inner processing routine).
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\PayPal
15
+ * @since 140326
16
+ */
17
+ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
18
+ exit("Do not access this file directly.");
19
+
20
+ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_billing_agreement_signup"))
21
+ {
22
+ /**
23
+ * s2Member's PayPal IPN handler (inner processing routine).
24
+ *
25
+ * @package s2Member\PayPal
26
+ * @since 140326
27
+ */
28
+ class c_ws_plugin__s2member_paypal_notify_in_billing_agreement_signup
29
+ {
30
+ /**
31
+ * s2Member's PayPal IPN handler (inner processing routine).
32
+ *
33
+ * @package s2Member\PayPal
34
+ * @since 140326
35
+ *
36
+ * @param array $vars Required. An array of defined variables passed by {@link s2Member\PayPal\c_ws_plugin__s2member_paypal_notify_in::paypal_notify()}.
37
+ * @return array|bool The original ``$paypal`` array passed in (extracted) from ``$vars``, or false when conditions do NOT apply.
38
+ */
39
+ public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
+ {
41
+ extract($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
+
43
+ if (!empty ($paypal["txn_type"]) && preg_match ("/^mp_signup$/i", $paypal["txn_type"]))
44
+ {
45
+ foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
46
+ do_action ("ws_plugin__s2member_during_paypal_notify_before_billing_agreement_signup", get_defined_vars ());
47
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
48
+
49
+ if (!get_transient ($transient_ipn = "s2m_ipn_" . md5 ("s2member_transient_" . $_paypal_s)) && set_transient ($transient_ipn, time (), 31556926 * 10))
50
+ {
51
+ $paypal["s2member_log"][] = "s2Member `txn_type` identified as ( `mp_signup` ).";
52
+
53
+ $processing = $during = true; // Yes, we ARE processing this.
54
+
55
+ $paypal["s2member_log"][] = "The `txn_type` does not require any action on the part of s2Member.";
56
+ $paypal["s2member_log"][] = "s2Member Pro handles Billing Agreement signups on-site, with an IPN proxy.";
57
+
58
+ foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
59
+ do_action ("ws_plugin__s2member_during_paypal_notify_during_billing_agreement_signup", get_defined_vars ());
60
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
61
+ }
62
+ else // Else, this is a duplicate IPN. Must stop here.
63
+ {
64
+ $paypal["s2member_log"][] = "Not processing. Duplicate IPN.";
65
+ $paypal["s2member_log"][] = "s2Member `txn_type` identified as ( `mp_signup` ).";
66
+ $paypal["s2member_log"][] = "Duplicate IPN. Already processed. This IPN will be ignored.";
67
+ }
68
+
69
+ foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
70
+ do_action ("ws_plugin__s2member_during_paypal_notify_after_billing_agreement_signup", get_defined_vars ());
71
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
72
+
73
+ return apply_filters ("c_ws_plugin__s2member_paypal_notify_in_billing_agreement_signup", $paypal, get_defined_vars ());
74
+ }
75
+ else
76
+ return apply_filters ("c_ws_plugin__s2member_paypal_notify_in_billing_agreement_signup", false, get_defined_vars ());
77
+ }
78
+ }
79
+ }
80
+ ?>
includes/classes/paypal-notify-in-cart.inc.php CHANGED
@@ -38,11 +38,9 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_cart"))
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
- extract ($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
- if ((!empty ($paypal["txn_type"]) && preg_match ("/^cart$/i", $paypal["txn_type"]))
44
- && (empty ($paypal["payment_status"]) || empty ($payment_status_issues) || !preg_match ($payment_status_issues, $paypal["payment_status"]))
45
- && (!empty ($paypal["txn_id"])))
46
  {
47
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
48
  do_action ("ws_plugin__s2member_during_paypal_notify_before_cart", get_defined_vars ());
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
+ extract ($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
+ if (!empty ($paypal["txn_type"]) && preg_match ("/^cart$/i", $paypal["txn_type"]))
 
 
44
  {
45
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
46
  do_action ("ws_plugin__s2member_during_paypal_notify_before_cart", get_defined_vars ());
includes/classes/paypal-notify-in-express-checkout.inc.php CHANGED
@@ -38,11 +38,9 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_express_checkout"))
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
- extract($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
- if ((!empty ($paypal["txn_type"]) && preg_match ("/^express_checkout$/i", $paypal["txn_type"]))
44
- && (empty ($paypal["payment_status"]) || empty ($payment_status_issues) || !preg_match ($payment_status_issues, $paypal["payment_status"]))
45
- && (!empty ($paypal["txn_id"])))
46
  {
47
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
48
  do_action ("ws_plugin__s2member_during_paypal_notify_before_express_checkout", get_defined_vars ());
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
+ extract($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
+ if (!empty ($paypal["txn_type"]) && preg_match ("/^express_checkout$/i", $paypal["txn_type"]))
 
 
44
  {
45
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
46
  do_action ("ws_plugin__s2member_during_paypal_notify_before_express_checkout", get_defined_vars ());
includes/classes/paypal-notify-in-merch-pmt.inc.php ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * s2Member's PayPal IPN handler (inner processing routine).
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\PayPal
15
+ * @since 140326
16
+ */
17
+ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
18
+ exit("Do not access this file directly.");
19
+
20
+ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_merch_pmt"))
21
+ {
22
+ /**
23
+ * s2Member's PayPal IPN handler (inner processing routine).
24
+ *
25
+ * @package s2Member\PayPal
26
+ * @since 140326
27
+ */
28
+ class c_ws_plugin__s2member_paypal_notify_in_merch_pmt
29
+ {
30
+ /**
31
+ * s2Member's PayPal IPN handler (inner processing routine).
32
+ *
33
+ * @package s2Member\PayPal
34
+ * @since 140326
35
+ *
36
+ * @param array $vars Required. An array of defined variables passed by {@link s2Member\PayPal\c_ws_plugin__s2member_paypal_notify_in::paypal_notify()}.
37
+ * @return array|bool The original ``$paypal`` array passed in (extracted) from ``$vars``, or false when conditions do NOT apply.
38
+ */
39
+ public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
+ {
41
+ extract($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
+
43
+ if (!empty ($paypal["txn_type"]) && preg_match ("/^merch_pmt$/i", $paypal["txn_type"]))
44
+ {
45
+ foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
46
+ do_action ("ws_plugin__s2member_during_paypal_notify_before_merch_pmt", get_defined_vars ());
47
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
48
+
49
+ if (!get_transient ($transient_ipn = "s2m_ipn_" . md5 ("s2member_transient_" . $_paypal_s)) && set_transient ($transient_ipn, time (), 31556926 * 10))
50
+ {
51
+ $paypal["s2member_log"][] = "s2Member `txn_type` identified as ( `merch_pmt` ).";
52
+
53
+ $processing = $during = true; // Yes, we ARE processing this.
54
+
55
+ $paypal["s2member_log"][] = "The `txn_type` does not require any action on the part of s2Member.";
56
+ $paypal["s2member_log"][] = "s2Member Pro handles Merch Pmts on-site, with an IPN proxy.";
57
+
58
+ foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
59
+ do_action ("ws_plugin__s2member_during_paypal_notify_during_merch_pmt", get_defined_vars ());
60
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
61
+ }
62
+ else // Else, this is a duplicate IPN. Must stop here.
63
+ {
64
+ $paypal["s2member_log"][] = "Not processing. Duplicate IPN.";
65
+ $paypal["s2member_log"][] = "s2Member `txn_type` identified as ( `merch_pmt` ).";
66
+ $paypal["s2member_log"][] = "Duplicate IPN. Already processed. This IPN will be ignored.";
67
+ }
68
+
69
+ foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
70
+ do_action ("ws_plugin__s2member_during_paypal_notify_after_merch_pmt", get_defined_vars ());
71
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
72
+
73
+ return apply_filters ("c_ws_plugin__s2member_paypal_notify_in_merch_pmt", $paypal, get_defined_vars ());
74
+ }
75
+ else
76
+ return apply_filters ("c_ws_plugin__s2member_paypal_notify_in_merch_pmt", false, get_defined_vars ());
77
+ }
78
+ }
79
+ }
80
+ ?>
includes/classes/paypal-notify-in-rec-profile-creation-w-level.inc.php CHANGED
@@ -38,7 +38,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_rec_profile_creation_
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
- extract($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^recurring_payment_profile_created$/i", $paypal["txn_type"]))
44
  && ((!empty ($paypal["item_number"]) || ($paypal["item_number"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_number ($paypal))) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
+ extract($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^recurring_payment_profile_created$/i", $paypal["txn_type"]))
44
  && ((!empty ($paypal["item_number"]) || ($paypal["item_number"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_number ($paypal))) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
includes/classes/paypal-notify-in-send-money.inc.php CHANGED
@@ -38,11 +38,9 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_send_money"))
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
- extract($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
- if ((!empty ($paypal["txn_type"]) && preg_match ("/^send_money$/i", $paypal["txn_type"]))
44
- && (empty ($paypal["payment_status"]) || empty ($payment_status_issues) || !preg_match ($payment_status_issues, $paypal["payment_status"]))
45
- && (!empty ($paypal["txn_id"])))
46
  {
47
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
48
  do_action ("ws_plugin__s2member_during_paypal_notify_before_send_money", get_defined_vars ());
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
+ extract($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
+ if (!empty ($paypal["txn_type"]) && preg_match ("/^send_money$/i", $paypal["txn_type"]))
 
 
44
  {
45
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
46
  do_action ("ws_plugin__s2member_during_paypal_notify_before_send_money", get_defined_vars ());
includes/classes/paypal-notify-in-sp-refund-reversal.inc.php CHANGED
@@ -40,7 +40,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_sp_refund_reversal"))
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
- extract ($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if (((!empty ($paypal["txn_type"]) && preg_match ("/^new_case$/i", $paypal["txn_type"]) && !empty ($paypal["case_type"]) && preg_match ("/^chargeback$/i", $paypal["case_type"]))
46
  || (!empty ($paypal["payment_status"]) && preg_match ("/^(refunded|reversed|reversal)$/i", $paypal["payment_status"])) /* The "txn_type" is irrelevant in these special situations. */)
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
+ extract ($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if (((!empty ($paypal["txn_type"]) && preg_match ("/^new_case$/i", $paypal["txn_type"]) && !empty ($paypal["case_type"]) && preg_match ("/^chargeback$/i", $paypal["case_type"]))
46
  || (!empty ($paypal["payment_status"]) && preg_match ("/^(refunded|reversed|reversal)$/i", $paypal["payment_status"])) /* The "txn_type" is irrelevant in these special situations. */)
includes/classes/paypal-notify-in-subscr-modify-w-level.inc.php CHANGED
@@ -40,7 +40,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_subscr_modify_w_level
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
- extract($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^subscr_modify$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
@@ -107,6 +107,11 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_subscr_modify_w_level
107
 
108
  update_user_option ($user_id, "s2member_subscr_gateway", $paypal["subscr_gateway"]);
109
  update_user_option ($user_id, "s2member_subscr_id", $paypal["subscr_id"]);
 
 
 
 
 
110
  update_user_option ($user_id, "s2member_custom", $paypal["custom"]);
111
 
112
  if (!get_user_option ("s2member_registration_ip", $user_id))
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
+ extract($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^subscr_modify$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
107
 
108
  update_user_option ($user_id, "s2member_subscr_gateway", $paypal["subscr_gateway"]);
109
  update_user_option ($user_id, "s2member_subscr_id", $paypal["subscr_id"]);
110
+
111
+ if(!empty($paypal["subscr_baid"]))
112
+ update_user_option ($user_id, "s2member_subscr_baid", $paypal["subscr_baid"]);
113
+ else delete_user_option ($user_id, "s2member_subscr_baid");
114
+
115
  update_user_option ($user_id, "s2member_custom", $paypal["custom"]);
116
 
117
  if (!get_user_option ("s2member_registration_ip", $user_id))
includes/classes/paypal-notify-in-subscr-or-rp-cancellation-w-level.inc.php CHANGED
@@ -40,9 +40,9 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_cancella
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
- extract ($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
- if ((!empty ($paypal["txn_type"]) && preg_match ("/^(subscr_cancel|recurring_payment_profile_cancel)$/i", $paypal["txn_type"]))
46
  && !(preg_match ("/^recurring_payment_profile_cancel$/i", $paypal["txn_type"]) && !empty ($paypal["initial_payment_status"]) && preg_match ("/^failed$/i", $paypal["initial_payment_status"]))
47
  && ((!empty ($paypal["item_number"]) || ($paypal["item_number"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_number ($paypal))) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
48
  && (!empty ($paypal["period1"]) || ($paypal["period1"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period1 ($paypal)) || ($paypal["period1"] = "0 D"))
@@ -57,7 +57,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_cancella
57
 
58
  if (!get_transient ($transient_ipn = "s2m_ipn_" . md5 ("s2member_transient_" . $_paypal_s)) && set_transient ($transient_ipn, time (), 31556926 * 10))
59
  {
60
- $paypal["s2member_log"][] = "s2Member `txn_type` identified as ( `subscr_cancel|recurring_payment_profile_cancel` ).";
61
 
62
  list ($paypal["level"], $paypal["ccaps"]) = preg_split ("/\:/", $paypal["item_number"], 3);
63
 
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
+ extract ($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
+ if ((!empty ($paypal["txn_type"]) && preg_match ("/^(subscr_cancel|recurring_payment_profile_cancel|mp_cancel)$/i", $paypal["txn_type"]))
46
  && !(preg_match ("/^recurring_payment_profile_cancel$/i", $paypal["txn_type"]) && !empty ($paypal["initial_payment_status"]) && preg_match ("/^failed$/i", $paypal["initial_payment_status"]))
47
  && ((!empty ($paypal["item_number"]) || ($paypal["item_number"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_number ($paypal))) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
48
  && (!empty ($paypal["period1"]) || ($paypal["period1"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_period1 ($paypal)) || ($paypal["period1"] = "0 D"))
57
 
58
  if (!get_transient ($transient_ipn = "s2m_ipn_" . md5 ("s2member_transient_" . $_paypal_s)) && set_transient ($transient_ipn, time (), 31556926 * 10))
59
  {
60
+ $paypal["s2member_log"][] = "s2Member `txn_type` identified as ( `subscr_cancel|recurring_payment_profile_cancel|mp_cancel` ).";
61
 
62
  list ($paypal["level"], $paypal["ccaps"]) = preg_split ("/\:/", $paypal["item_number"], 3);
63
 
includes/classes/paypal-notify-in-subscr-or-rp-eots-w-level.inc.php CHANGED
@@ -40,7 +40,7 @@ if(!class_exists("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
40
  */
41
  public static function cp($vars = array()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
- extract($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if(((!empty($paypal["txn_type"]) && preg_match("/^(subscr_eot|recurring_payment_expired|recurring_payment_suspended_due_to_max_failed_payment)$/i", $paypal["txn_type"]) && ($recurring = true))
46
  || (!empty($paypal["txn_type"]) && preg_match("/^recurring_payment_profile_cancel$/i", $paypal["txn_type"]) && !empty($paypal["initial_payment_status"]) && preg_match("/^failed$/i", $paypal["initial_payment_status"]) && ($recurring = true))
@@ -63,12 +63,14 @@ if(!class_exists("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
63
  $is_reversal = (preg_match("/^(reversed|reversal)$/i", $paypal["payment_status"]) && $paypal["parent_txn_id"]);
64
  $is_reversal = (!$is_reversal) ? (preg_match("/^new_case$/i", $paypal["txn_type"]) && preg_match("/^chargeback$/i", $paypal["case_type"])) : $is_reversal;
65
  $is_refund_or_reversal = ($is_refund || $is_reversal); // If either of the previous tests above evaluated to true; then it's obviously a Refund and/or a Reversal.
 
 
 
66
  $is_delayed_eot = (!$is_refund_or_reversal && preg_match("/^(subscr_eot|recurring_payment_expired)$/i", $paypal["txn_type"]) && preg_match("/^I-/i", $paypal["subscr_id"]));
67
 
68
  if($is_refund_or_reversal)
69
  $paypal["s2member_log"][] = "s2Member `txn_type` identified as ".($identified_as = "( `[empty or irrelevant]` ) w/ `payment_status` ( `refunded|reversed|reversal` ) - or - `new_case` w/ `case_type` ( `chargeback` )").".";
70
- else
71
- $paypal["s2member_log"][] = "s2Member `txn_type` identified as ".($identified_as = "( `subscr_eot|recurring_payment_expired|recurring_payment_suspended_due_to_max_failed_payment` ) - or - `recurring_payment_profile_cancel` w/ `initial_payment_status` ( `failed` )").".";
72
 
73
  if(empty($_REQUEST["s2member_paypal_proxy"])) // Only on true PayPal IPNs; e.g. we can bypass this on proxied IPNs.
74
  {
@@ -85,11 +87,11 @@ if(!class_exists("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
85
  $user_reg_ip = get_user_option("s2member_registration_ip", $user_id); // Needed below.
86
  $user_reg_ip = $paypal["ip"] = ($user_reg_ip) ? $user_reg_ip : $paypal["ip"];
87
 
88
- if( // Here we take action, BUT based on Auto EOT Behavior options; as configured by the Site Owner.
89
- (!$is_refund_or_reversal && !$is_delayed_eot && !get_user_option("s2member_auto_eot_time", $user_id))
90
- || ($is_refund_or_reversal && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,reversals")
91
- || ($is_reversal && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "reversals")
92
- || ($is_refund && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds"))
93
  {
94
  if(!$user->has_cap("administrator")) // Do NOT process this routine on Administrators.
95
  {
@@ -122,6 +124,7 @@ if(!class_exists("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
122
 
123
  delete_user_option($user_id, "s2member_custom");
124
  delete_user_option($user_id, "s2member_subscr_id");
 
125
  delete_user_option($user_id, "s2member_subscr_gateway");
126
 
127
  delete_user_option($user_id, "s2member_ipn_signup_vars");
@@ -293,11 +296,14 @@ if(!class_exists("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
293
  else if(!$is_refund_or_reversal || $is_delayed_eot)
294
  $paypal["s2member_log"][] = "Skipping (demote|delete) Member, for now. An Auto-EOT Time is already set for this account. When an Auto-EOT Time has been recorded, s2Member will handle EOT (demote|delete) events using it's own Auto-EOT System - internally.";
295
 
 
 
 
 
 
 
296
  else if($is_reversal)
297
  $paypal["s2member_log"][] = "Skipping (demote|delete) Member. Your configuration dictates that s2Member should NOT take any immediate action on an EOT associated with a Chargeback Reversal. An s2Member API Notification will still be processed however.";
298
-
299
- else if($is_refund)
300
- $paypal["s2member_log"][] = "Skipping (demote|delete) Member. Your configuration dictates that s2Member should NOT take any immediate action on an EOT associated with a Refund. An s2Member API Notification will still be processed however.";
301
  }
302
  else if($is_delayed_eot) // Otherwise, we need to re-generate/store this IPN into a Transient Queue. Then re-process it on registration.
303
  {
40
  */
41
  public static function cp($vars = array()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
+ extract($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if(((!empty($paypal["txn_type"]) && preg_match("/^(subscr_eot|recurring_payment_expired|recurring_payment_suspended_due_to_max_failed_payment)$/i", $paypal["txn_type"]) && ($recurring = true))
46
  || (!empty($paypal["txn_type"]) && preg_match("/^recurring_payment_profile_cancel$/i", $paypal["txn_type"]) && !empty($paypal["initial_payment_status"]) && preg_match("/^failed$/i", $paypal["initial_payment_status"]) && ($recurring = true))
63
  $is_reversal = (preg_match("/^(reversed|reversal)$/i", $paypal["payment_status"]) && $paypal["parent_txn_id"]);
64
  $is_reversal = (!$is_reversal) ? (preg_match("/^new_case$/i", $paypal["txn_type"]) && preg_match("/^chargeback$/i", $paypal["case_type"])) : $is_reversal;
65
  $is_refund_or_reversal = ($is_refund || $is_reversal); // If either of the previous tests above evaluated to true; then it's obviously a Refund and/or a Reversal.
66
+ $is_partial_refund = // Partial refund detection. All refunds processed against Subscriptions are considered partials. Full refunds occur only against Buy Now transactions.
67
+ (!$is_refund || (!empty($paypal["mc_gross"]) && ($original_txn_type = c_ws_plugin__s2member_utils_users::get_user_ipn_signup_var("txn_type", FALSE, $paypal["subscr_id"])) === "web_accept"
68
+ && ($original_mc_gross = c_ws_plugin__s2member_utils_users::get_user_ipn_signup_var("mc_gross", FALSE, $paypal["subscr_id"])) <= abs($paypal["mc_gross"]))) ? FALSE : TRUE;
69
  $is_delayed_eot = (!$is_refund_or_reversal && preg_match("/^(subscr_eot|recurring_payment_expired)$/i", $paypal["txn_type"]) && preg_match("/^I-/i", $paypal["subscr_id"]));
70
 
71
  if($is_refund_or_reversal)
72
  $paypal["s2member_log"][] = "s2Member `txn_type` identified as ".($identified_as = "( `[empty or irrelevant]` ) w/ `payment_status` ( `refunded|reversed|reversal` ) - or - `new_case` w/ `case_type` ( `chargeback` )").".";
73
+ else $paypal["s2member_log"][] = "s2Member `txn_type` identified as ".($identified_as = "( `subscr_eot|recurring_payment_expired|recurring_payment_suspended_due_to_max_failed_payment` ) - or - `recurring_payment_profile_cancel` w/ `initial_payment_status` ( `failed` )").".";
 
74
 
75
  if(empty($_REQUEST["s2member_paypal_proxy"])) // Only on true PayPal IPNs; e.g. we can bypass this on proxied IPNs.
76
  {
87
  $user_reg_ip = get_user_option("s2member_registration_ip", $user_id); // Needed below.
88
  $user_reg_ip = $paypal["ip"] = ($user_reg_ip) ? $user_reg_ip : $paypal["ip"];
89
 
90
+ if((!$is_refund_or_reversal && !$is_delayed_eot && !get_user_option("s2member_auto_eot_time", $user_id))
91
+ || ($is_refund_or_reversal && $is_partial_refund && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,partial_refunds,reversals")
92
+ || ($is_refund_or_reversal && !$is_partial_refund && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,reversals")
93
+ || ($is_refund && !$is_partial_refund && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds")
94
+ || ($is_reversal && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "reversals"))
95
  {
96
  if(!$user->has_cap("administrator")) // Do NOT process this routine on Administrators.
97
  {
124
 
125
  delete_user_option($user_id, "s2member_custom");
126
  delete_user_option($user_id, "s2member_subscr_id");
127
+ delete_user_option($user_id, "s2member_subscr_baid");
128
  delete_user_option($user_id, "s2member_subscr_gateway");
129
 
130
  delete_user_option($user_id, "s2member_ipn_signup_vars");
296
  else if(!$is_refund_or_reversal || $is_delayed_eot)
297
  $paypal["s2member_log"][] = "Skipping (demote|delete) Member, for now. An Auto-EOT Time is already set for this account. When an Auto-EOT Time has been recorded, s2Member will handle EOT (demote|delete) events using it's own Auto-EOT System - internally.";
298
 
299
+ else if($is_refund && $is_partial_refund)
300
+ $paypal["s2member_log"][] = "Skipping (demote|delete) Member. Your configuration dictates that s2Member should NOT take any immediate action on an EOT associated with a Partial Refund. An s2Member API Notification will still be processed however.";
301
+
302
+ else if($is_refund && !$is_partial_refund)
303
+ $paypal["s2member_log"][] = "Skipping (demote|delete) Member. Your configuration dictates that s2Member should NOT take any immediate action on an EOT associated with a Full Refund. An s2Member API Notification will still be processed however.";
304
+
305
  else if($is_reversal)
306
  $paypal["s2member_log"][] = "Skipping (demote|delete) Member. Your configuration dictates that s2Member should NOT take any immediate action on an EOT associated with a Chargeback Reversal. An s2Member API Notification will still be processed however.";
 
 
 
307
  }
308
  else if($is_delayed_eot) // Otherwise, we need to re-generate/store this IPN into a Transient Queue. Then re-process it on registration.
309
  {
includes/classes/paypal-notify-in-subscr-or-rp-payment-failed-w-level.inc.php CHANGED
@@ -38,7 +38,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
- extract($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^(subscr_failed|recurring_payment_failed|recurring_payment_skipped)$/i", $paypal["txn_type"]))
44
  && ((!empty ($paypal["item_number"]) || ($paypal["item_number"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_number ($paypal))) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
+ extract($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^(subscr_failed|recurring_payment_failed|recurring_payment_skipped)$/i", $paypal["txn_type"]))
44
  && ((!empty ($paypal["item_number"]) || ($paypal["item_number"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_number ($paypal))) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
includes/classes/paypal-notify-in-subscr-or-rp-payment-w-level.inc.php CHANGED
@@ -40,7 +40,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
- extract ($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^(subscr_payment|recurring_payment)$/i", $paypal["txn_type"]))
46
  && ((!empty ($paypal["item_number"]) || ($paypal["item_number"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_number ($paypal))) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
+ extract ($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^(subscr_payment|recurring_payment)$/i", $paypal["txn_type"]))
46
  && ((!empty ($paypal["item_number"]) || ($paypal["item_number"] = c_ws_plugin__s2member_paypal_utilities::paypal_pro_item_number ($paypal))) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
includes/classes/paypal-notify-in-subscr-or-wa-w-level.inc.php CHANGED
@@ -40,7 +40,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_subscr_or_wa_w_level"
40
  */
41
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
42
  {
43
- extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ ($vars);
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^(web_accept|subscr_signup)$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
@@ -126,6 +126,11 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_subscr_or_wa_w_level"
126
 
127
  update_user_option ($user_id, "s2member_subscr_gateway", $paypal["subscr_gateway"]);
128
  update_user_option ($user_id, "s2member_subscr_id", $paypal["subscr_id"]);
 
 
 
 
 
129
  update_user_option ($user_id, "s2member_custom", $paypal["custom"]);
130
 
131
  if (!get_user_option ("s2member_registration_ip", $user_id))
40
  */
41
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
42
  {
43
+ extract ($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^(web_accept|subscr_signup)$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
126
 
127
  update_user_option ($user_id, "s2member_subscr_gateway", $paypal["subscr_gateway"]);
128
  update_user_option ($user_id, "s2member_subscr_id", $paypal["subscr_id"]);
129
+
130
+ if(!empty($paypal["subscr_baid"]))
131
+ update_user_option ($user_id, "s2member_subscr_baid", $paypal["subscr_baid"]);
132
+ else delete_user_option ($user_id, "s2member_subscr_baid");
133
+
134
  update_user_option ($user_id, "s2member_custom", $paypal["custom"]);
135
 
136
  if (!get_user_option ("s2member_registration_ip", $user_id))
includes/classes/paypal-notify-in-virtual-terminal.inc.php CHANGED
@@ -38,11 +38,9 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_virtual_terminal"))
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
- extract($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
- if ((!empty ($paypal["txn_type"]) && preg_match ("/^virtual_terminal$/i", $paypal["txn_type"]))
44
- && (empty ($paypal["payment_status"]) || empty ($payment_status_issues) || !preg_match ($payment_status_issues, $paypal["payment_status"]))
45
- && (!empty ($paypal["txn_id"])))
46
  {
47
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
48
  do_action ("ws_plugin__s2member_during_paypal_notify_before_virtual_terminal", get_defined_vars ());
38
  */
39
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
40
  {
41
+ extract($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
 
43
+ if (!empty ($paypal["txn_type"]) && preg_match ("/^virtual_terminal$/i", $paypal["txn_type"]))
 
 
44
  {
45
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
46
  do_action ("ws_plugin__s2member_during_paypal_notify_before_virtual_terminal", get_defined_vars ());
includes/classes/paypal-notify-in-wa-ccaps-wo-level.inc.php CHANGED
@@ -40,7 +40,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_wa_ccaps_wo_level"))
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
- extract ($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^web_accept$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_wo_level_regex"], $paypal["item_number"]))
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
+ extract ($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^web_accept$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_wo_level_regex"], $paypal["item_number"]))
includes/classes/paypal-notify-in-web-accept-sp.inc.php CHANGED
@@ -40,7 +40,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_web_accept_sp"))
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
- extract ($vars); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^web_accept$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["sp_access_item_number_regex"], $paypal["item_number"]))
40
  */
41
  public static function cp ($vars = array ()) // Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
42
  {
43
+ extract ($vars, EXTR_OVERWRITE | EXTR_REFS); // Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``.
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^web_accept$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["sp_access_item_number_regex"], $paypal["item_number"]))
includes/classes/paypal-notify-in.inc.php CHANGED
@@ -62,6 +62,10 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in"))
62
  $email_configs_were_on = c_ws_plugin__s2member_email_configs::email_config_status (); // Filters on?
63
  c_ws_plugin__s2member_email_configs::email_config_release (); // Release s2Member Filters.
64
 
 
 
 
 
65
  if (is_array ($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_postvars ()) && ($_paypal = $paypal) && ($_paypal_s = serialize ($_paypal)))
66
  {
67
  $paypal["s2member_log"][] = "IPN received on: " . date ("D M j, Y g:i:s a T");
@@ -69,14 +73,21 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in"))
69
 
70
  $payment_status_issues = "/^(failed|denied|expired|refunded|partially_refunded|reversed|reversal|canceled_reversal|voided)$/i";
71
 
72
- $paypal["subscr_gateway"] = (!empty ($_REQUEST["s2member_paypal_proxy"])) ? esc_html (trim (stripslashes ($_REQUEST["s2member_paypal_proxy"]))) : "paypal";
73
 
74
  $coupon = (!empty($_REQUEST["s2member_paypal_proxy_coupon"]) && is_array($_REQUEST["s2member_paypal_proxy_coupon"])) ? stripslashes_deep($_REQUEST["s2member_paypal_proxy_coupon"]) : array();
75
  $coupon = (isset($coupon["full_coupon_code"], $coupon["coupon_code"], $coupon["affiliate_id"]) && is_string($coupon["full_coupon_code"]) && is_string($coupon["coupon_code"]) && is_string($coupon["affiliate_id"])) ? $coupon : array("full_coupon_code" => "", "coupon_code" => "", "affiliate_id" => "");
76
 
77
- if (empty ($paypal["custom"]) && !empty ($paypal["recurring_payment_id"])) // Lookup on Recurring Profiles?
 
 
 
 
78
  $paypal["custom"] = c_ws_plugin__s2member_utils_users::get_user_custom_with ($paypal["recurring_payment_id"]);
79
 
 
 
 
80
  if (!empty ($paypal["custom"]) && preg_match ("/^" . preg_quote (preg_replace ("/\:([0-9]+)$/", "", $_SERVER["HTTP_HOST"]), "/") . "/i", $paypal["custom"]))
81
  {
82
  $paypal["s2member_log"][] = "s2Member originating domain ( `\$_SERVER[\"HTTP_HOST\"]` ) validated.";
@@ -128,6 +139,12 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in"))
128
  else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_sp_refund_reversal::cp (get_defined_vars ())))
129
  $paypal = $_paypal_cp;
130
 
 
 
 
 
 
 
131
  else // Ignoring this IPN request. The txn_type/status does NOT require any action.
132
  $paypal["s2member_log"][] = "Ignoring this IPN request. The `txn_type/status` does NOT require any action on the part of s2Member.";
133
  }
@@ -135,13 +152,13 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in"))
135
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
136
  }
137
 
138
- else if (!empty ($paypal["txn_type"]) && preg_match ("/^recurring_payment_profile_cancel$/i", $paypal["txn_type"]))
139
  {
140
  $paypal["s2member_log"][] = "Transaction type ( `recurring_payment_profile_cancel` ), but there is no match to an existing account; so verification of `\$_SERVER[\"HTTP_HOST\"]` was not possible.";
141
  $paypal["s2member_log"][] = "It's likely this account was just upgraded/downgraded by s2Member Pro; so the Subscr. ID has probably been updated on-site; nothing to worry about here.";
142
  }
143
 
144
- else if (!empty ($paypal["txn_type"]) && preg_match ("/^recurring_/i", $paypal["txn_type"])) // Otherwise, is this a ^recurring_ txn_type?
145
  $paypal["s2member_log"][] = "Transaction type ( `^recurring_?` ), but there is no match to an existing account; so verification of `\$_SERVER[\"HTTP_HOST\"]` was not possible.";
146
 
147
  else // Else, use the default ``$_SERVER["HTTP_HOST"]`` error.
@@ -159,22 +176,22 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in"))
159
  Add IPN proxy (when available) to the ``$paypal`` array.
160
  */
161
  if (!empty ($_REQUEST["s2member_paypal_proxy"]))
162
- $paypal["s2member_paypal_proxy"] = $_REQUEST["s2member_paypal_proxy"];
163
  /*
164
  Add IPN proxy use vars (when available) to the ``$paypal`` array.
165
  */
166
  if (!empty ($_REQUEST["s2member_paypal_proxy_use"]))
167
- $paypal["s2member_paypal_proxy_use"] = $_REQUEST["s2member_paypal_proxy_use"];
168
  /*
169
  Add IPN proxy coupon vars (when available) to the ``$paypal`` array.
170
  */
171
  if (!empty ($_REQUEST["s2member_paypal_proxy_coupon"]))
172
- $paypal["s2member_paypal_proxy_coupon"] = $_REQUEST["s2member_paypal_proxy_coupon"];
173
  /*
174
  Also add IPN proxy self-verification (when available) to the ``$paypal`` array.
175
  */
176
  if (!empty ($_REQUEST["s2member_paypal_proxy_verification"]))
177
- $paypal["s2member_paypal_proxy_verification"] = $_REQUEST["s2member_paypal_proxy_verification"];
178
  /*
179
  If debugging/logging is enabled; we need to append ``$paypal`` to the log file.
180
  Logging now supports Multisite Networking as well.
62
  $email_configs_were_on = c_ws_plugin__s2member_email_configs::email_config_status (); // Filters on?
63
  c_ws_plugin__s2member_email_configs::email_config_release (); // Release s2Member Filters.
64
 
65
+ $paypal = array(); // Initialize PayPal array; we also reference this with a variable for a possible proxy handler.
66
+ if(!empty($_REQUEST["s2member_paypal_proxy"]) && in_array($_REQUEST["s2member_paypal_proxy"], array("alipay", "authnet", "clickbank", "ccbill", "google"), TRUE))
67
+ ${esc_html(trim(stripslashes($_REQUEST["s2member_paypal_proxy"])))} = &$paypal; // Internal alias by reference.
68
+
69
  if (is_array ($paypal = c_ws_plugin__s2member_paypal_utilities::paypal_postvars ()) && ($_paypal = $paypal) && ($_paypal_s = serialize ($_paypal)))
70
  {
71
  $paypal["s2member_log"][] = "IPN received on: " . date ("D M j, Y g:i:s a T");
73
 
74
  $payment_status_issues = "/^(failed|denied|expired|refunded|partially_refunded|reversed|reversal|canceled_reversal|voided)$/i";
75
 
76
+ $paypal["subscr_gateway"] = (!empty ($_REQUEST["s2member_paypal_proxy"])) ? esc_html(trim(stripslashes($_REQUEST["s2member_paypal_proxy"]))) : "paypal";
77
 
78
  $coupon = (!empty($_REQUEST["s2member_paypal_proxy_coupon"]) && is_array($_REQUEST["s2member_paypal_proxy_coupon"])) ? stripslashes_deep($_REQUEST["s2member_paypal_proxy_coupon"]) : array();
79
  $coupon = (isset($coupon["full_coupon_code"], $coupon["coupon_code"], $coupon["affiliate_id"]) && is_string($coupon["full_coupon_code"]) && is_string($coupon["coupon_code"]) && is_string($coupon["affiliate_id"])) ? $coupon : array("full_coupon_code" => "", "coupon_code" => "", "affiliate_id" => "");
80
 
81
+ if(!empty($paypal["txn_type"]) && $paypal["txn_type"] === "merch_pmt")
82
+ // This is mostly irrelevant, but it helps to keep the logs cleaner.
83
+ sleep(5); // Wait for Pro Form procesing to complete.
84
+
85
+ if (empty ($paypal["custom"]) && !empty ($paypal["recurring_payment_id"])) // Recurring Profile ID.
86
  $paypal["custom"] = c_ws_plugin__s2member_utils_users::get_user_custom_with ($paypal["recurring_payment_id"]);
87
 
88
+ else if (empty ($paypal["custom"]) && !empty ($paypal["mp_id"])) // Lookup; based on a Billing Agreement ID.
89
+ $paypal["custom"] = c_ws_plugin__s2member_utils_users::get_user_custom_with ($paypal["mp_id"]);
90
+
91
  if (!empty ($paypal["custom"]) && preg_match ("/^" . preg_quote (preg_replace ("/\:([0-9]+)$/", "", $_SERVER["HTTP_HOST"]), "/") . "/i", $paypal["custom"]))
92
  {
93
  $paypal["s2member_log"][] = "s2Member originating domain ( `\$_SERVER[\"HTTP_HOST\"]` ) validated.";
139
  else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_sp_refund_reversal::cp (get_defined_vars ())))
140
  $paypal = $_paypal_cp;
141
 
142
+ else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_billing_agreement_signup::cp (get_defined_vars ())))
143
+ $paypal = $_paypal_cp;
144
+
145
+ else if (($_paypal_cp = c_ws_plugin__s2member_paypal_notify_in_merch_pmt::cp (get_defined_vars ())))
146
+ $paypal = $_paypal_cp;
147
+
148
  else // Ignoring this IPN request. The txn_type/status does NOT require any action.
149
  $paypal["s2member_log"][] = "Ignoring this IPN request. The `txn_type/status` does NOT require any action on the part of s2Member.";
150
  }
152
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
153
  }
154
 
155
+ else if (!empty ($paypal["txn_type"]) && preg_match("/^recurring_payment_profile_cancel$/i", $paypal["txn_type"]))
156
  {
157
  $paypal["s2member_log"][] = "Transaction type ( `recurring_payment_profile_cancel` ), but there is no match to an existing account; so verification of `\$_SERVER[\"HTTP_HOST\"]` was not possible.";
158
  $paypal["s2member_log"][] = "It's likely this account was just upgraded/downgraded by s2Member Pro; so the Subscr. ID has probably been updated on-site; nothing to worry about here.";
159
  }
160
 
161
+ else if (!empty ($paypal["txn_type"]) && preg_match("/^recurring_/i", $paypal["txn_type"])) // Otherwise, is this a ^recurring_ txn_type?
162
  $paypal["s2member_log"][] = "Transaction type ( `^recurring_?` ), but there is no match to an existing account; so verification of `\$_SERVER[\"HTTP_HOST\"]` was not possible.";
163
 
164
  else // Else, use the default ``$_SERVER["HTTP_HOST"]`` error.
176
  Add IPN proxy (when available) to the ``$paypal`` array.
177
  */
178
  if (!empty ($_REQUEST["s2member_paypal_proxy"]))
179
+ $paypal["s2member_paypal_proxy"] = esc_html(trim(stripslashes($_REQUEST["s2member_paypal_proxy"])));
180
  /*
181
  Add IPN proxy use vars (when available) to the ``$paypal`` array.
182
  */
183
  if (!empty ($_REQUEST["s2member_paypal_proxy_use"]))
184
+ $paypal["s2member_paypal_proxy_use"] = esc_html(trim(stripslashes($_REQUEST["s2member_paypal_proxy_use"])));
185
  /*
186
  Add IPN proxy coupon vars (when available) to the ``$paypal`` array.
187
  */
188
  if (!empty ($_REQUEST["s2member_paypal_proxy_coupon"]))
189
+ $paypal["s2member_paypal_proxy_coupon"] = esc_html(trim(stripslashes($_REQUEST["s2member_paypal_proxy_coupon"])));
190
  /*
191
  Also add IPN proxy self-verification (when available) to the ``$paypal`` array.
192
  */
193
  if (!empty ($_REQUEST["s2member_paypal_proxy_verification"]))
194
+ $paypal["s2member_paypal_proxy_verification"] = esc_html(trim(stripslashes($_REQUEST["s2member_paypal_proxy_verification"])));
195
  /*
196
  If debugging/logging is enabled; we need to append ``$paypal`` to the log file.
197
  Logging now supports Multisite Networking as well.
includes/classes/paypal-return-in-no-tx-data.inc.php CHANGED
@@ -38,7 +38,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_return_in_no_tx_data"))
38
  */
39
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
40
  {
41
- extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars);
42
 
43
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
44
  do_action ("ws_plugin__s2member_during_paypal_return_before_no_return_data", get_defined_vars ());
38
  */
39
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
40
  {
41
+ extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars, EXTR_OVERWRITE | EXTR_REFS);
42
 
43
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
44
  do_action ("ws_plugin__s2member_during_paypal_return_before_no_return_data", get_defined_vars ());
includes/classes/paypal-return-in-proxy-ty-email.inc.php CHANGED
@@ -38,7 +38,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_return_in_proxy_ty_email"))
38
  */
39
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
40
  {
41
- extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars);
42
 
43
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
44
  do_action ("ws_plugin__s2member_during_paypal_return_before_explicit_ty_email", get_defined_vars ());
38
  */
39
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
40
  {
41
+ extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars, EXTR_OVERWRITE | EXTR_REFS);
42
 
43
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
44
  do_action ("ws_plugin__s2member_during_paypal_return_before_explicit_ty_email", get_defined_vars ());
includes/classes/paypal-return-in-proxy-x-preview.inc.php CHANGED
@@ -38,7 +38,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_return_in_proxy_x_preview"))
38
  */
39
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
40
  {
41
- extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars);
42
 
43
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
44
  do_action ("ws_plugin__s2member_during_paypal_return_before_explicit_x_preview", get_defined_vars ());
38
  */
39
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
40
  {
41
+ extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars, EXTR_OVERWRITE | EXTR_REFS);
42
 
43
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
44
  do_action ("ws_plugin__s2member_during_paypal_return_before_explicit_x_preview", get_defined_vars ());
includes/classes/paypal-return-in-subscr-modify-w-level.inc.php CHANGED
@@ -40,7 +40,7 @@ if(!class_exists("c_ws_plugin__s2member_paypal_return_in_subscr_modify_w_level")
40
  */
41
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp($vars = array())
42
  {
43
- extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars);
44
 
45
  if((!empty($paypal["txn_type"]) && preg_match("/^subscr_modify$/i", $paypal["txn_type"]))
46
  && (!empty($paypal["item_number"]) && preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
@@ -114,6 +114,11 @@ if(!class_exists("c_ws_plugin__s2member_paypal_return_in_subscr_modify_w_level")
114
 
115
  update_user_option($user_id, "s2member_subscr_gateway", $paypal["subscr_gateway"]);
116
  update_user_option($user_id, "s2member_subscr_id", $paypal["subscr_id"]);
 
 
 
 
 
117
  update_user_option($user_id, "s2member_custom", $paypal["custom"]);
118
 
119
  if(!get_user_option("s2member_registration_ip", $user_id))
40
  */
41
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp($vars = array())
42
  {
43
+ extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars, EXTR_OVERWRITE | EXTR_REFS);
44
 
45
  if((!empty($paypal["txn_type"]) && preg_match("/^subscr_modify$/i", $paypal["txn_type"]))
46
  && (!empty($paypal["item_number"]) && preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
114
 
115
  update_user_option($user_id, "s2member_subscr_gateway", $paypal["subscr_gateway"]);
116
  update_user_option($user_id, "s2member_subscr_id", $paypal["subscr_id"]);
117
+
118
+ if(!empty($paypal["subscr_baid"]))
119
+ update_user_option ($user_id, "s2member_subscr_baid", $paypal["subscr_baid"]);
120
+ else delete_user_option ($user_id, "s2member_subscr_baid");
121
+
122
  update_user_option($user_id, "s2member_custom", $paypal["custom"]);
123
 
124
  if(!get_user_option("s2member_registration_ip", $user_id))
includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php CHANGED
@@ -40,7 +40,7 @@ if(!class_exists("c_ws_plugin__s2member_paypal_return_in_subscr_or_wa_w_level"))
40
  */
41
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp($vars = array())
42
  {
43
- extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars);
44
 
45
  if((!empty($paypal["txn_type"]) && preg_match("/^(web_accept|subscr_signup|subscr_payment)$/i", $paypal["txn_type"]))
46
  && (!empty($paypal["item_number"]) && preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
@@ -152,6 +152,11 @@ if(!class_exists("c_ws_plugin__s2member_paypal_return_in_subscr_or_wa_w_level"))
152
 
153
  update_user_option($user_id, "s2member_subscr_gateway", $paypal["subscr_gateway"]);
154
  update_user_option($user_id, "s2member_subscr_id", $paypal["subscr_id"]);
 
 
 
 
 
155
  update_user_option($user_id, "s2member_custom", $paypal["custom"]);
156
 
157
  if(!get_user_option("s2member_registration_ip", $user_id))
40
  */
41
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp($vars = array())
42
  {
43
+ extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars, EXTR_OVERWRITE | EXTR_REFS);
44
 
45
  if((!empty($paypal["txn_type"]) && preg_match("/^(web_accept|subscr_signup|subscr_payment)$/i", $paypal["txn_type"]))
46
  && (!empty($paypal["item_number"]) && preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_level_regex"], $paypal["item_number"]))
152
 
153
  update_user_option($user_id, "s2member_subscr_gateway", $paypal["subscr_gateway"]);
154
  update_user_option($user_id, "s2member_subscr_id", $paypal["subscr_id"]);
155
+
156
+ if(!empty($paypal["subscr_baid"]))
157
+ update_user_option ($user_id, "s2member_subscr_baid", $paypal["subscr_baid"]);
158
+ else delete_user_option ($user_id, "s2member_subscr_baid");
159
+
160
  update_user_option($user_id, "s2member_custom", $paypal["custom"]);
161
 
162
  if(!get_user_option("s2member_registration_ip", $user_id))
includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php CHANGED
@@ -40,7 +40,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_return_in_wa_ccaps_wo_level"))
40
  */
41
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
42
  {
43
- extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars);
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^web_accept$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_wo_level_regex"], $paypal["item_number"]))
40
  */
41
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
42
  {
43
+ extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars, EXTR_OVERWRITE | EXTR_REFS);
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^web_accept$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_wo_level_regex"], $paypal["item_number"]))
includes/classes/paypal-return-in-web-accept-sp.inc.php CHANGED
@@ -40,7 +40,7 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_return_in_web_accept_sp"))
40
  */
41
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
42
  {
43
- extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars);
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^web_accept$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["sp_access_item_number_regex"], $paypal["item_number"]))
40
  */
41
  public static function /* Conditional phase for ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */ cp ($vars = array ())
42
  {
43
+ extract /* Extract all vars passed in from: ``c_ws_plugin__s2member_paypal_notify_in::paypal_notify()``. */($vars, EXTR_OVERWRITE | EXTR_REFS);
44
 
45
  if ((!empty ($paypal["txn_type"]) && preg_match ("/^web_accept$/i", $paypal["txn_type"]))
46
  && (!empty ($paypal["item_number"]) && preg_match ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["sp_access_item_number_regex"], $paypal["item_number"]))
includes/classes/paypal-return-in.inc.php CHANGED
@@ -45,6 +45,10 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_return_in"))
45
 
46
  if (!empty ($_GET["s2member_paypal_return"]) && ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"] || !empty ($_GET["s2member_paypal_proxy"])))
47
  {
 
 
 
 
48
  $custom_success_redirection = (!empty ($_GET["s2member_paypal_return_success"])) ? esc_html (trim (stripslashes ($_GET["s2member_paypal_return_success"]))) : false;
49
  $custom_success_redirection = ($custom_success_redirection) ? str_ireplace (array ("&#038;", "&amp;"), "&", $custom_success_redirection) : $custom_success_redirection;
50
 
@@ -137,27 +141,27 @@ if (!class_exists ("c_ws_plugin__s2member_paypal_return_in"))
137
  Add RTN proxy (when available) to the ``$paypal`` array.
138
  */
139
  if (!empty ($_GET["s2member_paypal_proxy"]))
140
- $paypal["s2member_paypal_proxy"] = $_GET["s2member_paypal_proxy"];
141
  /*
142
  Add IPN proxy use vars (when available) to the ``$paypal`` array.
143
  */
144
  if (!empty ($_GET["s2member_paypal_proxy_use"]))
145
- $paypal["s2member_paypal_proxy_use"] = $_GET["s2member_paypal_proxy_use"];
146
  /*
147
  Also add RTN proxy self-verification (when available) to the ``$paypal`` array.
148
  */
149
  if (!empty ($_GET["s2member_paypal_proxy_verification"]))
150
- $paypal["s2member_paypal_proxy_verification"] = $_GET["s2member_paypal_proxy_verification"];
151
  /*
152
  Also add RTN success redirection URL (when available) to the ``$paypal`` array.
153
  */
154
  if (!empty ($_GET["s2member_paypal_return_success"]))
155
- $paypal["s2member_paypal_return_success"] = $_GET["s2member_paypal_return_success"];
156
  /*
157
  Also add RTN t and r Attributes (when available) to the ``$paypal`` array.
158
  */
159
  if (!empty ($_GET["s2member_paypal_return_tra"]))
160
- $paypal["s2member_paypal_return_tra"] = $_GET["s2member_paypal_return_tra"];
161
  /*
162
  If debugging/logging is enabled; we need to append $paypal to the log file.
163
  Logging now supports Multisite Networking as well.
45
 
46
  if (!empty ($_GET["s2member_paypal_return"]) && ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"] || !empty ($_GET["s2member_paypal_proxy"])))
47
  {
48
+ $paypal = array(); // Initialize PayPal array; we also reference this with a variable for a possible proxy handler.
49
+ if(!empty($_GET["s2member_paypal_proxy"]) && in_array($_GET["s2member_paypal_proxy"], array("alipay", "authnet", "clickbank", "ccbill", "google"), TRUE))
50
+ ${esc_html(trim(stripslashes($_GET["s2member_paypal_proxy"])))} = &$paypal; // Internal alias by reference.
51
+
52
  $custom_success_redirection = (!empty ($_GET["s2member_paypal_return_success"])) ? esc_html (trim (stripslashes ($_GET["s2member_paypal_return_success"]))) : false;
53
  $custom_success_redirection = ($custom_success_redirection) ? str_ireplace (array ("&#038;", "&amp;"), "&", $custom_success_redirection) : $custom_success_redirection;
54
 
141
  Add RTN proxy (when available) to the ``$paypal`` array.
142
  */
143
  if (!empty ($_GET["s2member_paypal_proxy"]))
144
+ $paypal["s2member_paypal_proxy"] = esc_html(trim(stripslashes($_GET["s2member_paypal_proxy"])));
145
  /*
146
  Add IPN proxy use vars (when available) to the ``$paypal`` array.
147
  */
148
  if (!empty ($_GET["s2member_paypal_proxy_use"]))
149
+ $paypal["s2member_paypal_proxy_use"] = esc_html(trim(stripslashes($_GET["s2member_paypal_proxy_use"])));
150
  /*
151
  Also add RTN proxy self-verification (when available) to the ``$paypal`` array.
152
  */
153
  if (!empty ($_GET["s2member_paypal_proxy_verification"]))
154
+ $paypal["s2member_paypal_proxy_verification"] = esc_html(trim(stripslashes($_GET["s2member_paypal_proxy_verification"])));
155
  /*
156
  Also add RTN success redirection URL (when available) to the ``$paypal`` array.
157
  */
158
  if (!empty ($_GET["s2member_paypal_return_success"]))
159
+ $paypal["s2member_paypal_return_success"] = esc_html(trim(stripslashes($_GET["s2member_paypal_return_success"])));
160
  /*
161
  Also add RTN t and r Attributes (when available) to the ``$paypal`` array.
162
  */
163
  if (!empty ($_GET["s2member_paypal_return_tra"]))
164
+ $paypal["s2member_paypal_return_tra"] = esc_html(trim(stripslashes($_GET["s2member_paypal_return_tra"])));
165
  /*
166
  If debugging/logging is enabled; we need to append $paypal to the log file.
167
  Logging now supports Multisite Networking as well.
includes/classes/paypal-utilities.inc.php CHANGED
@@ -483,14 +483,17 @@ if(!class_exists("c_ws_plugin__s2member_paypal_utilities"))
483
  do_action("ws_plugin__s2member_before_paypal_pro_subscr_id", get_defined_vars());
484
  unset /* Unset defined __refs, __v. */($__refs, $__v);
485
 
486
- if(is_array($array = $array_or_string) && !empty($array["recurring_payment_id"]))
 
 
 
487
  $subscr_id = trim($array["recurring_payment_id"]);
488
 
489
- else if(is_array($array = $array_or_string) && !empty($array["subscr_id"]))
490
- $subscr_id = trim($array["subscr_id"]);
 
491
 
492
- else if(is_string($string = $array_or_string) && !empty($string))
493
- $subscr_id = trim($string);
494
 
495
  return apply_filters("ws_plugin__s2member_paypal_pro_subscr_id", ((!empty($subscr_id)) ? $subscr_id : false), get_defined_vars());
496
  }
@@ -510,20 +513,23 @@ if(!class_exists("c_ws_plugin__s2member_paypal_utilities"))
510
  do_action("ws_plugin__s2member_before_paypal_pro_item_number", get_defined_vars());
511
  unset /* Unset defined __refs, __v. */($__refs, $__v);
512
 
513
- if(isset($array_or_string["PROFILENAME"]) /* Payflow API alternative. */)
514
  $array_or_string["PROFILEREFERENCE"] = $array_or_string["PROFILENAME"];
515
 
516
- if(is_array($array = $array_or_string) && (!empty($array["PROFILEREFERENCE"]) || !empty($array["rp_invoice_id"])))
517
- list($_reference, $_domain, $_item_number) = array_map("trim", preg_split("/~/", ((!empty($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
518
 
519
  else if(is_array($array = $array_or_string) && !empty($array["item_number1"]))
520
  $_item_number = trim($array["item_number1"]);
521
 
522
- else if(is_array($array = $array_or_string) && !empty($array["item_number"]))
523
- $_item_number = trim($array["item_number"]);
 
 
 
 
524
 
525
- else if(is_string($string = $array_or_string) && !empty($string))
526
- $_item_number = trim($string);
527
 
528
  if(!empty($_item_number) && preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_or_wo_level_regex"], $_item_number))
529
  $item_number = $_item_number;
@@ -548,17 +554,20 @@ if(!class_exists("c_ws_plugin__s2member_paypal_utilities"))
548
  do_action("ws_plugin__s2member_before_paypal_pro_item_name", get_defined_vars());
549
  unset /* Unset defined __refs, __v. */($__refs, $__v);
550
 
551
- if(is_array($array = $array_or_string) && !empty($array["product_name"]))
552
- $item_name = trim($array["product_name"]);
553
 
554
  else if(is_array($array = $array_or_string) && !empty($array["item_name1"]))
555
  $item_name = trim($array["item_name1"]);
556
 
557
- else if(is_array($array = $array_or_string) && !empty($array["item_name"]))
558
- $item_name = trim($array["item_name"]);
559
 
560
- else if(is_string($string = $array_or_string) && !empty($string))
561
- $item_name = trim($string);
 
 
 
562
 
563
  return apply_filters("ws_plugin__s2member_paypal_pro_item_name", ((!empty($item_name)) ? $item_name : false), get_defined_vars());
564
  }
@@ -582,19 +591,21 @@ if(!class_exists("c_ws_plugin__s2member_paypal_utilities"))
582
  do_action("ws_plugin__s2member_before_paypal_pro_period1", get_defined_vars());
583
  unset /* Unset defined __refs, __v. */($__refs, $__v);
584
 
585
- if(isset($array_or_string["PROFILENAME"]) /* Payflow API alternative. */)
586
  $array_or_string["PROFILEREFERENCE"] = $array_or_string["PROFILENAME"];
587
 
588
- if(is_array($array = $array_or_string) && (!empty($array["PROFILEREFERENCE"]) || !empty($array["rp_invoice_id"])))
 
 
589
  {
590
  list($_reference, $_domain, $_item_number) = array_map("trim", preg_split("/~/", ((!empty($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
591
  list($_start_time, $_period1, $_period3) = array_map("trim", preg_split("/\:/", $_reference, 3));
592
  }
593
- else if(is_array($array = $array_or_string) && !empty($array["period1"]))
594
- $_period1 = trim($array["period1"]);
 
595
 
596
- else if(is_string($string = $array_or_string) && !empty($string))
597
- $_period1 = trim($string);
598
 
599
  if /* Were we able to get a `period1` string? */(!empty($_period1))
600
  {
@@ -636,19 +647,21 @@ if(!class_exists("c_ws_plugin__s2member_paypal_utilities"))
636
  do_action("ws_plugin__s2member_before_paypal_pro_period3", get_defined_vars());
637
  unset /* Unset defined __refs, __v. */($__refs, $__v);
638
 
639
- if(isset($array_or_string["PROFILENAME"]) /* Payflow API alternative. */)
640
  $array_or_string["PROFILEREFERENCE"] = $array_or_string["PROFILENAME"];
641
 
642
- if(is_array($array = $array_or_string) && (!empty($array["PROFILEREFERENCE"]) || !empty($array["rp_invoice_id"])))
 
 
643
  {
644
  list($_reference, $_domain, $_item_number) = array_map("trim", preg_split("/~/", ((!empty($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
645
  list($_start_time, $_period1, $_period3) = array_map("trim", preg_split("/\:/", $_reference, 3));
646
  }
647
- else if(is_array($array = $array_or_string) && !empty($array["period3"]))
648
- $_period3 = trim($array["period3"]);
 
649
 
650
- else if(is_string($string = $array_or_string) && !empty($string))
651
- $_period3 = trim($string);
652
 
653
  if /* Were we able to get a `period3` string? */(!empty($_period3))
654
  {
483
  do_action("ws_plugin__s2member_before_paypal_pro_subscr_id", get_defined_vars());
484
  unset /* Unset defined __refs, __v. */($__refs, $__v);
485
 
486
+ if(is_array($array = $array_or_string) && !empty($array["subscr_id"]))
487
+ $subscr_id = trim($array["subscr_id"]);
488
+
489
+ else if(is_array($array = $array_or_string) && !empty($array["recurring_payment_id"]))
490
  $subscr_id = trim($array["recurring_payment_id"]);
491
 
492
+ else if(is_array($array = $array_or_string) && !empty($array["mp_id"])
493
+ && ($ipn_signup_var_subscr_id = c_ws_plugin__s2member_utils_users::get_user_ipn_signup_var("subscr_id", FALSE, $array["mp_id"])))
494
+ $subscr_id = trim($ipn_signup_var_subscr_id); // Found w/ a Billing Agreement ID.
495
 
496
+ else if(is_string($string = $array_or_string) && !empty($string)) $subscr_id = trim($string);
 
497
 
498
  return apply_filters("ws_plugin__s2member_paypal_pro_subscr_id", ((!empty($subscr_id)) ? $subscr_id : false), get_defined_vars());
499
  }
513
  do_action("ws_plugin__s2member_before_paypal_pro_item_number", get_defined_vars());
514
  unset /* Unset defined __refs, __v. */($__refs, $__v);
515
 
516
+ if(is_array($array_or_string) && isset($array_or_string["PROFILENAME"]) /* Payflow. */)
517
  $array_or_string["PROFILEREFERENCE"] = $array_or_string["PROFILENAME"];
518
 
519
+ if(is_array($array = $array_or_string) && !empty($array["item_number"]))
520
+ $_item_number = trim($array["item_number"]);
521
 
522
  else if(is_array($array = $array_or_string) && !empty($array["item_number1"]))
523
  $_item_number = trim($array["item_number1"]);
524
 
525
+ else if(is_array($array = $array_or_string) && (!empty($array["PROFILEREFERENCE"]) || !empty($array["rp_invoice_id"])))
526
+ list($_reference, $_domain, $_item_number) = array_map("trim", preg_split("/~/", ((!empty($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
527
+
528
+ else if(is_array($array = $array_or_string) && !empty($array["mp_id"])
529
+ && ($ipn_signup_var_item_number = c_ws_plugin__s2member_utils_users::get_user_ipn_signup_var("item_number", FALSE, $array["mp_id"])))
530
+ $_item_number = trim($ipn_signup_var_item_number); // Found w/ a Billing Agreement ID.
531
 
532
+ else if(is_string($string = $array_or_string) && !empty($string)) $_item_number = trim($string);
 
533
 
534
  if(!empty($_item_number) && preg_match($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["membership_item_number_w_or_wo_level_regex"], $_item_number))
535
  $item_number = $_item_number;
554
  do_action("ws_plugin__s2member_before_paypal_pro_item_name", get_defined_vars());
555
  unset /* Unset defined __refs, __v. */($__refs, $__v);
556
 
557
+ if(is_array($array = $array_or_string) && !empty($array["item_name"]))
558
+ $item_name = trim($array["item_name"]);
559
 
560
  else if(is_array($array = $array_or_string) && !empty($array["item_name1"]))
561
  $item_name = trim($array["item_name1"]);
562
 
563
+ else if(is_array($array = $array_or_string) && !empty($array["product_name"]))
564
+ $item_name = trim($array["product_name"]);
565
 
566
+ else if(is_array($array = $array_or_string) && !empty($array["mp_id"])
567
+ && ($ipn_signup_var_item_name = c_ws_plugin__s2member_utils_users::get_user_ipn_signup_var("item_name", FALSE, $array["mp_id"])))
568
+ $item_name = trim($ipn_signup_var_item_name); // Found w/ a Billing Agreement ID.
569
+
570
+ else if(is_string($string = $array_or_string) && !empty($string)) $item_name = trim($string);
571
 
572
  return apply_filters("ws_plugin__s2member_paypal_pro_item_name", ((!empty($item_name)) ? $item_name : false), get_defined_vars());
573
  }
591
  do_action("ws_plugin__s2member_before_paypal_pro_period1", get_defined_vars());
592
  unset /* Unset defined __refs, __v. */($__refs, $__v);
593
 
594
+ if(is_array($array_or_string) && isset($array_or_string["PROFILENAME"]) /* Payflow. */)
595
  $array_or_string["PROFILEREFERENCE"] = $array_or_string["PROFILENAME"];
596
 
597
+ if(is_array($array = $array_or_string) && !empty($array["period1"])) $_period1 = trim($array["period1"]);
598
+
599
+ else if(is_array($array = $array_or_string) && (!empty($array["PROFILEREFERENCE"]) || !empty($array["rp_invoice_id"])))
600
  {
601
  list($_reference, $_domain, $_item_number) = array_map("trim", preg_split("/~/", ((!empty($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
602
  list($_start_time, $_period1, $_period3) = array_map("trim", preg_split("/\:/", $_reference, 3));
603
  }
604
+ else if(is_array($array = $array_or_string) && !empty($array["mp_id"])
605
+ && ($ipn_signup_var_period1 = c_ws_plugin__s2member_utils_users::get_user_ipn_signup_var("period1", FALSE, $array["mp_id"])))
606
+ $_period1 = trim($ipn_signup_var_period1); // Found w/ a Billing Agreement ID.
607
 
608
+ else if(is_string($string = $array_or_string) && !empty($string)) $_period1 = trim($string);
 
609
 
610
  if /* Were we able to get a `period1` string? */(!empty($_period1))
611
  {
647
  do_action("ws_plugin__s2member_before_paypal_pro_period3", get_defined_vars());
648
  unset /* Unset defined __refs, __v. */($__refs, $__v);
649
 
650
+ if(is_array($array_or_string) && isset($array_or_string["PROFILENAME"]) /* Payflow. */)
651
  $array_or_string["PROFILEREFERENCE"] = $array_or_string["PROFILENAME"];
652
 
653
+ if(is_array($array = $array_or_string) && !empty($array["period3"])) $_period3 = trim($array["period3"]);
654
+
655
+ else if(is_array($array = $array_or_string) && (!empty($array["PROFILEREFERENCE"]) || !empty($array["rp_invoice_id"])))
656
  {
657
  list($_reference, $_domain, $_item_number) = array_map("trim", preg_split("/~/", ((!empty($array["PROFILEREFERENCE"])) ? $array["PROFILEREFERENCE"] : $array["rp_invoice_id"]), 3));
658
  list($_start_time, $_period1, $_period3) = array_map("trim", preg_split("/\:/", $_reference, 3));
659
  }
660
+ else if(is_array($array = $array_or_string) && !empty($array["mp_id"])
661
+ && ($ipn_signup_var_period3 = c_ws_plugin__s2member_utils_users::get_user_ipn_signup_var("period3", FALSE, $array["mp_id"])))
662
+ $_period3 = trim($ipn_signup_var_period3); // Found w/ a Billing Agreement ID.
663
 
664
+ else if(is_string($string = $array_or_string) && !empty($string)) $_period3 = trim($string);
 
665
 
666
  if /* Were we able to get a `period3` string? */(!empty($_period3))
667
  {
includes/classes/registrations.inc.php CHANGED
@@ -446,7 +446,7 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
446
  $_p[$_key] = $_value; // Add each of these key conversions.
447
  unset /* Just a little housekeeping here. */ ($_key, $_value);
448
 
449
- if (!is_admin () && (isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_subscr_gateway"]) || isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_subscr_id"]) || isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_custom"]) || isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_ccaps"]) || isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_auto_eot_time"]) || isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_notes"])))
450
  exit (_x ("s2Member security violation. You attempted to POST administrative variables that will NOT be trusted in a NON-administrative zone!", "s2member-front", "s2member"));
451
 
452
  $_pmr = array_merge ($_p, $meta, $rvs); // Merge all of these arrays together now, in this specific order.
@@ -469,6 +469,7 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
469
  $login = $user->user_login;
470
  $ip = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_registration_ip"];
471
  $ip = (!$ip) ? $_SERVER["REMOTE_ADDR"] : $ip; // Else use environment variable.
 
472
  $cv = preg_split ("/\|/", $custom);
473
 
474
  if (!($auto_eot_time = "") && $eotper) // If a specific EOT Period is included.
@@ -517,6 +518,7 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
517
  update_user_option ($user_id, "s2member_auto_eot_time", $auto_eot_time);
518
  update_user_option ($user_id, "s2member_subscr_gateway", $subscr_gateway);
519
  update_user_option ($user_id, "s2member_subscr_id", $subscr_id);
 
520
  update_user_option ($user_id, "s2member_custom", $custom);
521
  update_user_option ($user_id, "s2member_notes", $notes);
522
 
@@ -632,6 +634,7 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
632
  $ip = (!$ip) ? $_SERVER["REMOTE_ADDR"] : $ip; // Else use environment variable.
633
  $custom = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_custom"];
634
  $subscr_id = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_subscr_id"];
 
635
  $subscr_gateway = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_subscr_gateway"];
636
  $cv = preg_split ("/\|/", (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_custom"]);
637
 
@@ -679,6 +682,7 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
679
  update_user_option ($user_id, "s2member_auto_eot_time", $auto_eot_time);
680
  update_user_option ($user_id, "s2member_subscr_gateway", $subscr_gateway);
681
  update_user_option ($user_id, "s2member_subscr_id", $subscr_id);
 
682
  update_user_option ($user_id, "s2member_custom", $custom);
683
  update_user_option ($user_id, "s2member_notes", $notes);
684
 
@@ -771,6 +775,7 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
771
  $ip = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_registration_ip"];
772
  $custom = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_custom"];
773
  $subscr_id = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_subscr_id"];
 
774
  $subscr_gateway = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_subscr_gateway"];
775
  $cv = preg_split ("/\|/", (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_custom"]);
776
 
@@ -809,6 +814,7 @@ if (!class_exists ("c_ws_plugin__s2member_registrations"))
809
  update_user_option ($user_id, "s2member_auto_eot_time", $auto_eot_time);
810
  update_user_option ($user_id, "s2member_subscr_gateway", $subscr_gateway);
811
  update_user_option ($user_id, "s2member_subscr_id", $subscr_id);
 
812
  update_user_option ($user_id, "s2member_custom", $custom);
813
  update_user_option ($user_id, "s2member_notes", $notes);
814
 
446
  $_p[$_key] = $_value; // Add each of these key conversions.
447
  unset /* Just a little housekeeping here. */ ($_key, $_value);
448
 
449
+ if (!is_admin () && (isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_subscr_gateway"]) || isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_subscr_id"]) || isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_subscr_baid"]) || isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_custom"]) || isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_ccaps"]) || isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_auto_eot_time"]) || isset ($_p["ws_plugin__s2member_custom_reg_field_s2member_notes"])))
450
  exit (_x ("s2Member security violation. You attempted to POST administrative variables that will NOT be trusted in a NON-administrative zone!", "s2member-front", "s2member"));
451
 
452
  $_pmr = array_merge ($_p, $meta, $rvs); // Merge all of these arrays together now, in this specific order.
469
  $login = $user->user_login;
470
  $ip = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_registration_ip"];
471
  $ip = (!$ip) ? $_SERVER["REMOTE_ADDR"] : $ip; // Else use environment variable.
472
+ $subscr_baid = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_subscr_baid"];
473
  $cv = preg_split ("/\|/", $custom);
474
 
475
  if (!($auto_eot_time = "") && $eotper) // If a specific EOT Period is included.
518
  update_user_option ($user_id, "s2member_auto_eot_time", $auto_eot_time);
519
  update_user_option ($user_id, "s2member_subscr_gateway", $subscr_gateway);
520
  update_user_option ($user_id, "s2member_subscr_id", $subscr_id);
521
+ update_user_option ($user_id, "s2member_subscr_baid", $subscr_baid);
522
  update_user_option ($user_id, "s2member_custom", $custom);
523
  update_user_option ($user_id, "s2member_notes", $notes);
524
 
634
  $ip = (!$ip) ? $_SERVER["REMOTE_ADDR"] : $ip; // Else use environment variable.
635
  $custom = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_custom"];
636
  $subscr_id = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_subscr_id"];
637
+ $subscr_baid = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_subscr_baid"];
638
  $subscr_gateway = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_subscr_gateway"];
639
  $cv = preg_split ("/\|/", (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_custom"]);
640
 
682
  update_user_option ($user_id, "s2member_auto_eot_time", $auto_eot_time);
683
  update_user_option ($user_id, "s2member_subscr_gateway", $subscr_gateway);
684
  update_user_option ($user_id, "s2member_subscr_id", $subscr_id);
685
+ update_user_option ($user_id, "s2member_subscr_baid", $subscr_baid);
686
  update_user_option ($user_id, "s2member_custom", $custom);
687
  update_user_option ($user_id, "s2member_notes", $notes);
688
 
775
  $ip = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_registration_ip"];
776
  $custom = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_custom"];
777
  $subscr_id = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_subscr_id"];
778
+ $subscr_baid = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_subscr_baid"];
779
  $subscr_gateway = (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_subscr_gateway"];
780
  $cv = preg_split ("/\|/", (string)@$_pmr["ws_plugin__s2member_custom_reg_field_s2member_custom"]);
781
 
814
  update_user_option ($user_id, "s2member_auto_eot_time", $auto_eot_time);
815
  update_user_option ($user_id, "s2member_subscr_gateway", $subscr_gateway);
816
  update_user_option ($user_id, "s2member_subscr_id", $subscr_id);
817
+ update_user_option ($user_id, "s2member_subscr_baid", $subscr_baid);
818
  update_user_option ($user_id, "s2member_custom", $custom);
819
  update_user_option ($user_id, "s2member_notes", $notes);
820
 
includes/classes/sc-if-conds-in.inc.php CHANGED
@@ -50,7 +50,6 @@ if (!class_exists ("c_ws_plugin__s2member_sc_if_conds_in"))
50
  * @param str $shortcode The actual Shortcode name itself.
51
  * @return str The ``$content`` if true, else an empty string.
52
  *
53
- * @todo Add support for ``else if`` logic.
54
  * @todo Add support for nested AND/OR conditionals inside the ONE Shortcode.
55
  * @todo Address possible security issue on sites with multiple editors, some of which should not have access to this feature.
56
  */
@@ -60,9 +59,53 @@ if (!class_exists ("c_ws_plugin__s2member_sc_if_conds_in"))
60
  do_action ("ws_plugin__s2member_before_sc_if_conditionals", get_defined_vars ());
61
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
62
 
63
- $blog_farm_safe = apply_filters ("ws_plugin__s2member_sc_if_conditionals_blog_farm_safe", array ("is_user_logged_in", "is_user_not_logged_in", "user_is", "user_is_not", "user_can", "user_cannot", "current_user_is", "current_user_is_not", "current_user_can", "current_user_cannot", "is_admin", "is_blog_admin", "is_user_admin", "is_network_admin", "is_404", "is_home", "is_front_page", "is_singular", "is_single", "is_page", "is_page_template", "is_attachment", "is_feed", "is_archive", "is_search", "is_category", "is_tax", "is_tag", "has_tag", "is_author", "is_date", "is_day", "is_month", "is_time", "is_year", "is_sticky", "is_paged", "is_preview", "is_comments_popup", "in_the_loop", "comments_open", "pings_open", "has_excerpt", "has_post_thumbnail"), get_defined_vars ());
 
 
 
 
 
 
 
 
 
 
64
 
65
- $attr = c_ws_plugin__s2member_utils_strings::trim_qts_deep ((array)$attr); // Force array; trim quote entities.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
  foreach ($attr as $attr_key => $attr_value) // Detects and removes logical attributes.
68
  // It's NOT possible to mix logic. You MUST stick to one type of logic or another.
@@ -79,14 +122,12 @@ if (!class_exists ("c_ws_plugin__s2member_sc_if_conds_in"))
79
  return ""; // Return now; empty string in this case.
80
  }
81
  }
82
-
83
- if (is_array ($logicals) && !empty ($logicals) && count (array_unique ($logicals)) > 1)
84
  {
85
  trigger_error ("s2If, AND/OR malformed conditional logic. It's NOT possible to mix logic using AND/OR combinations. You MUST stick to one type of logic or another. If both types of logic are needed, you MUST use two different Shortcode expressions. Or, use Advanced (PHP) Conditionals instead.", E_USER_ERROR);
86
  return ""; // Return now; empty string in this case.
87
  }
88
-
89
- $conditional_logic = (is_array ($logicals) && !empty ($logicals) && preg_match ("/^(\|\||OR)$/i", $logicals[0])) ? "OR" : "AND";
90
 
91
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
92
  do_action ("ws_plugin__s2member_before_sc_if_conditionals_after_conditional_logic", get_defined_vars ());
@@ -119,7 +160,6 @@ if (!class_exists ("c_ws_plugin__s2member_sc_if_conds_in"))
119
  break;
120
  }
121
  }
122
-
123
  else if (empty ($args)) // No arguments at all.
124
  {
125
  if ($test === true && !call_user_func ($conditional))
@@ -127,20 +167,17 @@ if (!class_exists ("c_ws_plugin__s2member_sc_if_conds_in"))
127
  $condition_failed = true;
128
  break;
129
  }
130
-
131
  else if ($test === false && call_user_func ($conditional))
132
  {
133
  $condition_failed = true;
134
  break;
135
  }
136
  }
137
-
138
  else if ($test === true && !call_user_func_array ($conditional, $args))
139
  {
140
  $condition_failed = true;
141
  break;
142
  }
143
-
144
  else if ($test === false && call_user_func_array ($conditional, $args))
145
  {
146
  $condition_failed = true;
@@ -171,8 +208,13 @@ if (!class_exists ("c_ws_plugin__s2member_sc_if_conds_in"))
171
  return ""; // Return now; empty string in this case.
172
  }
173
  }
174
- // Supports nested Shortcodes.
175
- return do_shortcode (apply_filters ("ws_plugin__s2member_sc_if_conditionals", (($condition_failed) ? "" : $content), get_defined_vars ()));
 
 
 
 
 
176
  }
177
 
178
  else if ($conditional_logic === "OR") // This is the OR variation. This routine analyzes conditionals using OR logic, instead of AND logic.
@@ -202,7 +244,6 @@ if (!class_exists ("c_ws_plugin__s2member_sc_if_conds_in"))
202
  break;
203
  }
204
  }
205
-
206
  else if (empty ($args)) // No arguments at all.
207
  {
208
  if ($test === true && call_user_func ($conditional))
@@ -210,20 +251,17 @@ if (!class_exists ("c_ws_plugin__s2member_sc_if_conds_in"))
210
  $condition_succeeded = true;
211
  break;
212
  }
213
-
214
  else if ($test === false && !call_user_func ($conditional))
215
  {
216
  $condition_succeeded = true;
217
  break;
218
  }
219
  }
220
-
221
  else if ($test === true && call_user_func_array ($conditional, $args))
222
  {
223
  $condition_succeeded = true;
224
  break;
225
  }
226
-
227
  else if ($test === false && !call_user_func_array ($conditional, $args))
228
  {
229
  $condition_succeeded = true;
@@ -254,10 +292,29 @@ if (!class_exists ("c_ws_plugin__s2member_sc_if_conds_in"))
254
  return ""; // Return now; empty string in this case.
255
  }
256
  }
257
- // Supports nested Shortcodes.
258
- return do_shortcode (apply_filters ("ws_plugin__s2member_sc_if_conditionals", (($condition_succeeded) ? $content : ""), get_defined_vars ()));
 
 
 
 
 
259
  }
 
260
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  }
262
  }
263
  ?>
50
  * @param str $shortcode The actual Shortcode name itself.
51
  * @return str The ``$content`` if true, else an empty string.
52
  *
 
53
  * @todo Add support for nested AND/OR conditionals inside the ONE Shortcode.
54
  * @todo Address possible security issue on sites with multiple editors, some of which should not have access to this feature.
55
  */
59
  do_action ("ws_plugin__s2member_before_sc_if_conditionals", get_defined_vars ());
60
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
61
 
62
+ $blog_farm_safe = apply_filters ("ws_plugin__s2member_sc_if_conditionals_blog_farm_safe",
63
+ array ("is_user_logged_in", "is_user_not_logged_in",
64
+ "user_is", "user_is_not", "user_can", "user_cannot",
65
+ "current_user_is", "current_user_is_not", "current_user_can", "current_user_cannot",
66
+ "is_admin", "is_blog_admin", "is_user_admin", "is_network_admin",
67
+ "is_404", "is_home", "is_front_page", "is_singular", "is_single", "is_page",
68
+ "is_page_template", "is_attachment", "is_feed", "is_archive", "is_search",
69
+ "is_category", "is_tax", "is_tag", "has_tag", "is_author", "is_date",
70
+ "is_day", "is_month", "is_time", "is_year", "is_sticky", "is_paged",
71
+ "is_preview", "is_comments_popup", "in_the_loop", "comments_open",
72
+ "pings_open", "has_excerpt", "has_post_thumbnail"), get_defined_vars ());
73
 
74
+ $pro_is_installed = c_ws_plugin__s2member_utils_conds::pro_is_installed(); // Has pro version?
75
+
76
+ $sc_conds_allow_arbitrary_php = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sc_conds_allow_arbitrary_php"];
77
+ if(!$pro_is_installed || (is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && !is_main_site ()))
78
+ $sc_conds_allow_arbitrary_php = FALSE; // Always disallow on child blogs of a blog farm.
79
+
80
+ $attr = // Trim quote entities to prevent issues in messy editors.
81
+ c_ws_plugin__s2member_utils_strings::trim_qts_deep ((array)$attr);
82
+
83
+ $content_if = $content_else = NULL; // Initialize.
84
+ $shortcode_depth = strspn($shortcode, '_'); // Based on a zero index.
85
+ $else_tag = "[".str_repeat("_", $shortcode_depth)."else]"; // e.g. [else], [_else], [__else]
86
+
87
+ if(strpos($content, $else_tag) !== FALSE && $pro_is_installed)
88
+ list($content_if, $content_else) = explode($else_tag, $content, 2);
89
+
90
+ # Arbitrary PHP code via the `php` attribute...
91
+
92
+ if($sc_conds_allow_arbitrary_php && isset($attr["php"]))
93
+ {
94
+ if(($condition_succeeded = c_ws_plugin__s2member_sc_if_conds_in::evl($attr["php"])))
95
+ $condition_content = isset($content_if) ? $content_if : $content;
96
+ else $condition_content = isset($content_else) ? $content_else : "";
97
+
98
+ if($condition_content) $condition_content = c_ws_plugin__s2member_utils_strings::trim_html($condition_content);
99
+
100
+ return do_shortcode (apply_filters ("ws_plugin__s2member_sc_if_conditionals", $condition_content, get_defined_vars ()));
101
+ }
102
+ else if(isset($attr["php"])) // Site owner is trying to use `php`, but it's NOT allowed on this installation.
103
+ {
104
+ trigger_error ("s2If syntax error. Simple Conditionals are not currently configured to allow arbitrary PHP code evaluation.", E_USER_ERROR);
105
+ return ""; // Return now; empty string in this case.
106
+ }
107
+
108
+ # Default behavior otherwise...
109
 
110
  foreach ($attr as $attr_key => $attr_value) // Detects and removes logical attributes.
111
  // It's NOT possible to mix logic. You MUST stick to one type of logic or another.
122
  return ""; // Return now; empty string in this case.
123
  }
124
  }
125
+ if (!empty ($logicals) && is_array ($logicals) && count (array_unique ($logicals)) > 1)
 
126
  {
127
  trigger_error ("s2If, AND/OR malformed conditional logic. It's NOT possible to mix logic using AND/OR combinations. You MUST stick to one type of logic or another. If both types of logic are needed, you MUST use two different Shortcode expressions. Or, use Advanced (PHP) Conditionals instead.", E_USER_ERROR);
128
  return ""; // Return now; empty string in this case.
129
  }
130
+ $conditional_logic = (!empty ($logicals) && is_array ($logicals) && preg_match ("/^(\|\||OR)$/i", $logicals[0])) ? "OR" : "AND";
 
131
 
132
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
133
  do_action ("ws_plugin__s2member_before_sc_if_conditionals_after_conditional_logic", get_defined_vars ());
160
  break;
161
  }
162
  }
 
163
  else if (empty ($args)) // No arguments at all.
164
  {
165
  if ($test === true && !call_user_func ($conditional))
167
  $condition_failed = true;
168
  break;
169
  }
 
170
  else if ($test === false && call_user_func ($conditional))
171
  {
172
  $condition_failed = true;
173
  break;
174
  }
175
  }
 
176
  else if ($test === true && !call_user_func_array ($conditional, $args))
177
  {
178
  $condition_failed = true;
179
  break;
180
  }
 
181
  else if ($test === false && call_user_func_array ($conditional, $args))
182
  {
183
  $condition_failed = true;
208
  return ""; // Return now; empty string in this case.
209
  }
210
  }
211
+ if(!empty($condition_failed))
212
+ $condition_content = isset($content_else) ? $content_else : "";
213
+ else $condition_content = isset($content_if) ? $content_if : $content;
214
+
215
+ if($condition_content) $condition_content = c_ws_plugin__s2member_utils_strings::trim_html($condition_content);
216
+
217
+ return do_shortcode (apply_filters ("ws_plugin__s2member_sc_if_conditionals", $condition_content, get_defined_vars ()));
218
  }
219
 
220
  else if ($conditional_logic === "OR") // This is the OR variation. This routine analyzes conditionals using OR logic, instead of AND logic.
244
  break;
245
  }
246
  }
 
247
  else if (empty ($args)) // No arguments at all.
248
  {
249
  if ($test === true && call_user_func ($conditional))
251
  $condition_succeeded = true;
252
  break;
253
  }
 
254
  else if ($test === false && !call_user_func ($conditional))
255
  {
256
  $condition_succeeded = true;
257
  break;
258
  }
259
  }
 
260
  else if ($test === true && call_user_func_array ($conditional, $args))
261
  {
262
  $condition_succeeded = true;
263
  break;
264
  }
 
265
  else if ($test === false && !call_user_func_array ($conditional, $args))
266
  {
267
  $condition_succeeded = true;
292
  return ""; // Return now; empty string in this case.
293
  }
294
  }
295
+ if(!empty($condition_succeeded))
296
+ $condition_content = isset($content_if) ? $content_if : $content;
297
+ else $condition_content = isset($content_else) ? $content_else : "";
298
+
299
+ if($condition_content) $condition_content = c_ws_plugin__s2member_utils_strings::trim_html($condition_content);
300
+
301
+ return do_shortcode (apply_filters ("ws_plugin__s2member_sc_if_conditionals", $condition_content, get_defined_vars ()));
302
  }
303
+ return ""; // Default return value.
304
  }
305
+ /**
306
+ * Sandbox for arbitrary PHP code evaluation in `[s2If/]` shortcodes.
307
+ *
308
+ * @package s2Member\s2If
309
+ * @since 140326
310
+ *
311
+ * @param str $expression PHP expression.
312
+ * @return bool TRUE if condition succeed; else FALSE.
313
+ */
314
+ public static function evl($expression)
315
+ {
316
+ return eval("return (".(string)$expression.");");
317
+ }
318
  }
319
  }
320
  ?>
includes/classes/sc-profile-in.inc.php CHANGED
@@ -219,7 +219,7 @@ if (!class_exists ("c_ws_plugin__s2member_sc_profile_in"))
219
  echo '<td>' . "\n";
220
  echo '<label for="ws-plugin--s2member-profile-' . esc_attr ($field_id_class) . '">' . "\n";
221
  echo '<strong' . ((preg_match ("/^(checkbox|pre_checkbox)$/", $field["type"])) ? ' style="display:none;"' : '') . '>' . $field["label"] . (($field["required"] === "yes") ? ' *' : '') . '</strong></label>' . ((preg_match ("/^(checkbox|pre_checkbox)$/", $field["type"])) ? '' : '<br />') . "\n";
222
- echo c_ws_plugin__s2member_custom_reg_fields::custom_field_gen (__FUNCTION__, $field, "ws_plugin__s2member_profile_", "ws-plugin--s2member-profile-", "ws-plugin--s2member-profile-field", "", ($tabindex = $tabindex + 1), "", $fields, $fields[$field_var], "profile");
223
  echo '</td>' . "\n";
224
  echo '</tr>' . "\n";
225
  }
219
  echo '<td>' . "\n";
220
  echo '<label for="ws-plugin--s2member-profile-' . esc_attr ($field_id_class) . '">' . "\n";
221
  echo '<strong' . ((preg_match ("/^(checkbox|pre_checkbox)$/", $field["type"])) ? ' style="display:none;"' : '') . '>' . $field["label"] . (($field["required"] === "yes") ? ' *' : '') . '</strong></label>' . ((preg_match ("/^(checkbox|pre_checkbox)$/", $field["type"])) ? '' : '<br />') . "\n";
222
+ echo c_ws_plugin__s2member_custom_reg_fields::custom_field_gen (__FUNCTION__, $field, "ws_plugin__s2member_profile_", "ws-plugin--s2member-profile-", "ws-plugin--s2member-profile-field", "", ($tabindex = $tabindex + 1), "", $fields, @$fields[$field_var], "profile");
223
  echo '</td>' . "\n";
224
  echo '</tr>' . "\n";
225
  }
includes/classes/user-securities.inc.php CHANGED
@@ -69,7 +69,10 @@ if (!class_exists ("c_ws_plugin__s2member_user_securities"))
69
  do_action ("ws_plugin__s2member_before_user_capabilities", get_defined_vars ());
70
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
71
 
72
- if (!is_multisite () && !empty ($capabilities["administrator"]) && !empty ($args[0]) && preg_match ("/^access_s2member_ccap_/i", $args[0]) && apply_filters ("ws_plugin__s2member_admins_have_all_ccaps", true, get_defined_vars ()))
 
 
 
73
  $capabilities = array_merge ((array)$capabilities, array ($args[0] => 1));
74
 
75
  else if (is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && (is_super_admin () || !empty ($capabilities["administrator"])) && !empty ($args[0]) && ($args[0] === "edit_user" || $args[0] === "edit_users"))
69
  do_action ("ws_plugin__s2member_before_user_capabilities", get_defined_vars ());
70
  unset /* Unset defined __refs, __v. */ ($__refs, $__v);
71
 
72
+ if (!empty ($capabilities["access_s2member_ccap_all_ccaps"]) && !empty ($args[0]) && preg_match ("/^access_s2member_ccap_/i", $args[0]) && apply_filters ("ws_plugin__s2member_all_ccaps_enable", true, get_defined_vars ()))
73
+ $capabilities = array_merge ((array)$capabilities, array ($args[0] => 1));
74
+
75
+ else if (!is_multisite () && !empty ($capabilities["administrator"]) && !empty ($args[0]) && preg_match ("/^access_s2member_ccap_/i", $args[0]) && apply_filters ("ws_plugin__s2member_admins_have_all_ccaps", true, get_defined_vars ()))
76
  $capabilities = array_merge ((array)$capabilities, array ($args[0] => 1));
77
 
78
  else if (is_multisite () && c_ws_plugin__s2member_utils_conds::is_multisite_farm () && (is_super_admin () || !empty ($capabilities["administrator"])) && !empty ($args[0]) && ($args[0] === "edit_user" || $args[0] === "edit_users"))
includes/classes/users-list.inc.php CHANGED
@@ -135,6 +135,8 @@ if (!class_exists ("c_ws_plugin__s2member_users_list"))
135
  if (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ())
136
  $cols["s2member_ccaps"] = "Custom Capabilities";
137
 
 
 
138
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
139
  foreach (json_decode ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
140
  {
@@ -207,6 +209,8 @@ if (!class_exists ("c_ws_plugin__s2member_users_list"))
207
 
208
  $val = (!empty ($ccaps)) ? implode ("<br />", $ccaps) : "—";
209
  }
 
 
210
 
211
  else if (preg_match ("/^s2member_custom_field_/", $col))
212
  {
135
  if (!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ())
136
  $cols["s2member_ccaps"] = "Custom Capabilities";
137
 
138
+ $cols["s2member_auto_eot_time"] = "EOT Time";
139
+
140
  if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
141
  foreach (json_decode ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
142
  {
209
 
210
  $val = (!empty ($ccaps)) ? implode ("<br />", $ccaps) : "—";
211
  }
212
+ else if($col === "s2member_auto_eot_time")
213
+ $val = ($v = get_user_option ("s2member_auto_eot_time", $user_id)) ? esc_html ($v) : "—";
214
 
215
  else if (preg_match ("/^s2member_custom_field_/", $col))
216
  {
includes/classes/utils-s2o.inc.php CHANGED
@@ -36,12 +36,15 @@ if (!class_exists ("c_ws_plugin__s2member_utils_s2o"))
36
  */
37
  public static function wp_dir ($starting_dir = FALSE, $alt_starting_dir = FALSE)
38
  {
 
 
 
39
  foreach(array($starting_dir, $alt_starting_dir) as $directory)
40
  if($directory && is_string($directory) && is_dir($directory))
41
  for($i = 0, $dir = $directory; $i <= 20; $i++, $dir = dirname($dir))
42
  if(file_exists($dir."/wp-settings.php"))
43
  return ($wp_dir = $dir);
44
-
45
  header ("HTTP/1.0 500 Error");
46
  header ("Content-Type: text/plain; charset=UTF-8");
47
  while (@ob_end_clean ()); // Clean any existing output buffers.
36
  */
37
  public static function wp_dir ($starting_dir = FALSE, $alt_starting_dir = FALSE)
38
  {
39
+ if(!empty($_SERVER['WP_DIR']))
40
+ return (string)$_SERVER['WP_DIR'];
41
+
42
  foreach(array($starting_dir, $alt_starting_dir) as $directory)
43
  if($directory && is_string($directory) && is_dir($directory))
44
  for($i = 0, $dir = $directory; $i <= 20; $i++, $dir = dirname($dir))
45
  if(file_exists($dir."/wp-settings.php"))
46
  return ($wp_dir = $dir);
47
+
48
  header ("HTTP/1.0 500 Error");
49
  header ("Content-Type: text/plain; charset=UTF-8");
50
  while (@ob_end_clean ()); // Clean any existing output buffers.
includes/classes/utils-strings.inc.php CHANGED
@@ -250,6 +250,22 @@ if(!class_exists("c_ws_plugin__s2member_utils_strings"))
250
  return is_array($value) ? array_map("c_ws_plugin__s2member_utils_strings::trim_qts_deep", $value) : preg_replace("/^(?:".$qts.")+|(?:".$qts.")+$/", "", (string)$value);
251
  }
252
  /**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
253
  * Wraps a string with the characters provided.
254
  *
255
  * This is useful when preparing an input array for ``c_ws_plugin__s2member_utils_arrays::in_regex_array()``.
250
  return is_array($value) ? array_map("c_ws_plugin__s2member_utils_strings::trim_qts_deep", $value) : preg_replace("/^(?:".$qts.")+|(?:".$qts.")+$/", "", (string)$value);
251
  }
252
  /**
253
+ * Trims HTML whitespace.
254
+ *
255
+ * This is useful on Shortcode content.
256
+ *
257
+ * @package s2Member\Utilities
258
+ * @since 140124
259
+ *
260
+ * @param str $string Input string to trim.
261
+ * @return str Output string with all HTML whitespace trimmed away.
262
+ */
263
+ public static function trim_html($string = FALSE)
264
+ {
265
+ $whitespace = '\0\x0B|\s|&nbsp;|\<br\>|\<br\s*\/\>|\<p\>(?:&nbsp;)*\<\/p\>';
266
+ return preg_replace('/^(?:'.$whitespace.')+|(?:'.$whitespace.')+$/', '', (string)$string);
267
+ }
268
+ /**
269
  * Wraps a string with the characters provided.
270
  *
271
  * This is useful when preparing an input array for ``c_ws_plugin__s2member_utils_arrays::in_regex_array()``.
includes/classes/utils-users.inc.php CHANGED
@@ -67,14 +67,14 @@ if (!class_exists ("c_ws_plugin__s2member_utils_users"))
67
 
68
  if /* This case includes some additional routines that can use the ``$os0`` value. */ ($subscr_or_txn_id && $os0)
69
  {
70
- if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND (`meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' OR `meta_value` = '" . esc_sql ($os0) . "') LIMIT 1"))
71
  || ($q = $wpdb->get_row ("SELECT `ID` AS `user_id` FROM `" . $wpdb->users . "` WHERE `ID` = '" . esc_sql ($os0) . "' LIMIT 1")))
72
  if (($custom = get_user_option ("s2member_custom", $q->user_id)))
73
  return $custom;
74
  }
75
  else if /* Otherwise, if all we have is a Subscr./Txn. ID value. */ ($subscr_or_txn_id)
76
  {
77
- if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND `meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' LIMIT 1")))
78
  if (($custom = get_user_option ("s2member_custom", $q->user_id)))
79
  return $custom;
80
  }
@@ -98,13 +98,13 @@ if (!class_exists ("c_ws_plugin__s2member_utils_users"))
98
 
99
  if /* This case includes some additional routines that can use the ``$os0`` value. */($subscr_or_txn_id && $os0)
100
  {
101
- if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND (`meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' OR `meta_value` = '" . esc_sql ($os0) . "') LIMIT 1"))
102
  || ($q = $wpdb->get_row ("SELECT `ID` AS `user_id` FROM `" . $wpdb->users . "` WHERE `ID` = '" . esc_sql ($os0) . "' LIMIT 1")))
103
  return $q->user_id;
104
  }
105
  else if /* Otherwise, if all we have is a Subscr./Txn. ID value. */ ($subscr_or_txn_id)
106
  {
107
- if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND `meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' LIMIT 1")))
108
  return $q->user_id;
109
  }
110
  return /* Otherwise, return false. */ false;
@@ -127,14 +127,14 @@ if (!class_exists ("c_ws_plugin__s2member_utils_users"))
127
 
128
  if /* This case includes some additional routines that can use the ``$os0`` value. */($subscr_or_txn_id && $os0)
129
  {
130
- if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND (`meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' OR `meta_value` = '" . esc_sql ($os0) . "') LIMIT 1"))
131
  || ($q = $wpdb->get_row ("SELECT `ID` AS `user_id` FROM `" . $wpdb->users . "` WHERE `ID` = '" . esc_sql ($os0) . "' LIMIT 1")))
132
  if (is_object ($user = new WP_User ($q->user_id)) && !empty ($user->ID) && ($email = $user->user_email))
133
  return $email;
134
  }
135
  else if /* Otherwise, if all we have is a Subscr./Txn. ID value. */($subscr_or_txn_id)
136
  {
137
- if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND `meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' LIMIT 1")))
138
  if (is_object ($user = new WP_User ($q->user_id)) && !empty ($user->ID) && ($email = $user->user_email))
139
  return $email;
140
  }
@@ -158,7 +158,10 @@ if (!class_exists ("c_ws_plugin__s2member_utils_users"))
158
  {
159
  if ($user_id || ($subscr_id && ($user_id = c_ws_plugin__s2member_utils_users::get_user_id_with ($subscr_id))) || (!$user_id && !$subscr_id && is_object ($user = wp_get_current_user ()) && !empty ($user->ID) && ($user_id = $user->ID)))
160
  {
161
- if (($_subscr_id = get_user_option ("s2member_subscr_id", $user_id)) && (!$subscr_id || $subscr_id === $_subscr_id) && ($subscr_id = $_subscr_id))
 
 
 
162
  if (is_array ($ipn_signup_vars = get_user_option ("s2member_ipn_signup_vars", $user_id)))
163
  if ($ipn_signup_vars["subscr_id"] === $subscr_id)
164
  return $ipn_signup_vars;
67
 
68
  if /* This case includes some additional routines that can use the ``$os0`` value. */ ($subscr_or_txn_id && $os0)
69
  {
70
+ if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_subscr_baid' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND (`meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' OR `meta_value` = '" . esc_sql ($os0) . "') LIMIT 1"))
71
  || ($q = $wpdb->get_row ("SELECT `ID` AS `user_id` FROM `" . $wpdb->users . "` WHERE `ID` = '" . esc_sql ($os0) . "' LIMIT 1")))
72
  if (($custom = get_user_option ("s2member_custom", $q->user_id)))
73
  return $custom;
74
  }
75
  else if /* Otherwise, if all we have is a Subscr./Txn. ID value. */ ($subscr_or_txn_id)
76
  {
77
+ if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_subscr_baid' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND `meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' LIMIT 1")))
78
  if (($custom = get_user_option ("s2member_custom", $q->user_id)))
79
  return $custom;
80
  }
98
 
99
  if /* This case includes some additional routines that can use the ``$os0`` value. */($subscr_or_txn_id && $os0)
100
  {
101
+ if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_subscr_baid' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND (`meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' OR `meta_value` = '" . esc_sql ($os0) . "') LIMIT 1"))
102
  || ($q = $wpdb->get_row ("SELECT `ID` AS `user_id` FROM `" . $wpdb->users . "` WHERE `ID` = '" . esc_sql ($os0) . "' LIMIT 1")))
103
  return $q->user_id;
104
  }
105
  else if /* Otherwise, if all we have is a Subscr./Txn. ID value. */ ($subscr_or_txn_id)
106
  {
107
+ if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_subscr_baid' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND `meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' LIMIT 1")))
108
  return $q->user_id;
109
  }
110
  return /* Otherwise, return false. */ false;
127
 
128
  if /* This case includes some additional routines that can use the ``$os0`` value. */($subscr_or_txn_id && $os0)
129
  {
130
+ if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_subscr_baid' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND (`meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' OR `meta_value` = '" . esc_sql ($os0) . "') LIMIT 1"))
131
  || ($q = $wpdb->get_row ("SELECT `ID` AS `user_id` FROM `" . $wpdb->users . "` WHERE `ID` = '" . esc_sql ($os0) . "' LIMIT 1")))
132
  if (is_object ($user = new WP_User ($q->user_id)) && !empty ($user->ID) && ($email = $user->user_email))
133
  return $email;
134
  }
135
  else if /* Otherwise, if all we have is a Subscr./Txn. ID value. */($subscr_or_txn_id)
136
  {
137
+ if (($q = $wpdb->get_row ("SELECT `user_id` FROM `" . $wpdb->usermeta . "` WHERE (`meta_key` = '" . $wpdb->prefix . "s2member_subscr_id' OR `meta_key` = '" . $wpdb->prefix . "s2member_subscr_baid' OR `meta_key` = '" . $wpdb->prefix . "s2member_first_payment_txn_id') AND `meta_value` = '" . esc_sql ($subscr_or_txn_id) . "' LIMIT 1")))
138
  if (is_object ($user = new WP_User ($q->user_id)) && !empty ($user->ID) && ($email = $user->user_email))
139
  return $email;
140
  }
158
  {
159
  if ($user_id || ($subscr_id && ($user_id = c_ws_plugin__s2member_utils_users::get_user_id_with ($subscr_id))) || (!$user_id && !$subscr_id && is_object ($user = wp_get_current_user ()) && !empty ($user->ID) && ($user_id = $user->ID)))
160
  {
161
+ $_subscr_id = get_user_option ("s2member_subscr_id", $user_id);
162
+ $_subscr_baid = get_user_option ("s2member_subscr_baid", $user_id);
163
+
164
+ if ($_subscr_id && (!$subscr_id || $subscr_id === $_subscr_id || $subscr_id === $_subscr_baid) && ($subscr_id = $_subscr_id))
165
  if (is_array ($ipn_signup_vars = get_user_option ("s2member_ipn_signup_vars", $user_id)))
166
  if ($ipn_signup_vars["subscr_id"] === $subscr_id)
167
  return $ipn_signup_vars;
includes/codes.inc.php CHANGED
@@ -28,6 +28,13 @@ add_shortcode ("s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
28
  add_shortcode ("_s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
29
  add_shortcode ("__s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
30
  add_shortcode ("___s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
 
 
 
 
 
 
 
31
 
32
  add_shortcode ("s2Member-Profile", "c_ws_plugin__s2member_sc_profile::sc_profile");
33
  add_shortcode ("s2Member-PayPal-Button", "c_ws_plugin__s2member_sc_paypal_button::sc_paypal_button");
28
  add_shortcode ("_s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
29
  add_shortcode ("__s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
30
  add_shortcode ("___s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
31
+ add_shortcode ("____s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
32
+ add_shortcode ("_____s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
33
+ add_shortcode ("______s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
34
+ add_shortcode ("_______s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
35
+ add_shortcode ("________s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
36
+ add_shortcode ("_________s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
37
+ add_shortcode ("__________s2If", "c_ws_plugin__s2member_sc_if_conds::sc_if_conditionals");
38
 
39
  add_shortcode ("s2Member-Profile", "c_ws_plugin__s2member_sc_profile::sc_profile");
40
  add_shortcode ("s2Member-PayPal-Button", "c_ws_plugin__s2member_sc_paypal_button::sc_paypal_button");
includes/menu-pages/code-samples/current-user-downloads-allowed-is-unlimited.x-php CHANGED
@@ -1,6 +1,13 @@
1
- You are allowed to download <?php echo (S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED) ? 'Unlimited' : S2MEMBER_LEVEL2_FILE_DOWNLOADS_ALLOWED; ?> files
2
  every <?php S2MEMBER_LEVEL2_FILE_DOWNLOADS_ALLOWED_DAYS; ?> days.
3
 
4
- ---- s2member Shortcode Equivalent ----
5
 
6
- There is NO equivalent for this logic yet.
 
 
 
 
 
 
 
1
+ You are allowed to download <?php echo (S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED) ? 'unlimited' : S2MEMBER_LEVEL2_FILE_DOWNLOADS_ALLOWED; ?> files
2
  every <?php S2MEMBER_LEVEL2_FILE_DOWNLOADS_ALLOWED_DAYS; ?> days.
3
 
4
+ ---- s2Member Shortcode Equivalent (Requires s2Member Pro) ------------
5
 
6
+ You are allowed to download [s2If php="S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED"]unlimited
7
+ [else][s2Get constant="S2MEMBER_LEVEL2_FILE_DOWNLOADS_ALLOWED" /][/s2If] files
8
+ every [s2Get constant="S2MEMBER_LEVEL2_FILE_DOWNLOADS_ALLOWED_DAYS" /] days.
9
+
10
+ **NOTE** The use of `[s2If php=""]` and `[else]` requires s2Member Pro.
11
+ **NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
12
+ Please visit `Dashboard ⥱ s2Member ⥱ Restriction Options ⥱ Simple Shortcode Conditionals`
13
+ to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
includes/menu-pages/code-samples/current-user-paid-registration-days-dripping.x-php CHANGED
@@ -10,8 +10,25 @@
10
  Drip content to Members that started paying you at least 90 days ago.
11
  <?php } ?>
12
 
13
- ---- s2member Shortcode Equivalent ----
14
 
15
- [s2Get constant="S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS" /]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
- There is NO Shortcode equivalent for this logic yet. Coming soon.
10
  Drip content to Members that started paying you at least 90 days ago.
11
  <?php } ?>
12
 
13
+ ---- s2member Shortcode Equivalent (Requires s2Member Pro) ----
14
 
15
+ [s2If php="S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS >= 30"]
16
+ Drip content to Members that started paying you at least 30 days ago.
17
+ [/s2If]
18
+
19
+ [s2If php="S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS >= 60"]
20
+ Drip content to Members that started paying you at least 60 days ago.
21
+ [/s2If]
22
+
23
+ [s2If php="S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS >= 90"]
24
+ Drip content to Members that started paying you at least 90 days ago.
25
+ [/s2If]
26
+
27
+ **NOTE** The use of `[s2If php=""]` requires s2Member Pro.
28
+ **NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
29
+ Please visit `Dashboard ⥱ s2Member ⥱ Restriction Options ⥱ Simple Shortcode Conditionals`
30
+ to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
31
+
32
+ ---- Another s2member Shortcode Equivalent ----
33
 
34
+ [s2Get constant="S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS" /]
includes/menu-pages/code-samples/current-user-paid-registration-days.x-php CHANGED
@@ -1,6 +1,8 @@
1
  <?php echo S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS; ?>
2
  This may output something like: 120 (120 days is approx 4 months)
3
 
 
 
4
  In this example, the longer they've been a "paying" Member, the more they get.
5
 
6
  <?php if(S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS >= 30){ ?>
@@ -15,8 +17,25 @@ In this example, the longer they've been a "paying" Member, the more they get.
15
  Drip content to Members that started paying you at least 90 days ago.
16
  <?php } ?>
17
 
18
- ---- s2member Shortcode Equivalent ----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
- [s2Get constant="S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS" /]
21
 
22
- There is NO Shortcode equivalent for this logic yet. Coming soon.
1
  <?php echo S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS; ?>
2
  This may output something like: 120 (120 days is approx 4 months)
3
 
4
+ -------------------------------------------------------------------------
5
+
6
  In this example, the longer they've been a "paying" Member, the more they get.
7
 
8
  <?php if(S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS >= 30){ ?>
17
  Drip content to Members that started paying you at least 90 days ago.
18
  <?php } ?>
19
 
20
+ ---- s2member Shortcode Equivalent (Requires s2Member Pro) ----
21
+
22
+ [s2If php="S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS >= 30"]
23
+ Drip content to Members that started paying you at least 30 days ago.
24
+ [/s2If]
25
+
26
+ [s2If php="S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS >= 60"]
27
+ Drip content to Members that started paying you at least 60 days ago.
28
+ [/s2If]
29
+
30
+ [s2If php="S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS >= 90"]
31
+ Drip content to Members that started paying you at least 90 days ago.
32
+ [/s2If]
33
+
34
+ **NOTE** The use of `[s2If php=""]` requires s2Member Pro.
35
+ **NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
36
+ Please visit `Dashboard ⥱ s2Member ⥱ Restriction Options ⥱ Simple Shortcode Conditionals`
37
+ to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
38
 
39
+ ---- Another s2member Shortcode Equivalent ----
40
 
41
+ [s2Get constant="S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS" /]
includes/menu-pages/code-samples/current-user-registration-days.x-php CHANGED
@@ -1,6 +1,8 @@
1
  <?php echo S2MEMBER_CURRENT_USER_REGISTRATION_DAYS; ?>
2
  This may output something like: 120 (120 days is approx 4 months)
3
 
 
 
4
  In this example, the longer they've been registered (for free or otherwise), the more they get.
5
 
6
  <?php if(S2MEMBER_CURRENT_USER_REGISTRATION_DAYS >= 30){ ?>
@@ -15,8 +17,25 @@ In this example, the longer they've been registered (for free or otherwise), the
15
  Drip content to Users who've been registered for at least 90 days.
16
  <?php } ?>
17
 
18
- ---- s2member Shortcode Equivalent ----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
- [s2Get constant="S2MEMBER_CURRENT_USER_REGISTRATION_DAYS" /]
21
 
22
- There is NO Shortcode equivalent for this logic yet. Coming soon.
1
  <?php echo S2MEMBER_CURRENT_USER_REGISTRATION_DAYS; ?>
2
  This may output something like: 120 (120 days is approx 4 months)
3
 
4
+ -------------------------------------------------------------------------
5
+
6
  In this example, the longer they've been registered (for free or otherwise), the more they get.
7
 
8
  <?php if(S2MEMBER_CURRENT_USER_REGISTRATION_DAYS >= 30){ ?>
17
  Drip content to Users who've been registered for at least 90 days.
18
  <?php } ?>
19
 
20
+ ---- s2member Shortcode Equivalent (Requires s2Member Pro) ----
21
+
22
+ [s2If php="S2MEMBER_CURRENT_USER_REGISTRATION_DAYS >= 30"]
23
+ Drip content to Users who've been registered for at least 30 days.
24
+ [/s2If]
25
+
26
+ [s2If php="S2MEMBER_CURRENT_USER_REGISTRATION_DAYS >= 60"]
27
+ Drip content to Users who've been registered for at least 60 days.
28
+ [/s2If]
29
+
30
+ [s2If php="S2MEMBER_CURRENT_USER_REGISTRATION_DAYS >= 90"]
31
+ Drip content to Users who've been registered for at least 90 days.
32
+ [/s2If]
33
+
34
+ **NOTE** The use of `[s2If php=""]` requires s2Member Pro.
35
+ **NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
36
+ Please visit `Dashboard ⥱ s2Member ⥱ Restriction Options ⥱ Simple Shortcode Conditionals`
37
+ to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
38
 
39
+ ---- Another s2member Shortcode Equivalent ----
40
 
41
+ [s2Get constant="S2MEMBER_CURRENT_USER_REGISTRATION_DAYS" /]
includes/menu-pages/code-samples/s2drip-example1.x-php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [s2Drip level="1" from_day="4"]
2
+ Some content for Members at Level 1 (or higher).
3
+
4
+ This content will show only after day 3 of their paid membership.
5
+ ~ i.e. it starts showing on day 4.
6
+
7
+ It will continue to be shown every day thereafter.
8
+ [/s2Drip]
9
+
10
+ [s2Drip level="1" from_day="4" to_day="30"]
11
+ Some content for Members at Level 1 (or higher).
12
+
13
+ This content will show only after day 3 of their paid membership.
14
+ ~ i.e. it starts showing on day 4.
15
+
16
+ In addition, this content will stop being shown on day 31 of their paid membership.
17
+ ... i.e. show until (and including) day 30; stop showing after day 30.
18
+ [/s2Drip]
19
+
20
+ **NOTE** The use of [s2Drip] requires s2Member Pro.
21
+
22
+ **NOTE** [s2Drip] will NOT work as expected when testing against an Administrator who is logged in.
23
+ While Administrators DO gain full access to all content, Administrators generally
24
+ do NOT have a paid registration time; i.e. they are not an actual customer.
25
+ Thus, do NOT test this as an Administrator, you WILL be confused :-)
26
+ Administrators will always see the content, no matter.
includes/menu-pages/code-samples/s2member-paid-registration-time-examples.x-php CHANGED
@@ -31,4 +31,25 @@
31
  Drip more content to Members that started paying you at Level#1, at least 60 days ago.
32
  <?php } ?>
33
 
34
- <?php } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  Drip more content to Members that started paying you at Level#1, at least 60 days ago.
32
  <?php } ?>
33
 
34
+ <?php } ?>
35
+
36
+ ---- Example #2 Shortcode Equivalent (Requires s2Member Pro) ------------
37
+
38
+ [s2If php="s2member_paid_registration_time() > 0"]
39
+
40
+ This is some content that will be displayed to all Members that have paid you at some point.
41
+
42
+ [_s2If php="($level1_payment_time = s2member_paid_registration_time('level1')) && $level1_payment_time <= ($_30_days_ago = strtotime('-30 days'))"]
43
+ Drip content to Members that started paying you at Level#1, at least 30 days ago.
44
+ [/_s2If]
45
+
46
+ [_s2If php="($level1_payment_time = s2member_paid_registration_time('level1')) && $level1_payment_time <= ($_60_days_ago = strtotime('-60 days'))"]
47
+ Drip content to Members that started paying you at Level#1, at least 60 days ago.
48
+ [/_s2If]
49
+
50
+ [/s2If]
51
+
52
+ **NOTE** The use of `[s2If php=""]` requires s2Member Pro.
53
+ **NOTE** Arbitrary PHP code (via [s2If php=""]) will only work if you enable this functionality.
54
+ Please visit `Dashboard ⥱ s2Member ⥱ Restriction Options ⥱ Simple Shortcode Conditionals`
55
+ to set your preferences and enable `[s2If php=""]` when s2Member Pro is installed.
includes/menu-pages/code-samples/sc-current-user-can-full-access-farm.x-php CHANGED
@@ -1,7 +1,5 @@
1
  [s2If current_user_can(access_s2member_level1)]
2
  Some content for Members who are logged in with an s2Member Level >= 1.
3
- [/s2If]
4
-
5
- [s2If !current_user_can(access_s2member_level1)]
6
  Some public content.
7
  [/s2If]
1
  [s2If current_user_can(access_s2member_level1)]
2
  Some content for Members who are logged in with an s2Member Level >= 1.
3
+ [else]
 
 
4
  Some public content.
5
  [/s2If]
includes/menu-pages/code-samples/sc-current-user-can-full-access.x-php CHANGED
@@ -1,7 +1,5 @@
1
  [s2If current_user_can(access_s2member_level1)]
2
  Some content for Members who are logged in with an s2Member Level >= 1.
3
- [/s2If]
4
-
5
- [s2If !current_user_can(access_s2member_level1)]
6
  Some public content.
7
  [/s2If]
1
  [s2If current_user_can(access_s2member_level1)]
2
  Some content for Members who are logged in with an s2Member Level >= 1.
3
+ [else]
 
 
4
  Some public content.
5
  [/s2If]
includes/menu-pages/code-samples/sc-current-user-is-specific-content-else-farm.x-php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Notice that NESTED Conditionals require a preceding underscore (i.e. _s2If, __s2If, ___s2If).
2
+ You can go up to ten levels deep ( __________s2If ).
3
+
4
+ [s2If current_user_is(s2member_level4)]
5
+ Some premium content for Level 4 Members.
6
+ [else]
7
+ [_s2If current_user_is(s2member_level3)]
8
+ Some premium content for Level 3 Members.
9
+ [_else]
10
+ [__s2If current_user_is(s2member_level2)]
11
+ Some premium content for Level 2 Members.
12
+ [__else]
13
+ [___s2If current_user_is(s2member_level1)]
14
+ Some premium content for Level 1 Members.
15
+ [___else]
16
+ [____s2If current_user_is(s2member_level0)]
17
+ Some content for Free Subscribers.
18
+ [____else]
19
+ Some public content.
20
+ [/____s2If]
21
+ [/___s2If]
22
+ [/__s2If]
23
+ [/_s2If]
24
+ [/s2If]
includes/menu-pages/code-samples/sc-current-user-is-specific-content-else.x-php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Notice that NESTED Conditionals require a preceding underscore (i.e. _s2If, __s2If, ___s2If).
2
+ You can go up to ten levels deep ( __________s2If ).
3
+
4
+ [s2If current_user_is(s2member_level4)]
5
+ Some premium content for Level 4 Members.
6
+ [else]
7
+ [_s2If current_user_is(s2member_level3)]
8
+ Some premium content for Level 3 Members.
9
+ [_else]
10
+ [__s2If current_user_is(s2member_level2)]
11
+ Some premium content for Level 2 Members.
12
+ [__else]
13
+ [___s2If current_user_is(s2member_level1)]
14
+ Some premium content for Level 1 Members.
15
+ [___else]
16
+ [____s2If current_user_is(s2member_level0)]
17
+ Some content for Free Subscribers.
18
+ [____else]
19
+ Some public content.
20
+ [/____s2If]
21
+ [/___s2If]
22
+ [/__s2If]
23
+ [/_s2If]
24
+ [/s2If]
includes/menu-pages/code-samples/sc-is-user-logged-in-else-farm.x-php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ [s2If is_user_logged_in()]
2
+ Content for anyone that is logged in, regardless of their Membership Level.
3
+ [else]
4
+ Some public content. They're NOT logged in.
5
+ [/s2If]
includes/menu-pages/code-samples/sc-is-user-logged-in-else.x-php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ [s2If is_user_logged_in()]
2
+ Content for anyone that is logged in, regardless of their Membership Level.
3
+ [else]
4
+ Some public content. They're NOT logged in.
5
+ [/s2If]
includes/menu-pages/code-samples/sc-s2-conditional-nesting-else-farm.x-php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ [s2If is_user_logged_in() AND current_user_is(s2member_level1)]
2
+ [_s2If is_page(1) OR is_page(2)]
3
+ You can access.
4
+ [_else]
5
+ Denied!
6
+ [/_s2If]
7
+ [/s2If]
includes/menu-pages/code-samples/sc-s2-conditional-nesting-else.x-php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ [s2If is_user_logged_in() AND current_user_is(s2member_level1)]
2
+ [_s2If is_page(1) OR is_page(2)]
3
+ You can access.
4
+ [_else]
5
+ Denied!
6
+ [/_s2If]
7
+ [/s2If]
includes/menu-pages/code-samples/sc-s2-conditional-nesting-farm.x-php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ [s2If is_user_logged_in() AND current_user_is(s2member_level1)]
2
+ [_s2If is_page(1) OR is_page(2)]
3
+ You can access.
4
+ [/_s2If]
5
+ [/s2If]
includes/menu-pages/code-samples/sc-s2-conditional-nesting.x-php CHANGED
@@ -1,5 +1,5 @@
1
  [s2If is_user_logged_in() AND current_user_is(s2member_level1)]
2
  [_s2If is_page(1) OR is_page(2)]
3
- content appears here
4
  [/_s2If]
5
  [/s2If]
1
  [s2If is_user_logged_in() AND current_user_is(s2member_level1)]
2
  [_s2If is_page(1) OR is_page(2)]
3
+ You can access.
4
  [/_s2If]
5
  [/s2If]
includes/menu-pages/code-samples/sc-s2-conditional-supplements-3-farm.x-php CHANGED
@@ -6,7 +6,7 @@
6
  [_s2If current_user_can(access_s2member_level3)]
7
 
8
  Notice that NESTED Conditionals require a preceding underscore (i.e. _s2If, __s2If, ___s2If).
9
- You can go up to three levels deep ( ___s2If ).
10
 
11
  Nested PayPal Form/Button Shortcodes ARE fine too.
12
  However, you do NOT need a preceding underscore on Form/Button codes. Or any other Shortcode for that matter.
6
  [_s2If current_user_can(access_s2member_level3)]
7
 
8
  Notice that NESTED Conditionals require a preceding underscore (i.e. _s2If, __s2If, ___s2If).
9
+ You can go up to ten levels deep ( __________s2If ).
10
 
11
  Nested PayPal Form/Button Shortcodes ARE fine too.
12
  However, you do NOT need a preceding underscore on Form/Button codes. Or any other Shortcode for that matter.
includes/menu-pages/code-samples/sc-s2-conditional-supplements-3.x-php CHANGED
@@ -7,7 +7,7 @@
7
 
8
  Display free gift here. This is a Custom Capability check, using a nested Conditional.
9
  Notice that NESTED Conditionals require a preceding underscore (i.e. _s2If, __s2If, ___s2If).
10
- You can go up to three levels deep ( ___s2If ).
11
 
12
  Nested PayPal Form/Button Shortcodes ARE fine too.
13
  However, you do NOT need a preceding underscore on Form/Button codes. Or any other Shortcode for that matter.
7
 
8
  Display free gift here. This is a Custom Capability check, using a nested Conditional.
9
  Notice that NESTED Conditionals require a preceding underscore (i.e. _s2If, __s2If, ___s2If).
10
+ You can go up to ten levels deep ( __________s2If ).
11
 
12
  Nested PayPal Form/Button Shortcodes ARE fine too.
13
  However, you do NOT need a preceding underscore on Form/Button codes. Or any other Shortcode for that matter.
includes/menu-pages/down-ops.inc.php CHANGED
@@ -678,10 +678,39 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
678
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_gzip_conflicts", get_defined_vars());
679
 
680
  echo '<div class="ws-menu-page-hr"></div>'."\n";
 
681
  echo '<p style="margin:0; font-weight:bold;">s2Member automatically adds this to your <code>.htaccess</code> file upon activation of the plugin.</p>'."\n";
682
  echo '<p style="margin:0;">The following <code>mod_rewrite</code> rule goes inside this file: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path(ABSPATH.".htaccess")).'</code></p>'."\n";
683
  echo '<pre class="code"><code>'.esc_html(trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_no_gzip_htaccess"])))).'</code></pre>';
684
  echo '<p><strong>* Tip:</strong> this covers all types of integration with s2Member File Downloads, even if you\'re using s2Member\'s Advanced Mod Rewrite Linkage.</p>'."\n";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
685
  echo '</div>'."\n";
686
 
687
  echo '</div>'."\n";
678
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_gzip_conflicts", get_defined_vars());
679
 
680
  echo '<div class="ws-menu-page-hr"></div>'."\n";
681
+
682
  echo '<p style="margin:0; font-weight:bold;">s2Member automatically adds this to your <code>.htaccess</code> file upon activation of the plugin.</p>'."\n";
683
  echo '<p style="margin:0;">The following <code>mod_rewrite</code> rule goes inside this file: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path(ABSPATH.".htaccess")).'</code></p>'."\n";
684
  echo '<pre class="code"><code>'.esc_html(trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_no_gzip_htaccess"])))).'</code></pre>';
685
  echo '<p><strong>* Tip:</strong> this covers all types of integration with s2Member File Downloads, even if you\'re using s2Member\'s Advanced Mod Rewrite Linkage.</p>'."\n";
686
+
687
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
688
+
689
+ echo '<table class="form-table">' . "\n";
690
+ echo '<tbody>' . "\n";
691
+ echo '<tr>' . "\n";
692
+
693
+ echo '<th>' . "\n";
694
+ echo '<label for="ws-plugin--s2member-file-download-content-encodong-none">' . "\n";
695
+ echo 'Also Force a <code>Content-Encoding: none</code> Header?' . "\n";
696
+ echo '</label>' . "\n";
697
+ echo '</th>' . "\n";
698
+
699
+ echo '</tr>' . "\n";
700
+ echo '<tr>' . "\n";
701
+
702
+ echo '<td>' . "\n";
703
+ echo '<select name="ws_plugin__s2member_file_download_content_encodong_none" id="ws-plugin--s2member-file-download-content-encodong-none">' . "\n";
704
+ echo '<option value="0"' . ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_content_encodong_none"]) ? ' selected="selected"' : '') . '>No (remain standards-compliant; I will configure my server properly)</option>' . "\n";
705
+ echo '<option value="1"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_content_encodong_none"]) ? ' selected="selected"' : '') . '>Yes (my web server is stubborn; downloads are corrupted without this)</option>' . "\n";
706
+ echo '</select>' . "\n";
707
+ echo '</td>' . "\n";
708
+
709
+ echo '</tr>' . "\n";
710
+ echo '</tbody>' . "\n";
711
+ echo '</table>' . "\n";
712
+
713
+ echo '<p><code>Content-Encoding: none</code> can be forced by s2Member in order to workaround stubborn web server configurations. However, please note that <code>Content-Encoding: none</code> is an invalid header (NOT standards compliant), so don\'t enable this unless you absolutely need to. For instance, if files downloaded via s2Member are always corrupt, you could enable this to workaround the issue. The issue being... that your web server is ignoring all of s2Member\'s attempts to serve a file without Content-Encoding. While <code>Content-Encoding: none</code> is indeed a hack, it\'s a relatively common hack that most modern browsers will understand just fine; making this a viable solution when/if necessary.</p>'."\n";
714
  echo '</div>'."\n";
715
 
716
  echo '</div>'."\n";
includes/menu-pages/els-ops.inc.php CHANGED
@@ -56,7 +56,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
56
  echo '<div class="ws-menu-page-section ws-plugin--s2member-mailchimp-section">'."\n";
57
  echo '<a href="http://www.s2member.com/mailchimp" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/mailchimp-stamp.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
58
  echo '<h3>MailChimp List Server Integration (optional)</h3>'."\n";
59
- echo '<p>s2Member can be integrated with MailChimp. MailChimp is an email marketing service. MailChimp makes it easy to send email newsletters to your Customers, manage your MailChimp subscriber lists, and track campaign performance. Although s2Member can be integrated with almost ANY list server, we highly recommend MailChimp; because of their <a href="http://www.s2member.com/mailchimp-api-docs" target="_blank" rel="external">powerful API for MailChimp services</a>. In future versions of s2Member, we plan to build additional features into s2Member that work with, and extend, MailChimp services.</p>'."\n";
60
  echo '<p>For now, we\'ve covered the basics. You can have your Members automatically subscribed to your MailChimp marketing lists <em>(e.g. newsletters / auto-responders)</em>. You\'ll need a <a href="http://www.s2member.com/mailchimp" target="_blank" rel="external">MailChimp account</a>, a <a href="http://www.s2member.com/mailchimp-api-key" target="_blank" rel="external">MailChimp API Key</a>, and your <a href="#" onclick="alert(\'To obtain your MailChimp List ID(s), log into your MailChimp account and click the Lists tab. Now click the (View) button, for the List(s) you want to integrate with s2Member. Then, click the (Settings) link. At the bottom of the (Settings) page, for each list; you\\\'ll find a Unique List ID.\'); return false;">MailChimp List IDs</a>.</p>'."\n";
61
  do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_mailchimp", get_defined_vars());
62
 
@@ -120,6 +120,78 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
120
  do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_after_mailchimp", get_defined_vars());
121
  }
122
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
  if(apply_filters("ws_plugin__s2member_during_els_ops_page_during_left_sections_display_aweber", true, get_defined_vars()))
124
  {
125
  do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_before_aweber", get_defined_vars());
@@ -185,7 +257,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
185
 
186
  echo '<div class="ws-menu-page-section ws-plugin--s2member-opt-in-section">'."\n";
187
  echo '<h3>Double Opt-In Checkbox Field (optional)</h3>'."\n";
188
- echo '<p>A Double Opt-In Checkbox will ONLY be displayed, if you\'ve integrated one <em>or more</em> List Servers.</p>'."\n";
189
  do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_opt_in", get_defined_vars());
190
 
191
  echo '<table class="form-table">'."\n";
@@ -289,8 +361,8 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
289
  echo '<option value="2"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_out_transitions"] === "2") ? ' selected="selected"' : '').'>Yes (always automatically transition, even if NOT removed from a previous list)</option>'."\n";
290
  echo '</select><br />'."\n";
291
  echo '<em><strong>*Transitions*</strong> When/if s2Member automatically removes a Member from Lists at their current Level# (based on your configuration in the previous section), this setting tells s2Member that it should <strong>also</strong> transition the Member to any Lists you\'ve configured at the new Access Level# (i.e. Role) they are being changed to. For example, if a Member is demoted from Level #1 to Level #0, do you want s2Member to add them to the Level #0 List(s) after it removes them from the Level #1 List(s)?</em><br /><br />'."\n";
292
- echo '<em><strong>*If removed from a previous list, or NOT?*</strong> You can choose your preference above. When/if s2Member automatically transitions a mailing list subscriber, it will first try to remove the subscriber from a previous mailing list. If s2Member is able to remove the subscriber from a previous list before the transition takes place, s2Member will then make an attempt (based on your configuration) to transition the subscriber to a new/different list silently (e.g. without a new confirmation email being sent out). If s2Member is NOT able to remove a subscriber from a previous list, it can - (if configured to do so), still transition a subscriber to a new list, by sending the subscriber a new email confirmation letter (e.g. this is NOT silent, because you absolutely NEED the subscriber\'s permission in this case).</em><br /><br />'."\n";
293
- echo '<em><strong>*Seamless with MailChimp*</strong> If enabled, Automatic List Transitions work seamlessly with MailChimp. Automatic List Transitions also work with AWeber, but AWeber will ALWAYS send the User/Member a new confirmation email, asking them to confirm changes to their mailing list subscription with you. Work is underway to improve this aspect of s2Member\'s integration with AWeber in a future release. Ideally, a Customer would be transitioned silently behind the scene with AWeber too, when appropriate.</em>'."\n";
294
  echo '</td>'."\n";
295
 
296
  echo '</tr>'."\n";
56
  echo '<div class="ws-menu-page-section ws-plugin--s2member-mailchimp-section">'."\n";
57
  echo '<a href="http://www.s2member.com/mailchimp" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/mailchimp-stamp.png" class="ws-menu-page-right" style="width:125px; height:125px; border:0;" alt="." /></a>'."\n";
58
  echo '<h3>MailChimp List Server Integration (optional)</h3>'."\n";
59
+ echo '<p>s2Member can be integrated with MailChimp. MailChimp is an email marketing service. MailChimp makes it easy to send email newsletters to your Customers, manage your MailChimp subscriber lists, and track campaign performance. Although s2Member can be integrated with almost ANY list server, we highly recommend MailChimp; because of their <a href="http://www.s2member.com/mailchimp-api-docs" target="_blank" rel="external">powerful API for MailChimp services</a>. In future versions of s2Member, we plan to build additional features into s2Member that work with, and extend MailChimp services.</p>'."\n";
60
  echo '<p>For now, we\'ve covered the basics. You can have your Members automatically subscribed to your MailChimp marketing lists <em>(e.g. newsletters / auto-responders)</em>. You\'ll need a <a href="http://www.s2member.com/mailchimp" target="_blank" rel="external">MailChimp account</a>, a <a href="http://www.s2member.com/mailchimp-api-key" target="_blank" rel="external">MailChimp API Key</a>, and your <a href="#" onclick="alert(\'To obtain your MailChimp List ID(s), log into your MailChimp account and click the Lists tab. Now click the (View) button, for the List(s) you want to integrate with s2Member. Then, click the (Settings) link. At the bottom of the (Settings) page, for each list; you\\\'ll find a Unique List ID.\'); return false;">MailChimp List IDs</a>.</p>'."\n";
61
  do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_mailchimp", get_defined_vars());
62
 
120
  do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_after_mailchimp", get_defined_vars());
121
  }
122
 
123
+ if(apply_filters("ws_plugin__s2member_during_els_ops_page_during_left_sections_display_getresponse", c_ws_plugin__s2member_utils_conds::pro_is_installed(), get_defined_vars()))
124
+ {
125
+ do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_before_getresponse", get_defined_vars());
126
+
127
+ echo '<div class="ws-menu-page-group" title="GetResponse Integration">'."\n";
128
+
129
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-getresponse-section">'."\n";
130
+ echo '<a href="http://www.s2member.com/r/getresponse/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/getresponse-logo.png" class="ws-menu-page-right" style="width:256px; height:89px; border:0;" alt="." /></a>'."\n";
131
+ echo '<h3>GetResponse List Server Integration (optional)</h3>'."\n";
132
+ echo '<p>s2Member can be integrated with GetResponse. GetResponse is a complete email marketing solution. It provides turnkey newsletter publishing and hosting features, as well as unlimited autoresponders to deliver information to your subscribers and convert them to paying customers.</p>'."\n";
133
+ echo '<p>You can have your Members automatically subscribed to your GetResponse marketing lists <em>(e.g. newsletters / auto-responders)</em>. You\'ll need a <a href="http://www.s2member.com/r/getresponse" target="_blank" rel="external">GetResponse account</a>, a <a href="http://www.s2member.com/r/getresponse-api-key" target="_blank" rel="external">GetResponse API Key</a>, and your <a href="http://www.s2member.com/r/getresponse-campaigns-list" target="_blank" rel="external" onclick="alert(\'To obtain your GetResponse Campaign Token(s), log into your GetResponse account and navigate to your entire list of Campaigns. In the left-hand column you\\\'ll find a list of Unique Campaign Tokens.\\n\\nPlease click OK and we\\\'ll take you there now :-)\');">GetResponse Campaign Tokens</a>.</p>'."\n";
134
+ do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_getresponse", get_defined_vars());
135
+
136
+ echo '<table class="form-table">'."\n";
137
+ echo '<tbody>'."\n";
138
+ echo '<tr>'."\n";
139
+
140
+ echo '<th>'."\n";
141
+ echo '<label for="ws-plugin--s2member-getresponse-api-key">'."\n";
142
+ echo 'GetResponse API Key:'."\n";
143
+ echo '</label>'."\n";
144
+ echo '</th>'."\n";
145
+
146
+ echo '</tr>'."\n";
147
+ echo '<tr>'."\n";
148
+
149
+ echo '<td>'."\n";
150
+ echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_getresponse_api_key" id="ws-plugin--s2member-getresponse-api-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["getresponse_api_key"]).'" /><br />'."\n";
151
+ echo 'Once you have a GetResponse account, you\'ll need to login; then <a href="http://www.s2member.com/r/getresponse-api-key" target="_blank" rel="external">get your API Key</a>.'."\n";
152
+ echo '</td>'."\n";
153
+
154
+ echo '</tr>'."\n";
155
+
156
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
157
+ {
158
+ echo '<tr>'."\n";
159
+
160
+ echo '<th>'."\n";
161
+ echo '<label for="ws-plugin--s2member-level'.$n.'-getresponse-list-ids">'."\n";
162
+ echo 'Campaign Token(s) for '.(($n === 0) ? 'Free Subscribers' : 'Level #'.$n.' Members').' (comma-delimited):'."\n";
163
+ echo '</label>'."\n";
164
+ echo '</th>'."\n";
165
+
166
+ echo '</tr>'."\n";
167
+ echo '<tr>'."\n";
168
+
169
+ echo '<td>'."\n";
170
+ echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_level'.$n.'_getresponse_list_ids" id="ws-plugin--s2member-level'.$n.'-getresponse-list-ids" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_getresponse_list_ids"]).'" /><br />'."\n";
171
+ echo 'New '.(($n === 0) ? 'Free Subscribers' : 'Level #'.$n.' Members').' will be subscribed to these Campaign Tokens.<br />'."\n";
172
+ echo 'Ex: <code>4ksdX</code> or <code>4ksdX, koeeXs, ggjXk, aakSc</code>'."\n";
173
+ echo '</td>'."\n";
174
+
175
+ echo '</tr>'."\n";
176
+ }
177
+
178
+ echo '</tbody>'."\n";
179
+ echo '</table>'."\n";
180
+
181
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
182
+
183
+ echo '<div class="info" style="margin-bottom:0;">'."\n";
184
+ echo '<p style="font-size:110%; margin-top:0;"><span>We HIGHLY recommend that you enable logging during your initial testing phase. Logs produce lots of useful details that can help in debugging. Logs can help you find issues in your configuration and/or problems during GetResponse processing. See: <a href="'.esc_attr(admin_url("/admin.php?page=ws-plugin--s2member-logs")).'">Log Files (Debug)</a>.</span></p>'."\n";
185
+ echo '<p style="font-size:110%; margin-bottom:0;"><span class="ws-menu-page-error">However, it is VERY IMPORTANT to disable logging once you go live. Log files may contain personally identifiable information, credit card numbers, secret API credentials, passwords and/or other sensitive information. We STRONGLY suggest that logging be disabled on a live site (for security reasons).</span></p>'."\n";
186
+ echo '</div>'."\n";
187
+
188
+ echo '</div>'."\n";
189
+
190
+ echo '</div>'."\n";
191
+
192
+ do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_after_getresponse", get_defined_vars());
193
+ }
194
+
195
  if(apply_filters("ws_plugin__s2member_during_els_ops_page_during_left_sections_display_aweber", true, get_defined_vars()))
196
  {
197
  do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_before_aweber", get_defined_vars());
257
 
258
  echo '<div class="ws-menu-page-section ws-plugin--s2member-opt-in-section">'."\n";
259
  echo '<h3>Double Opt-In Checkbox Field (optional)</h3>'."\n";
260
+ echo '<p>A Double Opt-In Checkbox will ONLY be displayed, if you\'ve integrated one <em>or more</em> List Servers. See also: <a href="http://www.s2member.com/kb/double-opt-in-checkbox/" target="_blank" rel="external">this KB article</a>.</p>'."\n";
261
  do_action("ws_plugin__s2member_during_els_ops_page_during_left_sections_during_opt_in", get_defined_vars());
262
 
263
  echo '<table class="form-table">'."\n";
361
  echo '<option value="2"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_out_transitions"] === "2") ? ' selected="selected"' : '').'>Yes (always automatically transition, even if NOT removed from a previous list)</option>'."\n";
362
  echo '</select><br />'."\n";
363
  echo '<em><strong>*Transitions*</strong> When/if s2Member automatically removes a Member from Lists at their current Level# (based on your configuration in the previous section), this setting tells s2Member that it should <strong>also</strong> transition the Member to any Lists you\'ve configured at the new Access Level# (i.e. Role) they are being changed to. For example, if a Member is demoted from Level #1 to Level #0, do you want s2Member to add them to the Level #0 List(s) after it removes them from the Level #1 List(s)?</em><br /><br />'."\n";
364
+ echo '<em><strong>*If removed from a previous list, or NOT?*</strong> You can choose your preference above. When/if s2Member automatically transitions a mailing list subscriber, it will first try to remove the subscriber from a previous mailing list. If s2Member is able to remove the subscriber from a previous list before the transition takes place, s2Member will then make an attempt (based on your configuration) to transition the subscriber to a new/different list silently (e.g. without a new confirmation email being sent out). If s2Member is NOT able to remove a subscriber from a previous list, it can (if configured to do so) still transition a subscriber to a new list, by sending the subscriber a new email confirmation letter (e.g. this is NOT silent, because you absolutely NEED the subscriber\'s permission in this case).</em><br /><br />'."\n";
365
+ echo '<em><strong>*Seamless with MailChimp*</strong> If enabled, Automatic List Transitions work seamlessly with MailChimp. Automatic List Transitions also work with GetResponse/AWeber, but GetResponse/AWeber will ALWAYS send the User/Member a new confirmation email, asking them to confirm changes to their mailing list subscription with you. Work is underway to improve this aspect of s2Member\'s integration with GetResponse/AWeber in a future release. Ideally, a Customer would be transitioned silently behind the scene with GetResponse/AWeber too, when appropriate.</em>'."\n";
366
  echo '</td>'."\n";
367
 
368
  echo '</tr>'."\n";
includes/menu-pages/menu-pages.css CHANGED
@@ -37,9 +37,9 @@ div.ws-menu-page
37
  margin : 25px 25px 25px 5px;
38
 
39
  border-radius : 5px;
40
- background : #ECECEC;
41
- border : 1px solid #A4A4A4;
42
- box-shadow : 0 0 2px 0 rgba(0, 0, 0, 0.2) !important;
43
  }
44
  div.ws-menu-page a
45
  {
37
  margin : 25px 25px 25px 5px;
38
 
39
  border-radius : 5px;
40
+ background : #FFFFFF;
41
+ border : 1px solid #A1ACBE;
42
+ box-shadow : 0 0 8px 0 rgba(0, 0, 0, 0.2) !important;
43
  }
44
  div.ws-menu-page a
45
  {
includes/menu-pages/paypal-ops.inc.php CHANGED
@@ -967,7 +967,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
967
 
968
  echo '<th>'."\n";
969
  echo '<label for="ws-plugin--s2member-triggers-immediate-eot">'."\n";
970
- echo 'Refunds/Reversals (trigger Immediate EOT)?'."\n";
971
  echo '</label>'."\n";
972
  echo '</th>'."\n";
973
 
@@ -976,12 +976,13 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
976
 
977
  echo '<td>'."\n";
978
  echo '<select name="ws_plugin__s2member_triggers_immediate_eot" id="ws-plugin--s2member-triggers-immediate-eot">'."\n";
979
- echo '<option value="none"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "none") ? ' selected="selected"' : '').'>Neither (I\'ll review these two events manually)</option>'."\n";
980
- echo '<option value="refunds"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds") ? ' selected="selected"' : '').'>Refunds (refunds ALWAYS trigger an Immediate EOT action)</option>'."\n";
981
- echo '<option value="reversals"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "reversals") ? ' selected="selected"' : '').'>Reversals (chargebacks ALWAYS trigger an Immediate EOT action)</option>'."\n";
982
- echo '<option value="refunds,reversals"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,reversals") ? ' selected="selected"' : '').'>Refunds/Reversals (ALWAYS trigger an Immediate EOT action)</option>'."\n";
 
983
  echo '</select><br />'."\n";
984
- echo '<em>This setting will <a href="#" onclick="alert(\'A Refund/Reversal Notification will ALWAYS be processed internally by s2Member, even if no action is taken by s2Member. This way you\\\'ll have the full ability to listen for these two events on your own; if you prefer (optional). For more information, check your Dashboard under: `s2Member -› API Notifications -› Refunds/Reversals`.\'); return false;">NOT impact</a> s2Member\'s internal API Notifications for Refund/Reversal events.</em>'."\n";
985
  echo '</td>'."\n";
986
 
987
  echo '</tr>'."\n";
967
 
968
  echo '<th>'."\n";
969
  echo '<label for="ws-plugin--s2member-triggers-immediate-eot">'."\n";
970
+ echo 'Refunds/Partial Refunds/Reversals (trigger Immediate EOT)?'."\n";
971
  echo '</label>'."\n";
972
  echo '</th>'."\n";
973
 
976
 
977
  echo '<td>'."\n";
978
  echo '<select name="ws_plugin__s2member_triggers_immediate_eot" id="ws-plugin--s2member-triggers-immediate-eot">'."\n";
979
+ echo '<option value="none"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "none") ? ' selected="selected"' : '').'>None (I\'ll review these events manually)</option>'."\n";
980
+ echo '<option value="refunds"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds") ? ' selected="selected"' : '').'>Full Refunds (full refunds only; ALWAYS trigger an Immediate EOT action)</option>'."\n";
981
+ echo '<option value="reversals"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "reversals") ? ' selected="selected"' : '').'>Reversals (chargebacks only; ALWAYS trigger an Immediate EOT action)</option>'."\n";
982
+ echo '<option value="refunds,reversals"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,reversals") ? ' selected="selected"' : '').'>Full Refunds, Reversals (these ALWAYS trigger an Immediate EOT action)</option>'."\n";
983
+ echo '<option value="refunds,partial_refunds,reversals"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["triggers_immediate_eot"] === "refunds,partial_refunds,reversals") ? ' selected="selected"' : '').'>Full Refunds, Partial Refunds, Reversals (these ALWAYS trigger an Immediate EOT action)</option>'."\n";
984
  echo '</select><br />'."\n";
985
+ echo '<em><strong>Note:</strong> s2Member is not equipped to detect partial refunds against multi-payment Subscriptions reliably. Therefore, all refunds processed against Subscriptions (of any kind) are considered <strong>Partial</strong> Refunds. Full refunds (in the eyes of s2Member) occur only against Buy Now transactions where it is easy for s2Member to see that the refund amount is &gt;= the original Buy Now purchase price (i.e. a Full Refund). <strong>Also Note:</strong> This setting (no matter what you choose) will NOT impact s2Member\'s internal API Notifications for Refund/Reversal events. <a href="#" onclick="alert(\'A Full or Partial Refund; and/or a Reversal Notification will ALWAYS be processed internally by s2Member, even if no action is taken by s2Member in accordance with your configuration here.\\n\\nIn this way, you\\\'ll have the full ability to listen for these events on your own (via API Notifications); if you prefer (optional). For more information, check your Dashboard under: `s2Member -› API Notifications -› Refunds/Reversals`.\'); return false;">Click here for details</a>.</em>'."\n";
986
  echo '</td>'."\n";
987
 
988
  echo '</tr>'."\n";
includes/menu-pages/res-ops.inc.php CHANGED
@@ -341,6 +341,38 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_res_ops"))
341
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_conditionals", get_defined_vars ());
342
  echo '</div>' . "\n";
343
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
344
  echo '</div>' . "\n";
345
 
346
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_after_conditionals", get_defined_vars ());
341
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_during_conditionals", get_defined_vars ());
342
  echo '</div>' . "\n";
343
 
344
+ if((!is_multisite () || !c_ws_plugin__s2member_utils_conds::is_multisite_farm () || is_main_site ()) && c_ws_plugin__s2member_utils_conds::pro_is_installed())
345
+ {
346
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
347
+
348
+ echo '<h3>Arbitrary PHP Code via <code>[s2If php=&quot;&quot;]</code></h3>' . "\n";
349
+ echo '<p>By default, the <code>[s2If]</code> Shortcode is limited to a specific set of Conditional Tags provided by WordPress and the s2Member plugin; e.g. <code>[s2If current_user_can(access_s2member_level1)]</code>; as one quick example. Arbitrary PHP code is NOT allowed with this syntax.</p>'."\n";
350
+ echo '<p>However, a second syntax variation exists; where it IS possible to use arbitrary PHP code (but only if enabled below). The second syntax variation uses one <code>php</code> Shortcode Attribute to run your conditional check; e.g. <code>[s2If php="current_user_can(\'access_s2member_level1\')"]</code>. For developers, this has some obvious advantages. The code inside the <code>php</code> attribute is evaluated at runtime, so it\'s possible to accomplish more when necessary. Of course, you could also use a plugin like <a href="https://www.s2member.com/kb/ezphp-plugin/" target="_blank" rel="external">ezPHP</a> to accomplish the same thing (if you prefer).</p>' . "\n";
351
+
352
+ echo '<table class="form-table">' . "\n";
353
+ echo '<tbody>' . "\n";
354
+ echo '<tr>' . "\n";
355
+
356
+ echo '<th>' . "\n";
357
+ echo '<label for="ws-plugin--s2member-sc-conds-allow-arbitrary-php">' . "\n";
358
+ echo 'Allow Arbitrary PHP Code via the <code>[s2If php=&quot;&quot;]</code> Attribute?' . "\n";
359
+ echo '</label>' . "\n";
360
+ echo '</th>' . "\n";
361
+
362
+ echo '</tr>' . "\n";
363
+ echo '<tr>' . "\n";
364
+
365
+ echo '<td>' . "\n";
366
+ echo '<select name="ws_plugin__s2member_sc_conds_allow_arbitrary_php" id="ws-plugin--s2member-sc-conds-allow-arbitrary-php">' . "\n";
367
+ echo '<option value="0"' . ((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sc_conds_allow_arbitrary_php"]) ? ' selected="selected"' : '') . '>No (recommended for best security; e.g. on sites with multiple authors/editors)</option>' . "\n";
368
+ echo '<option value="1"' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sc_conds_allow_arbitrary_php"]) ? ' selected="selected"' : '') . '>Yes (allow me to use PHP via the [s2If php=&quot;&quot;][/s2If] shortcode)</option>' . "\n";
369
+ echo '</select>' . "\n";
370
+ echo '</td>' . "\n";
371
+
372
+ echo '</tr>' . "\n";
373
+ echo '</tbody>' . "\n";
374
+ echo '</table>' . "\n";
375
+ }
376
  echo '</div>' . "\n";
377
 
378
  do_action ("ws_plugin__s2member_during_res_ops_page_during_left_sections_after_conditionals", get_defined_vars ());
includes/menu-pages/scripting.inc.php CHANGED
@@ -13,6 +13,8 @@
13
  *
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
 
 
16
  */
17
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
18
  exit ("Do not access this file directly.");
@@ -82,27 +84,40 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
82
 
83
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
84
 
85
- echo '<p><strong>Example #2:</strong> Full access for any Member with a Level >= 1.</strong></p>' . "\n";
 
 
 
 
 
 
 
86
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-current-user-can-full-access-farm.x-php")) . '</p>' . "\n";
87
 
88
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
89
 
90
- echo '<p><strong>Example #3:</strong> Specific content for each different Member Level.</strong></p>' . "\n";
91
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-current-user-is-specific-content-farm.x-php")) . '</p>' . "\n";
92
 
93
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
94
 
95
- echo '<p><strong>Example #4:</strong> Simple Conditionals w/ integrated use of [s2Get /].</strong></p>' . "\n";
 
 
 
 
 
 
96
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-1-farm.x-php")) . '</p>' . "\n";
97
 
98
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
99
 
100
- echo '<p><strong>Example #5:</strong> Using multiple Conditionals together, and even nesting other Shortcodes.</strong></p>' . "\n";
101
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-2-farm.x-php")) . '</p>' . "\n";
102
 
103
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
104
 
105
- echo '<p><strong>Example #6:</strong> Using multiple Conditionals together, and even nesting Conditionals.</strong></p>' . "\n";
106
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-3-farm.x-php")) . '</p>' . "\n";
107
 
108
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
@@ -121,8 +136,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
121
 
122
  echo '<p><em><strong>Implementing AND/OR Conditional expressions:</strong></em></p>' . "\n";
123
  echo '<p><em>*Tip: do NOT mix AND/OR expressions.<br /> <strong class="ws-menu-page-error-hilite">BAD</strong> <code>is_user_logged_in() AND is_page(1) OR is_page(2)</code><br />- use one or the other; do NOT mix AND/OR together.</em></p>' . "\n";
124
- echo '<p><em><strong class="ws-menu-page-hilite">If you need to have both types of logic, use nesting:</strong></em></p>' . "\n";
125
- echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-nesting.x-php")) . '</p>' . "\n";
 
 
 
126
  echo '</div>' . "\n";
127
 
128
  echo '</div>' . "\n";
@@ -150,27 +168,40 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
150
 
151
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
152
 
153
- echo '<p><strong>Example #2:</strong> Full access for any Member with a Level >= 1.</strong></p>' . "\n";
 
 
 
 
 
 
 
154
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-current-user-can-full-access.x-php")) . '</p>' . "\n";
155
 
156
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
157
 
158
- echo '<p><strong>Example #3:</strong> Specific content for each different Member Level.</strong></p>' . "\n";
159
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-current-user-is-specific-content.x-php")) . '</p>' . "\n";
160
 
161
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
162
 
163
- echo '<p><strong>Example #4:</strong> Simple Conditionals w/ integrated use of [s2Get /].</strong></p>' . "\n";
 
 
 
 
 
 
164
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-1.x-php")) . '</p>' . "\n";
165
 
166
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
167
 
168
- echo '<p><strong>Example #5:</strong> Using multiple Conditionals together, and even nesting other Shortcodes.</strong></p>' . "\n";
169
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-2.x-php")) . '</p>' . "\n";
170
 
171
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
172
 
173
- echo '<p><strong>Example #6:</strong> Using multiple Conditionals together, and even nesting Conditionals.</strong></p>' . "\n";
174
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-3.x-php")) . '</p>' . "\n";
175
 
176
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
@@ -189,8 +220,11 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
189
 
190
  echo '<p><em><strong>Implementing AND/OR Conditional expressions:</strong></em></p>' . "\n";
191
  echo '<p><em>*Tip: do NOT mix AND/OR expressions.<br /> <strong class="ws-menu-page-error-hilite">BAD</strong> <code>is_user_logged_in() AND is_page(1) OR is_page(2)</code><br />- use one or the other; do NOT mix AND/OR together.</em></p>' . "\n";
192
- echo '<p><em><strong class="ws-menu-page-hilite">If you need to have both types of logic, use nesting:</strong></em></p>' . "\n";
193
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-nesting.x-php")) . '</p>' . "\n";
 
 
 
194
  echo '</div>' . "\n";
195
 
196
  echo '</div>' . "\n";
@@ -427,6 +461,12 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
427
 
428
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
429
 
 
 
 
 
 
 
430
  echo '<p><strong>To drip content using <code>S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS</code>:</strong></p>' . "\n";
431
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/current-user-paid-registration-days-dripping.x-php")) . '</p>' . "\n";
432
 
@@ -435,7 +475,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
435
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
436
 
437
  echo '<h3>Very Advanced Content Dripping (some PHP required)</h3>' . "\n";
438
- echo '<p>If you plan on dripping content in VERY advanced ways, you can tap into s2Member\'s recorded history of all Paid Registration Times. (i.e. <code>' . esc_html ('<?php $time = s2member_paid_registration_time("level1"); ?>') . '</code>) will give you a timestamp at which a Member first paid for Level#1 access. If they\'ve never paid for Level#1 access, the function will return 0. s2Member keeps a recorded history of timestamps associated with each Level that a Member gains access to, throughout the lifetime of their account. * NOTE: This requires s2Member v3.3+. Previous versions of s2Member did NOT record this information. If you implement this functionality on an upgraded installation of s2Member, please remember that s2Member will have NO Paid Registration Time for any Member you acquired prior to installing s2Member v3.3+. <em>Check the forums for work-arounds.</em></p>' . "\n";
439
  echo '<p><strong>Here is the function documentation for PHP/WordPress developers:</strong></p>' . "\n";
440
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/s2member-paid-registration-time.x-php")) . '</p>' . "\n";
441
  echo '<p><strong>Here are some actual examples that should give you some ideas:</strong></p>' . "\n";
13
  *
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
+ *
17
+ * @TODO Shortcode equivalents using [else] syntax.
18
  */
19
  if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
20
  exit ("Do not access this file directly.");
84
 
85
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
86
 
87
+ echo '<p><strong>Example #2:</strong> The same as example #1, but this uses <code>[else]</code> syntax.</strong></p>' . "\n";
88
+ if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()) echo '<p><em><strong class="ws-menu-page-hilite">NOTE: the use of <code>[else]</code> requires s2Member Pro.</strong></em></p>' . "\n";
89
+ echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-is-user-logged-in-else-farm.x-php")) . '</p>' . "\n";
90
+
91
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
92
+
93
+ echo '<p><strong>Example #3:</strong> Full access for any Member with a Level >= 1; also using <code>[else]</code> syntax.</strong></p>' . "\n";
94
+ if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()) echo '<p><em><strong class="ws-menu-page-hilite">NOTE: the use of <code>[else]</code> requires s2Member Pro.</strong></em></p>' . "\n";
95
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-current-user-can-full-access-farm.x-php")) . '</p>' . "\n";
96
 
97
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
98
 
99
+ echo '<p><strong>Example #4:</strong> Specific content for each different Member Level.</strong></p>' . "\n";
100
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-current-user-is-specific-content-farm.x-php")) . '</p>' . "\n";
101
 
102
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
103
 
104
+ echo '<p><strong>Example #5:</strong> The same as example #4, but this uses <code>[else]</code> syntax &amp; nesting.</strong></p>' . "\n";
105
+ if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()) echo '<p><em><strong class="ws-menu-page-hilite">NOTE: the use of <code>[else]</code> requires s2Member Pro.</strong></em></p>' . "\n";
106
+ echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-current-user-is-specific-content-else-farm.x-php")) . '</p>' . "\n";
107
+
108
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
109
+
110
+ echo '<p><strong>Example #6:</strong> Simple Conditionals w/ integrated use of [s2Get /].</strong></p>' . "\n";
111
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-1-farm.x-php")) . '</p>' . "\n";
112
 
113
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
114
 
115
+ echo '<p><strong>Example #7:</strong> Using multiple Conditionals together; also nesting other Shortcodes.</strong></p>' . "\n";
116
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-2-farm.x-php")) . '</p>' . "\n";
117
 
118
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
119
 
120
+ echo '<p><strong>Example #8:</strong> Using multiple Conditionals together; also nesting Conditionals.</strong></p>' . "\n";
121
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-3-farm.x-php")) . '</p>' . "\n";
122
 
123
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
136
 
137
  echo '<p><em><strong>Implementing AND/OR Conditional expressions:</strong></em></p>' . "\n";
138
  echo '<p><em>*Tip: do NOT mix AND/OR expressions.<br /> <strong class="ws-menu-page-error-hilite">BAD</strong> <code>is_user_logged_in() AND is_page(1) OR is_page(2)</code><br />- use one or the other; do NOT mix AND/OR together.</em></p>' . "\n";
139
+ echo '<p><em><strong class="ws-menu-page-hilite">If you need to have both types of logic, use nesting...</strong></em></p>' . "\n";
140
+ echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-nesting-farm.x-php")) . '</p>' . "\n";
141
+ echo '<p><em><strong class="ws-menu-page-hilite">Another example, if you use <code>[else]</code> when nesting...</strong></em></p>' . "\n";
142
+ if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()) echo '<p><em><strong class="ws-menu-page-hilite">NOTE: the use of <code>[else]</code> requires s2Member Pro.</strong></em></p>' . "\n";
143
+ echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-nesting-else-farm.x-php")) . '</p>' . "\n";
144
  echo '</div>' . "\n";
145
 
146
  echo '</div>' . "\n";
168
 
169
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
170
 
171
+ echo '<p><strong>Example #2:</strong> The same as example #1, but this uses <code>[else]</code> syntax.</strong></p>' . "\n";
172
+ if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()) echo '<p><em><strong class="ws-menu-page-hilite">NOTE: the use of <code>[else]</code> requires s2Member Pro.</strong></em></p>' . "\n";
173
+ echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-is-user-logged-in-else.x-php")) . '</p>' . "\n";
174
+
175
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
176
+
177
+ echo '<p><strong>Example #3:</strong> Full access for any Member with a Level >= 1; also using <code>[else]</code> syntax.</strong></p>' . "\n";
178
+ if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()) echo '<p><em><strong class="ws-menu-page-hilite">NOTE: the use of <code>[else]</code> requires s2Member Pro.</strong></em></p>' . "\n";
179
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-current-user-can-full-access.x-php")) . '</p>' . "\n";
180
 
181
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
182
 
183
+ echo '<p><strong>Example #4:</strong> Specific content for each different Member Level.</strong></p>' . "\n";
184
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-current-user-is-specific-content.x-php")) . '</p>' . "\n";
185
 
186
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
187
 
188
+ echo '<p><strong>Example #5:</strong> The same as example #4, but this uses <code>[else]</code> syntax &amp; nesting.</strong></p>' . "\n";
189
+ if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()) echo '<p><em><strong class="ws-menu-page-hilite">NOTE: the use of <code>[else]</code> requires s2Member Pro.</strong></em></p>' . "\n";
190
+ echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-current-user-is-specific-content-else.x-php")) . '</p>' . "\n";
191
+
192
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
193
+
194
+ echo '<p><strong>Example #6:</strong> Simple Conditionals w/ integrated use of [s2Get /].</strong></p>' . "\n";
195
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-1.x-php")) . '</p>' . "\n";
196
 
197
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
198
 
199
+ echo '<p><strong>Example #7:</strong> Using multiple Conditionals together; also nesting other Shortcodes.</strong></p>' . "\n";
200
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-2.x-php")) . '</p>' . "\n";
201
 
202
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
203
 
204
+ echo '<p><strong>Example #8:</strong> Using multiple Conditionals together; also nesting Conditionals.</strong></p>' . "\n";
205
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-supplements-3.x-php")) . '</p>' . "\n";
206
 
207
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
220
 
221
  echo '<p><em><strong>Implementing AND/OR Conditional expressions:</strong></em></p>' . "\n";
222
  echo '<p><em>*Tip: do NOT mix AND/OR expressions.<br /> <strong class="ws-menu-page-error-hilite">BAD</strong> <code>is_user_logged_in() AND is_page(1) OR is_page(2)</code><br />- use one or the other; do NOT mix AND/OR together.</em></p>' . "\n";
223
+ echo '<p><em><strong class="ws-menu-page-hilite">If you need to have both types of logic, use nesting...</strong></em></p>' . "\n";
224
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-nesting.x-php")) . '</p>' . "\n";
225
+ echo '<p><em><strong class="ws-menu-page-hilite">Another example, if you use <code>[else]</code> when nesting...</strong></em></p>' . "\n";
226
+ if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()) echo '<p><em><strong class="ws-menu-page-hilite">NOTE: the use of <code>[else]</code> requires s2Member Pro.</strong></em></p>' . "\n";
227
+ echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/sc-s2-conditional-nesting-else.x-php")) . '</p>' . "\n";
228
  echo '</div>' . "\n";
229
 
230
  echo '</div>' . "\n";
461
 
462
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
463
 
464
+ echo '<p><strong>A very simple way to drip content; via the <code>[s2Drip]</code> Shortcode:</strong></p>' . "\n";
465
+ if(!c_ws_plugin__s2member_utils_conds::pro_is_installed()) echo '<p><em><strong class="ws-menu-page-hilite">NOTE: the use of <code>[s2Drip]</code> requires s2Member Pro.</strong></em></p>' . "\n";
466
+ echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/s2drip-example1.x-php")) . '</p>' . "\n";
467
+
468
+ echo '<div class="ws-menu-page-hr"></div>' . "\n";
469
+
470
  echo '<p><strong>To drip content using <code>S2MEMBER_CURRENT_USER_PAID_REGISTRATION_DAYS</code>:</strong></p>' . "\n";
471
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/current-user-paid-registration-days-dripping.x-php")) . '</p>' . "\n";
472
 
475
  echo '<div class="ws-menu-page-hr"></div>' . "\n";
476
 
477
  echo '<h3>Very Advanced Content Dripping (some PHP required)</h3>' . "\n";
478
+ echo '<p>If you plan on dripping content in VERY advanced ways, you can tap into s2Member\'s recorded history of all Paid Registration Times. (i.e. <code>' . esc_html ('<?php $time = s2member_paid_registration_time("level1"); ?>') . '</code>) will give you a timestamp at which a Member first paid for Level#1 access. If they\'ve never paid for Level#1 access, the function will return 0. s2Member keeps a recorded history of timestamps associated with each Level that a Member gains access to, throughout the lifetime of their account.</p>' . "\n";
479
  echo '<p><strong>Here is the function documentation for PHP/WordPress developers:</strong></p>' . "\n";
480
  echo '<p>' . c_ws_plugin__s2member_utils_strings::highlight_php (file_get_contents (dirname (__FILE__) . "/code-samples/s2member-paid-registration-time.x-php")) . '</p>' . "\n";
481
  echo '<p><strong>Here are some actual examples that should give you some ideas:</strong></p>' . "\n";
includes/syscon.inc.php CHANGED
@@ -130,6 +130,7 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
130
  $default_options["gateway_debug_logs_extensive"] = "0";
131
 
132
  $default_options["lazy_load_css_js"] = "0";
 
133
 
134
  $default_options["sec_encryption_key"] = "";
135
  $default_options["sec_encryption_key_history"] = array();
@@ -167,7 +168,8 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
167
  $default_options["mms_auto_patch"] = "1";
168
  $default_options["mms_registration_file"] = "wp-login";
169
  $default_options["mms_registration_grants"] = "none";
170
- for($n = 0, $v = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++, $v = $v + 5)$default_options["mms_registration_blogs_level".$n] = (string)$v;
 
171
 
172
  $default_options["login_welcome_page"] = "";
173
  $default_options["login_redirection_override"] = "";
@@ -246,10 +248,16 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
246
  $default_options["sp_email_message"] = sprintf(_x("Thanks %%%%first_name%%%%!\n\n%%%%item_name%%%%\n\nYour order can be retrieved here:\n%%%%sp_access_url%%%%\n(link expires in %%%%sp_access_exp%%%%)\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", "s2member-front", "s2member"), get_bloginfo("name"));
247
 
248
  $default_options["mailchimp_api_key"] = "";
 
249
 
250
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_mailchimp_list_ids"] = "";
 
 
 
 
251
 
252
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)$default_options["level".$n."_aweber_list_ids"] = "";
 
253
 
254
  $default_options["signup_notification_urls"] = "";
255
  $default_options["registration_notification_urls"] = "";
@@ -282,6 +290,7 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
282
  $default_options["file_download_limit_exceeded_page"] = "";
283
  $default_options["file_download_inline_extensions"] = "";
284
  $default_options["file_download_stream_extensions"] = "";
 
285
 
286
  $default_options["amazon_s3_files_bucket"] = "";
287
  $default_options["amazon_s3_files_access_key"] = "";
@@ -312,7 +321,7 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
312
 
313
  $default_options["specific_ids"] = "";
314
 
315
- $default_options["triggers_immediate_eot"] = "refunds,reversals";
316
  $default_options["membership_eot_behavior"] = "demote";
317
  $default_options["eot_time_ext_behavior"] = "extend";
318
  $default_options["auto_eot_system_enabled"] = "1";
@@ -354,6 +363,9 @@ if(!function_exists("ws_plugin__s2member_configure_options_and_their_defaults"))
354
  else if($key === "lazy_load_css_js" && (!is_string($value) || !is_numeric($value)))
355
  $value = $default_options[$key];
356
 
 
 
 
357
  else if($key === "sec_encryption_key" && (!is_string($value) || !strlen($value)))
358
  $value = $default_options[$key];
359
 
130
  $default_options["gateway_debug_logs_extensive"] = "0";
131
 
132
  $default_options["lazy_load_css_js"] = "0";
133
+ $default_options["sc_conds_allow_arbitrary_php"] = "0";
134
 
135
  $default_options["sec_encryption_key"] = "";
136
  $default_options["sec_encryption_key_history"] = array();
168
  $default_options["mms_auto_patch"] = "1";
169
  $default_options["mms_registration_file"] = "wp-login";
170
  $default_options["mms_registration_grants"] = "none";
171
+ for($n = 0, $v = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++, $v = $v + 5)
172
+ $default_options["mms_registration_blogs_level".$n] = (string)$v;
173
 
174
  $default_options["login_welcome_page"] = "";
175
  $default_options["login_redirection_override"] = "";
248
  $default_options["sp_email_message"] = sprintf(_x("Thanks %%%%first_name%%%%!\n\n%%%%item_name%%%%\n\nYour order can be retrieved here:\n%%%%sp_access_url%%%%\n(link expires in %%%%sp_access_exp%%%%)\n\nIf you have any trouble, please feel free to contact us.\n\nBest Regards,\n%s", "s2member-front", "s2member"), get_bloginfo("name"));
249
 
250
  $default_options["mailchimp_api_key"] = "";
251
+ $default_options["getresponse_api_key"] = "";
252
 
253
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
254
+ $default_options["level".$n."_mailchimp_list_ids"] = "";
255
+
256
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
257
+ $default_options["level".$n."_getresponse_list_ids"] = "";
258
 
259
+ for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
260
+ $default_options["level".$n."_aweber_list_ids"] = "";
261
 
262
  $default_options["signup_notification_urls"] = "";
263
  $default_options["registration_notification_urls"] = "";
290
  $default_options["file_download_limit_exceeded_page"] = "";
291
  $default_options["file_download_inline_extensions"] = "";
292
  $default_options["file_download_stream_extensions"] = "";
293
+ $default_options["file_download_content_encodong_none"] = "0";
294
 
295
  $default_options["amazon_s3_files_bucket"] = "";
296
  $default_options["amazon_s3_files_access_key"] = "";
321
 
322
  $default_options["specific_ids"] = "";
323
 
324
+ $default_options["triggers_immediate_eot"] = "refunds,partial_refunds,reversals";
325
  $default_options["membership_eot_behavior"] = "demote";
326
  $default_options["eot_time_ext_behavior"] = "extend";
327
  $default_options["auto_eot_system_enabled"] = "1";
363
  else if($key === "lazy_load_css_js" && (!is_string($value) || !is_numeric($value)))
364
  $value = $default_options[$key];
365
 
366
+ else if($key === "sc_conds_allow_arbitrary_php" && (!is_string($value) || !is_numeric($value)))
367
+ $value = $default_options[$key];
368
+
369
  else if($key === "sec_encryption_key" && (!is_string($value) || !strlen($value)))
370
  $value = $default_options[$key];
371
 
includes/templates/cfg-files/s2member-files.php CHANGED
@@ -8,14 +8,15 @@ $ws_plugin__s2member_temp_s_base = (!empty ($base)) ? $base : c_ws_plugin__s2mem
8
  // Do NOT use ``site`` URL. Must use the `home` URL here, because that's what WordPress uses in its own `mod_rewrite` implementation.
9
  ?>
10
 
11
- Options +FollowSymLinks -Indexes
12
-
13
- <IfModule mod_env.c>
14
  # No GZIP for script-based file downloads.
15
  SetEnv no-gzip 1
16
  </IfModule>
17
 
18
- <IfModule mod_rewrite.c>
 
 
 
19
  # Enable rewrite and configure base.
20
  RewriteEngine On
21
  RewriteBase <?php echo $ws_plugin__s2member_temp_s_base . "\n"; ?>
@@ -101,8 +102,16 @@ Options +FollowSymLinks -Indexes
101
  RewriteRule ^(.*)$ %{ENV:s2member_file_download_wp_vdir}?s2member_file_download=%{ENV:s2member_file_download}%{ENV:s2member_file_stream}%{ENV:s2member_file_inline}%{ENV:s2member_file_storage}%{ENV:s2member_file_remote}%{ENV:s2member_file_ssl}%{ENV:s2member_file_download_key}%{ENV:s2member_skip_confirmation} [QSA,L]
102
  </IfModule>
103
 
104
- <IfModule !mod_rewrite.c>
105
- deny from all
 
 
 
 
 
106
  </IfModule>
107
 
 
 
 
108
  <?php unset ($ws_plugin__s2member_temp_s_base); ?>
8
  // Do NOT use ``site`` URL. Must use the `home` URL here, because that's what WordPress uses in its own `mod_rewrite` implementation.
9
  ?>
10
 
11
+ <IfModule env_module>
 
 
12
  # No GZIP for script-based file downloads.
13
  SetEnv no-gzip 1
14
  </IfModule>
15
 
16
+ <IfModule rewrite_module>
17
+ # Enable symlinks (required for rewrites).
18
+ Options +FollowSymLinks
19
+
20
  # Enable rewrite and configure base.
21
  RewriteEngine On
22
  RewriteBase <?php echo $ws_plugin__s2member_temp_s_base . "\n"; ?>
102
  RewriteRule ^(.*)$ %{ENV:s2member_file_download_wp_vdir}?s2member_file_download=%{ENV:s2member_file_download}%{ENV:s2member_file_stream}%{ENV:s2member_file_inline}%{ENV:s2member_file_storage}%{ENV:s2member_file_remote}%{ENV:s2member_file_ssl}%{ENV:s2member_file_download_key}%{ENV:s2member_skip_confirmation} [QSA,L]
103
  </IfModule>
104
 
105
+ <IfModule !rewrite_module>
106
+ <IfModule authz_core_module>
107
+ Require all denied
108
+ </IfModule>
109
+ <IfModule !authz_core_module>
110
+ deny from all
111
+ </IfModule>
112
  </IfModule>
113
 
114
+ # Disallow directory indexing here.
115
+ Options -Indexes
116
+
117
  <?php unset ($ws_plugin__s2member_temp_s_base); ?>
includes/templates/cfg-files/s2member-logs.php CHANGED
@@ -3,4 +3,12 @@ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
6
- deny from all
 
 
 
 
 
 
 
 
3
  exit("Do not access this file directly.");
4
  ?>
5
 
6
+ <IfModule authz_core_module>
7
+ Require all denied
8
+ </IfModule>
9
+ <IfModule !authz_core_module>
10
+ deny from all
11
+ </IfModule>
12
+
13
+ # Disallow directory indexing here.
14
+ Options -Indexes
includes/translations/s2member.pot CHANGED
@@ -1,10 +1,10 @@
1
- # Copyright (C) 2014
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: 140105\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
- "POT-Creation-Date: 2014-01-08 05:26:12+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -17,8 +17,8 @@ msgctxt "s2member-front"
17
  msgid "Max failed logins. Please wait %s and try again."
18
  msgstr ""
19
 
20
- #: s2member/includes/classes/custom-reg-fields.inc.php:331
21
- #: s2member/includes/classes/custom-reg-fields.inc.php:467
22
  #: s2member/includes/classes/profile-in.inc.php:120
23
  #: s2member/includes/classes/sc-profile-in.inc.php:136
24
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:66
@@ -31,8 +31,8 @@ msgctxt "s2member-front"
31
  msgid "First Name"
32
  msgstr ""
33
 
34
- #: s2member/includes/classes/custom-reg-fields.inc.php:343
35
- #: s2member/includes/classes/custom-reg-fields.inc.php:482
36
  #: s2member/includes/classes/profile-in.inc.php:140
37
  #: s2member/includes/classes/sc-profile-in.inc.php:156
38
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:72
@@ -45,8 +45,8 @@ msgctxt "s2member-front"
45
  msgid "Last Name"
46
  msgstr ""
47
 
48
- #: s2member/includes/classes/custom-reg-fields.inc.php:440
49
- #: s2member/includes/classes/custom-reg-fields.inc.php:445
50
  #: s2member/includes/classes/profile-in.inc.php:233
51
  #: s2member/includes/classes/profile-in.inc.php:239
52
  #: s2member/includes/classes/sc-profile-in.inc.php:249
@@ -55,12 +55,12 @@ msgctxt "s2member-front"
55
  msgid "Please type your Password twice to confirm."
56
  msgstr ""
57
 
58
- #: s2member/includes/classes/custom-reg-fields.inc.php:441
59
  msgctxt "s2member-front"
60
  msgid "Password (please type it twice)"
61
  msgstr ""
62
 
63
- #: s2member/includes/classes/custom-reg-fields.inc.php:449
64
  #: s2member/includes/classes/profile-in.inc.php:243
65
  #: s2member/includes/classes/sc-profile-in.inc.php:259
66
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:94
@@ -77,39 +77,37 @@ msgid "as a Member"
77
  msgstr ""
78
 
79
  #: s2member/includes/classes/files-in.inc.php:108
80
- #: s2member/includes/classes/files-in.inc.php:267
81
  msgctxt "s2member-front"
82
- msgid ""
83
- "<strong>404: Sorry, file not found.</strong> Please contact Support for "
84
- "assistance."
85
  msgstr ""
86
 
87
  #: s2member/includes/classes/files-in.inc.php:121
88
  msgctxt "s2member-front"
89
- msgid ""
90
- "<strong>503 (Invalid Key):</strong> Sorry, your access to this file has "
91
- "expired. Please contact Support for assistance."
92
  msgstr ""
93
 
94
  #: s2member/includes/classes/files-in.inc.php:144
95
  msgctxt "s2member-front"
96
- msgid ""
97
- "<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please "
98
- "contact Support for assistance. If you are the site owner, please configure: "
99
- "<code>s2Member -› Download Options -› Basic Download Restrictions</code>."
 
 
100
  msgstr ""
101
 
102
- #: s2member/includes/classes/files-in.inc.php:502
103
  msgctxt "s2member-front"
104
  msgid "<strong>503: Access denied.</strong> Invalid File Download specs."
105
  msgstr ""
106
 
107
- #: s2member/includes/classes/files-in.inc.php:596
108
  msgctxt "s2member-front"
109
  msgid "Members Only"
110
  msgstr ""
111
 
112
- #: s2member/includes/classes/files-in.inc.php:602
113
  msgctxt "s2member-front"
114
  msgid "<strong>401:</strong> Sorry, access denied."
115
  msgstr ""
@@ -117,26 +115,25 @@ msgstr ""
117
  #. translators: In this translation, `%s` may be filled with an English
118
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
119
  #. if you like.
120
- #: s2member/includes/classes/files-in.inc.php:741
121
  msgctxt "s2member-admin"
122
  msgid "Unable to update existing Amazon S3 Cross-Domain Policy. %s"
123
  msgstr ""
124
 
125
- #: s2member/includes/classes/files-in.inc.php:744
126
  msgctxt "s2member-admin"
127
- msgid ""
128
- "Unable to update existing Amazon S3 Cross-Domain Policy. Connection failed."
129
  msgstr ""
130
 
131
  #. translators: In this translation, `%s` may be filled with an English
132
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
133
  #. if you like.
134
- #: s2member/includes/classes/files-in.inc.php:748
135
  msgctxt "s2member-admin"
136
  msgid "Unable to update existing Amazon S3 Bucket Policy. %s"
137
  msgstr ""
138
 
139
- #: s2member/includes/classes/files-in.inc.php:751
140
  msgctxt "s2member-admin"
141
  msgid "Unable to update existing Amazon S3 Bucket Policy. Connection failed."
142
  msgstr ""
@@ -144,81 +141,61 @@ msgstr ""
144
  #. translators: In this translation, `%s` may be filled with an English
145
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
146
  #. if you like.
147
- #: s2member/includes/classes/files-in.inc.php:755
148
  msgctxt "s2member-admin"
149
  msgid "Unable to update existing Amazon S3 Bucket ACLs. %s"
150
  msgstr ""
151
 
152
- #: s2member/includes/classes/files-in.inc.php:758
153
  msgctxt "s2member-admin"
154
  msgid "Unable to update existing Amazon S3 Bucket ACLs. Connection failed."
155
  msgstr ""
156
 
157
- #: s2member/includes/classes/files-in.inc.php:761
158
  msgctxt "s2member-admin"
159
- msgid ""
160
- "Unable to acquire/read existing Amazon S3 Bucket ACLs. Unexpected response."
161
  msgstr ""
162
 
163
  #. translators: In this translation, `%s` may be filled with an English
164
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
165
  #. if you like.
166
- #: s2member/includes/classes/files-in.inc.php:765
167
  msgctxt "s2member-admin"
168
  msgid "Unable to acquire existing Amazon S3 Bucket ACLs. %s"
169
  msgstr ""
170
 
171
- #: s2member/includes/classes/files-in.inc.php:768
172
  msgctxt "s2member-admin"
173
  msgid "Unable to acquire existing Amazon S3 Bucket ACLs. Connection failed."
174
  msgstr ""
175
 
176
- #: s2member/includes/classes/files-in.inc.php:771
177
  msgctxt "s2member-admin"
178
- msgid ""
179
- "Unable to auto-configure existing Amazon S3 Bucket ACLs. Incomplete Amazon "
180
- "S3 configuration options. Missing one of: Amazon S3 Bucket, Access Key, or "
181
- "Secret Key."
182
  msgstr ""
183
 
184
- #: s2member/includes/classes/files-in.inc.php:871
185
  msgctxt "s2member-admin"
186
- msgid ""
187
- "Unable to delete existing Amazon CloudFront Downloads Distro. Still in a "
188
- "`pending` state. Please wait 15 minutes, then try again. There is a certain "
189
- "process that s2Member must strictly adhere to when re-configuring your "
190
- "Amazon CloudFront Distros. You may have to tick the auto-configure checkbox "
191
- "again, and re-run s2Member's auto-configuration routine many times, because "
192
- "s2Member will likely run into several `pending` challenges, as it works to "
193
- "completely re-configure your Amazon CloudFront Distros for you. Thanks for "
194
- "your patience. Please wait 15 minutes, then try again."
195
  msgstr ""
196
 
197
  #. translators: In this translation, `%s` may be filled with an English
198
  #. message, which comes from the Amazon CloudFront API call. Feel free to
199
  #. exclude `%s` if you like.
200
- #: s2member/includes/classes/files-in.inc.php:878
201
  msgctxt "s2member-admin"
202
  msgid "Unable to delete existing Amazon CloudFront Downloads Distro. %s"
203
  msgstr ""
204
 
205
- #: s2member/includes/classes/files-in.inc.php:890
206
  msgctxt "s2member-admin"
207
- msgid ""
208
- "Unable to delete existing Amazon CloudFront Streaming Distro. Still in a "
209
- "`pending` state. Please wait 15 minutes, then try again. There is a certain "
210
- "process that s2Member must strictly adhere to when re-configuring your "
211
- "Amazon CloudFront Distros. You may have to tick the auto-configure checkbox "
212
- "again, and re-run s2Member's auto-configuration routine many times, because "
213
- "s2Member will likely run into several `pending` challenges, as it works to "
214
- "completely re-configure your Amazon CloudFront Distros for you. Thanks for "
215
- "your patience. Please wait 15 minutes, then try again."
216
  msgstr ""
217
 
218
  #. translators: In this translation, `%s` may be filled with an English
219
  #. message, which comes from the Amazon CloudFront API call. Feel free to
220
  #. exclude `%s` if you like.
221
- #: s2member/includes/classes/files-in.inc.php:897
222
  msgctxt "s2member-admin"
223
  msgid "Unable to delete existing Amazon CloudFront Streaming Distro. %s"
224
  msgstr ""
@@ -226,8 +203,8 @@ msgstr ""
226
  #. translators: In this translation, `%s` may be filled with an English
227
  #. message, which comes from the Amazon CloudFront API call. Feel free to
228
  #. exclude `%s` if you like.
229
- #: s2member/includes/classes/files-in.inc.php:913
230
- #: s2member/includes/classes/files-in.inc.php:1097
231
  msgctxt "s2member-admin"
232
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. %s"
233
  msgstr ""
@@ -235,12 +212,12 @@ msgstr ""
235
  #. translators: In this translation, `%s` may be filled with an English
236
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
237
  #. if you like.
238
- #: s2member/includes/classes/files-in.inc.php:954
239
  msgctxt "s2member-admin"
240
  msgid "Unable to update existing Amazon S3 ACLs. %s"
241
  msgstr ""
242
 
243
- #: s2member/includes/classes/files-in.inc.php:957
244
  msgctxt "s2member-admin"
245
  msgid "Unable to update existing Amazon S3 ACLs. Connection failed."
246
  msgstr ""
@@ -248,14 +225,14 @@ msgstr ""
248
  #. translators: In this translation, `%s` may be filled with an English
249
  #. message, which comes from the Amazon CloudFront API call. Feel free to
250
  #. exclude `%s` if you like.
251
- #: s2member/includes/classes/files-in.inc.php:961
252
- #: s2member/includes/classes/files-in.inc.php:1384
253
  msgctxt "s2member-admin"
254
  msgid "Unable to create Amazon CloudFront Streaming Distro. %s"
255
  msgstr ""
256
 
257
- #: s2member/includes/classes/files-in.inc.php:964
258
- #: s2member/includes/classes/files-in.inc.php:1387
259
  msgctxt "s2member-admin"
260
  msgid "Unable to create Amazon CloudFront Streaming Distro. Connection failed."
261
  msgstr ""
@@ -263,14 +240,14 @@ msgstr ""
263
  #. translators: In this translation, `%s` may be filled with an English
264
  #. message, which comes from the Amazon CloudFront API call. Feel free to
265
  #. exclude `%s` if you like.
266
- #: s2member/includes/classes/files-in.inc.php:968
267
- #: s2member/includes/classes/files-in.inc.php:1361
268
  msgctxt "s2member-admin"
269
  msgid "Unable to create Amazon CloudFront Downloads Distro. %s"
270
  msgstr ""
271
 
272
- #: s2member/includes/classes/files-in.inc.php:971
273
- #: s2member/includes/classes/files-in.inc.php:1364
274
  msgctxt "s2member-admin"
275
  msgid "Unable to create Amazon CloudFront Downloads Distro. Connection failed."
276
  msgstr ""
@@ -278,20 +255,19 @@ msgstr ""
278
  #. translators: In this translation, `%s` may be filled with an English
279
  #. message, which comes from the Amazon CloudFront API call. Feel free to
280
  #. exclude `%s` if you like.
281
- #: s2member/includes/classes/files-in.inc.php:975
282
- #: s2member/includes/classes/files-in.inc.php:1142
283
  msgctxt "s2member-admin"
284
  msgid "Unable to create Amazon CloudFront Origin Access Identity. %s"
285
  msgstr ""
286
 
287
- #: s2member/includes/classes/files-in.inc.php:978
288
- #: s2member/includes/classes/files-in.inc.php:1145
289
  msgctxt "s2member-admin"
290
- msgid ""
291
- "Unable to create Amazon CloudFront Origin Access Identity. Connection failed."
292
  msgstr ""
293
 
294
- #: s2member/includes/classes/files-in.inc.php:981
295
  msgctxt "s2member-admin"
296
  msgid "Unable to clear existing Amazon CloudFront Origin Access Identity."
297
  msgstr ""
@@ -299,21 +275,19 @@ msgstr ""
299
  #. translators: In this translation, `%s` may be filled with an English
300
  #. message, which comes from the Amazon CloudFront API call. Feel free to
301
  #. exclude `%s` if you like.
302
- #: s2member/includes/classes/files-in.inc.php:985
303
- #: s2member/includes/classes/files-in.inc.php:1054
304
  msgctxt "s2member-admin"
305
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. %s"
306
  msgstr ""
307
 
308
- #: s2member/includes/classes/files-in.inc.php:988
309
- #: s2member/includes/classes/files-in.inc.php:1057
310
  msgctxt "s2member-admin"
311
- msgid ""
312
- "Unable to acquire existing Amazon CloudFront Origin Access Identity. "
313
- "Connection failed."
314
  msgstr ""
315
 
316
- #: s2member/includes/classes/files-in.inc.php:991
317
  msgctxt "s2member-admin"
318
  msgid "Unable to clear existing Amazon CloudFront Streaming Distro."
319
  msgstr ""
@@ -321,19 +295,17 @@ msgstr ""
321
  #. translators: In this translation, `%s` may be filled with an English
322
  #. message, which comes from the Amazon CloudFront API call. Feel free to
323
  #. exclude `%s` if you like.
324
- #: s2member/includes/classes/files-in.inc.php:995
325
  msgctxt "s2member-admin"
326
  msgid "Unable to acquire existing Amazon CloudFront Streaming Distro. %s"
327
  msgstr ""
328
 
329
- #: s2member/includes/classes/files-in.inc.php:998
330
  msgctxt "s2member-admin"
331
- msgid ""
332
- "Unable to acquire existing Amazon CloudFront Streaming Distro. Connection "
333
- "failed."
334
  msgstr ""
335
 
336
- #: s2member/includes/classes/files-in.inc.php:1001
337
  msgctxt "s2member-admin"
338
  msgid "Unable to clear existing Amazon CloudFront Downloads Distro."
339
  msgstr ""
@@ -341,82 +313,65 @@ msgstr ""
341
  #. translators: In this translation, `%s` may be filled with an English
342
  #. message, which comes from the Amazon CloudFront API call. Feel free to
343
  #. exclude `%s` if you like.
344
- #: s2member/includes/classes/files-in.inc.php:1005
345
  msgctxt "s2member-admin"
346
  msgid "Unable to acquire existing Amazon CloudFront Downloads Distro. %s"
347
  msgstr ""
348
 
349
- #: s2member/includes/classes/files-in.inc.php:1008
350
  msgctxt "s2member-admin"
351
- msgid ""
352
- "Unable to acquire existing Amazon CloudFront Downloads Distro. Connection "
353
- "failed."
354
  msgstr ""
355
 
356
- #: s2member/includes/classes/files-in.inc.php:1011
357
  msgctxt "s2member-admin"
358
- msgid ""
359
- "Unable to auto-configure Amazon CloudFront Distros. Incomplete Amazon "
360
- "CloudFront configuration options. Missing of one: Amazon CloudFront Private "
361
- "Key-Pair-ID, or Private Key file contents."
362
  msgstr ""
363
 
364
- #: s2member/includes/classes/files-in.inc.php:1014
365
  msgctxt "s2member-admin"
366
- msgid ""
367
- "Unable to auto-configure Amazon S3/CloudFront Distros. Incomplete Amazon S3 "
368
- "configuration options. Missing one of: Amazon S3 Bucket, Access Key, or "
369
- "Secret Key. You must provide s2Member with an Amazon S3 configuration before "
370
- "enabling CloudFront."
371
  msgstr ""
372
 
373
  #. translators: In this translation, `%s` may be filled with an English
374
  #. message, which comes from the Amazon CloudFront API call. Feel free to
375
  #. exclude `%s` if you like.
376
- #: s2member/includes/classes/files-in.inc.php:1050
377
  msgctxt "s2member-admin"
378
  msgid "Existing Amazon CloudFront Origin Access Identity NOT found. %s"
379
  msgstr ""
380
 
381
- #: s2member/includes/classes/files-in.inc.php:1060
382
  msgctxt "s2member-admin"
383
- msgid ""
384
- "Unable to acquire existing Amazon CloudFront Origin Access Identity. Invalid "
385
- "Access ID."
386
  msgstr ""
387
 
388
- #: s2member/includes/classes/files-in.inc.php:1100
389
  msgctxt "s2member-admin"
390
- msgid ""
391
- "Unable to delete existing Amazon CloudFront Origin Access Identity. "
392
- "Connection failed."
393
  msgstr ""
394
 
395
- #: s2member/includes/classes/files-in.inc.php:1103
396
  msgctxt "s2member-admin"
397
- msgid ""
398
- "Unable to delete existing Amazon CloudFront Origin Access Identity. Invalid "
399
- "Access ID, ETag, or XML config."
400
  msgstr ""
401
 
402
- #: s2member/includes/classes/files-in.inc.php:1129
403
- #: s2member/includes/classes/files-in.inc.php:1348
404
- #: s2member/includes/classes/files-in.inc.php:1371
405
  msgctxt "s2member-admin"
406
  msgid "Created by s2Member, for S3 Bucket: %s."
407
  msgstr ""
408
 
409
- #: s2member/includes/classes/files-in.inc.php:1138
410
  msgctxt "s2member-admin"
411
- msgid ""
412
- "Unable to create/read Amazon CloudFront Origin Access Identity. Unexpected "
413
- "response."
414
  msgstr ""
415
 
416
  #. translators: In this translation, `%s` may be filled with an English
417
  #. message, which comes from the Amazon CloudFront API call. Feel free to
418
  #. exclude `%s` if you like.
419
- #: s2member/includes/classes/files-in.inc.php:1182
420
  msgctxt "s2member-admin"
421
  msgid "Existing Amazon CloudFront Distro NOT found. %s"
422
  msgstr ""
@@ -424,67 +379,55 @@ msgstr ""
424
  #. translators: In this translation, `%s` may be filled with an English
425
  #. message, which comes from the Amazon CloudFront API call. Feel free to
426
  #. exclude `%s` if you like.
427
- #: s2member/includes/classes/files-in.inc.php:1186
428
  msgctxt "s2member-admin"
429
  msgid "Unable to acquire existing Amazon CloudFront Distro. %s"
430
  msgstr ""
431
 
432
- #: s2member/includes/classes/files-in.inc.php:1189
433
  msgctxt "s2member-admin"
434
  msgid "Unable to acquire existing Amazon CloudFront Distro. Connection failed."
435
  msgstr ""
436
 
437
- #: s2member/includes/classes/files-in.inc.php:1192
438
  msgctxt "s2member-admin"
439
- msgid ""
440
- "Unable to acquire existing Amazon CloudFront Distro. Invalid Distro ID and/"
441
- "or Distro type."
442
  msgstr ""
443
 
444
  #. translators: In this translation, `%s` may be filled with an English
445
  #. message, which comes from the Amazon CloudFront API call. Feel free to
446
  #. exclude `%s` if you like.
447
- #: s2member/includes/classes/files-in.inc.php:1234
448
- #: s2member/includes/classes/files-in.inc.php:1307
449
  msgctxt "s2member-admin"
450
  msgid "Unable to disable existing Amazon CloudFront Distro. %s"
451
  msgstr ""
452
 
453
- #: s2member/includes/classes/files-in.inc.php:1237
454
- #: s2member/includes/classes/files-in.inc.php:1310
455
  msgctxt "s2member-admin"
456
  msgid "Unable to disable existing Amazon CloudFront Distro. Connection failed."
457
  msgstr ""
458
 
459
- #: s2member/includes/classes/files-in.inc.php:1240
460
  msgctxt "s2member-admin"
461
- msgid ""
462
- "Existing Amazon CloudFront Distro cannot be disabled at this time. Still in "
463
- "a `pending` state. Please wait 15 minutes, then try again. There is a "
464
- "certain process that s2Member must strictly adhere to when re-configuring "
465
- "your Amazon CloudFront Distros. You may have to tick the auto-configure "
466
- "checkbox again, and re-run s2Member's auto-configuration routine many times, "
467
- "because s2Member will likely run into several `pending` challenges, as it "
468
- "works to completely re-configure your Amazon CloudFront Distros for you. "
469
- "Thanks for your patience. Please wait 15 minutes, then try again."
470
  msgstr ""
471
 
472
- #: s2member/includes/classes/files-in.inc.php:1246
473
  msgctxt "s2member-admin"
474
- msgid ""
475
- "Unable to disable existing Amazon CloudFront Distro. Invalid Distro ID, "
476
- "ETag, or XML config."
477
  msgstr ""
478
 
479
  #. translators: In this translation, `%s` may be filled with an English
480
  #. message, which comes from the Amazon CloudFront API call. Feel free to
481
  #. exclude `%s` if you like.
482
- #: s2member/includes/classes/files-in.inc.php:1289
483
  msgctxt "s2member-admin"
484
  msgid "Unable to delete existing Amazon CloudFront Distro. %s"
485
  msgstr ""
486
 
487
- #: s2member/includes/classes/files-in.inc.php:1292
488
  msgctxt "s2member-admin"
489
  msgid "Unable to delete existing Amazon CloudFront Distro. Connection failed."
490
  msgstr ""
@@ -492,70 +435,45 @@ msgstr ""
492
  #. translators: In this translation, `%s` may be filled with an English
493
  #. message, which comes from the Amazon CloudFront API call. Feel free to
494
  #. exclude `%s` if you like.
495
- #: s2member/includes/classes/files-in.inc.php:1296
496
  msgctxt "s2member-admin"
497
- msgid ""
498
- "Existing Amazon CloudFront Distro cannot be deleted at this time. Still in a "
499
- "`pending` state after having been disabled by s2Member. Please wait 15 "
500
- "minutes, then try again. There is a certain process that s2Member must "
501
- "strictly adhere to when re-configuring your Amazon CloudFront Distros. You "
502
- "may have to tick the auto-configure checkbox again, and re-run s2Member's "
503
- "auto-configuration routine many times, because s2Member will likely run into "
504
- "several `pending` challenges, as it works to completely re-configure your "
505
- "Amazon CloudFront Distros for you. Thanks for your patience. Please wait 15 "
506
- "minutes, then try again."
507
  msgstr ""
508
 
509
  #. translators: In this translation, `%s` may be filled with an English
510
  #. message, which comes from the Amazon CloudFront API call. Feel free to
511
  #. exclude `%s` if you like.
512
- #: s2member/includes/classes/files-in.inc.php:1300
513
  msgctxt "s2member-admin"
514
  msgid "Unable to check status of existing Amazon CloudFront Distro. %s"
515
  msgstr ""
516
 
517
- #: s2member/includes/classes/files-in.inc.php:1303
518
  msgctxt "s2member-admin"
519
- msgid ""
520
- "Unable to check status of existing Amazon CloudFront Distro. Connection "
521
- "failed."
522
  msgstr ""
523
 
524
- #: s2member/includes/classes/files-in.inc.php:1313
525
  msgctxt "s2member-admin"
526
- msgid ""
527
- "Existing Amazon CloudFront Distro cannot be deleted at this time. Still in a "
528
- "`pending` state. Please wait 15 minutes, then try again. There is a certain "
529
- "process that s2Member must strictly adhere to when re-configuring your "
530
- "Amazon CloudFront Distros. You may have to tick the auto-configure checkbox "
531
- "again, and re-run s2Member's auto-configuration routine many times, because "
532
- "s2Member will likely run into several `pending` challenges, as it works to "
533
- "completely re-configure your Amazon CloudFront Distros for you. Thanks for "
534
- "your patience. Please wait 15 minutes, then try again."
535
  msgstr ""
536
 
537
- #: s2member/includes/classes/files-in.inc.php:1316
538
  msgctxt "s2member-admin"
539
- msgid ""
540
- "Unable to delete existing Amazon CloudFront Distro. Invalid Distro ID or "
541
- "ETag."
542
  msgstr ""
543
 
544
- #: s2member/includes/classes/files-in.inc.php:1357
545
  msgctxt "s2member-admin"
546
- msgid ""
547
- "Unable to create/read Amazon CloudFront Downloads Distro. Unexpected "
548
- "response."
549
  msgstr ""
550
 
551
- #: s2member/includes/classes/files-in.inc.php:1380
552
  msgctxt "s2member-admin"
553
- msgid ""
554
- "Unable to create/read Amazon CloudFront Streaming Distro. Unexpected "
555
- "response."
556
  msgstr ""
557
 
558
- #: s2member/includes/classes/files-in.inc.php:1391
559
  msgctxt "s2member-admin"
560
  msgid "Unable to create Amazon CloudFront Distro. Invalid Distro type."
561
  msgstr ""
@@ -567,61 +485,45 @@ msgstr ""
567
 
568
  #: s2member/includes/classes/login-checks.inc.php:76
569
  msgctxt "s2member-front"
570
- msgid ""
571
- "<strong>ERROR</strong>: Max simultaneous logins for username: %1$s. Please "
572
- "wait %2$s and try again."
573
  msgstr ""
574
 
575
  #: s2member/includes/classes/paypal-return-in-no-tx-data.inc.php:66
576
  #: s2member/includes/classes/paypal-return-in-proxy-ty-email.inc.php:64
577
  msgctxt "s2member-front"
578
- msgid ""
579
- "<strong>Thank you! (you MUST check your email before proceeding).</"
580
- "strong><br /><br />* Note: It can take <em>(up to 15 minutes)</em> for Email "
581
- "Confirmation with important details. If you don't receive email confirmation "
582
- "in the next 15 minutes, please contact Support."
583
  msgstr ""
584
 
585
  #: s2member/includes/classes/paypal-return-in-no-tx-data.inc.php:66
586
  #: s2member/includes/classes/paypal-return-in-proxy-ty-email.inc.php:64
587
  msgctxt "s2member-front"
588
- msgid ""
589
- "<strong>** Sandbox Mode **</strong> You may NOT receive this Email in "
590
- "Sandbox Mode. Sandbox addresses are usually bogus (for testing)."
591
  msgstr ""
592
 
593
  #: s2member/includes/classes/paypal-return-in-no-tx-data.inc.php:67
594
  #: s2member/includes/classes/paypal-return-in-proxy-ty-email.inc.php:65
595
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:199
596
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:210
597
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:221
598
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:246
599
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:257
600
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:367
601
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:156
602
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:167
603
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:178
604
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:189
605
  #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:120
606
  #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:131
607
- #: s2member/includes/classes/paypal-return-in.inc.php:91
608
- #: s2member/includes/classes/paypal-return-in.inc.php:108
609
- #: s2member/includes/classes/paypal-return-in.inc.php:134
610
  msgctxt "s2member-front"
611
  msgid "Back To Home Page"
612
  msgstr ""
613
 
614
  #: s2member/includes/classes/paypal-return-in-proxy-x-preview.inc.php:64
615
  msgctxt "s2member-front"
616
- msgid ""
617
- "<strong>Thank you! (this is a preview, no action necessary).</strong><br /"
618
- "><br />* Note: each of your Customers are returned back to your site "
619
- "immediately after they complete checkout. This Return Page displays a "
620
- "message and instructions for the Customer. s2Member may change the message "
621
- "and instructions dynamically, based on what the Customer is actually doing "
622
- "<em>(i.e. based on the type of transaction that is taking place)</em>.<br /"
623
- "><br /><em>* With <a href=\"%s\" target=\"_blank\">s2Member Pro</a> "
624
- "installed, it is possible to customize this Return Page in various ways.</em>"
625
  msgstr ""
626
 
627
  #: s2member/includes/classes/paypal-return-in-proxy-x-preview.inc.php:65
@@ -630,59 +532,47 @@ msgctxt "s2member-front"
630
  msgid "Continue (Click Here)"
631
  msgstr ""
632
 
633
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:187
634
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:234
635
  msgctxt "s2member-front"
636
  msgid "Thank you! You've been updated to:"
637
  msgstr ""
638
 
639
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:188
640
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:235
641
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:145
642
  msgctxt "s2member-front"
643
  msgid "Please Log Back In (Click Here)"
644
  msgstr ""
645
 
646
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:198
647
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:245
648
  msgctxt "s2member-front"
649
- msgid ""
650
- "<strong>ERROR:</strong> Unable to modify Subscription.<br />Please contact "
651
- "Support for assistance.<br /><br />The existing User ID is associated with "
652
- "an Administrator. Stopping here. Otherwise, an Administrator could lose "
653
- "access. Please make sure that you are NOT logged in as an Administrator "
654
- "while testing."
655
  msgstr ""
656
 
657
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:209
658
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:256
659
  msgctxt "s2member-front"
660
- msgid ""
661
- "<strong>ERROR:</strong> Unable to modify Subscription.<br />Please contact "
662
- "Support for assistance.<br /><br />Could not get the existing User ID from "
663
- "the DB."
664
  msgstr ""
665
 
666
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:220
667
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:366
668
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:188
669
  #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:130
670
  msgctxt "s2member-front"
671
- msgid ""
672
- "<strong>Page Expired:</strong> Duplicate Return-Data.<br />Please contact "
673
- "Support if you need any assistance."
674
  msgstr ""
675
 
676
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:327
677
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:350
678
  msgctxt "s2member-front"
679
- msgid ""
680
- "<strong>Thank you! Your account has been approved.<br />The next step is to "
681
- "Register a Username for immediate access.</strong>"
682
  msgstr ""
683
 
684
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:328
685
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:351
686
  msgctxt "s2member-front"
687
  msgid "Please Register Now (Click Here)"
688
  msgstr ""
@@ -694,27 +584,17 @@ msgstr ""
694
 
695
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:155
696
  msgctxt "s2member-front"
697
- msgid ""
698
- "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact "
699
- "Support for assistance.<br /><br />The existing User ID is associated with "
700
- "an Administrator. Stopping here. Otherwise, an Administrator could lose "
701
- "access. Please make sure that you are NOT logged in as an Administrator "
702
- "while testing."
703
  msgstr ""
704
 
705
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:166
706
  msgctxt "s2member-front"
707
- msgid ""
708
- "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact "
709
- "Support for assistance.<br /><br />Could not get the existing User ID from "
710
- "the DB."
711
  msgstr ""
712
 
713
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:177
714
  msgctxt "s2member-front"
715
- msgid ""
716
- "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact "
717
- "Support for assistance.<br /><br />Missing User/Member details."
718
  msgstr ""
719
 
720
  #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:108
@@ -724,48 +604,22 @@ msgstr ""
724
 
725
  #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:119
726
  msgctxt "s2member-front"
727
- msgid ""
728
- "<strong>ERROR:</strong> Unable to generate Access Link.<br />Please contact "
729
- "Support for assistance."
730
  msgstr ""
731
 
732
- #: s2member/includes/classes/paypal-return-in.inc.php:90
733
  msgctxt "s2member-front"
734
- msgid ""
735
- "<strong>ERROR:</strong> Unexpected <code>txn_type/status</code>.<br />The "
736
- "<code>txn_type/status</code> did not meet requirements.<br />Please contact "
737
- "Support for assistance."
738
  msgstr ""
739
 
740
- #: s2member/includes/classes/paypal-return-in.inc.php:107
741
  msgctxt "s2member-front"
742
- msgid ""
743
- "<strong>ERROR:</strong> Unable to verify <code>$_SERVER[\"HTTP_HOST\"]</"
744
- "code>.<br />Please contact Support for assistance.<br /><br />If you are the "
745
- "site owner, please check the <code>custom</code> value in your Button Code. "
746
- "It MUST start with your domain name."
747
  msgstr ""
748
 
749
- #: s2member/includes/classes/paypal-return-in.inc.php:133
750
  msgctxt "s2member-front"
751
- msgid ""
752
- "<strong>ERROR:</strong> Unable to verify <code>$_POST</code> vars.<br /"
753
- ">Please contact Support for assistance.<br /><br />This is most likely "
754
- "related to an invalid configuration of s2Member, or a problem with server "
755
- "compatibility. If you are the site owner, and you're absolutely SURE that "
756
- "your configuration is valid, you may want to run some tests on your server, "
757
- "just to be sure <code>$_POST</code> variables are populated, and that your "
758
- "server is able to connect/communicate with your Payment Gateway over an "
759
- "HTTPS connection.<br /><br />s2Member uses the <code>WP_Http</code> class "
760
- "for remote connections; which will try to use <code>cURL</code> first, and "
761
- "then fall back on the <code>FOPEN</code> method when <code>cURL</code> is "
762
- "not available. On a Windows server, you may have to disable your <code>cURL</"
763
- "code> extension; and instead, set <code>allow_url_fopen = yes</code> in your "
764
- "php.ini file. The <code>cURL</code> extension (usually) does NOT support SSL "
765
- "connections on a Windows server.<br /><br />Please see <a href=\"http://www."
766
- "s2member.com/forums/topic/ideal-server-configuration-for-s2member/\" target="
767
- "\"_blank\">this thread</a> for details regarding the ideal server "
768
- "configuration for s2Member."
769
  msgstr ""
770
 
771
  #. translators: Exclude `%2$s` and `%3$s`. These are English details returned
@@ -789,8 +643,7 @@ msgstr ""
789
  #: s2member/includes/classes/paypal-utilities.inc.php:232
790
  #: s2member/includes/classes/paypal-utilities.inc.php:238
791
  msgctxt "s2member-front"
792
- msgid ""
793
- "Error #%s. Transaction declined. Please use an alternate funding source."
794
  msgstr ""
795
 
796
  #: s2member/includes/classes/paypal-utilities.inc.php:235
@@ -822,10 +675,7 @@ msgstr ""
822
 
823
  #: s2member/includes/classes/paypal-utilities.inc.php:369
824
  msgctxt "s2member-front"
825
- msgid ""
826
- " Please contact PayPal Merchant Technical Support (www.paypal.com/mts) and "
827
- "request `Recurring Billing` service, and also ask to have `Reference "
828
- "Transactions` enabled for Recurring Billing via Express Checkout."
829
  msgstr ""
830
 
831
  #: s2member/includes/classes/profile-in.inc.php:78
@@ -843,6 +693,8 @@ msgstr ""
843
 
844
  #: s2member/includes/classes/profile-in.inc.php:98
845
  #: s2member/includes/classes/sc-profile-in.inc.php:114
 
 
846
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:78
847
  #: s2member-pro/includes/templates/forms/authnet-registration-form.php:46
848
  #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:78
@@ -894,16 +746,12 @@ msgstr ""
894
  #: s2member/includes/classes/register-in.inc.php:48
895
  #: s2member/includes/classes/sp-access.inc.php:132
896
  msgctxt "s2member-front"
897
- msgid ""
898
- "<strong>Your Link Expired:</strong><br />Please contact Support if you need "
899
- "assistance."
900
  msgstr ""
901
 
902
  #: s2member/includes/classes/registrations.inc.php:450
903
  msgctxt "s2member-front"
904
- msgid ""
905
- "s2Member security violation. You attempted to POST administrative variables "
906
- "that will NOT be trusted in a NON-administrative zone!"
907
  msgstr ""
908
 
909
  #: s2member/includes/classes/return-templates.inc.php:50
@@ -923,9 +771,7 @@ msgstr ""
923
 
924
  #: s2member/includes/classes/return-templates.inc.php:77
925
  msgctxt "s2member-front"
926
- msgid ""
927
- "If you need assistance, please <a href=\"%s\" target=\"_blank\">contact "
928
- "support</a>."
929
  msgstr ""
930
 
931
  #: s2member/includes/classes/sc-paypal-button-e.inc.php:77
@@ -937,6 +783,9 @@ msgstr ""
937
  #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:34
938
  #: s2member/includes/templates/buttons/paypal-checkout-button.php:46
939
  #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:34
 
 
 
940
  msgctxt "s2member-front paypal-button-lang-code"
941
  msgid "en_US"
942
  msgstr ""
@@ -982,17 +831,13 @@ msgstr ""
982
 
983
  #: s2member/includes/classes/translations.inc.php:123
984
  msgctxt "s2member-front"
985
- msgid ""
986
- "Your account is now active. <a href=\"%1$s\">Visit site</a> or <a href=\"%2$s"
987
- "\">Log in</a>."
988
  msgstr ""
989
 
990
  #: s2member/includes/classes/translations.inc.php:144
991
  #: s2member/includes/classes/translations.inc.php:166
992
  msgctxt "s2member-front"
993
- msgid ""
994
- "By filling out the form below, you can <strong>add a site to your account</"
995
- "strong>."
996
  msgstr ""
997
 
998
  #: s2member/includes/classes/translations.inc.php:144
@@ -1239,22 +1084,347 @@ msgid_plural "for %1$s %3$s"
1239
  msgstr[0] ""
1240
  msgstr[1] ""
1241
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1242
  #: s2member/includes/syscon.inc.php:84
1243
  msgctxt "s2member-front recaptcha-lang-code"
1244
  msgid "en"
1245
  msgstr ""
1246
 
1247
- #: s2member/includes/syscon.inc.php:152
1248
  msgctxt "s2member-front"
1249
  msgid "Yes, I want to receive updates via email."
1250
  msgstr ""
1251
 
1252
- #: s2member/includes/syscon.inc.php:206
1253
  msgctxt "s2member-front"
1254
  msgid "[%s] Username/Password"
1255
  msgstr ""
1256
 
1257
- #: s2member/includes/syscon.inc.php:207
1258
  msgctxt "s2member-front"
1259
  msgid ""
1260
  "Your Username/Password for:\n"
@@ -1265,12 +1435,12 @@ msgid ""
1265
  "%%%%wp_login_url%%%%"
1266
  msgstr ""
1267
 
1268
- #: s2member/includes/syscon.inc.php:210
1269
  msgctxt "s2member-front"
1270
  msgid "[%s] New User Registration"
1271
  msgstr ""
1272
 
1273
- #: s2member/includes/syscon.inc.php:211
1274
  msgctxt "s2member-front"
1275
  msgid ""
1276
  "New User Registration on your site:\n"
@@ -1282,13 +1452,13 @@ msgid ""
1282
  "IP Address: %%%%user_ip%%%%"
1283
  msgstr ""
1284
 
1285
- #: s2member/includes/syscon.inc.php:233
1286
  #: s2member-pro/includes/syscon.inc.php:94
1287
  msgctxt "s2member-front"
1288
  msgid "Congratulations! (your membership has been approved)"
1289
  msgstr ""
1290
 
1291
- #: s2member/includes/syscon.inc.php:234
1292
  msgctxt "s2member-front"
1293
  msgid ""
1294
  "Thanks %%%%first_name%%%%! Your membership has been approved.\n"
@@ -1304,16 +1474,15 @@ msgid ""
1304
  "%s"
1305
  msgstr ""
1306
 
1307
- #: s2member/includes/syscon.inc.php:237 s2member/includes/syscon.inc.php:241
1308
  msgctxt "s2member-front"
1309
  msgid "Thank you! Your account has been updated."
1310
  msgstr ""
1311
 
1312
- #: s2member/includes/syscon.inc.php:238 s2member/includes/syscon.inc.php:242
1313
  msgctxt "s2member-front"
1314
  msgid ""
1315
- "Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%"
1316
- "%.\n"
1317
  "\n"
1318
  "If you have any trouble, please feel free to contact us.\n"
1319
  "\n"
@@ -1321,13 +1490,13 @@ msgid ""
1321
  "%s"
1322
  msgstr ""
1323
 
1324
- #: s2member/includes/syscon.inc.php:245
1325
  #: s2member-pro/includes/syscon.inc.php:98
1326
  msgctxt "s2member-front"
1327
  msgid "Thank You! (instructions for access)"
1328
  msgstr ""
1329
 
1330
- #: s2member/includes/syscon.inc.php:246
1331
  msgctxt "s2member-front"
1332
  msgid ""
1333
  "Thanks %%%%first_name%%%%!\n"
@@ -1344,32 +1513,32 @@ msgid ""
1344
  "%s"
1345
  msgstr ""
1346
 
1347
- #: s2member/includes/syscon.inc.php:274
1348
  msgctxt "s2member-front"
1349
  msgid "Free Subscriber"
1350
  msgstr ""
1351
 
1352
- #: s2member/includes/syscon.inc.php:274
1353
  msgctxt "s2member-front"
1354
  msgid "Bronze Member"
1355
  msgstr ""
1356
 
1357
- #: s2member/includes/syscon.inc.php:274
1358
  msgctxt "s2member-front"
1359
  msgid "Silver Member"
1360
  msgstr ""
1361
 
1362
- #: s2member/includes/syscon.inc.php:274
1363
  msgctxt "s2member-front"
1364
  msgid "Gold Member"
1365
  msgstr ""
1366
 
1367
- #: s2member/includes/syscon.inc.php:274
1368
  msgctxt "s2member-front"
1369
  msgid "Platinum Member"
1370
  msgstr ""
1371
 
1372
- #: s2member/includes/syscon.inc.php:274
1373
  msgctxt "s2member-front"
1374
  msgid "Level %s Member"
1375
  msgstr ""
@@ -1470,10 +1639,7 @@ msgstr ""
1470
 
1471
  #: s2member/includes/templates/errors/ip-restrictions.php:13
1472
  msgctxt "s2member-front"
1473
- msgid ""
1474
- "<strong>503: Service Temporarily Unavailable</strong><br />Too many IP "
1475
- "addresses accessing one secure area<em>!</em><br />Please contact Support if "
1476
- "you need assistance."
1477
  msgstr ""
1478
 
1479
  #: s2member/includes/templates/options/paypal-currencies.php:6
@@ -2264,17 +2430,14 @@ msgctxt "s2member-front"
2264
  msgid ""
2265
  "ERROR: Unable to verify POST vars. Please contact Support for assistance.\n"
2266
  "\n"
2267
- "This is most likely related to an invalid AliPay configuration. If you are "
2268
- "the site owner, please check: s2Member -› AliPay Options."
2269
  msgstr ""
2270
 
2271
  #: s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:116
2272
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:115
2273
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:113
2274
  msgctxt "s2member-front"
2275
- msgid ""
2276
- "<strong>Billing termination confirmed.</strong> Your account has been "
2277
- "cancelled."
2278
  msgstr ""
2279
 
2280
  #: s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:124
@@ -2295,84 +2458,76 @@ msgstr ""
2295
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:155
2296
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:148
2297
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:153
2298
- #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:146
2299
  msgctxt "s2member-front"
2300
  msgid "You're <strong>NOT</strong> logged in."
2301
  msgstr ""
2302
 
2303
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:288
2304
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:626
2305
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:332
2306
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:655
2307
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:388
2308
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:722
2309
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:469
2310
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:906
2311
  msgctxt "s2member-front"
2312
- msgid ""
2313
- "<strong>Thank you.</strong> Your account has been updated.<br />&mdash; "
2314
- "Please <a href=\"%s\" rel=\"nofollow\">log back in</a> now."
2315
  msgstr ""
2316
 
2317
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:492
2318
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:743
2319
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:492
2320
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:808
2321
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:561
2322
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:874
2323
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:737
2324
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1060
2325
  msgctxt "s2member-front"
2326
- msgid ""
2327
- "<strong>Thank you.</strong> Your account has been approved.<br />&mdash; "
2328
- "Please <a href=\"%s\" rel=\"nofollow\">login</a>."
2329
  msgstr ""
2330
 
2331
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:501
2332
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:525
2333
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:752
2334
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:773
2335
- #: s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:125
2336
- #: s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:142
2337
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:501
2338
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:522
2339
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:817
2340
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:838
2341
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:570
2342
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:591
2343
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:883
2344
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:904
2345
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:746
2346
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:767
2347
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1069
2348
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1090
2349
- #: s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:125
2350
- #: s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:142
2351
- msgctxt "s2member-front"
2352
- msgid ""
2353
- "<strong>Oops.</strong> A slight problem. Please contact Support for "
2354
- "assistance."
2355
  msgstr ""
2356
 
2357
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:516
2358
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:764
2359
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:513
2360
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:829
2361
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:582
2362
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:895
2363
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:758
2364
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1081
2365
  msgctxt "s2member-front"
2366
- msgid ""
2367
- "<strong>Thank you.</strong> Your account has been approved.<br />&mdash; "
2368
- "You'll receive an email momentarily."
2369
  msgstr ""
2370
 
2371
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:784
2372
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:849
2373
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:915
2374
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1101
2375
- #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:137
2376
  msgctxt "s2member-front"
2377
  msgid "<strong>Unknown error.</strong> Please contact Support for assistance."
2378
  msgstr ""
@@ -2559,38 +2714,31 @@ msgctxt "s2member-front"
2559
  msgid "12 December"
2560
  msgstr ""
2561
 
2562
- #: s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:118
2563
- #: s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:118
2564
  msgctxt "s2member-front"
2565
- msgid ""
2566
- "<strong>Thank you.</strong> Please <a href=\"%s\" rel=\"nofollow\">login</a>."
2567
  msgstr ""
2568
 
2569
- #: s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:135
2570
- #: s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:135
2571
  msgctxt "s2member-front"
2572
  msgid "<strong>Thank you.</strong> You'll receive an email momentarily."
2573
  msgstr ""
2574
 
2575
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:205
2576
  msgctxt "s2member-admin"
2577
- msgid ""
2578
- "Authorize.Net configuration error. Please configure your Authorize.Net API "
2579
- "Login ID."
2580
  msgstr ""
2581
 
2582
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:208
2583
  msgctxt "s2member-admin"
2584
- msgid ""
2585
- "Authorize.Net configuration error. Your Authorize.Net API Transaction Key is "
2586
- "not yet configured."
2587
  msgstr ""
2588
 
2589
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:211
2590
  msgctxt "s2member-admin"
2591
- msgid ""
2592
- "Authorize.Net configuration error. Your Authorize.Net Secret MD5 Hash is not "
2593
- "yet configured."
2594
  msgstr ""
2595
 
2596
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:233
@@ -2598,8 +2746,7 @@ msgstr ""
2598
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:236
2599
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:597
2600
  msgctxt "s2member-front"
2601
- msgid ""
2602
- "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to cancel your account."
2603
  msgstr ""
2604
 
2605
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:236
@@ -2623,9 +2770,7 @@ msgstr ""
2623
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:272
2624
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:608
2625
  msgctxt "s2member-front"
2626
- msgid ""
2627
- "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to update your billing "
2628
- "information."
2629
  msgstr ""
2630
 
2631
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:253
@@ -2641,25 +2786,19 @@ msgstr ""
2641
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:302
2642
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:308
2643
  msgctxt "s2member-front"
2644
- msgid ""
2645
- "Nothing to update. You have NO recurring fees. Or, your billing profile is "
2646
- "no longer active. Please contact Support if you need assistance."
2647
  msgstr ""
2648
 
2649
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:267
2650
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:314
2651
  msgctxt "s2member-admin"
2652
- msgid ""
2653
- "Invalid form configuration. Missing \"level\" attribute. Membership Level. "
2654
- "Must be numeric [0-%s]."
2655
  msgstr ""
2656
 
2657
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:270
2658
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:317
2659
  msgctxt "s2member-admin"
2660
- msgid ""
2661
- "Invalid form configuration. Invalid \"level\" attribute. Membership Level. "
2662
- "Must be numeric [0-%s]."
2663
  msgstr ""
2664
 
2665
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:273
@@ -2667,10 +2806,7 @@ msgstr ""
2667
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:320
2668
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:426
2669
  msgctxt "s2member-admin"
2670
- msgid ""
2671
- "Invalid form configuration. Invalid \"ccaps\" attribute. Custom "
2672
- "Capabilities. When provided, must be all lowercase [a-z_0-9,]. A preceding `-"
2673
- "all,` directive is also acceptable."
2674
  msgstr ""
2675
 
2676
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:276
@@ -2678,9 +2814,7 @@ msgstr ""
2678
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:323
2679
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:468
2680
  msgctxt "s2member-admin"
2681
- msgid ""
2682
- "Invalid form configuration. Invalid \"tp\" attribute. The Trial Period. When "
2683
- "provided, must be numeric."
2684
  msgstr ""
2685
 
2686
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:279
@@ -2688,9 +2822,7 @@ msgstr ""
2688
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:326
2689
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:471
2690
  msgctxt "s2member-admin"
2691
- msgid ""
2692
- "Invalid form configuration. Invalid \"tp\" attribute. The Trial Period. When "
2693
- "provided, must be >= 1."
2694
  msgstr ""
2695
 
2696
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:282
@@ -2698,9 +2830,7 @@ msgstr ""
2698
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:329
2699
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:474
2700
  msgctxt "s2member-admin"
2701
- msgid ""
2702
- "Invalid form configuration. Missing \"tt\" attribute. The Trial Term. When "
2703
- "\"tp\" is provided, \"tt\" (Trial Term) must be one of D,W,M,Y."
2704
  msgstr ""
2705
 
2706
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:285
@@ -2708,81 +2838,61 @@ msgstr ""
2708
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:332
2709
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:477
2710
  msgctxt "s2member-admin"
2711
- msgid ""
2712
- "Invalid form configuration. Invalid \"tt\" attribute. The Trial Term. When "
2713
- "\"tp\" is provided, \"tt\" (Trial Term) must be one of D,W,M,Y."
2714
  msgstr ""
2715
 
2716
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:288
2717
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:335
2718
  msgctxt "s2member-admin"
2719
- msgid ""
2720
- "Invalid form configuration. Invalid \"custom\" attribute. When provided, "
2721
- "must start with your domain name."
2722
  msgstr ""
2723
 
2724
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:293
2725
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:340
2726
  msgctxt "s2member-admin"
2727
- msgid ""
2728
- "Invalid form configuration. Missing \"ids\" attribute. Must contain comma-"
2729
- "delimited Post/Page IDs."
2730
  msgstr ""
2731
 
2732
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:296
2733
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:343
2734
  msgctxt "s2member-admin"
2735
- msgid ""
2736
- "Invalid form configuration. Invalid \"ids\" attribute. Must contain comma-"
2737
- "delimited Post/Page IDs. Must contain [0-9,] only."
2738
  msgstr ""
2739
 
2740
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:299
2741
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:346
2742
  msgctxt "s2member-admin"
2743
- msgid ""
2744
- "Invalid form configuration. Missing \"exp\" attribute. Specific Post/Page "
2745
- "Expiration (in hours). Must be numeric."
2746
  msgstr ""
2747
 
2748
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:302
2749
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:349
2750
  msgctxt "s2member-admin"
2751
- msgid ""
2752
- "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page "
2753
- "Expiration (in hours). Must be numeric."
2754
  msgstr ""
2755
 
2756
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:305
2757
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:352
2758
  msgctxt "s2member-admin"
2759
- msgid ""
2760
- "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page "
2761
- "Expiration (in hours). Must be >= 1."
2762
  msgstr ""
2763
 
2764
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:308
2765
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:355
2766
  msgctxt "s2member-admin"
2767
- msgid ""
2768
- "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page "
2769
- "Expiration (in hours). Must be <= 43800."
2770
  msgstr ""
2771
 
2772
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:311
2773
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:358
2774
  msgctxt "s2member-admin"
2775
- msgid ""
2776
- "Invalid form configuration. Missing \"sp_ids_exp\" internal attribute. "
2777
- "Please check Shortcode Attributes."
2778
  msgstr ""
2779
 
2780
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:314
2781
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:361
2782
  msgctxt "s2member-admin"
2783
- msgid ""
2784
- "Invalid form configuration. Invalid \"sp_ids_exp\" internal attribute. "
2785
- "Please check Shortcode Attributes."
2786
  msgstr ""
2787
 
2788
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:317
@@ -2790,9 +2900,7 @@ msgstr ""
2790
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:364
2791
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:432
2792
  msgctxt "s2member-admin"
2793
- msgid ""
2794
- "Invalid form configuration. Missing \"desc\" attribute. Please provide a "
2795
- "Description for this form."
2796
  msgstr ""
2797
 
2798
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:320
@@ -2800,9 +2908,7 @@ msgstr ""
2800
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:367
2801
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:435
2802
  msgctxt "s2member-admin"
2803
- msgid ""
2804
- "Invalid form configuration. Your \"desc\" (Description) attribute must be <= "
2805
- "100 characters long."
2806
  msgstr ""
2807
 
2808
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:323
@@ -2810,17 +2916,13 @@ msgstr ""
2810
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:370
2811
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:438
2812
  msgctxt "s2member-admin"
2813
- msgid ""
2814
- "Invalid form configuration. Missing \"custom\" attribute. Must start with "
2815
- "your domain name."
2816
  msgstr ""
2817
 
2818
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:326
2819
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:373
2820
  msgctxt "s2member-admin"
2821
- msgid ""
2822
- "Invalid form configuration. Invalid \"custom\" attribute. Must start with "
2823
- "your domain name."
2824
  msgstr ""
2825
 
2826
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:329
@@ -2828,9 +2930,7 @@ msgstr ""
2828
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:376
2829
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:444
2830
  msgctxt "s2member-admin"
2831
- msgid ""
2832
- "Invalid form configuration. Missing \"cc\" attribute. Must be a 3 character "
2833
- "Currency Code."
2834
  msgstr ""
2835
 
2836
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:332
@@ -2838,9 +2938,7 @@ msgstr ""
2838
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:379
2839
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:447
2840
  msgctxt "s2member-admin"
2841
- msgid ""
2842
- "Invalid form configuration. Invalid \"cc\" attribute. Must be a 3 character "
2843
- "Currency Code."
2844
  msgstr ""
2845
 
2846
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:335
@@ -2848,9 +2946,7 @@ msgstr ""
2848
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:400
2849
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:537
2850
  msgctxt "s2member-admin"
2851
- msgid ""
2852
- "Invalid form configuration. Missing \"ra\" attribute. The Regular Amount. "
2853
- "Must be >= 0.00."
2854
  msgstr ""
2855
 
2856
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:338
@@ -2858,9 +2954,7 @@ msgstr ""
2858
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:403
2859
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:540
2860
  msgctxt "s2member-admin"
2861
- msgid ""
2862
- "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. "
2863
- "Must be numeric."
2864
  msgstr ""
2865
 
2866
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:341
@@ -2868,228 +2962,163 @@ msgstr ""
2868
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:406
2869
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:543
2870
  msgctxt "s2member-admin"
2871
- msgid ""
2872
- "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. "
2873
- "Must be >= 0.00."
2874
  msgstr ""
2875
 
2876
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:344
2877
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:472
2878
  msgctxt "s2member-admin"
2879
- msgid ""
2880
- "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. "
2881
- "Must be <= 99999.00."
2882
  msgstr ""
2883
 
2884
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:349
2885
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:414
2886
  msgctxt "s2member-front"
2887
- msgid ""
2888
- "You must <a href=\"%s\" rel=\"nofollow\">login</a> to update your billing "
2889
- "plan."
2890
  msgstr ""
2891
 
2892
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:352
2893
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:417
2894
  msgctxt "s2member-front"
2895
- msgid ""
2896
- "You must <a href=\"%s\" rel=\"nofollow\">login</a> before making this "
2897
- "purchase."
2898
  msgstr ""
2899
 
2900
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:355
2901
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:420
2902
  msgctxt "s2member-admin"
2903
- msgid ""
2904
- "Invalid form configuration. Missing \"level\" attribute. Membership Level. "
2905
- "Must be numeric [1-%s], or an asterisk (*)."
2906
  msgstr ""
2907
 
2908
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:358
2909
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:423
2910
  msgctxt "s2member-admin"
2911
- msgid ""
2912
- "Invalid form configuration. Invalid \"level\" attribute. Membership Level. "
2913
- "Must be numeric [1-%s], or an asterisk (*)."
2914
  msgstr ""
2915
 
2916
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:364
2917
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:429
2918
  msgctxt "s2member-admin"
2919
- msgid ""
2920
- "Invalid form configuration. Missing or invalid \"ccaps\" attribute. When "
2921
- "\"level\" is \"*\" for (Independent Custom Capabilities), \"ccaps\" is "
2922
- "required. All lowercase [a-z_0-9,]. A preceding `-all,` directive is also "
2923
- "acceptable."
2924
  msgstr ""
2925
 
2926
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:376
2927
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:441
2928
  msgctxt "s2member-admin"
2929
- msgid ""
2930
- "Invalid form configuration. Invalid \"custom\" attribute. Must start with "
2931
- "matching domain."
2932
  msgstr ""
2933
 
2934
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:397
2935
  msgctxt "s2member-admin"
2936
- msgid ""
2937
- "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" (Trial "
2938
- "Term) attribute is \"D\", and \"tp\" (Trial Period) > 365."
2939
  msgstr ""
2940
 
2941
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:400
2942
  msgctxt "s2member-admin"
2943
- msgid ""
2944
- "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" (Trial "
2945
- "Term) attribute is \"W\", and \"tp\" (Trial Period) > 52."
2946
  msgstr ""
2947
 
2948
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:403
2949
  msgctxt "s2member-admin"
2950
- msgid ""
2951
- "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" (Trial "
2952
- "Term) attribute is \"M\", and \"tp\" (Trial Period) > 12."
2953
  msgstr ""
2954
 
2955
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:406
2956
  msgctxt "s2member-admin"
2957
- msgid ""
2958
- "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" (Trial "
2959
- "Term) attribute is \"Y\", and \"tp\" (Trial Period) > 1."
2960
  msgstr ""
2961
 
2962
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:409
2963
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:480
2964
  msgctxt "s2member-admin"
2965
- msgid ""
2966
- "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When "
2967
- "provided, must be numeric."
2968
  msgstr ""
2969
 
2970
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:412
2971
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:483
2972
  msgctxt "s2member-admin"
2973
- msgid ""
2974
- "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When "
2975
- "provided, must be >= 0.00."
2976
  msgstr ""
2977
 
2978
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:415
2979
  msgctxt "s2member-admin"
2980
- msgid ""
2981
- "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When "
2982
- "provided, must be <= 99999.00."
2983
  msgstr ""
2984
 
2985
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:418
2986
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:489
2987
  msgctxt "s2member-admin"
2988
- msgid ""
2989
- "Invalid form configuration. Missing \"rp\" attribute. The Regular Period. "
2990
- "Must be >= 1."
2991
  msgstr ""
2992
 
2993
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:421
2994
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:492
2995
  msgctxt "s2member-admin"
2996
- msgid ""
2997
- "Invalid form configuration. Invalid \"rp\" attribute. The Regular Period. "
2998
- "Must be numeric."
2999
  msgstr ""
3000
 
3001
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:424
3002
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:495
3003
  msgctxt "s2member-admin"
3004
- msgid ""
3005
- "Invalid form configuration. Invalid \"rp\" attribute. The Regular Period. "
3006
- "Must be >= 1."
3007
  msgstr ""
3008
 
3009
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:427
3010
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:498
3011
  msgctxt "s2member-admin"
3012
- msgid ""
3013
- "Invalid form configuration. Missing \"rt\" attribute. The Regular Term. Must "
3014
- "be one of D,W,M,Y,L."
3015
  msgstr ""
3016
 
3017
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:430
3018
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:501
3019
  msgctxt "s2member-admin"
3020
- msgid ""
3021
- "Invalid form configuration. Invalid \"rt\" attribute. The Regular Term. Must "
3022
- "be one of D,W,M,Y,L."
3023
  msgstr ""
3024
 
3025
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:433
3026
  msgctxt "s2member-admin"
3027
- msgid ""
3028
- "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt"
3029
- "\" (Regular Term) attribute is \"D\", \"rp\" (Regular Period) is < 7, and "
3030
- "\"rr\" is not \"BN\" (Buy Now)."
3031
  msgstr ""
3032
 
3033
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:436
3034
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:504
3035
  msgctxt "s2member-admin"
3036
- msgid ""
3037
- "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt"
3038
- "\" (Regular Term) attribute is \"D\", \"rp\" (Regular Period) > 365, and \"rr"
3039
- "\" is not \"BN\" (Buy Now)."
3040
  msgstr ""
3041
 
3042
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:439
3043
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:507
3044
  msgctxt "s2member-admin"
3045
- msgid ""
3046
- "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt"
3047
- "\" (Regular Term) attribute is \"W\", \"rp\" (Regular Period) > 52, and \"rr"
3048
- "\" is not \"BN\" (Buy Now)."
3049
  msgstr ""
3050
 
3051
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:442
3052
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:510
3053
  msgctxt "s2member-admin"
3054
- msgid ""
3055
- "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt"
3056
- "\" (Regular Term) attribute is \"M\", \"rp\" (Regular Period) > 12, and \"rr"
3057
- "\" is not \"BN\" (Buy Now)."
3058
  msgstr ""
3059
 
3060
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:445
3061
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:519
3062
  msgctxt "s2member-admin"
3063
- msgid ""
3064
- "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt"
3065
- "\" (Regular Term) attribute is \"Y\", \"rp\" (Regular Period) > 1, and \"rr"
3066
- "\" is not \"BN\" (Buy Now)."
3067
  msgstr ""
3068
 
3069
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:448
3070
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:522
3071
  msgctxt "s2member-admin"
3072
- msgid ""
3073
- "Invalid form configuration. Invalid \"rp, rt\" attributes. The \"rt"
3074
- "\" (Regular Term) attribute is \"L\" (Lifetime), and \"rp\" (Regular Period) "
3075
- "> 1."
3076
  msgstr ""
3077
 
3078
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:451
3079
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:525
3080
  msgctxt "s2member-admin"
3081
- msgid ""
3082
- "Invalid form configuration. Invalid \"rt, rr\" attributes. The \"rt"
3083
- "\" (Regular Term) attribute is \"L\" (Lifetime), and \"rr\" is not \"BN"
3084
- "\" (Buy Now)."
3085
  msgstr ""
3086
 
3087
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:454
3088
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:528
3089
  msgctxt "s2member-admin"
3090
- msgid ""
3091
- "Invalid form configuration. Missing \"level_ccaps_eotper\" attribute. Please "
3092
- "check Shortcode Attributes."
3093
  msgstr ""
3094
 
3095
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:457
@@ -3097,68 +3126,49 @@ msgstr ""
3097
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:531
3098
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:534
3099
  msgctxt "s2member-admin"
3100
- msgid ""
3101
- "Invalid form configuration. Invalid \"level_ccaps_eotper\" attribute. Please "
3102
- "check Shortcode Attributes."
3103
  msgstr ""
3104
 
3105
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:475
3106
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:549
3107
  msgctxt "s2member-admin"
3108
- msgid ""
3109
- "Invalid form configuration. Invalid \"rr\" attribute. Regular Recurring. "
3110
- "When provided, must be 0, 1, or BN."
3111
  msgstr ""
3112
 
3113
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:478
3114
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:552
3115
  msgctxt "s2member-admin"
3116
- msgid ""
3117
- "Invalid form configuration. Invalid \"rr, tp\" attributes. The \"rr"
3118
- "\" (Regular Recurring) attribute is \"BN\" (Buy Now), and \"tp\" (Trial "
3119
- "Period) is not \"0\"."
3120
  msgstr ""
3121
 
3122
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:481
3123
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:555
3124
  msgctxt "s2member-admin"
3125
- msgid ""
3126
- "Invalid form configuration. Invalid \"level, rr\" attributes. The \"level"
3127
- "\" (Level) attribute is \"*\" for (Independent Custom Capabilities), and \"rr"
3128
- "\" is not \"BN\" (Buy Now)."
3129
  msgstr ""
3130
 
3131
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:484
3132
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:558
3133
  msgctxt "s2member-admin"
3134
- msgid ""
3135
- "Invalid form configuration. Invalid \"ta, tp, tt\" attributes. Trial Period. "
3136
- "When provided, these cannot be exactly the same as your \"ra, rp, rt\" "
3137
- "attributes."
3138
  msgstr ""
3139
 
3140
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:487
3141
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:561
3142
  msgctxt "s2member-admin"
3143
- msgid ""
3144
- "Invalid form configuration. Invalid \"rrt\" attribute. Recurring Times "
3145
- "(fixed). When provided, must be numeric."
3146
  msgstr ""
3147
 
3148
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:490
3149
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:564
3150
  msgctxt "s2member-admin"
3151
- msgid ""
3152
- "Invalid form configuration. Invalid \"rrt\" attribute. Recurring Times "
3153
- "(fixed). When provided, must be >= 1."
3154
  msgstr ""
3155
 
3156
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:493
3157
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:567
3158
  msgctxt "s2member-admin"
3159
- msgid ""
3160
- "Invalid form configuration. Invalid \"rr, rrt\" attributes. When \"rrt"
3161
- "\" (Recurring Times) is provided, \"rr\" (Regular Recurring) must be 1."
3162
  msgstr ""
3163
 
3164
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:520
@@ -3182,9 +3192,7 @@ msgstr ""
3182
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:611
3183
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:761
3184
  msgctxt "s2member-admin"
3185
- msgid ""
3186
- "Unable to process. You are an Administrator. Stopping here for security. "
3187
- "Otherwise, an Administrator could lose access."
3188
  msgstr ""
3189
 
3190
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:534
@@ -3238,9 +3246,7 @@ msgstr ""
3238
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:726
3239
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:818
3240
  msgctxt "s2member-front"
3241
- msgid ""
3242
- "Invalid Card Expiration Date. Must be in this format (mm/yyyy). Please try "
3243
- "again."
3244
  msgstr ""
3245
 
3246
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:549
@@ -3250,9 +3256,7 @@ msgstr ""
3250
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:729
3251
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:821
3252
  msgctxt "s2member-front"
3253
- msgid ""
3254
- "Missing Card Verification Code. It's on the back of your Card. 3-4 digits. "
3255
- "Please try again."
3256
  msgstr ""
3257
 
3258
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:552
@@ -3262,9 +3266,7 @@ msgstr ""
3262
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:732
3263
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:824
3264
  msgctxt "s2member-front"
3265
- msgid ""
3266
- "Missing Card Start Date, or Issue #. Required for Maestro/Solo. Please try "
3267
- "again."
3268
  msgstr ""
3269
 
3270
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:555
@@ -3424,17 +3426,13 @@ msgstr ""
3424
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:675
3425
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:755
3426
  msgctxt "s2member-front"
3427
- msgid ""
3428
- "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to modify your billing "
3429
- "plan."
3430
  msgstr ""
3431
 
3432
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:678
3433
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:758
3434
  msgctxt "s2member-front"
3435
- msgid ""
3436
- "You must <a href=\"%s\" rel=\"nofollow\">log in</a> before making this "
3437
- "purchase."
3438
  msgstr ""
3439
 
3440
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:765
@@ -3444,43 +3442,35 @@ msgid "Unknown form submission type. Please contact Support."
3444
  msgstr ""
3445
 
3446
  #: s2member-pro/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:169
3447
- #: s2member-pro/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:286
3448
  msgctxt "s2member-front"
3449
- msgid ""
3450
- "<strong>Thank you.</strong> Your purchase has been approved.<br />&mdash; "
3451
- "Please <a href=\"%s\" rel=\"nofollow\">click here</a> to proceed."
3452
  msgstr ""
3453
 
3454
  #: s2member-pro/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:176
3455
- #: s2member-pro/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:293
3456
  msgctxt "s2member-front"
3457
- msgid ""
3458
- "<strong>Oops.</strong> Unable to generate Access Link. Please contact "
3459
- "Support for assistance."
3460
  msgstr ""
3461
 
3462
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:110
3463
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:115
3464
- #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:119
3465
  msgctxt "s2member-front"
3466
  msgid "<strong>Confirmed.</strong> Your billing information has been updated."
3467
  msgstr ""
3468
 
3469
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:122
3470
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:131
3471
- #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:131
3472
  msgctxt "s2member-front"
3473
- msgid ""
3474
- "<strong>Unable to update.</strong> You have NO recurring fees. Or, your "
3475
- "billing profile is no longer active. Please contact Support if you need "
3476
- "assistance."
3477
  msgstr ""
3478
 
3479
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:131
3480
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:148
3481
  msgctxt "s2member-front"
3482
- msgid ""
3483
- "<strong>Oops.</strong> No Subscr. ID. Please contact Support for assistance."
3484
  msgstr ""
3485
 
3486
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:666
@@ -3558,9 +3548,7 @@ msgstr ""
3558
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:600
3559
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:615
3560
  msgctxt "s2member-front"
3561
- msgid ""
3562
- "<div>Coupon: <strong>%s off</strong>. (Now: <strong>%s, then %s</strong>)</"
3563
- "div>"
3564
  msgstr ""
3565
 
3566
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:923
@@ -3580,8 +3568,7 @@ msgstr ""
3580
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1028
3581
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:657
3582
  msgctxt "s2member-front"
3583
- msgid ""
3584
- "<div>Sorry, your Coupon cannot be applied to this particular purchase.</div>"
3585
  msgstr ""
3586
 
3587
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1032
@@ -3619,44 +3606,34 @@ msgctxt "s2member-front"
3619
  msgid ""
3620
  "ERROR: Unable to verify POST vars. Please contact Support for assistance.\n"
3621
  "\n"
3622
- "This is most likely related to an invalid ClickBank configuration. If you "
3623
- "are the site owner, please check: s2Member -› ClickBank Options."
3624
  msgstr ""
3625
 
3626
  #: s2member-pro/includes/classes/gateways/clickbank/clickbank-utilities.inc.php:168
3627
  msgctxt "s2member-front"
3628
- msgid ""
3629
- "<strong>Reminder:</strong> Purchases at this site will appear on your credit "
3630
- "card or bank statement as: <code>ClickBank</code> or <code>CLKBANK*COM</"
3631
- "code>."
3632
  msgstr ""
3633
 
3634
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:123
3635
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:247
3636
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:263
3637
  msgctxt "s2member-front"
3638
- msgid ""
3639
- "<strong>Unable to cancel at this time.</strong> Your account is pending "
3640
- "other changes. Please try again in 15 minutes."
3641
  msgstr ""
3642
 
3643
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:135
3644
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:128
3645
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:257
3646
  msgctxt "s2member-front"
3647
- msgid ""
3648
- "Please <a href=\"%s\" rel=\"nofollow\">log in at PayPal</a> to cancel your "
3649
- "Subscription."
3650
  msgstr ""
3651
 
3652
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:344
3653
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:667
3654
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:486
3655
- #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:918
3656
  msgctxt "s2member-front"
3657
- msgid ""
3658
- "<strong>Sorry.</strong> Your account is pending other changes. Please try "
3659
- "again in 15 minutes."
3660
  msgstr ""
3661
 
3662
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:378
@@ -3692,20 +3669,17 @@ msgstr ""
3692
 
3693
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:208
3694
  msgctxt "s2member-admin"
3695
- msgid ""
3696
- "PayPal configuration error. Your PayPal API Username is not yet configured."
3697
  msgstr ""
3698
 
3699
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:211
3700
  msgctxt "s2member-admin"
3701
- msgid ""
3702
- "PayPal configuration error. Your PayPal API Password is not yet configured."
3703
  msgstr ""
3704
 
3705
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:214
3706
  msgctxt "s2member-admin"
3707
- msgid ""
3708
- "PayPal configuration error. Your PayPal API Signature is not yet configured."
3709
  msgstr ""
3710
 
3711
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:283
@@ -3715,120 +3689,86 @@ msgstr ""
3715
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:135
3716
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:139
3717
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:79
3718
- #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:135
3719
  msgctxt "s2member-front"
3720
- msgid ""
3721
- "Please <a href=\"%s\" rel=\"nofollow\">log in at PayPal</a> to update your "
3722
- "billing information."
3723
  msgstr ""
3724
 
3725
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:286
3726
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:305
3727
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:127
3728
  msgctxt "s2member-front"
3729
- msgid ""
3730
- "<strong>Unable to update at this time.</strong> Your account is pending "
3731
- "other changes. Please try again in 15 minutes."
3732
  msgstr ""
3733
 
3734
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:382
3735
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:450
3736
  msgctxt "s2member-admin"
3737
- msgid ""
3738
- "Invalid form configuration. Missing \"dg\" attribute. Digital indicator. "
3739
- "Must be numeric [0-1]."
3740
  msgstr ""
3741
 
3742
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:385
3743
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:453
3744
  msgctxt "s2member-admin"
3745
- msgid ""
3746
- "Invalid form configuration. Invalid \"dg\" attribute. Digital indicator. "
3747
- "Must be numeric [0-1]."
3748
  msgstr ""
3749
 
3750
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:388
3751
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:456
3752
  msgctxt "s2member-admin"
3753
- msgid ""
3754
- "Invalid form configuration. Missing \"ns\" attribute. Shipping "
3755
- "configuration. Must be numeric [0-2]."
3756
  msgstr ""
3757
 
3758
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:391
3759
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:459
3760
  msgctxt "s2member-admin"
3761
- msgid ""
3762
- "Invalid form configuration. Invalid \"ns\" attribute. Shipping "
3763
- "configuration. Must be numeric [0-2]."
3764
  msgstr ""
3765
 
3766
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:394
3767
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:462
3768
  msgctxt "s2member-admin"
3769
- msgid ""
3770
- "Invalid form configuration. Invalid \"ns\" attribute. Shipping "
3771
- "configuration. Must be 1 with \"dg\" (digital) items."
3772
  msgstr ""
3773
 
3774
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:397
3775
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:465
3776
  msgctxt "s2member-admin"
3777
- msgid ""
3778
- "Invalid form configuration. Invalid \"lc\" attribute. Locale Code. When "
3779
- "provided, must be a 2 character country code."
3780
  msgstr ""
3781
 
3782
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:409
3783
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:546
3784
  msgctxt "s2member-admin"
3785
- msgid ""
3786
- "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. "
3787
- "Must be <= 10000.00."
3788
  msgstr ""
3789
 
3790
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:486
3791
  msgctxt "s2member-admin"
3792
- msgid ""
3793
- "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When "
3794
- "provided, must be <= 10000.00."
3795
  msgstr ""
3796
 
3797
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:513
3798
  msgctxt "s2member-admin"
3799
- msgid ""
3800
- "Invalid Payflow form configuration. Invalid \"rt, rp, rr\" attributes. "
3801
- "Payflow supports a specific set of recurring intervals. Pro Forms can be "
3802
- "configured to charge: weekly, bi-weekly, monthly, quarterly, semi-yearly or "
3803
- "yearly. Any other combination results in this error. This is a Payflow "
3804
- "limitation."
3805
  msgstr ""
3806
 
3807
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:516
3808
  msgctxt "s2member-admin"
3809
- msgid ""
3810
- "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt"
3811
- "\" (Regular Term) attribute is \"Y\", \"rp\" (Regular Period) > 5, and \"rr"
3812
- "\" is not \"BN\" (Buy Now)."
3813
  msgstr ""
3814
 
3815
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:570
3816
  msgctxt "s2member-admin"
3817
- msgid ""
3818
- "Invalid form configuration. Invalid \"rr, rra\" attributes. When \"rr"
3819
- "\" (Regular Recurring) is 0 or 1, \"rra\" (Recurring Retry Attempts) must be "
3820
- "numeric."
3821
  msgstr ""
3822
 
3823
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:573
3824
  msgctxt "s2member-admin"
3825
- msgid ""
3826
- "Invalid form configuration. Invalid \"rr, rra\" attributes. When \"rr"
3827
- "\" (Regular Recurring) is 0 or 1, \"rra\" (Recurring Retry Attempts) must be "
3828
- ">= 0."
3829
  msgstr ""
3830
 
3831
- #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:141
3832
  msgctxt "s2member-front"
3833
  msgid "<strong>No Subscr. ID.</strong> Please contact Support for assistance."
3834
  msgstr ""
@@ -3888,6 +3828,117 @@ msgctxt "s2member-front"
3888
  msgid "My Profile Summary"
3889
  msgstr ""
3890
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3891
  #: s2member-pro/includes/syscon.inc.php:95
3892
  msgctxt "s2member-front"
3893
  msgid ""
@@ -3899,8 +3950,7 @@ msgid ""
3899
  "Charges today: $%%%%initial%%%%\n"
3900
  "Recurring charges: $%%%%recurring/regular_cycle%%%%\n"
3901
  "\n"
3902
- "Your Username/Password will arrive shortly, in a separate email. If you have "
3903
- "any trouble, please feel free to contact us.\n"
3904
  "\n"
3905
  "Best Regards,\n"
3906
  "%s"
@@ -3932,20 +3982,6 @@ msgctxt "s2member-front"
3932
  msgid "Confirm Cancellation"
3933
  msgstr ""
3934
 
3935
- #: s2member-pro/includes/templates/forms/authnet-cancellation-form.php:36
3936
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:198
3937
- #: s2member-pro/includes/templates/forms/authnet-registration-form.php:81
3938
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:179
3939
- #: s2member-pro/includes/templates/forms/authnet-update-form.php:117
3940
- #: s2member-pro/includes/templates/forms/paypal-cancellation-form.php:36
3941
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:198
3942
- #: s2member-pro/includes/templates/forms/paypal-registration-form.php:81
3943
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:179
3944
- #: s2member-pro/includes/templates/forms/paypal-update-form.php:117
3945
- msgctxt "s2member-front"
3946
- msgid "Submit Form"
3947
- msgstr ""
3948
-
3949
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:21
3950
  #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:21
3951
  #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:21
@@ -3978,14 +4014,6 @@ msgctxt "s2member-front"
3978
  msgid "Apply Coupon"
3979
  msgstr ""
3980
 
3981
- #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:62
3982
- #: s2member-pro/includes/templates/forms/authnet-registration-form.php:30
3983
- #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:62
3984
- #: s2member-pro/includes/templates/forms/paypal-registration-form.php:30
3985
- msgctxt "s2member-front"
3986
- msgid "Create Profile"
3987
- msgstr ""
3988
-
3989
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:84
3990
  #: s2member-pro/includes/templates/forms/authnet-registration-form.php:52
3991
  #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:84
1
+ # Copyright (C) 2014
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: 140328\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
+ "POT-Creation-Date: 2014-03-29 00:07:53+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
17
  msgid "Max failed logins. Please wait %s and try again."
18
  msgstr ""
19
 
20
+ #: s2member/includes/classes/custom-reg-fields.inc.php:339
21
+ #: s2member/includes/classes/custom-reg-fields.inc.php:475
22
  #: s2member/includes/classes/profile-in.inc.php:120
23
  #: s2member/includes/classes/sc-profile-in.inc.php:136
24
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:66
31
  msgid "First Name"
32
  msgstr ""
33
 
34
+ #: s2member/includes/classes/custom-reg-fields.inc.php:351
35
+ #: s2member/includes/classes/custom-reg-fields.inc.php:490
36
  #: s2member/includes/classes/profile-in.inc.php:140
37
  #: s2member/includes/classes/sc-profile-in.inc.php:156
38
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:72
45
  msgid "Last Name"
46
  msgstr ""
47
 
48
+ #: s2member/includes/classes/custom-reg-fields.inc.php:448
49
+ #: s2member/includes/classes/custom-reg-fields.inc.php:453
50
  #: s2member/includes/classes/profile-in.inc.php:233
51
  #: s2member/includes/classes/profile-in.inc.php:239
52
  #: s2member/includes/classes/sc-profile-in.inc.php:249
55
  msgid "Please type your Password twice to confirm."
56
  msgstr ""
57
 
58
+ #: s2member/includes/classes/custom-reg-fields.inc.php:449
59
  msgctxt "s2member-front"
60
  msgid "Password (please type it twice)"
61
  msgstr ""
62
 
63
+ #: s2member/includes/classes/custom-reg-fields.inc.php:457
64
  #: s2member/includes/classes/profile-in.inc.php:243
65
  #: s2member/includes/classes/sc-profile-in.inc.php:259
66
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:94
77
  msgstr ""
78
 
79
  #: s2member/includes/classes/files-in.inc.php:108
80
+ #: s2member/includes/classes/files-in.inc.php:280
81
  msgctxt "s2member-front"
82
+ msgid "<strong>404: Sorry, file not found.</strong> Please contact Support for assistance."
 
 
83
  msgstr ""
84
 
85
  #: s2member/includes/classes/files-in.inc.php:121
86
  msgctxt "s2member-front"
87
+ msgid "<strong>503 (Invalid Key):</strong> Sorry, your access to this file has expired. Please contact Support for assistance."
 
 
88
  msgstr ""
89
 
90
  #: s2member/includes/classes/files-in.inc.php:144
91
  msgctxt "s2member-front"
92
+ msgid "<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <code>s2Member -› General Options -› Membership Options Page</code>."
93
+ msgstr ""
94
+
95
+ #: s2member/includes/classes/files-in.inc.php:157
96
+ msgctxt "s2member-front"
97
+ msgid "<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <code>s2Member -› Download Options -› Basic Download Restrictions</code>."
98
  msgstr ""
99
 
100
+ #: s2member/includes/classes/files-in.inc.php:519
101
  msgctxt "s2member-front"
102
  msgid "<strong>503: Access denied.</strong> Invalid File Download specs."
103
  msgstr ""
104
 
105
+ #: s2member/includes/classes/files-in.inc.php:613
106
  msgctxt "s2member-front"
107
  msgid "Members Only"
108
  msgstr ""
109
 
110
+ #: s2member/includes/classes/files-in.inc.php:619
111
  msgctxt "s2member-front"
112
  msgid "<strong>401:</strong> Sorry, access denied."
113
  msgstr ""
115
  #. translators: In this translation, `%s` may be filled with an English
116
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
117
  #. if you like.
118
+ #: s2member/includes/classes/files-in.inc.php:758
119
  msgctxt "s2member-admin"
120
  msgid "Unable to update existing Amazon S3 Cross-Domain Policy. %s"
121
  msgstr ""
122
 
123
+ #: s2member/includes/classes/files-in.inc.php:761
124
  msgctxt "s2member-admin"
125
+ msgid "Unable to update existing Amazon S3 Cross-Domain Policy. Connection failed."
 
126
  msgstr ""
127
 
128
  #. translators: In this translation, `%s` may be filled with an English
129
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
130
  #. if you like.
131
+ #: s2member/includes/classes/files-in.inc.php:765
132
  msgctxt "s2member-admin"
133
  msgid "Unable to update existing Amazon S3 Bucket Policy. %s"
134
  msgstr ""
135
 
136
+ #: s2member/includes/classes/files-in.inc.php:768
137
  msgctxt "s2member-admin"
138
  msgid "Unable to update existing Amazon S3 Bucket Policy. Connection failed."
139
  msgstr ""
141
  #. translators: In this translation, `%s` may be filled with an English
142
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
143
  #. if you like.
144
+ #: s2member/includes/classes/files-in.inc.php:772
145
  msgctxt "s2member-admin"
146
  msgid "Unable to update existing Amazon S3 Bucket ACLs. %s"
147
  msgstr ""
148
 
149
+ #: s2member/includes/classes/files-in.inc.php:775
150
  msgctxt "s2member-admin"
151
  msgid "Unable to update existing Amazon S3 Bucket ACLs. Connection failed."
152
  msgstr ""
153
 
154
+ #: s2member/includes/classes/files-in.inc.php:778
155
  msgctxt "s2member-admin"
156
+ msgid "Unable to acquire/read existing Amazon S3 Bucket ACLs. Unexpected response."
 
157
  msgstr ""
158
 
159
  #. translators: In this translation, `%s` may be filled with an English
160
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
161
  #. if you like.
162
+ #: s2member/includes/classes/files-in.inc.php:782
163
  msgctxt "s2member-admin"
164
  msgid "Unable to acquire existing Amazon S3 Bucket ACLs. %s"
165
  msgstr ""
166
 
167
+ #: s2member/includes/classes/files-in.inc.php:785
168
  msgctxt "s2member-admin"
169
  msgid "Unable to acquire existing Amazon S3 Bucket ACLs. Connection failed."
170
  msgstr ""
171
 
172
+ #: s2member/includes/classes/files-in.inc.php:788
173
  msgctxt "s2member-admin"
174
+ msgid "Unable to auto-configure existing Amazon S3 Bucket ACLs. Incomplete Amazon S3 configuration options. Missing one of: Amazon S3 Bucket, Access Key, or Secret Key."
 
 
 
175
  msgstr ""
176
 
177
+ #: s2member/includes/classes/files-in.inc.php:888
178
  msgctxt "s2member-admin"
179
+ msgid "Unable to delete existing Amazon CloudFront Downloads Distro. Still in a `pending` state. Please wait 15 minutes, then try again. There is a certain process that s2Member must strictly adhere to when re-configuring your Amazon CloudFront Distros. You may have to tick the auto-configure checkbox again, and re-run s2Member's auto-configuration routine many times, because s2Member will likely run into several `pending` challenges, as it works to completely re-configure your Amazon CloudFront Distros for you. Thanks for your patience. Please wait 15 minutes, then try again."
 
 
 
 
 
 
 
 
180
  msgstr ""
181
 
182
  #. translators: In this translation, `%s` may be filled with an English
183
  #. message, which comes from the Amazon CloudFront API call. Feel free to
184
  #. exclude `%s` if you like.
185
+ #: s2member/includes/classes/files-in.inc.php:895
186
  msgctxt "s2member-admin"
187
  msgid "Unable to delete existing Amazon CloudFront Downloads Distro. %s"
188
  msgstr ""
189
 
190
+ #: s2member/includes/classes/files-in.inc.php:907
191
  msgctxt "s2member-admin"
192
+ msgid "Unable to delete existing Amazon CloudFront Streaming Distro. Still in a `pending` state. Please wait 15 minutes, then try again. There is a certain process that s2Member must strictly adhere to when re-configuring your Amazon CloudFront Distros. You may have to tick the auto-configure checkbox again, and re-run s2Member's auto-configuration routine many times, because s2Member will likely run into several `pending` challenges, as it works to completely re-configure your Amazon CloudFront Distros for you. Thanks for your patience. Please wait 15 minutes, then try again."
 
 
 
 
 
 
 
 
193
  msgstr ""
194
 
195
  #. translators: In this translation, `%s` may be filled with an English
196
  #. message, which comes from the Amazon CloudFront API call. Feel free to
197
  #. exclude `%s` if you like.
198
+ #: s2member/includes/classes/files-in.inc.php:914
199
  msgctxt "s2member-admin"
200
  msgid "Unable to delete existing Amazon CloudFront Streaming Distro. %s"
201
  msgstr ""
203
  #. translators: In this translation, `%s` may be filled with an English
204
  #. message, which comes from the Amazon CloudFront API call. Feel free to
205
  #. exclude `%s` if you like.
206
+ #: s2member/includes/classes/files-in.inc.php:930
207
+ #: s2member/includes/classes/files-in.inc.php:1114
208
  msgctxt "s2member-admin"
209
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. %s"
210
  msgstr ""
212
  #. translators: In this translation, `%s` may be filled with an English
213
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
214
  #. if you like.
215
+ #: s2member/includes/classes/files-in.inc.php:971
216
  msgctxt "s2member-admin"
217
  msgid "Unable to update existing Amazon S3 ACLs. %s"
218
  msgstr ""
219
 
220
+ #: s2member/includes/classes/files-in.inc.php:974
221
  msgctxt "s2member-admin"
222
  msgid "Unable to update existing Amazon S3 ACLs. Connection failed."
223
  msgstr ""
225
  #. translators: In this translation, `%s` may be filled with an English
226
  #. message, which comes from the Amazon CloudFront API call. Feel free to
227
  #. exclude `%s` if you like.
228
+ #: s2member/includes/classes/files-in.inc.php:978
229
+ #: s2member/includes/classes/files-in.inc.php:1401
230
  msgctxt "s2member-admin"
231
  msgid "Unable to create Amazon CloudFront Streaming Distro. %s"
232
  msgstr ""
233
 
234
+ #: s2member/includes/classes/files-in.inc.php:981
235
+ #: s2member/includes/classes/files-in.inc.php:1404
236
  msgctxt "s2member-admin"
237
  msgid "Unable to create Amazon CloudFront Streaming Distro. Connection failed."
238
  msgstr ""
240
  #. translators: In this translation, `%s` may be filled with an English
241
  #. message, which comes from the Amazon CloudFront API call. Feel free to
242
  #. exclude `%s` if you like.
243
+ #: s2member/includes/classes/files-in.inc.php:985
244
+ #: s2member/includes/classes/files-in.inc.php:1378
245
  msgctxt "s2member-admin"
246
  msgid "Unable to create Amazon CloudFront Downloads Distro. %s"
247
  msgstr ""
248
 
249
+ #: s2member/includes/classes/files-in.inc.php:988
250
+ #: s2member/includes/classes/files-in.inc.php:1381
251
  msgctxt "s2member-admin"
252
  msgid "Unable to create Amazon CloudFront Downloads Distro. Connection failed."
253
  msgstr ""
255
  #. translators: In this translation, `%s` may be filled with an English
256
  #. message, which comes from the Amazon CloudFront API call. Feel free to
257
  #. exclude `%s` if you like.
258
+ #: s2member/includes/classes/files-in.inc.php:992
259
+ #: s2member/includes/classes/files-in.inc.php:1159
260
  msgctxt "s2member-admin"
261
  msgid "Unable to create Amazon CloudFront Origin Access Identity. %s"
262
  msgstr ""
263
 
264
+ #: s2member/includes/classes/files-in.inc.php:995
265
+ #: s2member/includes/classes/files-in.inc.php:1162
266
  msgctxt "s2member-admin"
267
+ msgid "Unable to create Amazon CloudFront Origin Access Identity. Connection failed."
 
268
  msgstr ""
269
 
270
+ #: s2member/includes/classes/files-in.inc.php:998
271
  msgctxt "s2member-admin"
272
  msgid "Unable to clear existing Amazon CloudFront Origin Access Identity."
273
  msgstr ""
275
  #. translators: In this translation, `%s` may be filled with an English
276
  #. message, which comes from the Amazon CloudFront API call. Feel free to
277
  #. exclude `%s` if you like.
278
+ #: s2member/includes/classes/files-in.inc.php:1002
279
+ #: s2member/includes/classes/files-in.inc.php:1071
280
  msgctxt "s2member-admin"
281
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. %s"
282
  msgstr ""
283
 
284
+ #: s2member/includes/classes/files-in.inc.php:1005
285
+ #: s2member/includes/classes/files-in.inc.php:1074
286
  msgctxt "s2member-admin"
287
+ msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. Connection failed."
 
 
288
  msgstr ""
289
 
290
+ #: s2member/includes/classes/files-in.inc.php:1008
291
  msgctxt "s2member-admin"
292
  msgid "Unable to clear existing Amazon CloudFront Streaming Distro."
293
  msgstr ""
295
  #. translators: In this translation, `%s` may be filled with an English
296
  #. message, which comes from the Amazon CloudFront API call. Feel free to
297
  #. exclude `%s` if you like.
298
+ #: s2member/includes/classes/files-in.inc.php:1012
299
  msgctxt "s2member-admin"
300
  msgid "Unable to acquire existing Amazon CloudFront Streaming Distro. %s"
301
  msgstr ""
302
 
303
+ #: s2member/includes/classes/files-in.inc.php:1015
304
  msgctxt "s2member-admin"
305
+ msgid "Unable to acquire existing Amazon CloudFront Streaming Distro. Connection failed."
 
 
306
  msgstr ""
307
 
308
+ #: s2member/includes/classes/files-in.inc.php:1018
309
  msgctxt "s2member-admin"
310
  msgid "Unable to clear existing Amazon CloudFront Downloads Distro."
311
  msgstr ""
313
  #. translators: In this translation, `%s` may be filled with an English
314
  #. message, which comes from the Amazon CloudFront API call. Feel free to
315
  #. exclude `%s` if you like.
316
+ #: s2member/includes/classes/files-in.inc.php:1022
317
  msgctxt "s2member-admin"
318
  msgid "Unable to acquire existing Amazon CloudFront Downloads Distro. %s"
319
  msgstr ""
320
 
321
+ #: s2member/includes/classes/files-in.inc.php:1025
322
  msgctxt "s2member-admin"
323
+ msgid "Unable to acquire existing Amazon CloudFront Downloads Distro. Connection failed."
 
 
324
  msgstr ""
325
 
326
+ #: s2member/includes/classes/files-in.inc.php:1028
327
  msgctxt "s2member-admin"
328
+ msgid "Unable to auto-configure Amazon CloudFront Distros. Incomplete Amazon CloudFront configuration options. Missing of one: Amazon CloudFront Private Key-Pair-ID, or Private Key file contents."
 
 
 
329
  msgstr ""
330
 
331
+ #: s2member/includes/classes/files-in.inc.php:1031
332
  msgctxt "s2member-admin"
333
+ msgid "Unable to auto-configure Amazon S3/CloudFront Distros. Incomplete Amazon S3 configuration options. Missing one of: Amazon S3 Bucket, Access Key, or Secret Key. You must provide s2Member with an Amazon S3 configuration before enabling CloudFront."
 
 
 
 
334
  msgstr ""
335
 
336
  #. translators: In this translation, `%s` may be filled with an English
337
  #. message, which comes from the Amazon CloudFront API call. Feel free to
338
  #. exclude `%s` if you like.
339
+ #: s2member/includes/classes/files-in.inc.php:1067
340
  msgctxt "s2member-admin"
341
  msgid "Existing Amazon CloudFront Origin Access Identity NOT found. %s"
342
  msgstr ""
343
 
344
+ #: s2member/includes/classes/files-in.inc.php:1077
345
  msgctxt "s2member-admin"
346
+ msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. Invalid Access ID."
 
 
347
  msgstr ""
348
 
349
+ #: s2member/includes/classes/files-in.inc.php:1117
350
  msgctxt "s2member-admin"
351
+ msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. Connection failed."
 
 
352
  msgstr ""
353
 
354
+ #: s2member/includes/classes/files-in.inc.php:1120
355
  msgctxt "s2member-admin"
356
+ msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. Invalid Access ID, ETag, or XML config."
 
 
357
  msgstr ""
358
 
359
+ #: s2member/includes/classes/files-in.inc.php:1146
360
+ #: s2member/includes/classes/files-in.inc.php:1365
361
+ #: s2member/includes/classes/files-in.inc.php:1388
362
  msgctxt "s2member-admin"
363
  msgid "Created by s2Member, for S3 Bucket: %s."
364
  msgstr ""
365
 
366
+ #: s2member/includes/classes/files-in.inc.php:1155
367
  msgctxt "s2member-admin"
368
+ msgid "Unable to create/read Amazon CloudFront Origin Access Identity. Unexpected response."
 
 
369
  msgstr ""
370
 
371
  #. translators: In this translation, `%s` may be filled with an English
372
  #. message, which comes from the Amazon CloudFront API call. Feel free to
373
  #. exclude `%s` if you like.
374
+ #: s2member/includes/classes/files-in.inc.php:1199
375
  msgctxt "s2member-admin"
376
  msgid "Existing Amazon CloudFront Distro NOT found. %s"
377
  msgstr ""
379
  #. translators: In this translation, `%s` may be filled with an English
380
  #. message, which comes from the Amazon CloudFront API call. Feel free to
381
  #. exclude `%s` if you like.
382
+ #: s2member/includes/classes/files-in.inc.php:1203
383
  msgctxt "s2member-admin"
384
  msgid "Unable to acquire existing Amazon CloudFront Distro. %s"
385
  msgstr ""
386
 
387
+ #: s2member/includes/classes/files-in.inc.php:1206
388
  msgctxt "s2member-admin"
389
  msgid "Unable to acquire existing Amazon CloudFront Distro. Connection failed."
390
  msgstr ""
391
 
392
+ #: s2member/includes/classes/files-in.inc.php:1209
393
  msgctxt "s2member-admin"
394
+ msgid "Unable to acquire existing Amazon CloudFront Distro. Invalid Distro ID and/or Distro type."
 
 
395
  msgstr ""
396
 
397
  #. translators: In this translation, `%s` may be filled with an English
398
  #. message, which comes from the Amazon CloudFront API call. Feel free to
399
  #. exclude `%s` if you like.
400
+ #: s2member/includes/classes/files-in.inc.php:1251
401
+ #: s2member/includes/classes/files-in.inc.php:1324
402
  msgctxt "s2member-admin"
403
  msgid "Unable to disable existing Amazon CloudFront Distro. %s"
404
  msgstr ""
405
 
406
+ #: s2member/includes/classes/files-in.inc.php:1254
407
+ #: s2member/includes/classes/files-in.inc.php:1327
408
  msgctxt "s2member-admin"
409
  msgid "Unable to disable existing Amazon CloudFront Distro. Connection failed."
410
  msgstr ""
411
 
412
+ #: s2member/includes/classes/files-in.inc.php:1257
413
  msgctxt "s2member-admin"
414
+ msgid "Existing Amazon CloudFront Distro cannot be disabled at this time. Still in a `pending` state. Please wait 15 minutes, then try again. There is a certain process that s2Member must strictly adhere to when re-configuring your Amazon CloudFront Distros. You may have to tick the auto-configure checkbox again, and re-run s2Member's auto-configuration routine many times, because s2Member will likely run into several `pending` challenges, as it works to completely re-configure your Amazon CloudFront Distros for you. Thanks for your patience. Please wait 15 minutes, then try again."
 
 
 
 
 
 
 
 
415
  msgstr ""
416
 
417
+ #: s2member/includes/classes/files-in.inc.php:1263
418
  msgctxt "s2member-admin"
419
+ msgid "Unable to disable existing Amazon CloudFront Distro. Invalid Distro ID, ETag, or XML config."
 
 
420
  msgstr ""
421
 
422
  #. translators: In this translation, `%s` may be filled with an English
423
  #. message, which comes from the Amazon CloudFront API call. Feel free to
424
  #. exclude `%s` if you like.
425
+ #: s2member/includes/classes/files-in.inc.php:1306
426
  msgctxt "s2member-admin"
427
  msgid "Unable to delete existing Amazon CloudFront Distro. %s"
428
  msgstr ""
429
 
430
+ #: s2member/includes/classes/files-in.inc.php:1309
431
  msgctxt "s2member-admin"
432
  msgid "Unable to delete existing Amazon CloudFront Distro. Connection failed."
433
  msgstr ""
435
  #. translators: In this translation, `%s` may be filled with an English
436
  #. message, which comes from the Amazon CloudFront API call. Feel free to
437
  #. exclude `%s` if you like.
438
+ #: s2member/includes/classes/files-in.inc.php:1313
439
  msgctxt "s2member-admin"
440
+ msgid "Existing Amazon CloudFront Distro cannot be deleted at this time. Still in a `pending` state after having been disabled by s2Member. Please wait 15 minutes, then try again. There is a certain process that s2Member must strictly adhere to when re-configuring your Amazon CloudFront Distros. You may have to tick the auto-configure checkbox again, and re-run s2Member's auto-configuration routine many times, because s2Member will likely run into several `pending` challenges, as it works to completely re-configure your Amazon CloudFront Distros for you. Thanks for your patience. Please wait 15 minutes, then try again."
 
 
 
 
 
 
 
 
 
441
  msgstr ""
442
 
443
  #. translators: In this translation, `%s` may be filled with an English
444
  #. message, which comes from the Amazon CloudFront API call. Feel free to
445
  #. exclude `%s` if you like.
446
+ #: s2member/includes/classes/files-in.inc.php:1317
447
  msgctxt "s2member-admin"
448
  msgid "Unable to check status of existing Amazon CloudFront Distro. %s"
449
  msgstr ""
450
 
451
+ #: s2member/includes/classes/files-in.inc.php:1320
452
  msgctxt "s2member-admin"
453
+ msgid "Unable to check status of existing Amazon CloudFront Distro. Connection failed."
 
 
454
  msgstr ""
455
 
456
+ #: s2member/includes/classes/files-in.inc.php:1330
457
  msgctxt "s2member-admin"
458
+ msgid "Existing Amazon CloudFront Distro cannot be deleted at this time. Still in a `pending` state. Please wait 15 minutes, then try again. There is a certain process that s2Member must strictly adhere to when re-configuring your Amazon CloudFront Distros. You may have to tick the auto-configure checkbox again, and re-run s2Member's auto-configuration routine many times, because s2Member will likely run into several `pending` challenges, as it works to completely re-configure your Amazon CloudFront Distros for you. Thanks for your patience. Please wait 15 minutes, then try again."
 
 
 
 
 
 
 
 
459
  msgstr ""
460
 
461
+ #: s2member/includes/classes/files-in.inc.php:1333
462
  msgctxt "s2member-admin"
463
+ msgid "Unable to delete existing Amazon CloudFront Distro. Invalid Distro ID or ETag."
 
 
464
  msgstr ""
465
 
466
+ #: s2member/includes/classes/files-in.inc.php:1374
467
  msgctxt "s2member-admin"
468
+ msgid "Unable to create/read Amazon CloudFront Downloads Distro. Unexpected response."
 
 
469
  msgstr ""
470
 
471
+ #: s2member/includes/classes/files-in.inc.php:1397
472
  msgctxt "s2member-admin"
473
+ msgid "Unable to create/read Amazon CloudFront Streaming Distro. Unexpected response."
 
 
474
  msgstr ""
475
 
476
+ #: s2member/includes/classes/files-in.inc.php:1408
477
  msgctxt "s2member-admin"
478
  msgid "Unable to create Amazon CloudFront Distro. Invalid Distro type."
479
  msgstr ""
485
 
486
  #: s2member/includes/classes/login-checks.inc.php:76
487
  msgctxt "s2member-front"
488
+ msgid "<strong>ERROR</strong>: Max simultaneous logins for username: %1$s. Please wait %2$s and try again."
 
 
489
  msgstr ""
490
 
491
  #: s2member/includes/classes/paypal-return-in-no-tx-data.inc.php:66
492
  #: s2member/includes/classes/paypal-return-in-proxy-ty-email.inc.php:64
493
  msgctxt "s2member-front"
494
+ msgid "<strong>Thank you! (you MUST check your email before proceeding).</strong><br /><br />* Note: It can take <em>(up to 15 minutes)</em> for Email Confirmation with important details. If you don't receive email confirmation in the next 15 minutes, please contact Support."
 
 
 
 
495
  msgstr ""
496
 
497
  #: s2member/includes/classes/paypal-return-in-no-tx-data.inc.php:66
498
  #: s2member/includes/classes/paypal-return-in-proxy-ty-email.inc.php:64
499
  msgctxt "s2member-front"
500
+ msgid "<strong>** Sandbox Mode **</strong> You may NOT receive this Email in Sandbox Mode. Sandbox addresses are usually bogus (for testing)."
 
 
501
  msgstr ""
502
 
503
  #: s2member/includes/classes/paypal-return-in-no-tx-data.inc.php:67
504
  #: s2member/includes/classes/paypal-return-in-proxy-ty-email.inc.php:65
505
+ #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:204
506
+ #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:215
507
+ #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:226
508
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:251
509
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:262
510
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:372
511
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:156
512
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:167
513
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:178
514
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:189
515
  #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:120
516
  #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:131
517
+ #: s2member/includes/classes/paypal-return-in.inc.php:95
518
+ #: s2member/includes/classes/paypal-return-in.inc.php:112
519
+ #: s2member/includes/classes/paypal-return-in.inc.php:138
520
  msgctxt "s2member-front"
521
  msgid "Back To Home Page"
522
  msgstr ""
523
 
524
  #: s2member/includes/classes/paypal-return-in-proxy-x-preview.inc.php:64
525
  msgctxt "s2member-front"
526
+ msgid "<strong>Thank you! (this is a preview, no action necessary).</strong><br /><br />* Note: each of your Customers are returned back to your site immediately after they complete checkout. This Return Page displays a message and instructions for the Customer. s2Member may change the message and instructions dynamically, based on what the Customer is actually doing <em>(i.e. based on the type of transaction that is taking place)</em>.<br /><br /><em>* With <a href=\"%s\" target=\"_blank\">s2Member Pro</a> installed, it is possible to customize this Return Page in various ways.</em>"
 
 
 
 
 
 
 
 
527
  msgstr ""
528
 
529
  #: s2member/includes/classes/paypal-return-in-proxy-x-preview.inc.php:65
532
  msgid "Continue (Click Here)"
533
  msgstr ""
534
 
535
+ #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:192
536
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:239
537
  msgctxt "s2member-front"
538
  msgid "Thank you! You've been updated to:"
539
  msgstr ""
540
 
541
+ #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:193
542
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:240
543
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:145
544
  msgctxt "s2member-front"
545
  msgid "Please Log Back In (Click Here)"
546
  msgstr ""
547
 
548
+ #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:203
549
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:250
550
  msgctxt "s2member-front"
551
+ msgid "<strong>ERROR:</strong> Unable to modify Subscription.<br />Please contact Support for assistance.<br /><br />The existing User ID is associated with an Administrator. Stopping here. Otherwise, an Administrator could lose access. Please make sure that you are NOT logged in as an Administrator while testing."
 
 
 
 
 
552
  msgstr ""
553
 
554
+ #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:214
555
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:261
556
  msgctxt "s2member-front"
557
+ msgid "<strong>ERROR:</strong> Unable to modify Subscription.<br />Please contact Support for assistance.<br /><br />Could not get the existing User ID from the DB."
 
 
 
558
  msgstr ""
559
 
560
+ #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:225
561
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:371
562
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:188
563
  #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:130
564
  msgctxt "s2member-front"
565
+ msgid "<strong>Page Expired:</strong> Duplicate Return-Data.<br />Please contact Support if you need any assistance."
 
 
566
  msgstr ""
567
 
568
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:332
569
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:355
570
  msgctxt "s2member-front"
571
+ msgid "<strong>Thank you! Your account has been approved.<br />The next step is to Register a Username for immediate access.</strong>"
 
 
572
  msgstr ""
573
 
574
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:333
575
+ #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:356
576
  msgctxt "s2member-front"
577
  msgid "Please Register Now (Click Here)"
578
  msgstr ""
584
 
585
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:155
586
  msgctxt "s2member-front"
587
+ msgid "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact Support for assistance.<br /><br />The existing User ID is associated with an Administrator. Stopping here. Otherwise, an Administrator could lose access. Please make sure that you are NOT logged in as an Administrator while testing."
 
 
 
 
 
588
  msgstr ""
589
 
590
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:166
591
  msgctxt "s2member-front"
592
+ msgid "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact Support for assistance.<br /><br />Could not get the existing User ID from the DB."
 
 
 
593
  msgstr ""
594
 
595
  #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:177
596
  msgctxt "s2member-front"
597
+ msgid "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact Support for assistance.<br /><br />Missing User/Member details."
 
 
598
  msgstr ""
599
 
600
  #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:108
604
 
605
  #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:119
606
  msgctxt "s2member-front"
607
+ msgid "<strong>ERROR:</strong> Unable to generate Access Link.<br />Please contact Support for assistance."
 
 
608
  msgstr ""
609
 
610
+ #: s2member/includes/classes/paypal-return-in.inc.php:94
611
  msgctxt "s2member-front"
612
+ msgid "<strong>ERROR:</strong> Unexpected <code>txn_type/status</code>.<br />The <code>txn_type/status</code> did not meet requirements.<br />Please contact Support for assistance."
 
 
 
613
  msgstr ""
614
 
615
+ #: s2member/includes/classes/paypal-return-in.inc.php:111
616
  msgctxt "s2member-front"
617
+ msgid "<strong>ERROR:</strong> Unable to verify <code>$_SERVER[\"HTTP_HOST\"]</code>.<br />Please contact Support for assistance.<br /><br />If you are the site owner, please check the <code>custom</code> value in your Button Code. It MUST start with your domain name."
 
 
 
 
618
  msgstr ""
619
 
620
+ #: s2member/includes/classes/paypal-return-in.inc.php:137
621
  msgctxt "s2member-front"
622
+ msgid "<strong>ERROR:</strong> Unable to verify <code>$_POST</code> vars.<br />Please contact Support for assistance.<br /><br />This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility. If you are the site owner, and you're absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure <code>$_POST</code> variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.<br /><br />s2Member uses the <code>WP_Http</code> class for remote connections; which will try to use <code>cURL</code> first, and then fall back on the <code>FOPEN</code> method when <code>cURL</code> is not available. On a Windows server, you may have to disable your <code>cURL</code> extension; and instead, set <code>allow_url_fopen = yes</code> in your php.ini file. The <code>cURL</code> extension (usually) does NOT support SSL connections on a Windows server.<br /><br />Please see <a href=\"http://www.s2member.com/forums/topic/ideal-server-configuration-for-s2member/\" target=\"_blank\">this thread</a> for details regarding the ideal server configuration for s2Member."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
623
  msgstr ""
624
 
625
  #. translators: Exclude `%2$s` and `%3$s`. These are English details returned
643
  #: s2member/includes/classes/paypal-utilities.inc.php:232
644
  #: s2member/includes/classes/paypal-utilities.inc.php:238
645
  msgctxt "s2member-front"
646
+ msgid "Error #%s. Transaction declined. Please use an alternate funding source."
 
647
  msgstr ""
648
 
649
  #: s2member/includes/classes/paypal-utilities.inc.php:235
675
 
676
  #: s2member/includes/classes/paypal-utilities.inc.php:369
677
  msgctxt "s2member-front"
678
+ msgid " Please contact PayPal Merchant Technical Support (www.paypal.com/mts) and request `Recurring Billing` service, and also ask to have `Reference Transactions` enabled for Recurring Billing via Express Checkout."
 
 
 
679
  msgstr ""
680
 
681
  #: s2member/includes/classes/profile-in.inc.php:78
693
 
694
  #: s2member/includes/classes/profile-in.inc.php:98
695
  #: s2member/includes/classes/sc-profile-in.inc.php:114
696
+ #: s2member-pro/includes/separates/gateways/google/google-min.js:1
697
+ #: s2member-pro/includes/separates/gateways/google/google.js:39
698
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:78
699
  #: s2member-pro/includes/templates/forms/authnet-registration-form.php:46
700
  #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:78
746
  #: s2member/includes/classes/register-in.inc.php:48
747
  #: s2member/includes/classes/sp-access.inc.php:132
748
  msgctxt "s2member-front"
749
+ msgid "<strong>Your Link Expired:</strong><br />Please contact Support if you need assistance."
 
 
750
  msgstr ""
751
 
752
  #: s2member/includes/classes/registrations.inc.php:450
753
  msgctxt "s2member-front"
754
+ msgid "s2Member security violation. You attempted to POST administrative variables that will NOT be trusted in a NON-administrative zone!"
 
 
755
  msgstr ""
756
 
757
  #: s2member/includes/classes/return-templates.inc.php:50
771
 
772
  #: s2member/includes/classes/return-templates.inc.php:77
773
  msgctxt "s2member-front"
774
+ msgid "If you need assistance, please <a href=\"%s\" target=\"_blank\">contact support</a>."
 
 
775
  msgstr ""
776
 
777
  #: s2member/includes/classes/sc-paypal-button-e.inc.php:77
783
  #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:34
784
  #: s2member/includes/templates/buttons/paypal-checkout-button.php:46
785
  #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:34
786
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
787
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:270
788
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:562
789
  msgctxt "s2member-front paypal-button-lang-code"
790
  msgid "en_US"
791
  msgstr ""
831
 
832
  #: s2member/includes/classes/translations.inc.php:123
833
  msgctxt "s2member-front"
834
+ msgid "Your account is now active. <a href=\"%1$s\">Visit site</a> or <a href=\"%2$s\">Log in</a>."
 
 
835
  msgstr ""
836
 
837
  #: s2member/includes/classes/translations.inc.php:144
838
  #: s2member/includes/classes/translations.inc.php:166
839
  msgctxt "s2member-front"
840
+ msgid "By filling out the form below, you can <strong>add a site to your account</strong>."
 
 
841
  msgstr ""
842
 
843
  #: s2member/includes/classes/translations.inc.php:144
1084
  msgstr[0] ""
1085
  msgstr[1] ""
1086
 
1087
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:32
1088
+ msgctxt "s2member-front"
1089
+ msgid "— Confirm File Download —"
1090
+ msgstr ""
1091
+
1092
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:33
1093
+ msgctxt "s2member-front"
1094
+ msgid "You`ve downloaded %s protected %s in the last %s."
1095
+ msgstr ""
1096
+
1097
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:33
1098
+ msgctxt "s2member-front"
1099
+ msgid "file"
1100
+ msgstr ""
1101
+
1102
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:33
1103
+ msgctxt "s2member-front"
1104
+ msgid "files"
1105
+ msgstr ""
1106
+
1107
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:33
1108
+ msgctxt "s2member-front"
1109
+ msgid "24 hours"
1110
+ msgstr ""
1111
+
1112
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:33
1113
+ msgctxt "s2member-front"
1114
+ msgid "%s days"
1115
+ msgstr ""
1116
+
1117
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:34
1118
+ msgctxt "s2member-front"
1119
+ msgid "You`re entitled to UNLIMITED downloads though (so, no worries)."
1120
+ msgstr ""
1121
+
1122
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:34
1123
+ msgctxt "s2member-front"
1124
+ msgid "You`re entitled to %s unique %s %s."
1125
+ msgstr ""
1126
+
1127
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:34
1128
+ msgctxt "s2member-front"
1129
+ msgid "download"
1130
+ msgstr ""
1131
+
1132
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:34
1133
+ msgctxt "s2member-front"
1134
+ msgid "downloads"
1135
+ msgstr ""
1136
+
1137
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:34
1138
+ msgctxt "s2member-front"
1139
+ msgid "each day"
1140
+ msgstr ""
1141
+
1142
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:34
1143
+ msgctxt "s2member-front"
1144
+ msgid "every %s-day period"
1145
+ msgstr ""
1146
+
1147
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:80
1148
+ #: s2member/includes/s2member.js:87 s2member/includes/s2member.js:94
1149
+ #: s2member/includes/s2member.js:130 s2member/includes/s2member.js:185
1150
+ #: s2member/includes/s2member.js:192 s2member/includes/s2member.js:199
1151
+ #: s2member/includes/s2member.js:231 s2member/includes/s2member.js:263
1152
+ #: s2member/includes/s2member.js:290
1153
+ #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1154
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:66
1155
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:73
1156
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:160
1157
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:167
1158
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:232
1159
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:239
1160
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:246
1161
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:253
1162
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:497
1163
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:504
1164
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:769
1165
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:776
1166
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:783
1167
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:790
1168
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1169
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:66
1170
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:73
1171
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:160
1172
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:167
1173
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:232
1174
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:239
1175
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:246
1176
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:253
1177
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:537
1178
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:544
1179
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:857
1180
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:864
1181
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:871
1182
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:878
1183
+ msgctxt "s2member-front"
1184
+ msgid "— Oops, you missed something: —"
1185
+ msgstr ""
1186
+
1187
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:87
1188
+ #: s2member/includes/s2member.js:192
1189
+ #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1190
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:239
1191
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:776
1192
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1193
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:239
1194
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:864
1195
+ msgctxt "s2member-front"
1196
+ msgid "Passwords do not match up. Please try again."
1197
+ msgstr ""
1198
+
1199
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:94
1200
+ #: s2member/includes/s2member.js:199
1201
+ #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1202
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:246
1203
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:783
1204
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1205
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:246
1206
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:871
1207
+ msgctxt "s2member-front"
1208
+ msgid "Password MUST be at least 6 characters. Please try again."
1209
+ msgstr ""
1210
+
1211
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:330
1212
+ msgctxt "s2member-front"
1213
+ msgid "Strength indicator"
1214
+ msgstr ""
1215
+
1216
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:331
1217
+ msgctxt "s2member-front"
1218
+ msgid "Very weak"
1219
+ msgstr ""
1220
+
1221
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:332
1222
+ msgctxt "s2member-front"
1223
+ msgid "Weak"
1224
+ msgstr ""
1225
+
1226
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:333
1227
+ msgctxt "s2member-front"
1228
+ msgid "Medium"
1229
+ msgstr ""
1230
+
1231
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:334
1232
+ msgctxt "s2member-front"
1233
+ msgid "Strong"
1234
+ msgstr ""
1235
+
1236
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:335
1237
+ msgctxt "s2member-front"
1238
+ msgid "Mismatch"
1239
+ msgstr ""
1240
+
1241
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:364
1242
+ msgctxt "s2member-front"
1243
+ msgid "Please check at least one of the boxes."
1244
+ msgstr ""
1245
+
1246
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:369
1247
+ msgctxt "s2member-front"
1248
+ msgid "Required. This box must be checked."
1249
+ msgstr ""
1250
+
1251
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:375
1252
+ msgctxt "s2member-front"
1253
+ msgid "Please select one of the options."
1254
+ msgstr ""
1255
+
1256
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:380
1257
+ msgctxt "s2member-front"
1258
+ msgid "Please select at least one of the options."
1259
+ msgstr ""
1260
+
1261
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:384
1262
+ msgctxt "s2member-front"
1263
+ msgid "This is a required field, please try again."
1264
+ msgstr ""
1265
+
1266
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:390
1267
+ msgctxt "s2member-front"
1268
+ msgid "Must be numeric (with or without decimals, commas allowed)."
1269
+ msgstr ""
1270
+
1271
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:394
1272
+ msgctxt "s2member-front"
1273
+ msgid "Must be numeric (with or without decimals, no commas)."
1274
+ msgstr ""
1275
+
1276
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:398
1277
+ msgctxt "s2member-front"
1278
+ msgid "Must be an integer (a whole number, without any decimals)."
1279
+ msgstr ""
1280
+
1281
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:402
1282
+ msgctxt "s2member-front"
1283
+ msgid "Must be an integer > 0 (whole number, no decimals, greater than 0)."
1284
+ msgstr ""
1285
+
1286
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:406
1287
+ msgctxt "s2member-front"
1288
+ msgid "Must be a float (floating point number, decimals required)."
1289
+ msgstr ""
1290
+
1291
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:410
1292
+ msgctxt "s2member-front"
1293
+ msgid "Must be a float > 0 (floating point number, decimals required, greater than 0)."
1294
+ msgstr ""
1295
+
1296
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:414
1297
+ msgctxt "s2member-front"
1298
+ msgid "Must be a date (required date format: dd/mm/yyyy)."
1299
+ msgstr ""
1300
+
1301
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:418
1302
+ msgctxt "s2member-front"
1303
+ msgid "Must be a valid email address."
1304
+ msgstr ""
1305
+
1306
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:422
1307
+ msgctxt "s2member-front"
1308
+ msgid ""
1309
+ "Please use a personal email address.\n"
1310
+ "Addresses like <%s@> are problematic."
1311
+ msgstr ""
1312
+
1313
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:426
1314
+ msgctxt "s2member-front"
1315
+ msgid "Must be a full URL (starting with http or https)."
1316
+ msgstr ""
1317
+
1318
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:430
1319
+ msgctxt "s2member-front"
1320
+ msgid "Must be a domain name (domain name only, without http)."
1321
+ msgstr ""
1322
+
1323
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:434
1324
+ msgctxt "s2member-front"
1325
+ msgid "Must be a phone # (10 digits w/possible hyphens,spaces,brackets)."
1326
+ msgstr ""
1327
+
1328
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:438
1329
+ msgctxt "s2member-front"
1330
+ msgid "Must be a US zipcode (5-9 digits w/possible hyphen)."
1331
+ msgstr ""
1332
+
1333
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:442
1334
+ msgctxt "s2member-front"
1335
+ msgid "Must be a Canadian zipcode (6 alpha-numerics w/possible space)."
1336
+ msgstr ""
1337
+
1338
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:446
1339
+ msgctxt "s2member-front"
1340
+ msgid "Must be a zipcode (either a US or Canadian zipcode)."
1341
+ msgstr ""
1342
+
1343
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:450
1344
+ msgctxt "s2member-front"
1345
+ msgid "Please use alphanumerics, spaces & punctuation only."
1346
+ msgstr ""
1347
+
1348
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:454
1349
+ msgctxt "s2member-front"
1350
+ msgid "Please use alphanumerics & spaces only."
1351
+ msgstr ""
1352
+
1353
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:458
1354
+ msgctxt "s2member-front"
1355
+ msgid "Please use alphanumerics & punctuation only (no spaces)."
1356
+ msgstr ""
1357
+
1358
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:462
1359
+ msgctxt "s2member-front"
1360
+ msgid "Please use alphanumerics only (no spaces/punctuation)."
1361
+ msgstr ""
1362
+
1363
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:466
1364
+ msgctxt "s2member-front"
1365
+ msgid "Please use alphabetics only (no digits/spaces/punctuation)."
1366
+ msgstr ""
1367
+
1368
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:470
1369
+ msgctxt "s2member-front"
1370
+ msgid "Please use numeric digits only."
1371
+ msgstr ""
1372
+
1373
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1374
+ msgctxt "s2member-front"
1375
+ msgid "Must be exactly %s %s."
1376
+ msgstr ""
1377
+
1378
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1379
+ #: s2member/includes/s2member.js:480
1380
+ msgctxt "s2member-front"
1381
+ msgid "digit"
1382
+ msgstr ""
1383
+
1384
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1385
+ #: s2member/includes/s2member.js:480
1386
+ msgctxt "s2member-front"
1387
+ msgid "digits"
1388
+ msgstr ""
1389
+
1390
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1391
+ #: s2member/includes/s2member.js:480
1392
+ msgctxt "s2member-front"
1393
+ msgid "character"
1394
+ msgstr ""
1395
+
1396
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:477
1397
+ #: s2member/includes/s2member.js:480
1398
+ msgctxt "s2member-front"
1399
+ msgid "characters"
1400
+ msgstr ""
1401
+
1402
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:480
1403
+ msgctxt "s2member-front"
1404
+ msgid "Must be at least %s %s."
1405
+ msgstr ""
1406
+
1407
+ #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:533
1408
+ msgctxt "s2member-front"
1409
+ msgid "Processing"
1410
+ msgstr ""
1411
+
1412
  #: s2member/includes/syscon.inc.php:84
1413
  msgctxt "s2member-front recaptcha-lang-code"
1414
  msgid "en"
1415
  msgstr ""
1416
 
1417
+ #: s2member/includes/syscon.inc.php:153
1418
  msgctxt "s2member-front"
1419
  msgid "Yes, I want to receive updates via email."
1420
  msgstr ""
1421
 
1422
+ #: s2member/includes/syscon.inc.php:208
1423
  msgctxt "s2member-front"
1424
  msgid "[%s] Username/Password"
1425
  msgstr ""
1426
 
1427
+ #: s2member/includes/syscon.inc.php:209
1428
  msgctxt "s2member-front"
1429
  msgid ""
1430
  "Your Username/Password for:\n"
1435
  "%%%%wp_login_url%%%%"
1436
  msgstr ""
1437
 
1438
+ #: s2member/includes/syscon.inc.php:212
1439
  msgctxt "s2member-front"
1440
  msgid "[%s] New User Registration"
1441
  msgstr ""
1442
 
1443
+ #: s2member/includes/syscon.inc.php:213
1444
  msgctxt "s2member-front"
1445
  msgid ""
1446
  "New User Registration on your site:\n"
1452
  "IP Address: %%%%user_ip%%%%"
1453
  msgstr ""
1454
 
1455
+ #: s2member/includes/syscon.inc.php:235
1456
  #: s2member-pro/includes/syscon.inc.php:94
1457
  msgctxt "s2member-front"
1458
  msgid "Congratulations! (your membership has been approved)"
1459
  msgstr ""
1460
 
1461
+ #: s2member/includes/syscon.inc.php:236
1462
  msgctxt "s2member-front"
1463
  msgid ""
1464
  "Thanks %%%%first_name%%%%! Your membership has been approved.\n"
1474
  "%s"
1475
  msgstr ""
1476
 
1477
+ #: s2member/includes/syscon.inc.php:239 s2member/includes/syscon.inc.php:243
1478
  msgctxt "s2member-front"
1479
  msgid "Thank you! Your account has been updated."
1480
  msgstr ""
1481
 
1482
+ #: s2member/includes/syscon.inc.php:240 s2member/includes/syscon.inc.php:244
1483
  msgctxt "s2member-front"
1484
  msgid ""
1485
+ "Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n"
 
1486
  "\n"
1487
  "If you have any trouble, please feel free to contact us.\n"
1488
  "\n"
1490
  "%s"
1491
  msgstr ""
1492
 
1493
+ #: s2member/includes/syscon.inc.php:247
1494
  #: s2member-pro/includes/syscon.inc.php:98
1495
  msgctxt "s2member-front"
1496
  msgid "Thank You! (instructions for access)"
1497
  msgstr ""
1498
 
1499
+ #: s2member/includes/syscon.inc.php:248
1500
  msgctxt "s2member-front"
1501
  msgid ""
1502
  "Thanks %%%%first_name%%%%!\n"
1513
  "%s"
1514
  msgstr ""
1515
 
1516
+ #: s2member/includes/syscon.inc.php:282
1517
  msgctxt "s2member-front"
1518
  msgid "Free Subscriber"
1519
  msgstr ""
1520
 
1521
+ #: s2member/includes/syscon.inc.php:282
1522
  msgctxt "s2member-front"
1523
  msgid "Bronze Member"
1524
  msgstr ""
1525
 
1526
+ #: s2member/includes/syscon.inc.php:282
1527
  msgctxt "s2member-front"
1528
  msgid "Silver Member"
1529
  msgstr ""
1530
 
1531
+ #: s2member/includes/syscon.inc.php:282
1532
  msgctxt "s2member-front"
1533
  msgid "Gold Member"
1534
  msgstr ""
1535
 
1536
+ #: s2member/includes/syscon.inc.php:282
1537
  msgctxt "s2member-front"
1538
  msgid "Platinum Member"
1539
  msgstr ""
1540
 
1541
+ #: s2member/includes/syscon.inc.php:282
1542
  msgctxt "s2member-front"
1543
  msgid "Level %s Member"
1544
  msgstr ""
1639
 
1640
  #: s2member/includes/templates/errors/ip-restrictions.php:13
1641
  msgctxt "s2member-front"
1642
+ msgid "<strong>503: Service Temporarily Unavailable</strong><br />Too many IP addresses accessing one secure area<em>!</em><br />Please contact Support if you need assistance."
 
 
 
1643
  msgstr ""
1644
 
1645
  #: s2member/includes/templates/options/paypal-currencies.php:6
2430
  msgid ""
2431
  "ERROR: Unable to verify POST vars. Please contact Support for assistance.\n"
2432
  "\n"
2433
+ "This is most likely related to an invalid AliPay configuration. If you are the site owner, please check: s2Member -› AliPay Options."
 
2434
  msgstr ""
2435
 
2436
  #: s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:116
2437
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:115
2438
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:113
2439
  msgctxt "s2member-front"
2440
+ msgid "<strong>Billing termination confirmed.</strong> Your account has been cancelled."
 
 
2441
  msgstr ""
2442
 
2443
  #: s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:124
2458
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:155
2459
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:148
2460
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:153
2461
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:145
2462
  msgctxt "s2member-front"
2463
  msgid "You're <strong>NOT</strong> logged in."
2464
  msgstr ""
2465
 
2466
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:288
2467
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:626
2468
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:339
2469
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:662
2470
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:409
2471
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:747
2472
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:474
2473
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:911
2474
  msgctxt "s2member-front"
2475
+ msgid "<strong>Thank you.</strong> Your account has been updated.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">log back in</a> now."
 
 
2476
  msgstr ""
2477
 
2478
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:492
2479
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:743
2480
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:499
2481
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:815
2482
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:586
2483
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:899
2484
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:742
2485
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1065
2486
  msgctxt "s2member-front"
2487
+ msgid "<strong>Thank you.</strong> Your account has been approved.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">login</a>."
 
 
2488
  msgstr ""
2489
 
2490
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:501
2491
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:525
2492
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:752
2493
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:773
2494
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:124
2495
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:141
2496
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:508
2497
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:529
2498
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:824
2499
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:845
2500
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:595
2501
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:616
2502
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:908
2503
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:929
2504
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:751
2505
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:772
2506
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1074
2507
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1095
2508
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:124
2509
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:141
2510
+ msgctxt "s2member-front"
2511
+ msgid "<strong>Oops.</strong> A slight problem. Please contact Support for assistance."
 
 
2512
  msgstr ""
2513
 
2514
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:516
2515
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:764
2516
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:520
2517
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:836
2518
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:607
2519
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:920
2520
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:763
2521
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1086
2522
  msgctxt "s2member-front"
2523
+ msgid "<strong>Thank you.</strong> Your account has been approved.<br />&mdash; You'll receive an email momentarily."
 
 
2524
  msgstr ""
2525
 
2526
  #: s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:784
2527
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:856
2528
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:940
2529
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1106
2530
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:136
2531
  msgctxt "s2member-front"
2532
  msgid "<strong>Unknown error.</strong> Please contact Support for assistance."
2533
  msgstr ""
2714
  msgid "12 December"
2715
  msgstr ""
2716
 
2717
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:117
2718
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:117
2719
  msgctxt "s2member-front"
2720
+ msgid "<strong>Thank you.</strong> Please <a href=\"%s\" rel=\"nofollow\">login</a>."
 
2721
  msgstr ""
2722
 
2723
+ #: s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:134
2724
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:134
2725
  msgctxt "s2member-front"
2726
  msgid "<strong>Thank you.</strong> You'll receive an email momentarily."
2727
  msgstr ""
2728
 
2729
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:205
2730
  msgctxt "s2member-admin"
2731
+ msgid "Authorize.Net configuration error. Please configure your Authorize.Net API Login ID."
 
 
2732
  msgstr ""
2733
 
2734
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:208
2735
  msgctxt "s2member-admin"
2736
+ msgid "Authorize.Net configuration error. Your Authorize.Net API Transaction Key is not yet configured."
 
 
2737
  msgstr ""
2738
 
2739
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:211
2740
  msgctxt "s2member-admin"
2741
+ msgid "Authorize.Net configuration error. Your Authorize.Net Secret MD5 Hash is not yet configured."
 
 
2742
  msgstr ""
2743
 
2744
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:233
2746
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:236
2747
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:597
2748
  msgctxt "s2member-front"
2749
+ msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to cancel your account."
 
2750
  msgstr ""
2751
 
2752
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:236
2770
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:272
2771
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:608
2772
  msgctxt "s2member-front"
2773
+ msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to update your billing information."
 
 
2774
  msgstr ""
2775
 
2776
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:253
2786
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:302
2787
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:308
2788
  msgctxt "s2member-front"
2789
+ msgid "Nothing to update. You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance."
 
 
2790
  msgstr ""
2791
 
2792
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:267
2793
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:314
2794
  msgctxt "s2member-admin"
2795
+ msgid "Invalid form configuration. Missing \"level\" attribute. Membership Level. Must be numeric [0-%s]."
 
 
2796
  msgstr ""
2797
 
2798
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:270
2799
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:317
2800
  msgctxt "s2member-admin"
2801
+ msgid "Invalid form configuration. Invalid \"level\" attribute. Membership Level. Must be numeric [0-%s]."
 
 
2802
  msgstr ""
2803
 
2804
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:273
2806
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:320
2807
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:426
2808
  msgctxt "s2member-admin"
2809
+ msgid "Invalid form configuration. Invalid \"ccaps\" attribute. Custom Capabilities. When provided, must be all lowercase [a-z_0-9,]. A preceding `-all,` directive is also acceptable."
 
 
 
2810
  msgstr ""
2811
 
2812
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:276
2814
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:323
2815
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:468
2816
  msgctxt "s2member-admin"
2817
+ msgid "Invalid form configuration. Invalid \"tp\" attribute. The Trial Period. When provided, must be numeric."
 
 
2818
  msgstr ""
2819
 
2820
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:279
2822
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:326
2823
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:471
2824
  msgctxt "s2member-admin"
2825
+ msgid "Invalid form configuration. Invalid \"tp\" attribute. The Trial Period. When provided, must be >= 1."
 
 
2826
  msgstr ""
2827
 
2828
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:282
2830
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:329
2831
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:474
2832
  msgctxt "s2member-admin"
2833
+ msgid "Invalid form configuration. Missing \"tt\" attribute. The Trial Term. When \"tp\" is provided, \"tt\" (Trial Term) must be one of D,W,M,Y."
 
 
2834
  msgstr ""
2835
 
2836
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:285
2838
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:332
2839
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:477
2840
  msgctxt "s2member-admin"
2841
+ msgid "Invalid form configuration. Invalid \"tt\" attribute. The Trial Term. When \"tp\" is provided, \"tt\" (Trial Term) must be one of D,W,M,Y."
 
 
2842
  msgstr ""
2843
 
2844
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:288
2845
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:335
2846
  msgctxt "s2member-admin"
2847
+ msgid "Invalid form configuration. Invalid \"custom\" attribute. When provided, must start with your domain name."
 
 
2848
  msgstr ""
2849
 
2850
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:293
2851
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:340
2852
  msgctxt "s2member-admin"
2853
+ msgid "Invalid form configuration. Missing \"ids\" attribute. Must contain comma-delimited Post/Page IDs."
 
 
2854
  msgstr ""
2855
 
2856
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:296
2857
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:343
2858
  msgctxt "s2member-admin"
2859
+ msgid "Invalid form configuration. Invalid \"ids\" attribute. Must contain comma-delimited Post/Page IDs. Must contain [0-9,] only."
 
 
2860
  msgstr ""
2861
 
2862
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:299
2863
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:346
2864
  msgctxt "s2member-admin"
2865
+ msgid "Invalid form configuration. Missing \"exp\" attribute. Specific Post/Page Expiration (in hours). Must be numeric."
 
 
2866
  msgstr ""
2867
 
2868
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:302
2869
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:349
2870
  msgctxt "s2member-admin"
2871
+ msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration (in hours). Must be numeric."
 
 
2872
  msgstr ""
2873
 
2874
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:305
2875
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:352
2876
  msgctxt "s2member-admin"
2877
+ msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration (in hours). Must be >= 1."
 
 
2878
  msgstr ""
2879
 
2880
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:308
2881
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:355
2882
  msgctxt "s2member-admin"
2883
+ msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration (in hours). Must be <= 43800."
 
 
2884
  msgstr ""
2885
 
2886
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:311
2887
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:358
2888
  msgctxt "s2member-admin"
2889
+ msgid "Invalid form configuration. Missing \"sp_ids_exp\" internal attribute. Please check Shortcode Attributes."
 
 
2890
  msgstr ""
2891
 
2892
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:314
2893
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:361
2894
  msgctxt "s2member-admin"
2895
+ msgid "Invalid form configuration. Invalid \"sp_ids_exp\" internal attribute. Please check Shortcode Attributes."
 
 
2896
  msgstr ""
2897
 
2898
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:317
2900
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:364
2901
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:432
2902
  msgctxt "s2member-admin"
2903
+ msgid "Invalid form configuration. Missing \"desc\" attribute. Please provide a Description for this form."
 
 
2904
  msgstr ""
2905
 
2906
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:320
2908
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:367
2909
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:435
2910
  msgctxt "s2member-admin"
2911
+ msgid "Invalid form configuration. Your \"desc\" (Description) attribute must be <= 100 characters long."
 
 
2912
  msgstr ""
2913
 
2914
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:323
2916
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:370
2917
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:438
2918
  msgctxt "s2member-admin"
2919
+ msgid "Invalid form configuration. Missing \"custom\" attribute. Must start with your domain name."
 
 
2920
  msgstr ""
2921
 
2922
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:326
2923
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:373
2924
  msgctxt "s2member-admin"
2925
+ msgid "Invalid form configuration. Invalid \"custom\" attribute. Must start with your domain name."
 
 
2926
  msgstr ""
2927
 
2928
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:329
2930
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:376
2931
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:444
2932
  msgctxt "s2member-admin"
2933
+ msgid "Invalid form configuration. Missing \"cc\" attribute. Must be a 3 character Currency Code."
 
 
2934
  msgstr ""
2935
 
2936
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:332
2938
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:379
2939
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:447
2940
  msgctxt "s2member-admin"
2941
+ msgid "Invalid form configuration. Invalid \"cc\" attribute. Must be a 3 character Currency Code."
 
 
2942
  msgstr ""
2943
 
2944
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:335
2946
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:400
2947
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:537
2948
  msgctxt "s2member-admin"
2949
+ msgid "Invalid form configuration. Missing \"ra\" attribute. The Regular Amount. Must be >= 0.00."
 
 
2950
  msgstr ""
2951
 
2952
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:338
2954
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:403
2955
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:540
2956
  msgctxt "s2member-admin"
2957
+ msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be numeric."
 
 
2958
  msgstr ""
2959
 
2960
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:341
2962
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:406
2963
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:543
2964
  msgctxt "s2member-admin"
2965
+ msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be >= 0.00."
 
 
2966
  msgstr ""
2967
 
2968
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:344
2969
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:472
2970
  msgctxt "s2member-admin"
2971
+ msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be <= 99999.00."
 
 
2972
  msgstr ""
2973
 
2974
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:349
2975
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:414
2976
  msgctxt "s2member-front"
2977
+ msgid "You must <a href=\"%s\" rel=\"nofollow\">login</a> to update your billing plan."
 
 
2978
  msgstr ""
2979
 
2980
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:352
2981
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:417
2982
  msgctxt "s2member-front"
2983
+ msgid "You must <a href=\"%s\" rel=\"nofollow\">login</a> before making this purchase."
 
 
2984
  msgstr ""
2985
 
2986
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:355
2987
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:420
2988
  msgctxt "s2member-admin"
2989
+ msgid "Invalid form configuration. Missing \"level\" attribute. Membership Level. Must be numeric [1-%s], or an asterisk (*)."
 
 
2990
  msgstr ""
2991
 
2992
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:358
2993
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:423
2994
  msgctxt "s2member-admin"
2995
+ msgid "Invalid form configuration. Invalid \"level\" attribute. Membership Level. Must be numeric [1-%s], or an asterisk (*)."
 
 
2996
  msgstr ""
2997
 
2998
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:364
2999
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:429
3000
  msgctxt "s2member-admin"
3001
+ msgid "Invalid form configuration. Missing or invalid \"ccaps\" attribute. When \"level\" is \"*\" for (Independent Custom Capabilities), \"ccaps\" is required. All lowercase [a-z_0-9,]. A preceding `-all,` directive is also acceptable."
 
 
 
 
3002
  msgstr ""
3003
 
3004
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:376
3005
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:441
3006
  msgctxt "s2member-admin"
3007
+ msgid "Invalid form configuration. Invalid \"custom\" attribute. Must start with matching domain."
 
 
3008
  msgstr ""
3009
 
3010
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:397
3011
  msgctxt "s2member-admin"
3012
+ msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" (Trial Term) attribute is \"D\", and \"tp\" (Trial Period) > 365."
 
 
3013
  msgstr ""
3014
 
3015
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:400
3016
  msgctxt "s2member-admin"
3017
+ msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" (Trial Term) attribute is \"W\", and \"tp\" (Trial Period) > 52."
 
 
3018
  msgstr ""
3019
 
3020
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:403
3021
  msgctxt "s2member-admin"
3022
+ msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" (Trial Term) attribute is \"M\", and \"tp\" (Trial Period) > 12."
 
 
3023
  msgstr ""
3024
 
3025
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:406
3026
  msgctxt "s2member-admin"
3027
+ msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. The \"tt\" (Trial Term) attribute is \"Y\", and \"tp\" (Trial Period) > 1."
 
 
3028
  msgstr ""
3029
 
3030
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:409
3031
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:480
3032
  msgctxt "s2member-admin"
3033
+ msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be numeric."
 
 
3034
  msgstr ""
3035
 
3036
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:412
3037
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:483
3038
  msgctxt "s2member-admin"
3039
+ msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be >= 0.00."
 
 
3040
  msgstr ""
3041
 
3042
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:415
3043
  msgctxt "s2member-admin"
3044
+ msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be <= 99999.00."
 
 
3045
  msgstr ""
3046
 
3047
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:418
3048
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:489
3049
  msgctxt "s2member-admin"
3050
+ msgid "Invalid form configuration. Missing \"rp\" attribute. The Regular Period. Must be >= 1."
 
 
3051
  msgstr ""
3052
 
3053
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:421
3054
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:492
3055
  msgctxt "s2member-admin"
3056
+ msgid "Invalid form configuration. Invalid \"rp\" attribute. The Regular Period. Must be numeric."
 
 
3057
  msgstr ""
3058
 
3059
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:424
3060
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:495
3061
  msgctxt "s2member-admin"
3062
+ msgid "Invalid form configuration. Invalid \"rp\" attribute. The Regular Period. Must be >= 1."
 
 
3063
  msgstr ""
3064
 
3065
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:427
3066
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:498
3067
  msgctxt "s2member-admin"
3068
+ msgid "Invalid form configuration. Missing \"rt\" attribute. The Regular Term. Must be one of D,W,M,Y,L."
 
 
3069
  msgstr ""
3070
 
3071
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:430
3072
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:501
3073
  msgctxt "s2member-admin"
3074
+ msgid "Invalid form configuration. Invalid \"rt\" attribute. The Regular Term. Must be one of D,W,M,Y,L."
 
 
3075
  msgstr ""
3076
 
3077
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:433
3078
  msgctxt "s2member-admin"
3079
+ msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"D\", \"rp\" (Regular Period) is < 7, and \"rr\" is not \"BN\" (Buy Now)."
 
 
 
3080
  msgstr ""
3081
 
3082
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:436
3083
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:504
3084
  msgctxt "s2member-admin"
3085
+ msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"D\", \"rp\" (Regular Period) > 365, and \"rr\" is not \"BN\" (Buy Now)."
 
 
 
3086
  msgstr ""
3087
 
3088
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:439
3089
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:507
3090
  msgctxt "s2member-admin"
3091
+ msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"W\", \"rp\" (Regular Period) > 52, and \"rr\" is not \"BN\" (Buy Now)."
 
 
 
3092
  msgstr ""
3093
 
3094
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:442
3095
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:510
3096
  msgctxt "s2member-admin"
3097
+ msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"M\", \"rp\" (Regular Period) > 12, and \"rr\" is not \"BN\" (Buy Now)."
 
 
 
3098
  msgstr ""
3099
 
3100
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:445
3101
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:519
3102
  msgctxt "s2member-admin"
3103
+ msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"Y\", \"rp\" (Regular Period) > 1, and \"rr\" is not \"BN\" (Buy Now)."
 
 
 
3104
  msgstr ""
3105
 
3106
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:448
3107
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:522
3108
  msgctxt "s2member-admin"
3109
+ msgid "Invalid form configuration. Invalid \"rp, rt\" attributes. The \"rt\" (Regular Term) attribute is \"L\" (Lifetime), and \"rp\" (Regular Period) > 1."
 
 
 
3110
  msgstr ""
3111
 
3112
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:451
3113
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:525
3114
  msgctxt "s2member-admin"
3115
+ msgid "Invalid form configuration. Invalid \"rt, rr\" attributes. The \"rt\" (Regular Term) attribute is \"L\" (Lifetime), and \"rr\" is not \"BN\" (Buy Now)."
 
 
 
3116
  msgstr ""
3117
 
3118
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:454
3119
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:528
3120
  msgctxt "s2member-admin"
3121
+ msgid "Invalid form configuration. Missing \"level_ccaps_eotper\" attribute. Please check Shortcode Attributes."
 
 
3122
  msgstr ""
3123
 
3124
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:457
3126
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:531
3127
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:534
3128
  msgctxt "s2member-admin"
3129
+ msgid "Invalid form configuration. Invalid \"level_ccaps_eotper\" attribute. Please check Shortcode Attributes."
 
 
3130
  msgstr ""
3131
 
3132
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:475
3133
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:549
3134
  msgctxt "s2member-admin"
3135
+ msgid "Invalid form configuration. Invalid \"rr\" attribute. Regular Recurring. When provided, must be 0, 1, or BN."
 
 
3136
  msgstr ""
3137
 
3138
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:478
3139
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:552
3140
  msgctxt "s2member-admin"
3141
+ msgid "Invalid form configuration. Invalid \"rr, tp\" attributes. The \"rr\" (Regular Recurring) attribute is \"BN\" (Buy Now), and \"tp\" (Trial Period) is not \"0\"."
 
 
 
3142
  msgstr ""
3143
 
3144
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:481
3145
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:555
3146
  msgctxt "s2member-admin"
3147
+ msgid "Invalid form configuration. Invalid \"level, rr\" attributes. The \"level\" (Level) attribute is \"*\" for (Independent Custom Capabilities), and \"rr\" is not \"BN\" (Buy Now)."
 
 
 
3148
  msgstr ""
3149
 
3150
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:484
3151
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:558
3152
  msgctxt "s2member-admin"
3153
+ msgid "Invalid form configuration. Invalid \"ta, tp, tt\" attributes. Trial Period. When provided, these cannot be exactly the same as your \"ra, rp, rt\" attributes."
 
 
 
3154
  msgstr ""
3155
 
3156
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:487
3157
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:561
3158
  msgctxt "s2member-admin"
3159
+ msgid "Invalid form configuration. Invalid \"rrt\" attribute. Recurring Times (fixed). When provided, must be numeric."
 
 
3160
  msgstr ""
3161
 
3162
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:490
3163
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:564
3164
  msgctxt "s2member-admin"
3165
+ msgid "Invalid form configuration. Invalid \"rrt\" attribute. Recurring Times (fixed). When provided, must be >= 1."
 
 
3166
  msgstr ""
3167
 
3168
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:493
3169
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:567
3170
  msgctxt "s2member-admin"
3171
+ msgid "Invalid form configuration. Invalid \"rr, rrt\" attributes. When \"rrt\" (Recurring Times) is provided, \"rr\" (Regular Recurring) must be 1."
 
 
3172
  msgstr ""
3173
 
3174
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:520
3192
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:611
3193
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:761
3194
  msgctxt "s2member-admin"
3195
+ msgid "Unable to process. You are an Administrator. Stopping here for security. Otherwise, an Administrator could lose access."
 
 
3196
  msgstr ""
3197
 
3198
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:534
3246
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:726
3247
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:818
3248
  msgctxt "s2member-front"
3249
+ msgid "Invalid Card Expiration Date. Must be in this format (mm/yyyy). Please try again."
 
 
3250
  msgstr ""
3251
 
3252
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:549
3256
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:729
3257
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:821
3258
  msgctxt "s2member-front"
3259
+ msgid "Missing Card Verification Code. It's on the back of your Card. 3-4 digits. Please try again."
 
 
3260
  msgstr ""
3261
 
3262
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:552
3266
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:732
3267
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:824
3268
  msgctxt "s2member-front"
3269
+ msgid "Missing Card Start Date, or Issue #. Required for Maestro/Solo. Please try again."
 
 
3270
  msgstr ""
3271
 
3272
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:555
3426
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:675
3427
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:755
3428
  msgctxt "s2member-front"
3429
+ msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to modify your billing plan."
 
 
3430
  msgstr ""
3431
 
3432
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:678
3433
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:758
3434
  msgctxt "s2member-front"
3435
+ msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> before making this purchase."
 
 
3436
  msgstr ""
3437
 
3438
  #: s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:765
3442
  msgstr ""
3443
 
3444
  #: s2member-pro/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:169
3445
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:288
3446
  msgctxt "s2member-front"
3447
+ msgid "<strong>Thank you.</strong> Your purchase has been approved.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">click here</a> to proceed."
 
 
3448
  msgstr ""
3449
 
3450
  #: s2member-pro/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:176
3451
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:295
3452
  msgctxt "s2member-front"
3453
+ msgid "<strong>Oops.</strong> Unable to generate Access Link. Please contact Support for assistance."
 
 
3454
  msgstr ""
3455
 
3456
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:110
3457
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:115
3458
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:118
3459
  msgctxt "s2member-front"
3460
  msgid "<strong>Confirmed.</strong> Your billing information has been updated."
3461
  msgstr ""
3462
 
3463
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:122
3464
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:131
3465
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:130
3466
  msgctxt "s2member-front"
3467
+ msgid "<strong>Unable to update.</strong> You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance."
 
 
 
3468
  msgstr ""
3469
 
3470
  #: s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:131
3471
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:148
3472
  msgctxt "s2member-front"
3473
+ msgid "<strong>Oops.</strong> No Subscr. ID. Please contact Support for assistance."
 
3474
  msgstr ""
3475
 
3476
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:666
3548
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:600
3549
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:615
3550
  msgctxt "s2member-front"
3551
+ msgid "<div>Coupon: <strong>%s off</strong>. (Now: <strong>%s, then %s</strong>)</div>"
 
 
3552
  msgstr ""
3553
 
3554
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:923
3568
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1028
3569
  #: s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:657
3570
  msgctxt "s2member-front"
3571
+ msgid "<div>Sorry, your Coupon cannot be applied to this particular purchase.</div>"
 
3572
  msgstr ""
3573
 
3574
  #: s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1032
3606
  msgid ""
3607
  "ERROR: Unable to verify POST vars. Please contact Support for assistance.\n"
3608
  "\n"
3609
+ "This is most likely related to an invalid ClickBank configuration. If you are the site owner, please check: s2Member -› ClickBank Options."
 
3610
  msgstr ""
3611
 
3612
  #: s2member-pro/includes/classes/gateways/clickbank/clickbank-utilities.inc.php:168
3613
  msgctxt "s2member-front"
3614
+ msgid "<strong>Reminder:</strong> Purchases at this site will appear on your credit card or bank statement as: <code>ClickBank</code> or <code>CLKBANK*COM</code>."
 
 
 
3615
  msgstr ""
3616
 
3617
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:123
3618
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:247
3619
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:263
3620
  msgctxt "s2member-front"
3621
+ msgid "<strong>Unable to cancel at this time.</strong> Your account is pending other changes. Please try again in 15 minutes."
 
 
3622
  msgstr ""
3623
 
3624
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:135
3625
  #: s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:128
3626
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:257
3627
  msgctxt "s2member-front"
3628
+ msgid "Please <a href=\"%s\" rel=\"nofollow\">log in at PayPal</a> to cancel your Subscription."
 
 
3629
  msgstr ""
3630
 
3631
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:351
3632
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:674
3633
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:491
3634
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:923
3635
  msgctxt "s2member-front"
3636
+ msgid "<strong>Sorry.</strong> Your account is pending other changes. Please try again in 15 minutes."
 
 
3637
  msgstr ""
3638
 
3639
  #: s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:378
3669
 
3670
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:208
3671
  msgctxt "s2member-admin"
3672
+ msgid "PayPal configuration error. Your PayPal API Username is not yet configured."
 
3673
  msgstr ""
3674
 
3675
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:211
3676
  msgctxt "s2member-admin"
3677
+ msgid "PayPal configuration error. Your PayPal API Password is not yet configured."
 
3678
  msgstr ""
3679
 
3680
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:214
3681
  msgctxt "s2member-admin"
3682
+ msgid "PayPal configuration error. Your PayPal API Signature is not yet configured."
 
3683
  msgstr ""
3684
 
3685
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:283
3689
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:135
3690
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:139
3691
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:79
3692
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:134
3693
  msgctxt "s2member-front"
3694
+ msgid "Please <a href=\"%s\" rel=\"nofollow\">log in at PayPal</a> to update your billing information."
 
 
3695
  msgstr ""
3696
 
3697
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:286
3698
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:305
3699
  #: s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:127
3700
  msgctxt "s2member-front"
3701
+ msgid "<strong>Unable to update at this time.</strong> Your account is pending other changes. Please try again in 15 minutes."
 
 
3702
  msgstr ""
3703
 
3704
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:382
3705
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:450
3706
  msgctxt "s2member-admin"
3707
+ msgid "Invalid form configuration. Missing \"dg\" attribute. Digital indicator. Must be numeric [0-1]."
 
 
3708
  msgstr ""
3709
 
3710
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:385
3711
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:453
3712
  msgctxt "s2member-admin"
3713
+ msgid "Invalid form configuration. Invalid \"dg\" attribute. Digital indicator. Must be numeric [0-1]."
 
 
3714
  msgstr ""
3715
 
3716
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:388
3717
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:456
3718
  msgctxt "s2member-admin"
3719
+ msgid "Invalid form configuration. Missing \"ns\" attribute. Shipping configuration. Must be numeric [0-2]."
 
 
3720
  msgstr ""
3721
 
3722
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:391
3723
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:459
3724
  msgctxt "s2member-admin"
3725
+ msgid "Invalid form configuration. Invalid \"ns\" attribute. Shipping configuration. Must be numeric [0-2]."
 
 
3726
  msgstr ""
3727
 
3728
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:394
3729
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:462
3730
  msgctxt "s2member-admin"
3731
+ msgid "Invalid form configuration. Invalid \"ns\" attribute. Shipping configuration. Must be 1 with \"dg\" (digital) items."
 
 
3732
  msgstr ""
3733
 
3734
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:397
3735
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:465
3736
  msgctxt "s2member-admin"
3737
+ msgid "Invalid form configuration. Invalid \"lc\" attribute. Locale Code. When provided, must be a 2 character country code."
 
 
3738
  msgstr ""
3739
 
3740
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:409
3741
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:546
3742
  msgctxt "s2member-admin"
3743
+ msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be <= 10000.00."
 
 
3744
  msgstr ""
3745
 
3746
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:486
3747
  msgctxt "s2member-admin"
3748
+ msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be <= 10000.00."
 
 
3749
  msgstr ""
3750
 
3751
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:513
3752
  msgctxt "s2member-admin"
3753
+ msgid "Invalid Payflow form configuration. Invalid \"rt, rp, rr\" attributes. Payflow supports a specific set of recurring intervals. Pro Forms can be configured to charge: weekly, bi-weekly, monthly, quarterly, semi-yearly or yearly. Any other combination results in this error. This is a Payflow limitation."
 
 
 
 
 
3754
  msgstr ""
3755
 
3756
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:516
3757
  msgctxt "s2member-admin"
3758
+ msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"Y\", \"rp\" (Regular Period) > 5, and \"rr\" is not \"BN\" (Buy Now)."
 
 
 
3759
  msgstr ""
3760
 
3761
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:570
3762
  msgctxt "s2member-admin"
3763
+ msgid "Invalid form configuration. Invalid \"rr, rra\" attributes. When \"rr\" (Regular Recurring) is 0 or 1, \"rra\" (Recurring Retry Attempts) must be numeric."
 
 
 
3764
  msgstr ""
3765
 
3766
  #: s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:573
3767
  msgctxt "s2member-admin"
3768
+ msgid "Invalid form configuration. Invalid \"rr, rra\" attributes. When \"rr\" (Regular Recurring) is 0 or 1, \"rra\" (Recurring Retry Attempts) must be >= 0."
 
 
 
3769
  msgstr ""
3770
 
3771
+ #: s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:140
3772
  msgctxt "s2member-front"
3773
  msgid "<strong>No Subscr. ID.</strong> Please contact Support for assistance."
3774
  msgstr ""
3828
  msgid "My Profile Summary"
3829
  msgstr ""
3830
 
3831
+ #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3832
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:73
3833
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:167
3834
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:253
3835
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:504
3836
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:790
3837
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3838
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:73
3839
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:167
3840
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:253
3841
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:544
3842
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:878
3843
+ msgctxt "s2member-front"
3844
+ msgid "Security Code missing. Please try again."
3845
+ msgstr ""
3846
+
3847
+ #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3848
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:142
3849
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:479
3850
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:751
3851
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3852
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:142
3853
+ msgctxt "s2member-front"
3854
+ msgid "Please choose a Billing Method."
3855
+ msgstr ""
3856
+
3857
+ #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3858
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:323
3859
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:575
3860
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3861
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:327
3862
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:619
3863
+ msgctxt "s2member-front"
3864
+ msgid "Calculating Sales Tax..."
3865
+ msgstr ""
3866
+
3867
+ #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3868
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:323
3869
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:575
3870
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3871
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:327
3872
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:619
3873
+ msgctxt "s2member-front"
3874
+ msgid "calculating sales tax..."
3875
+ msgstr ""
3876
+
3877
+ #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3878
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:334
3879
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:586
3880
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3881
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:338
3882
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:630
3883
+ msgctxt "s2member-front"
3884
+ msgid "<strong>Sales Tax%s:</strong> %s<br /><strong>— Total%s:</strong> %s"
3885
+ msgstr ""
3886
+
3887
+ #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3888
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:334
3889
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:586
3890
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3891
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:338
3892
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:630
3893
+ msgctxt "s2member-front"
3894
+ msgid "Today"
3895
+ msgstr ""
3896
+
3897
+ #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3898
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:648
3899
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3900
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:692
3901
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:62
3902
+ #: s2member-pro/includes/templates/forms/authnet-registration-form.php:30
3903
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:62
3904
+ #: s2member-pro/includes/templates/forms/paypal-registration-form.php:30
3905
+ msgctxt "s2member-front"
3906
+ msgid "Create Profile"
3907
+ msgstr ""
3908
+
3909
+ #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3910
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:649
3911
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3912
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:693
3913
+ msgctxt "s2member-front"
3914
+ msgid "Your Profile"
3915
+ msgstr ""
3916
+
3917
+ #: s2member-pro/includes/separates/gateways/google/google-min.js:1
3918
+ #: s2member-pro/includes/separates/gateways/google/google.js:49
3919
+ msgctxt "s2member-front"
3920
+ msgid "Thank you! Please check your email for further details."
3921
+ msgstr ""
3922
+
3923
+ #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3924
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:269
3925
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:270
3926
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:561
3927
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:562
3928
+ #: s2member-pro/includes/templates/forms/authnet-cancellation-form.php:36
3929
+ #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:198
3930
+ #: s2member-pro/includes/templates/forms/authnet-registration-form.php:81
3931
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:179
3932
+ #: s2member-pro/includes/templates/forms/authnet-update-form.php:117
3933
+ #: s2member-pro/includes/templates/forms/paypal-cancellation-form.php:36
3934
+ #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:198
3935
+ #: s2member-pro/includes/templates/forms/paypal-registration-form.php:81
3936
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:179
3937
+ #: s2member-pro/includes/templates/forms/paypal-update-form.php:117
3938
+ msgctxt "s2member-front"
3939
+ msgid "Submit Form"
3940
+ msgstr ""
3941
+
3942
  #: s2member-pro/includes/syscon.inc.php:95
3943
  msgctxt "s2member-front"
3944
  msgid ""
3950
  "Charges today: $%%%%initial%%%%\n"
3951
  "Recurring charges: $%%%%recurring/regular_cycle%%%%\n"
3952
  "\n"
3953
+ "Your Username/Password will arrive shortly, in a separate email. If you have any trouble, please feel free to contact us.\n"
 
3954
  "\n"
3955
  "Best Regards,\n"
3956
  "%s"
3982
  msgid "Confirm Cancellation"
3983
  msgstr ""
3984
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3985
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:21
3986
  #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:21
3987
  #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:21
4014
  msgid "Apply Coupon"
4015
  msgstr ""
4016
 
 
 
 
 
 
 
 
 
4017
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:84
4018
  #: s2member-pro/includes/templates/forms/authnet-registration-form.php:52
4019
  #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:84
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 140105
4
- Stable tag: 140105
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -16,12 +16,12 @@ Authorize.Net® Compatible: yes w/s2Member® Pro
16
  Google® Checkout Compatible: yes w/s2Member® Pro
17
  ClickBank® Compatible: yes w/s2Member® Pro
18
 
19
- Tested up to: 3.8
20
  Requires at least: 3.3
21
 
22
  Copyright: © 2009 WebSharks, Inc.
23
  License: GNU General Public License v2 or later.
24
- Contributors: WebSharks, anguz
25
 
26
  Author: s2Member® / WebSharks, Inc.
27
  Author URI: http://www.s2member.com/
@@ -142,12 +142,45 @@ Released under the terms of the [GNU General Public License](http://www.gnu.org/
142
 
143
  == Upgrade Notice ==
144
 
145
- = v140105 =
146
 
147
  (Maintenance Release) Upgrade immediately.
148
 
149
  == Changelog ==
150
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  = v140105 =
152
 
153
  * (s2Member/s2Member Pro) **Compatibility**. Updated to support WordPress v3.8. Nothing significant, just minor UI tweaks in the Login/Registration Design for WordPress v3.8; e.g. `wp-login.php` got some minor improvements in this release of s2Member and s2Member Pro.
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 140328
4
+ Stable tag: 140328
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
16
  Google® Checkout Compatible: yes w/s2Member® Pro
17
  ClickBank® Compatible: yes w/s2Member® Pro
18
 
19
+ Tested up to: 3.9
20
  Requires at least: 3.3
21
 
22
  Copyright: © 2009 WebSharks, Inc.
23
  License: GNU General Public License v2 or later.
24
+ Contributors: WebSharks, JasWSInc, anguz, raamdev
25
 
26
  Author: s2Member® / WebSharks, Inc.
27
  Author URI: http://www.s2member.com/
142
 
143
  == Upgrade Notice ==
144
 
145
+ = v140328 =
146
 
147
  (Maintenance Release) Upgrade immediately.
148
 
149
  == Changelog ==
150
 
151
+ = v140328 =
152
+
153
+ * (s2Member/s2Member Pro) **Compatibility**. Updated to support WordPress v3.9. Nothing significant, just minor UI tweaks to make s2Member fully compatible with WP v3.9.
154
+ * (s2Member) **Compatibility**. Updating for backward compatibility with WordPress v3.8 - 3.3 by tweaking calls to `get_post()`. See this [commit](https://github.com/WebSharks/s2Member/commit/7b8c8aecc3e8d0d0bada3e80f41615b968a763f8) for further details.
155
+ * (s2Member/s2Member Pro) **Translations**. Updating the `includes/translations/s2member.pot` [file](https://github.com/WebSharks/s2Member/tree/000000-dev/s2member/includes/translations) to include the entire set of translation strings for both s2Member and s2Member Pro. Some translation entries from JS files were missing in the previous release due to a glitch in our WP i18n processor. Fixed in this release.
156
+ * (s2Member) **Server Check Tool**. Updating the [s2Member Server Scanner](https://www.s2member.com/kb/server-scanner/) to exclude checksum validations against README files. This release includes other scanning improvements also, which allow the tool to do a better job of scanning for compatibility issues.
157
+ * (s2Member Pro) **GetResponse Integration**. This release adds support for GetResponse™ as an email service provider. s2Member now comes preintegrated with GetResponse™ (requires s2Member Pro), MailChimp® and AWeber™ too.
158
+ * (s2Member) **Double Opt-In Article**. Updating inline documentation to include further details about Double Opt-Ins via [this KB article](http://www.s2member.com/kb/double-opt-in-checkbox/).
159
+ * (s2Member) **Compatibility**. Adding support for `$_SERVER['WP_DIR']` (to help developers with a particular edge case). For further details please see [this GitHub issue](https://github.com/WebSharks/s2Member/issues/39).
160
+ * (s2Member) **Auto-EOT Time Column**. This release adds an Auto-EOT Time column to the list of Users in the WordPress Dashboard. Note: it is possible to show/hide specific columns with the Screen Options tab in WordPress.
161
+ * (s2Member) **HTML Trimming**. Adding a new utility method to the s2Member codebase. This [method](https://github.com/WebSharks/s2Member/commit/aa19d23511e9c34a5cc00628285107da9a565594) helps cleanup HTML-based whitespace (and extra line breaks) that are injected inadvertently by some themes when site owners use the `[s2If]` shortcode.
162
+ * (s2Member) **Bug Fix**. Fixing an issue related to Login Redirections over SSL. For further details please see [this GitHub issue](https://github.com/WebSharks/s2Member/issues/59).
163
+ * (s2Member) **All Custom Capabilities**. If your site offers many different CCAPS (Custom Capabilities) and you'd like a way to sell someone access to all of them at once (without needing to list each of them one-by-one); this is now possible. This is accomplished by selling a customer the special CCAP `all_ccaps`. If the `current_user_can('access_s2member_ccap_all_ccaps')`, they will be granted access to ALL Custom Capabilities that you've implemented on the site (now, and in the future). For instance, if the `current_user_can('access_s2member_ccap_all_ccaps')` they can also `access_s2member_ccap_music` even if they don't actually have CCAP `music`. In short, `all_ccaps` grants a customer access to all CCAPS automatically.
164
+ * (s2Member) **E_NOTICE**. Updating several areas of the s2Member codebase in an ongoing effort to make s2Member behave as expected when running in `WP_DEBUG` mode. Note that `WP_DEBUG` is NOT recommended for a production site (this mode is reserved for developers only please).
165
+ * (s2Member) **Bug Fix**. Fixing a bug related to redirections over SSL in an edge case. See [this GitHub commit](https://github.com/WebSharks/s2Member/commit/881a8f513ff00d1932f33928c771cab38ab84dc7) if you'd like further details.
166
+ * (s2Member) **Bug Fix**. Fixing a bug in the way s2Member handles IP Restrictions in one particular area of the source code. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/63) if you'd like further details.
167
+ * (s2Member) **File Downloads (Content-Encoding)**. Adding a new configurable option for site owners that use protected File Downloads with s2Member. There is a known issue on some hosting platforms; and this new configurable option provides a workaround that is related to the `Content-Encoding` header. Please see: `Dashboard ⥱ s2Member ⥱ Download Options ⥱ Preventing GZIP Conflicts` to configure this new setting. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/70) if you'd like further details.
168
+ * (s2Member) **Apache Compatibility**. Updating s2Member's `.htaccess` files to provide support for the `Require` directive supplied by the `authz_core_module` in the most recent versions of Apache. s2Member also maintains backward compatibility for the `allow/deny` directives used in previous versions of Apache.
169
+ * (s2Member Pro) **Gateway-Specific Variables**. Adding gateway-specific variables for use in email templates configured with s2Member. For further details please see [this GitHub issue](https://github.com/WebSharks/s2Member/issues/25).
170
+ * (s2Member) **Cosmetics**. Updating s2Member's adminitrative menu pages to enhance their appearance in the most recent versions of WordPress. Nothing significant, just minor tweaks.
171
+ * (s2Member Pro) **PayPal IPNs**. Adding support for `txn_type` values: `merch_pmt`, `mp_signup`, and `mp_cancel` to enhance s2Member's support for Billing Agreements when integrated together with a PayPal Pro (Payflow Edition) account that processes Express Checkout transactions. This also resolves a bug related to cancellation IPN processing in a specific scenario. Fixed in this release.
172
+ * (s2Member Pro) **[s2If][else]**. Requires s2Member Pro. This release adds support for a new `[else]` condition when using the `[s2If]` shortcode to protect parts of your content. For examples, please see: `Dashboard ⥱ s2Member ⥱ API Scripting ⥱ Simple Shortcode Conditionals`. See also: `Dashboard ⥱ s2Member ⥱ Restriction Options ⥱ Simple Shortcode Conditionals`.
173
+ * (s2Member Pro) **[s2If php=""]**. Requires s2Member Pro. This release adds support for a new `php` Shortcode Attribute; e.g. `[s2If php=""]`. This makes it possible to use arbitrary PHP code in your `[s2If]` shortcodes. For examples, please see: `Dashboard ⥱ s2Member ⥱ API Scripting ⥱ Simple Shortcode Conditionals`. **Note: this feature is disabled by default.** You must enable the `php` attribute for this to work as expected. Please see: `Dashboard ⥱ s2Member ⥱ Restriction Options ⥱ Simple Shortcode Conditionals` (with s2Member Pro installed).
174
+ * (s2Member) **Bug Fix**. Correcting an issue related to Login Redirections and an E_NOTICE. Please see [this GitHub issue](https://github.com/WebSharks/s2Member/issues/75) if you'd like further details.
175
+ * (s2Member Pro) **[s2Drip]**. Requires s2Member Pro. This release adds support for a new easy-to-use shortcode that can drip content to paying Members based on their Membership Level. For examples, please see: `Dashboard ⥱ s2Member ⥱ API Scripting ⥱ Content Dripping`.
176
+ * (s2Member Pro) **ClickBank**. Adding support for the `vtid` parameter in ClickBank Button Shortcodes. See [this GitHub issue](https://github.com/WebSharks/s2Member/issues/44) if you'd like further details.
177
+ * (s2Member Pro) **PayPal Express Checkout**. Updating PayPal Express Checkout cancellation links so they will automatically use the PayPal Merchant ID supplied by a site owner (i.e. PayPal's recommended behavior). If you'd like further details please see [this GitHub commit](https://github.com/WebSharks/s2Member-Pro/commit/5efbe35eed352868a956c94e51ab09f8e561892a).
178
+ * (s2Member Pro) **Pro Forms**. Adding a new filter for developers `s2member_pro_cancels_old_rp_before_new_rp`. This is true by default. If you'd like to prevent s2Member from terminating an existing Recurring Profile (before creating a new one); i.e. during an upgrade... you can set this to a FALSE value. Not recommended, but there are a few edge cases where it could be helpful for developers. See also [this GitHub commit](https://github.com/WebSharks/s2Member-Pro/commit/19a84c81070bb0e1869b5dbd9d0325cc458fd016).
179
+ * (s2Member Pro) **ClickBank Bug Fix**. Adding support for alphabetics in ClickBank Item Numbers. This bug impacted the ClickBank Button Generator only, it did not prevent alphabetics from being used in a raw Shortcode. Still, this has been resolved now. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/46).
180
+ * (s2Member Pro) **PayPal Mobile Bug Fix**. This release corrects a bug related to the `MAXAMT` PayPal specification that is sent via Express Checkout on a mobile device. A symptom of this bug was to sometimes see PayPal's awkward default amount of `$25` when completing checkout on a mobile device. Fixed in this release.
181
+ * (s2Member Pro) **PayPal Express Checkout**. This release addresses an issue where a customer reaches PayPal.com with an item description that inadequately reads "Future payment" (i.e. missing the description provided by a site owner). PayPal's latest improvements have made it possible for s2Member to get this right. Resolved in this release.
182
+ * (s2Member/s2Member Pro) **Partial Refunds**. This release adds support for Partial Refunds in the s2Member EOT Behavior Options. See also [this GitHub issue](https://github.com/WebSharks/s2Member/issues/40).
183
+
184
  = v140105 =
185
 
186
  * (s2Member/s2Member Pro) **Compatibility**. Updated to support WordPress v3.8. Nothing significant, just minor UI tweaks in the Login/Registration Design for WordPress v3.8; e.g. `wp-login.php` got some minor improvements in this release of s2Member and s2Member Pro.
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 140105
23
- Stable tag: 140105
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
@@ -75,7 +75,7 @@ if(realpath(__FILE__) === realpath($_SERVER["SCRIPT_FILENAME"]))
75
  * @var str
76
  */
77
  if(!defined("WS_PLUGIN__S2MEMBER_VERSION"))
78
- define("WS_PLUGIN__S2MEMBER_VERSION", "140105" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
@@ -105,7 +105,7 @@ if(!defined("WS_PLUGIN__S2MEMBER_MIN_WP_VERSION"))
105
  * @var str
106
  */
107
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
108
- define("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "140105" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
+ Version: 140328
23
+ Stable tag: 140328
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
75
  * @var str
76
  */
77
  if(!defined("WS_PLUGIN__S2MEMBER_VERSION"))
78
+ define("WS_PLUGIN__S2MEMBER_VERSION", "140328" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
105
  * @var str
106
  */
107
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
108
+ define("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "140328" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.