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

Version Description

= v160303 =

(Maintenance Release) Upgrade immediately.

Download this release

Release Info

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

Code changes from version 160120 to 160303

changelog.md CHANGED
@@ -1,3 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  = v160120 =
2
 
3
  - (s2Member,s2Member Pro) **Bug Fix:** Resolved a minor glitch in the **WordPress Dashboard → Settings → General** panel, where s2Member's notice regarding Open Registration was inadvertently forcing the entire page into italics. Props @renzms @kristineds @raamdev ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/831) if you'd like additional details.
1
+ = v160303 =
2
+
3
+ - (s2Member/s2Member Pro) **Comet Cache Compat.:** This release improves compatibility with Comet Cache (formerly ZenCache), whenever you have it configured to cache logged-in users. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/888). Props @KTS915 for reporting!
4
+
5
+ - (s2Member Pro) **ClickBank IPN v6 Compat.:** Version 6 of the ClickBank IPN system was recently updated in a way that causes it to return `transactionType = CANCEL-TEST-REBILL` in test mode, instead of the previous value, which was: `TEST_CANCEL-REBILL`. s2Member Pro has been updated to understand either/or. See also [this GitHub issue](https://github.com/websharks/s2member/issues/882) for further details.
6
+
7
+ - (s2Member Pro) **Stripe Bug Fix:** This release corrects a bug caused by typos in the source code that were preventing refunds from being processed as expected whenever Stripe was integrated. Props @YearOfBenj for reporting this important issue. Props @patdumond for relaying vital information. See also [this GitHub issue](https://github.com/websharks/s2member/issues/874) if you'd like additional details.
8
+
9
+ - (s2Member Pro) **PayPal Bug Fix:** Under some conditions, the EOT behavior in s2Member Pro (when integrated with PayPal Pro) would immediately terminate access whenever a customer's subscription naturally expires. Recent versions of the Payflow system set the status to `EXPIRED`, and this was handled as an immediate EOT instead of as a delayed EOT that is subject to date calculations to determine the correct date on which a customer should lose access; i.e., based on what they have already paid for. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/873) if you'd like additional details.
10
+
11
+ - (s2Member Pro) **One-Time Offer Bug Fix:** This release corrects some inconsistencies in the One-Time Offers system that comes with s2Member Pro. Symptoms included seemingly unpredictable behavior whenever redirections were configured without a specific Membership Level. Props @jacobposey for reporting. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/855) if you'd like additional details.
12
+
13
+ - (s2Member/s2Member Pro) **Bug Fix:** s2Member was not properly respecting `DISALLOW_FILE_MODS` in a specific scenario related to GZIP. Props @renzms @kristineds. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/832) for further details.
14
+
15
+ - (s2Member,s2Member Pro) **Bug Fix:** Resolved a minor glitch in the **WordPress Dashboard → Settings → General** panel, where s2Member's notice regarding Open Registration was inadvertently forcing the entire page into italics. Props @renzms @kristineds @raamdev ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/831) if you'd like additional details.
16
+
17
+ - (s2Member/s2Member Pro) **PayPal Sandbox:** This release updates the inline documentation under the PayPal Account Settings section of s2Member. We now suggest that instead of enabling PayPal Sandbox Mode (sometimes buggy at best), that site owners run tests with low-dollar amounts against a live PayPal account instead; e.g., $0.01 test transactions in live mode work great also. See [this GitHub issue](https://github.com/websharks/s2member/issues/891) if you'd like additional details. Props @raamdev for mentioning this again.
18
+
19
  = v160120 =
20
 
21
  - (s2Member,s2Member Pro) **Bug Fix:** Resolved a minor glitch in the **WordPress Dashboard → Settings → General** panel, where s2Member's notice regarding Open Registration was inadvertently forcing the entire page into italics. Props @renzms @kristineds @raamdev ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/831) if you'd like additional details.
checksum.txt CHANGED
@@ -1 +1 @@
1
- 11d370c25f342a327ffe729210727337
1
+ b155b61fde7bcce8dfd5e9eb3e002338
includes/classes/files-in.inc.php CHANGED
@@ -997,8 +997,7 @@ if(!class_exists('c_ws_plugin__s2member_files_in'))
997
  $cfc['expires'] = strtotime('+'.apply_filters('ws_plugin__s2member_amazon_cf_file_expires_time', '24 hours', get_defined_vars()));
998
 
999
  $cf_extn = strtolower(substr($file, strrpos($file, '.') + 1)); // Parses the file extension out so we can scan it in some special scenarios.
1000
- $cf_ip_res = (c_ws_plugin__s2member_utils_conds::is_localhost()) ? FALSE : TRUE; // Do NOT restrict access to a particular IP during `localhost` development. The IP may NOT be the same one Amazon CloudFront sees.
1001
- $cf_stream_extn_resource_exclusions = array_unique((array)apply_filters('ws_plugin__s2member_amazon_cf_file_streaming_extension_resource_exclusions', array('mp3'), get_defined_vars())); // MP3 files should NOT include an extension in their resource reference.
1002
  $cf_resource = ($stream) ? ((in_array($cf_extn, $cf_stream_extn_resource_exclusions)) ? substr($file, 0, strrpos($file, '.')) : $file) : 'http'.(($ssl) ? 's' : '').'://'.(($cfc['distro_downloads_cname']) ? $cfc['distro_downloads_cname'] : $cfc['distro_downloads_dname']).'/'.$url_e_file;
1003
  $cf_url = ($stream) ? 'rtmp'.(($ssl) ? 'e' : '').'://'.(($cfc['distro_streaming_cname']) ? $cfc['distro_streaming_cname'] : $cfc['distro_streaming_dname']).'/cfx/st/'.$file : 'http'.(($ssl) ? 's' : '').'://'.(($cfc['distro_downloads_cname']) ? $cfc['distro_downloads_cname'] : $cfc['distro_downloads_dname']).'/'.$url_e_file;
1004
  $cf_policy = '{"Statement":[{"Resource":"'.c_ws_plugin__s2member_utils_strings::esc_dq($cf_resource).'","Condition":{'.(($cf_ip_res) ? '"IpAddress":{"AWS:SourceIp":"'.c_ws_plugin__s2member_utils_strings::esc_dq($_SERVER['REMOTE_ADDR']).'/32"},' : '').'"DateLessThan":{"AWS:EpochTime":'.(int)$cfc['expires'].'}}}]}';
997
  $cfc['expires'] = strtotime('+'.apply_filters('ws_plugin__s2member_amazon_cf_file_expires_time', '24 hours', get_defined_vars()));
998
 
999
  $cf_extn = strtolower(substr($file, strrpos($file, '.') + 1)); // Parses the file extension out so we can scan it in some special scenarios.
1000
+ $cf_ip_res = c_ws_plugin__s2member_utils_conds::is_localhost() || ($stream && !$cfc['rtmp_policy_include_ip']) ? FALSE : TRUE;
 
1001
  $cf_resource = ($stream) ? ((in_array($cf_extn, $cf_stream_extn_resource_exclusions)) ? substr($file, 0, strrpos($file, '.')) : $file) : 'http'.(($ssl) ? 's' : '').'://'.(($cfc['distro_downloads_cname']) ? $cfc['distro_downloads_cname'] : $cfc['distro_downloads_dname']).'/'.$url_e_file;
1002
  $cf_url = ($stream) ? 'rtmp'.(($ssl) ? 'e' : '').'://'.(($cfc['distro_streaming_cname']) ? $cfc['distro_streaming_cname'] : $cfc['distro_streaming_dname']).'/cfx/st/'.$file : 'http'.(($ssl) ? 's' : '').'://'.(($cfc['distro_downloads_cname']) ? $cfc['distro_downloads_cname'] : $cfc['distro_downloads_dname']).'/'.$url_e_file;
1003
  $cf_policy = '{"Statement":[{"Resource":"'.c_ws_plugin__s2member_utils_strings::esc_dq($cf_resource).'","Condition":{'.(($cf_ip_res) ? '"IpAddress":{"AWS:SourceIp":"'.c_ws_plugin__s2member_utils_strings::esc_dq($_SERVER['REMOTE_ADDR']).'/32"},' : '').'"DateLessThan":{"AWS:EpochTime":'.(int)$cfc['expires'].'}}}]}';
includes/classes/files.inc.php CHANGED
@@ -326,7 +326,7 @@ if(!class_exists('c_ws_plugin__s2member_files'))
326
  if(file_exists($htaccess) && is_readable($htaccess) && ($htaccess_contents = file_get_contents($htaccess)) !== FALSE && is_string($htaccess_contents = trim($htaccess_contents)))
327
  return preg_match('/'.preg_quote($start_line, '/').'['."\r\n".']+.*?['."\r\n".']+'.preg_quote($end_line, '/').'['."\r\n".']{0,2}/is', $htaccess_contents);
328
 
329
- return FALSE; // Default return `FALSE`.
330
  }
331
 
332
  /**
@@ -339,7 +339,10 @@ if(!class_exists('c_ws_plugin__s2member_files'))
339
  */
340
  public static function write_no_gzip_into_root_htaccess()
341
  {
342
- if(c_ws_plugin__s2member_files::remove_no_gzip_from_root_htaccess() /* Must first be able to remove any existing entry. */)
 
 
 
343
  {
344
  $start_line = '# BEGIN s2Member GZIP exclusions'; // Beginning line for this entry.
345
  $end_line = '# END s2Member GZIP exclusions'; // Identifying end line for this entry.
@@ -362,7 +365,7 @@ if(!class_exists('c_ws_plugin__s2member_files'))
362
  return file_put_contents($htaccess, $no_gzip);
363
  }
364
  }
365
- return FALSE; // Default return `FALSE`.
366
  }
367
 
368
  /**
@@ -375,6 +378,9 @@ if(!class_exists('c_ws_plugin__s2member_files'))
375
  */
376
  public static function remove_no_gzip_from_root_htaccess()
377
  {
 
 
 
378
  $start_line = '# BEGIN s2Member GZIP exclusions'; // Beginning line for this entry.
379
  $end_line = '# END s2Member GZIP exclusions'; // Identifying end line for this entry.
380
  $htaccess = ABSPATH.'.htaccess'; // Location of this `.htaccess` file we need to write in.
@@ -385,11 +391,11 @@ if(!class_exists('c_ws_plugin__s2member_files'))
385
 
386
  return (file_put_contents($htaccess, $htaccess_contents) !== FALSE); // Check for `FALSE`, because this could return `0` if the file is now empty.
387
  }
388
- else if(!file_exists($htaccess) /* Return `TRUE` here, we're OK. */)
389
  {
390
  return TRUE;
391
  }
392
- return FALSE; // Default return `FALSE`.
393
  }
394
  }
395
- }
326
  if(file_exists($htaccess) && is_readable($htaccess) && ($htaccess_contents = file_get_contents($htaccess)) !== FALSE && is_string($htaccess_contents = trim($htaccess_contents)))
327
  return preg_match('/'.preg_quote($start_line, '/').'['."\r\n".']+.*?['."\r\n".']+'.preg_quote($end_line, '/').'['."\r\n".']{0,2}/is', $htaccess_contents);
328
 
329
+ return FALSE;
330
  }
331
 
332
  /**
339
  */
340
  public static function write_no_gzip_into_root_htaccess()
341
  {
342
+ if(defined('DISALLOW_FILE_MODS') && DISALLOW_FILE_MODS) {
343
+ return FALSE; # No write access on this site.
344
+ }
345
+ if(c_ws_plugin__s2member_files::remove_no_gzip_from_root_htaccess())
346
  {
347
  $start_line = '# BEGIN s2Member GZIP exclusions'; // Beginning line for this entry.
348
  $end_line = '# END s2Member GZIP exclusions'; // Identifying end line for this entry.
365
  return file_put_contents($htaccess, $no_gzip);
366
  }
367
  }
368
+ return FALSE;
369
  }
370
 
371
  /**
378
  */
379
  public static function remove_no_gzip_from_root_htaccess()
380
  {
381
+ if(defined('DISALLOW_FILE_MODS') && DISALLOW_FILE_MODS) {
382
+ return FALSE; # No write access on this site.
383
+ }
384
  $start_line = '# BEGIN s2Member GZIP exclusions'; // Beginning line for this entry.
385
  $end_line = '# END s2Member GZIP exclusions'; // Identifying end line for this entry.
386
  $htaccess = ABSPATH.'.htaccess'; // Location of this `.htaccess` file we need to write in.
391
 
392
  return (file_put_contents($htaccess, $htaccess_contents) !== FALSE); // Check for `FALSE`, because this could return `0` if the file is now empty.
393
  }
394
+ else if(!file_exists($htaccess))
395
  {
396
  return TRUE;
397
  }
398
+ return FALSE;
399
  }
400
  }
401
+ }
includes/classes/no-cache.inc.php CHANGED
@@ -95,8 +95,8 @@ if(!class_exists('c_ws_plugin__s2member_no_cache'))
95
  if(!$once && (empty($_GET['qcAC']) || !filter_var($_GET['qcAC'], FILTER_VALIDATE_BOOLEAN))
96
  && (
97
  $no_cache === TRUE // Forces no-cache constants; if `TRUE` explicitly.
98
- || ($no_cache === 'restricted' && (!defined('ZENCACHE_WHEN_LOGGED_IN') || !ZENCACHE_WHEN_LOGGED_IN) && (!defined('QUICK_CACHE_WHEN_LOGGED_IN') || !QUICK_CACHE_WHEN_LOGGED_IN))
99
- || (is_user_logged_in() && (!defined('ZENCACHE_WHEN_LOGGED_IN') || !ZENCACHE_WHEN_LOGGED_IN) && (!defined('QUICK_CACHE_WHEN_LOGGED_IN') || !QUICK_CACHE_WHEN_LOGGED_IN))
100
  || c_ws_plugin__s2member_systematics::is_s2_systematic_use_page()
101
  )
102
  )
@@ -134,6 +134,17 @@ if(!class_exists('c_ws_plugin__s2member_no_cache'))
134
  if(!defined('DONOTCACHEOBJECT'))
135
  define('DONOTCACHEOBJECT', TRUE);
136
 
 
 
 
 
 
 
 
 
 
 
 
137
  /**
138
  * No-cache anything for ZenCache plugin.
139
  *
@@ -197,6 +208,7 @@ if(!class_exists('c_ws_plugin__s2member_no_cache'))
197
  $using_selective_behavior = apply_filters('ws_plugin__s2member_no_cache_headers_selective', FALSE, get_defined_vars());
198
 
199
  if(!$once && !headers_sent() // Only once, and only if possible.
 
200
  && (empty($_GET['zcABC']) || !filter_var($_GET['zcABC'], FILTER_VALIDATE_BOOLEAN))
201
  && (empty($_GET['qcABC']) || !filter_var($_GET['qcABC'], FILTER_VALIDATE_BOOLEAN))
202
  && ($no_cache || !$using_selective_behavior || c_ws_plugin__s2member_no_cache::$headers)
@@ -221,4 +233,4 @@ if(!class_exists('c_ws_plugin__s2member_no_cache'))
221
  return TRUE; // Always return true.
222
  }
223
  }
224
- }
95
  if(!$once && (empty($_GET['qcAC']) || !filter_var($_GET['qcAC'], FILTER_VALIDATE_BOOLEAN))
96
  && (
97
  $no_cache === TRUE // Forces no-cache constants; if `TRUE` explicitly.
98
+ || ($no_cache === 'restricted' && (!defined('COMET_CACHE_WHEN_LOGGED_IN') || !COMET_CACHE_WHEN_LOGGED_IN) && (!defined('ZENCACHE_WHEN_LOGGED_IN') || !ZENCACHE_WHEN_LOGGED_IN) && (!defined('QUICK_CACHE_WHEN_LOGGED_IN') || !QUICK_CACHE_WHEN_LOGGED_IN))
99
+ || (is_user_logged_in() && (!defined('COMET_CACHE_WHEN_LOGGED_IN') || !COMET_CACHE_WHEN_LOGGED_IN) && (!defined('ZENCACHE_WHEN_LOGGED_IN') || !ZENCACHE_WHEN_LOGGED_IN) && (!defined('QUICK_CACHE_WHEN_LOGGED_IN') || !QUICK_CACHE_WHEN_LOGGED_IN))
100
  || c_ws_plugin__s2member_systematics::is_s2_systematic_use_page()
101
  )
102
  )
134
  if(!defined('DONOTCACHEOBJECT'))
135
  define('DONOTCACHEOBJECT', TRUE);
136
 
137
+ /**
138
+ * No-cache anything for Comet Cache plugin.
139
+ *
140
+ * @package s2Member\No_Cache
141
+ * @since 160222
142
+ *
143
+ * @var bool
144
+ */
145
+ if(!defined('COMET_CACHE_ALLOWED'))
146
+ define('COMET_CACHE_ALLOWED', FALSE);
147
+
148
  /**
149
  * No-cache anything for ZenCache plugin.
150
  *
208
  $using_selective_behavior = apply_filters('ws_plugin__s2member_no_cache_headers_selective', FALSE, get_defined_vars());
209
 
210
  if(!$once && !headers_sent() // Only once, and only if possible.
211
+ && (empty($_GET['ccABC']) || !filter_var($_GET['ccABC'], FILTER_VALIDATE_BOOLEAN))
212
  && (empty($_GET['zcABC']) || !filter_var($_GET['zcABC'], FILTER_VALIDATE_BOOLEAN))
213
  && (empty($_GET['qcABC']) || !filter_var($_GET['qcABC'], FILTER_VALIDATE_BOOLEAN))
214
  && ($no_cache || !$using_selective_behavior || c_ws_plugin__s2member_no_cache::$headers)
233
  return TRUE; // Always return true.
234
  }
235
  }
236
+ }
includes/classes/sc-eots-in.inc.php CHANGED
@@ -92,9 +92,6 @@ if(!class_exists('c_ws_plugin__s2member_sc_eots_in'))
92
  $eot = c_ws_plugin__s2member_utils_users::get_user_eot($user_id, true, $mode);
93
  set_transient($transient, $eot, DAY_IN_SECONDS / 2);
94
  }
95
- if($eot['time'] && $attr['round_to'])
96
- $eot['time'] = strtotime($attr['round_to'], $eot['time']);
97
-
98
  if($eot['time'] && (integer)$attr['offset'])
99
  $eot['time'] = $eot['time'] + (integer)$attr['offset'];
100
 
@@ -119,6 +116,8 @@ if(!class_exists('c_ws_plugin__s2member_sc_eots_in'))
119
  $time = new DateTime(date('Y-m-d H:i:s', $eot['time']));
120
  if($attr['timezone'] && strtoupper($attr['timezone']) !== 'UTC')
121
  $time->setTimezone(new DateTimeZone($attr['timezone']));
 
 
122
  }
123
  if($time && $attr['date_format'] === 'timestamp')
124
  $date = (string)$time->getTimestamp();
92
  $eot = c_ws_plugin__s2member_utils_users::get_user_eot($user_id, true, $mode);
93
  set_transient($transient, $eot, DAY_IN_SECONDS / 2);
94
  }
 
 
 
95
  if($eot['time'] && (integer)$attr['offset'])
96
  $eot['time'] = $eot['time'] + (integer)$attr['offset'];
97
 
116
  $time = new DateTime(date('Y-m-d H:i:s', $eot['time']));
117
  if($attr['timezone'] && strtoupper($attr['timezone']) !== 'UTC')
118
  $time->setTimezone(new DateTimeZone($attr['timezone']));
119
+ if($attr['round_to'])
120
+ $time->modify($attr['round_to']);
121
  }
122
  if($time && $attr['date_format'] === 'timestamp')
123
  $date = (string)$time->getTimestamp();
includes/menu-pages/down-ops.inc.php CHANGED
@@ -505,6 +505,30 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
505
  echo '<tbody>'."\n";
506
  echo '<tr>'."\n";
507
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
508
  echo '<td>'."\n";
509
  echo '<h3>Completely Reset CloudFront Configuration?</h3>'."\n";
510
  echo '<div style="float:right; margin:0 0 0 25px;">'."\n";
@@ -903,4 +927,4 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
903
  }
904
  }
905
 
906
- new c_ws_plugin__s2member_menu_page_down_ops();
505
  echo '<tbody>'."\n";
506
  echo '<tr>'."\n";
507
 
508
+ echo '<th>'."\n";
509
+ echo '<label for="ws-plugin--s2member-amazon-cf-files-rtmp-policy-include-ip">'."\n";
510
+ echo 'Exclude IPs from digitally signed links in CloudFront RTMP streams?'."\n";
511
+ echo '</label>'."\n";
512
+ echo '</th>'."\n";
513
+
514
+ echo '</tr>'."\n";
515
+ echo '<tr>'."\n";
516
+
517
+ echo '<td>'."\n";
518
+ echo '<input type="radio" name="ws_plugin__s2member_amazon_cf_files_rtmp_policy_include_ip" id="ws-plugin--s2member-amazon-cf-files-rtmp-policy-include-ip-1" value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_rtmp_policy_include_ip"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-amazon-cf-files-rtmp-policy-include-ip-1"><strong>Yes,</strong> include IPs for best security (default behavior).</label><br /><input type="radio" name="ws_plugin__s2member_amazon_cf_files_rtmp_policy_include_ip" id="ws-plugin--s2member-amazon-cf-files-rtmp-policy-include-ip-0" value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_rtmp_policy_include_ip"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-amazon-cf-files-rtmp-policy-include-ip-0"><strong>No</strong>, exclude IPs when streaming to improve compatibility.</label><br />'."\n";
519
+ echo '<p><em>Excluding IP addresses from digitally signed links when streaming over the RTMP protocol will improve compatibility, at the expense of loosening security just a little bit. It\'s a trade-off, and for that reason you should only exclude IPs if you care more about compatibility than you do security. For instance, if your content is not super-senstivite and secret, you might exclude IPs from digitally signed links; putting more focus on preventing issues in various devices. On the other hand, if your streaming audio/video files should be guarded with tight security at all times, you will want to leave this at the default setting (Yes), thereby requiring a matching IP address across both the HTTP and RTMP protocols at all times. Some mobile devices (depending on the mobile carrier) will be unable to pass IP validation though; i.e., some mobile devices assign different IPs for HTTP than they do for RTMP; which can lead to cross-protocol validation failures if you include IP addresses in digitally signed links.</em></p>'."\n";
520
+ echo '</td>'."\n";
521
+
522
+ echo '</tr>'."\n";
523
+ echo '</tbody>'."\n";
524
+ echo '</table>'."\n";
525
+
526
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
527
+
528
+ echo '<table class="form-table" style="margin-top:0;">'."\n";
529
+ echo '<tbody>'."\n";
530
+ echo '<tr>'."\n";
531
+
532
  echo '<td>'."\n";
533
  echo '<h3>Completely Reset CloudFront Configuration?</h3>'."\n";
534
  echo '<div style="float:right; margin:0 0 0 25px;">'."\n";
927
  }
928
  }
929
 
930
+ new c_ws_plugin__s2member_menu_page_down_ops();
includes/menu-pages/paypal-ops.inc.php CHANGED
@@ -177,7 +177,8 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
177
 
178
  echo '<td>'."\n";
179
  echo '<input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-0" value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-sandbox-0">No</label> &nbsp;&nbsp;&nbsp; <input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-1" value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-sandbox-1">Yes, enable support for Sandbox testing.</label><br />'."\n";
180
- echo '<em>Only enable this if you\'ve provided Sandbox credentials above.<br />This puts the API, IPN, PDT and Form/Button Generators all into Sandbox mode.<br />See: <a href="http://s2member.com/r/paypal-developers/" target="_blank" rel="external">PayPal Developers</a></em>'."\n";
 
181
  echo '</td>'."\n";
182
 
183
  echo '</tr>'."\n";
@@ -1098,4 +1099,4 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
1098
  }
1099
  }
1100
 
1101
- new c_ws_plugin__s2member_menu_page_paypal_ops();
177
 
178
  echo '<td>'."\n";
179
  echo '<input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-0" value="0"'.((!$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-sandbox-0">No</label> &nbsp;&nbsp;&nbsp; <input type="radio" name="ws_plugin__s2member_paypal_sandbox" id="ws-plugin--s2member-paypal-sandbox-1" value="1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_sandbox"]) ? ' checked="checked"' : '').' /> <label for="ws-plugin--s2member-paypal-sandbox-1">Yes, enable support for Sandbox testing.</label><br />'."\n";
180
+ echo '<em>Only enable this if you\'ve provided Sandbox credentials above.<br />This puts the API, IPN, PDT and Form/Button Generators all into Sandbox mode. See: <a href="http://s2member.com/r/paypal-developers/" target="_blank" rel="external">PayPal Developers</a></em><br />'."\n";
181
+ echo '<em><strong>Warning:</strong> The PayPal Sandbox doesn\'t always give you an accurate view of what will happen once you go live, and in fact it is sometimes buggy at best. For this reason, our strong recommendation is that instead of using Sandbox Mode to run tests, that you go live and run tests with low-dollar amounts; i.e., $0.01 transactions are possible with PayPal in live mode, and that is a better way to test your installation of s2Member.</em>'."\n";
182
  echo '</td>'."\n";
183
 
184
  echo '</tr>'."\n";
1099
  }
1100
  }
1101
 
1102
+ new c_ws_plugin__s2member_menu_page_paypal_ops();
includes/syscon.inc.php CHANGED
@@ -321,6 +321,7 @@ if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults'))
321
  $default_options['amazon_cf_files_distro_streaming_cname'] = '';
322
  $default_options['amazon_cf_files_distro_streaming_dname'] = '';
323
  $default_options['amazon_cf_files_distros_auto_config_status'] = '';
 
324
 
325
  $default_options['ruris_case_sensitive'] = '0'; // No by default.
326
 
321
  $default_options['amazon_cf_files_distro_streaming_cname'] = '';
322
  $default_options['amazon_cf_files_distro_streaming_dname'] = '';
323
  $default_options['amazon_cf_files_distros_auto_config_status'] = '';
324
+ $default_options['amazon_cf_files_rtmp_policy_include_ip'] = '1';
325
 
326
  $default_options['ruris_case_sensitive'] = '0'; // No by default.
327
 
includes/translations/s2member.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: 160120\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
- "POT-Creation-Date: 2016-01-20 00:02:36+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -401,7 +401,7 @@ msgctxt "s2member-admin"
401
  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."
402
  msgstr ""
403
 
404
- #: s2member/includes/classes/files-in.inc.php:1042
405
  msgctxt "s2member-admin"
406
  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."
407
  msgstr ""
@@ -409,12 +409,12 @@ msgstr ""
409
  #. translators: In this translation, `%s` may be filled with an English
410
  #. message, which comes from the Amazon CloudFront API call. Feel free to
411
  #. exclude `%s` if you like.
412
- #: s2member/includes/classes/files-in.inc.php:1049
413
  msgctxt "s2member-admin"
414
  msgid "Unable to delete existing Amazon CloudFront Downloads Distro. %s"
415
  msgstr ""
416
 
417
- #: s2member/includes/classes/files-in.inc.php:1061
418
  msgctxt "s2member-admin"
419
  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."
420
  msgstr ""
@@ -422,7 +422,7 @@ msgstr ""
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:1068
426
  msgctxt "s2member-admin"
427
  msgid "Unable to delete existing Amazon CloudFront Streaming Distro. %s"
428
  msgstr ""
@@ -430,8 +430,8 @@ msgstr ""
430
  #. translators: In this translation, `%s` may be filled with an English
431
  #. message, which comes from the Amazon CloudFront API call. Feel free to
432
  #. exclude `%s` if you like.
433
- #: s2member/includes/classes/files-in.inc.php:1084
434
- #: s2member/includes/classes/files-in.inc.php:1272
435
  msgctxt "s2member-admin"
436
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. %s"
437
  msgstr ""
@@ -439,12 +439,12 @@ msgstr ""
439
  #. translators: In this translation, `%s` may be filled with an English
440
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
441
  #. if you like.
442
- #: s2member/includes/classes/files-in.inc.php:1125
443
  msgctxt "s2member-admin"
444
  msgid "Unable to update existing Amazon S3 ACLs. %s"
445
  msgstr ""
446
 
447
- #: s2member/includes/classes/files-in.inc.php:1128
448
  msgctxt "s2member-admin"
449
  msgid "Unable to update existing Amazon S3 ACLs. Connection failed."
450
  msgstr ""
@@ -452,14 +452,14 @@ msgstr ""
452
  #. translators: In this translation, `%s` may be filled with an English
453
  #. message, which comes from the Amazon CloudFront API call. Feel free to
454
  #. exclude `%s` if you like.
455
- #: s2member/includes/classes/files-in.inc.php:1132
456
- #: s2member/includes/classes/files-in.inc.php:1567
457
  msgctxt "s2member-admin"
458
  msgid "Unable to create Amazon CloudFront Streaming Distro. %s"
459
  msgstr ""
460
 
461
- #: s2member/includes/classes/files-in.inc.php:1135
462
- #: s2member/includes/classes/files-in.inc.php:1570
463
  msgctxt "s2member-admin"
464
  msgid "Unable to create Amazon CloudFront Streaming Distro. Connection failed."
465
  msgstr ""
@@ -467,14 +467,14 @@ msgstr ""
467
  #. translators: In this translation, `%s` may be filled with an English
468
  #. message, which comes from the Amazon CloudFront API call. Feel free to
469
  #. exclude `%s` if you like.
470
- #: s2member/includes/classes/files-in.inc.php:1139
471
- #: s2member/includes/classes/files-in.inc.php:1545
472
  msgctxt "s2member-admin"
473
  msgid "Unable to create Amazon CloudFront Downloads Distro. %s"
474
  msgstr ""
475
 
476
- #: s2member/includes/classes/files-in.inc.php:1142
477
- #: s2member/includes/classes/files-in.inc.php:1548
478
  msgctxt "s2member-admin"
479
  msgid "Unable to create Amazon CloudFront Downloads Distro. Connection failed."
480
  msgstr ""
@@ -482,19 +482,19 @@ msgstr ""
482
  #. translators: In this translation, `%s` may be filled with an English
483
  #. message, which comes from the Amazon CloudFront API call. Feel free to
484
  #. exclude `%s` if you like.
485
- #: s2member/includes/classes/files-in.inc.php:1146
486
- #: s2member/includes/classes/files-in.inc.php:1318
487
  msgctxt "s2member-admin"
488
  msgid "Unable to create Amazon CloudFront Origin Access Identity. %s"
489
  msgstr ""
490
 
491
- #: s2member/includes/classes/files-in.inc.php:1149
492
- #: s2member/includes/classes/files-in.inc.php:1321
493
  msgctxt "s2member-admin"
494
  msgid "Unable to create Amazon CloudFront Origin Access Identity. Connection failed."
495
  msgstr ""
496
 
497
- #: s2member/includes/classes/files-in.inc.php:1152
498
  msgctxt "s2member-admin"
499
  msgid "Unable to clear existing Amazon CloudFront Origin Access Identity."
500
  msgstr ""
@@ -502,19 +502,19 @@ msgstr ""
502
  #. translators: In this translation, `%s` may be filled with an English
503
  #. message, which comes from the Amazon CloudFront API call. Feel free to
504
  #. exclude `%s` if you like.
505
- #: s2member/includes/classes/files-in.inc.php:1156
506
- #: s2member/includes/classes/files-in.inc.php:1227
507
  msgctxt "s2member-admin"
508
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. %s"
509
  msgstr ""
510
 
511
- #: s2member/includes/classes/files-in.inc.php:1159
512
- #: s2member/includes/classes/files-in.inc.php:1230
513
  msgctxt "s2member-admin"
514
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. Connection failed."
515
  msgstr ""
516
 
517
- #: s2member/includes/classes/files-in.inc.php:1162
518
  msgctxt "s2member-admin"
519
  msgid "Unable to clear existing Amazon CloudFront Streaming Distro."
520
  msgstr ""
@@ -522,17 +522,17 @@ msgstr ""
522
  #. translators: In this translation, `%s` may be filled with an English
523
  #. message, which comes from the Amazon CloudFront API call. Feel free to
524
  #. exclude `%s` if you like.
525
- #: s2member/includes/classes/files-in.inc.php:1166
526
  msgctxt "s2member-admin"
527
  msgid "Unable to acquire existing Amazon CloudFront Streaming Distro. %s"
528
  msgstr ""
529
 
530
- #: s2member/includes/classes/files-in.inc.php:1169
531
  msgctxt "s2member-admin"
532
  msgid "Unable to acquire existing Amazon CloudFront Streaming Distro. Connection failed."
533
  msgstr ""
534
 
535
- #: s2member/includes/classes/files-in.inc.php:1172
536
  msgctxt "s2member-admin"
537
  msgid "Unable to clear existing Amazon CloudFront Downloads Distro."
538
  msgstr ""
@@ -540,22 +540,22 @@ msgstr ""
540
  #. translators: In this translation, `%s` may be filled with an English
541
  #. message, which comes from the Amazon CloudFront API call. Feel free to
542
  #. exclude `%s` if you like.
543
- #: s2member/includes/classes/files-in.inc.php:1176
544
  msgctxt "s2member-admin"
545
  msgid "Unable to acquire existing Amazon CloudFront Downloads Distro. %s"
546
  msgstr ""
547
 
548
- #: s2member/includes/classes/files-in.inc.php:1179
549
  msgctxt "s2member-admin"
550
  msgid "Unable to acquire existing Amazon CloudFront Downloads Distro. Connection failed."
551
  msgstr ""
552
 
553
- #: s2member/includes/classes/files-in.inc.php:1182
554
  msgctxt "s2member-admin"
555
  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."
556
  msgstr ""
557
 
558
- #: s2member/includes/classes/files-in.inc.php:1185
559
  msgctxt "s2member-admin"
560
  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."
561
  msgstr ""
@@ -563,34 +563,34 @@ msgstr ""
563
  #. translators: In this translation, `%s` may be filled with an English
564
  #. message, which comes from the Amazon CloudFront API call. Feel free to
565
  #. exclude `%s` if you like.
566
- #: s2member/includes/classes/files-in.inc.php:1223
567
  msgctxt "s2member-admin"
568
  msgid "Existing Amazon CloudFront Origin Access Identity NOT found. %s"
569
  msgstr ""
570
 
571
- #: s2member/includes/classes/files-in.inc.php:1233
572
  msgctxt "s2member-admin"
573
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. Invalid Access ID."
574
  msgstr ""
575
 
576
- #: s2member/includes/classes/files-in.inc.php:1275
577
  msgctxt "s2member-admin"
578
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. Connection failed."
579
  msgstr ""
580
 
581
- #: s2member/includes/classes/files-in.inc.php:1278
582
  msgctxt "s2member-admin"
583
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. Invalid Access ID, ETag, or XML config."
584
  msgstr ""
585
 
586
- #: s2member/includes/classes/files-in.inc.php:1305
587
- #: s2member/includes/classes/files-in.inc.php:1532
588
- #: s2member/includes/classes/files-in.inc.php:1554
589
  msgctxt "s2member-admin"
590
  msgid "Created by s2Member, for S3 Bucket: %s."
591
  msgstr ""
592
 
593
- #: s2member/includes/classes/files-in.inc.php:1314
594
  msgctxt "s2member-admin"
595
  msgid "Unable to create/read Amazon CloudFront Origin Access Identity. Unexpected response."
596
  msgstr ""
@@ -598,7 +598,7 @@ msgstr ""
598
  #. translators: In this translation, `%s` may be filled with an English
599
  #. message, which comes from the Amazon CloudFront API call. Feel free to
600
  #. exclude `%s` if you like.
601
- #: s2member/includes/classes/files-in.inc.php:1360
602
  msgctxt "s2member-admin"
603
  msgid "Existing Amazon CloudFront Distro NOT found. %s"
604
  msgstr ""
@@ -606,17 +606,17 @@ msgstr ""
606
  #. translators: In this translation, `%s` may be filled with an English
607
  #. message, which comes from the Amazon CloudFront API call. Feel free to
608
  #. exclude `%s` if you like.
609
- #: s2member/includes/classes/files-in.inc.php:1364
610
  msgctxt "s2member-admin"
611
  msgid "Unable to acquire existing Amazon CloudFront Distro. %s"
612
  msgstr ""
613
 
614
- #: s2member/includes/classes/files-in.inc.php:1367
615
  msgctxt "s2member-admin"
616
  msgid "Unable to acquire existing Amazon CloudFront Distro. Connection failed."
617
  msgstr ""
618
 
619
- #: s2member/includes/classes/files-in.inc.php:1370
620
  msgctxt "s2member-admin"
621
  msgid "Unable to acquire existing Amazon CloudFront Distro. Invalid Distro ID and/or Distro type."
622
  msgstr ""
@@ -624,24 +624,24 @@ msgstr ""
624
  #. translators: In this translation, `%s` may be filled with an English
625
  #. message, which comes from the Amazon CloudFront API call. Feel free to
626
  #. exclude `%s` if you like.
627
- #: s2member/includes/classes/files-in.inc.php:1414
628
- #: s2member/includes/classes/files-in.inc.php:1489
629
  msgctxt "s2member-admin"
630
  msgid "Unable to disable existing Amazon CloudFront Distro. %s"
631
  msgstr ""
632
 
633
- #: s2member/includes/classes/files-in.inc.php:1417
634
- #: s2member/includes/classes/files-in.inc.php:1492
635
  msgctxt "s2member-admin"
636
  msgid "Unable to disable existing Amazon CloudFront Distro. Connection failed."
637
  msgstr ""
638
 
639
- #: s2member/includes/classes/files-in.inc.php:1420
640
  msgctxt "s2member-admin"
641
  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."
642
  msgstr ""
643
 
644
- #: s2member/includes/classes/files-in.inc.php:1426
645
  msgctxt "s2member-admin"
646
  msgid "Unable to disable existing Amazon CloudFront Distro. Invalid Distro ID, ETag, or XML config."
647
  msgstr ""
@@ -649,12 +649,12 @@ msgstr ""
649
  #. translators: In this translation, `%s` may be filled with an English
650
  #. message, which comes from the Amazon CloudFront API call. Feel free to
651
  #. exclude `%s` if you like.
652
- #: s2member/includes/classes/files-in.inc.php:1471
653
  msgctxt "s2member-admin"
654
  msgid "Unable to delete existing Amazon CloudFront Distro. %s"
655
  msgstr ""
656
 
657
- #: s2member/includes/classes/files-in.inc.php:1474
658
  msgctxt "s2member-admin"
659
  msgid "Unable to delete existing Amazon CloudFront Distro. Connection failed."
660
  msgstr ""
@@ -662,7 +662,7 @@ msgstr ""
662
  #. translators: In this translation, `%s` may be filled with an English
663
  #. message, which comes from the Amazon CloudFront API call. Feel free to
664
  #. exclude `%s` if you like.
665
- #: s2member/includes/classes/files-in.inc.php:1478
666
  msgctxt "s2member-admin"
667
  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."
668
  msgstr ""
@@ -670,37 +670,37 @@ msgstr ""
670
  #. translators: In this translation, `%s` may be filled with an English
671
  #. message, which comes from the Amazon CloudFront API call. Feel free to
672
  #. exclude `%s` if you like.
673
- #: s2member/includes/classes/files-in.inc.php:1482
674
  msgctxt "s2member-admin"
675
  msgid "Unable to check status of existing Amazon CloudFront Distro. %s"
676
  msgstr ""
677
 
678
- #: s2member/includes/classes/files-in.inc.php:1485
679
  msgctxt "s2member-admin"
680
  msgid "Unable to check status of existing Amazon CloudFront Distro. Connection failed."
681
  msgstr ""
682
 
683
- #: s2member/includes/classes/files-in.inc.php:1495
684
  msgctxt "s2member-admin"
685
  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."
686
  msgstr ""
687
 
688
- #: s2member/includes/classes/files-in.inc.php:1498
689
  msgctxt "s2member-admin"
690
  msgid "Unable to delete existing Amazon CloudFront Distro. Invalid Distro ID or ETag."
691
  msgstr ""
692
 
693
- #: s2member/includes/classes/files-in.inc.php:1541
694
  msgctxt "s2member-admin"
695
  msgid "Unable to create/read Amazon CloudFront Downloads Distro. Unexpected response."
696
  msgstr ""
697
 
698
- #: s2member/includes/classes/files-in.inc.php:1563
699
  msgctxt "s2member-admin"
700
  msgid "Unable to create/read Amazon CloudFront Streaming Distro. Unexpected response."
701
  msgstr ""
702
 
703
- #: s2member/includes/classes/files-in.inc.php:1574
704
  msgctxt "s2member-admin"
705
  msgid "Unable to create Amazon CloudFront Distro. Invalid Distro type."
706
  msgstr ""
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: 160303\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
+ "POT-Creation-Date: 2016-03-03 23:56:02+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
401
  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."
402
  msgstr ""
403
 
404
+ #: s2member/includes/classes/files-in.inc.php:1041
405
  msgctxt "s2member-admin"
406
  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."
407
  msgstr ""
409
  #. translators: In this translation, `%s` may be filled with an English
410
  #. message, which comes from the Amazon CloudFront API call. Feel free to
411
  #. exclude `%s` if you like.
412
+ #: s2member/includes/classes/files-in.inc.php:1048
413
  msgctxt "s2member-admin"
414
  msgid "Unable to delete existing Amazon CloudFront Downloads Distro. %s"
415
  msgstr ""
416
 
417
+ #: s2member/includes/classes/files-in.inc.php:1060
418
  msgctxt "s2member-admin"
419
  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."
420
  msgstr ""
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:1067
426
  msgctxt "s2member-admin"
427
  msgid "Unable to delete existing Amazon CloudFront Streaming Distro. %s"
428
  msgstr ""
430
  #. translators: In this translation, `%s` may be filled with an English
431
  #. message, which comes from the Amazon CloudFront API call. Feel free to
432
  #. exclude `%s` if you like.
433
+ #: s2member/includes/classes/files-in.inc.php:1083
434
+ #: s2member/includes/classes/files-in.inc.php:1271
435
  msgctxt "s2member-admin"
436
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. %s"
437
  msgstr ""
439
  #. translators: In this translation, `%s` may be filled with an English
440
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
441
  #. if you like.
442
+ #: s2member/includes/classes/files-in.inc.php:1124
443
  msgctxt "s2member-admin"
444
  msgid "Unable to update existing Amazon S3 ACLs. %s"
445
  msgstr ""
446
 
447
+ #: s2member/includes/classes/files-in.inc.php:1127
448
  msgctxt "s2member-admin"
449
  msgid "Unable to update existing Amazon S3 ACLs. Connection failed."
450
  msgstr ""
452
  #. translators: In this translation, `%s` may be filled with an English
453
  #. message, which comes from the Amazon CloudFront API call. Feel free to
454
  #. exclude `%s` if you like.
455
+ #: s2member/includes/classes/files-in.inc.php:1131
456
+ #: s2member/includes/classes/files-in.inc.php:1566
457
  msgctxt "s2member-admin"
458
  msgid "Unable to create Amazon CloudFront Streaming Distro. %s"
459
  msgstr ""
460
 
461
+ #: s2member/includes/classes/files-in.inc.php:1134
462
+ #: s2member/includes/classes/files-in.inc.php:1569
463
  msgctxt "s2member-admin"
464
  msgid "Unable to create Amazon CloudFront Streaming Distro. Connection failed."
465
  msgstr ""
467
  #. translators: In this translation, `%s` may be filled with an English
468
  #. message, which comes from the Amazon CloudFront API call. Feel free to
469
  #. exclude `%s` if you like.
470
+ #: s2member/includes/classes/files-in.inc.php:1138
471
+ #: s2member/includes/classes/files-in.inc.php:1544
472
  msgctxt "s2member-admin"
473
  msgid "Unable to create Amazon CloudFront Downloads Distro. %s"
474
  msgstr ""
475
 
476
+ #: s2member/includes/classes/files-in.inc.php:1141
477
+ #: s2member/includes/classes/files-in.inc.php:1547
478
  msgctxt "s2member-admin"
479
  msgid "Unable to create Amazon CloudFront Downloads Distro. Connection failed."
480
  msgstr ""
482
  #. translators: In this translation, `%s` may be filled with an English
483
  #. message, which comes from the Amazon CloudFront API call. Feel free to
484
  #. exclude `%s` if you like.
485
+ #: s2member/includes/classes/files-in.inc.php:1145
486
+ #: s2member/includes/classes/files-in.inc.php:1317
487
  msgctxt "s2member-admin"
488
  msgid "Unable to create Amazon CloudFront Origin Access Identity. %s"
489
  msgstr ""
490
 
491
+ #: s2member/includes/classes/files-in.inc.php:1148
492
+ #: s2member/includes/classes/files-in.inc.php:1320
493
  msgctxt "s2member-admin"
494
  msgid "Unable to create Amazon CloudFront Origin Access Identity. Connection failed."
495
  msgstr ""
496
 
497
+ #: s2member/includes/classes/files-in.inc.php:1151
498
  msgctxt "s2member-admin"
499
  msgid "Unable to clear existing Amazon CloudFront Origin Access Identity."
500
  msgstr ""
502
  #. translators: In this translation, `%s` may be filled with an English
503
  #. message, which comes from the Amazon CloudFront API call. Feel free to
504
  #. exclude `%s` if you like.
505
+ #: s2member/includes/classes/files-in.inc.php:1155
506
+ #: s2member/includes/classes/files-in.inc.php:1226
507
  msgctxt "s2member-admin"
508
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. %s"
509
  msgstr ""
510
 
511
+ #: s2member/includes/classes/files-in.inc.php:1158
512
+ #: s2member/includes/classes/files-in.inc.php:1229
513
  msgctxt "s2member-admin"
514
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. Connection failed."
515
  msgstr ""
516
 
517
+ #: s2member/includes/classes/files-in.inc.php:1161
518
  msgctxt "s2member-admin"
519
  msgid "Unable to clear existing Amazon CloudFront Streaming Distro."
520
  msgstr ""
522
  #. translators: In this translation, `%s` may be filled with an English
523
  #. message, which comes from the Amazon CloudFront API call. Feel free to
524
  #. exclude `%s` if you like.
525
+ #: s2member/includes/classes/files-in.inc.php:1165
526
  msgctxt "s2member-admin"
527
  msgid "Unable to acquire existing Amazon CloudFront Streaming Distro. %s"
528
  msgstr ""
529
 
530
+ #: s2member/includes/classes/files-in.inc.php:1168
531
  msgctxt "s2member-admin"
532
  msgid "Unable to acquire existing Amazon CloudFront Streaming Distro. Connection failed."
533
  msgstr ""
534
 
535
+ #: s2member/includes/classes/files-in.inc.php:1171
536
  msgctxt "s2member-admin"
537
  msgid "Unable to clear existing Amazon CloudFront Downloads Distro."
538
  msgstr ""
540
  #. translators: In this translation, `%s` may be filled with an English
541
  #. message, which comes from the Amazon CloudFront API call. Feel free to
542
  #. exclude `%s` if you like.
543
+ #: s2member/includes/classes/files-in.inc.php:1175
544
  msgctxt "s2member-admin"
545
  msgid "Unable to acquire existing Amazon CloudFront Downloads Distro. %s"
546
  msgstr ""
547
 
548
+ #: s2member/includes/classes/files-in.inc.php:1178
549
  msgctxt "s2member-admin"
550
  msgid "Unable to acquire existing Amazon CloudFront Downloads Distro. Connection failed."
551
  msgstr ""
552
 
553
+ #: s2member/includes/classes/files-in.inc.php:1181
554
  msgctxt "s2member-admin"
555
  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."
556
  msgstr ""
557
 
558
+ #: s2member/includes/classes/files-in.inc.php:1184
559
  msgctxt "s2member-admin"
560
  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."
561
  msgstr ""
563
  #. translators: In this translation, `%s` may be filled with an English
564
  #. message, which comes from the Amazon CloudFront API call. Feel free to
565
  #. exclude `%s` if you like.
566
+ #: s2member/includes/classes/files-in.inc.php:1222
567
  msgctxt "s2member-admin"
568
  msgid "Existing Amazon CloudFront Origin Access Identity NOT found. %s"
569
  msgstr ""
570
 
571
+ #: s2member/includes/classes/files-in.inc.php:1232
572
  msgctxt "s2member-admin"
573
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. Invalid Access ID."
574
  msgstr ""
575
 
576
+ #: s2member/includes/classes/files-in.inc.php:1274
577
  msgctxt "s2member-admin"
578
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. Connection failed."
579
  msgstr ""
580
 
581
+ #: s2member/includes/classes/files-in.inc.php:1277
582
  msgctxt "s2member-admin"
583
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. Invalid Access ID, ETag, or XML config."
584
  msgstr ""
585
 
586
+ #: s2member/includes/classes/files-in.inc.php:1304
587
+ #: s2member/includes/classes/files-in.inc.php:1531
588
+ #: s2member/includes/classes/files-in.inc.php:1553
589
  msgctxt "s2member-admin"
590
  msgid "Created by s2Member, for S3 Bucket: %s."
591
  msgstr ""
592
 
593
+ #: s2member/includes/classes/files-in.inc.php:1313
594
  msgctxt "s2member-admin"
595
  msgid "Unable to create/read Amazon CloudFront Origin Access Identity. Unexpected response."
596
  msgstr ""
598
  #. translators: In this translation, `%s` may be filled with an English
599
  #. message, which comes from the Amazon CloudFront API call. Feel free to
600
  #. exclude `%s` if you like.
601
+ #: s2member/includes/classes/files-in.inc.php:1359
602
  msgctxt "s2member-admin"
603
  msgid "Existing Amazon CloudFront Distro NOT found. %s"
604
  msgstr ""
606
  #. translators: In this translation, `%s` may be filled with an English
607
  #. message, which comes from the Amazon CloudFront API call. Feel free to
608
  #. exclude `%s` if you like.
609
+ #: s2member/includes/classes/files-in.inc.php:1363
610
  msgctxt "s2member-admin"
611
  msgid "Unable to acquire existing Amazon CloudFront Distro. %s"
612
  msgstr ""
613
 
614
+ #: s2member/includes/classes/files-in.inc.php:1366
615
  msgctxt "s2member-admin"
616
  msgid "Unable to acquire existing Amazon CloudFront Distro. Connection failed."
617
  msgstr ""
618
 
619
+ #: s2member/includes/classes/files-in.inc.php:1369
620
  msgctxt "s2member-admin"
621
  msgid "Unable to acquire existing Amazon CloudFront Distro. Invalid Distro ID and/or Distro type."
622
  msgstr ""
624
  #. translators: In this translation, `%s` may be filled with an English
625
  #. message, which comes from the Amazon CloudFront API call. Feel free to
626
  #. exclude `%s` if you like.
627
+ #: s2member/includes/classes/files-in.inc.php:1413
628
+ #: s2member/includes/classes/files-in.inc.php:1488
629
  msgctxt "s2member-admin"
630
  msgid "Unable to disable existing Amazon CloudFront Distro. %s"
631
  msgstr ""
632
 
633
+ #: s2member/includes/classes/files-in.inc.php:1416
634
+ #: s2member/includes/classes/files-in.inc.php:1491
635
  msgctxt "s2member-admin"
636
  msgid "Unable to disable existing Amazon CloudFront Distro. Connection failed."
637
  msgstr ""
638
 
639
+ #: s2member/includes/classes/files-in.inc.php:1419
640
  msgctxt "s2member-admin"
641
  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."
642
  msgstr ""
643
 
644
+ #: s2member/includes/classes/files-in.inc.php:1425
645
  msgctxt "s2member-admin"
646
  msgid "Unable to disable existing Amazon CloudFront Distro. Invalid Distro ID, ETag, or XML config."
647
  msgstr ""
649
  #. translators: In this translation, `%s` may be filled with an English
650
  #. message, which comes from the Amazon CloudFront API call. Feel free to
651
  #. exclude `%s` if you like.
652
+ #: s2member/includes/classes/files-in.inc.php:1470
653
  msgctxt "s2member-admin"
654
  msgid "Unable to delete existing Amazon CloudFront Distro. %s"
655
  msgstr ""
656
 
657
+ #: s2member/includes/classes/files-in.inc.php:1473
658
  msgctxt "s2member-admin"
659
  msgid "Unable to delete existing Amazon CloudFront Distro. Connection failed."
660
  msgstr ""
662
  #. translators: In this translation, `%s` may be filled with an English
663
  #. message, which comes from the Amazon CloudFront API call. Feel free to
664
  #. exclude `%s` if you like.
665
+ #: s2member/includes/classes/files-in.inc.php:1477
666
  msgctxt "s2member-admin"
667
  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."
668
  msgstr ""
670
  #. translators: In this translation, `%s` may be filled with an English
671
  #. message, which comes from the Amazon CloudFront API call. Feel free to
672
  #. exclude `%s` if you like.
673
+ #: s2member/includes/classes/files-in.inc.php:1481
674
  msgctxt "s2member-admin"
675
  msgid "Unable to check status of existing Amazon CloudFront Distro. %s"
676
  msgstr ""
677
 
678
+ #: s2member/includes/classes/files-in.inc.php:1484
679
  msgctxt "s2member-admin"
680
  msgid "Unable to check status of existing Amazon CloudFront Distro. Connection failed."
681
  msgstr ""
682
 
683
+ #: s2member/includes/classes/files-in.inc.php:1494
684
  msgctxt "s2member-admin"
685
  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."
686
  msgstr ""
687
 
688
+ #: s2member/includes/classes/files-in.inc.php:1497
689
  msgctxt "s2member-admin"
690
  msgid "Unable to delete existing Amazon CloudFront Distro. Invalid Distro ID or ETag."
691
  msgstr ""
692
 
693
+ #: s2member/includes/classes/files-in.inc.php:1540
694
  msgctxt "s2member-admin"
695
  msgid "Unable to create/read Amazon CloudFront Downloads Distro. Unexpected response."
696
  msgstr ""
697
 
698
+ #: s2member/includes/classes/files-in.inc.php:1562
699
  msgctxt "s2member-admin"
700
  msgid "Unable to create/read Amazon CloudFront Streaming Distro. Unexpected response."
701
  msgstr ""
702
 
703
+ #: s2member/includes/classes/files-in.inc.php:1573
704
  msgctxt "s2member-admin"
705
  msgid "Unable to create Amazon CloudFront Distro. Invalid Distro type."
706
  msgstr ""
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 160120
4
- Stable tag: 160120
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -17,7 +17,7 @@ Authorize.Net® Compatible: yes w/s2Member® Pro
17
  Google® Checkout Compatible: yes w/s2Member® Pro
18
  ClickBank® Compatible: yes w/s2Member® Pro
19
 
20
- Tested up to: 4.4
21
  Requires at least: 4.2
22
 
23
  Requires PHP: 5.2+
@@ -169,12 +169,30 @@ Released under the terms of the [GNU General Public License](http://www.gnu.org/
169
 
170
  == Upgrade Notice ==
171
 
172
- = v160120 =
173
 
174
  (Maintenance Release) Upgrade immediately.
175
 
176
  == Changelog ==
177
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  = v160120 =
179
 
180
  - (s2Member,s2Member Pro) **Bug Fix:** Resolved a minor glitch in the **WordPress Dashboard → Settings → General** panel, where s2Member's notice regarding Open Registration was inadvertently forcing the entire page into italics. Props @renzms @kristineds @raamdev ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/831) if you'd like additional details.
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 160303
4
+ Stable tag: 160303
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
17
  Google® Checkout Compatible: yes w/s2Member® Pro
18
  ClickBank® Compatible: yes w/s2Member® Pro
19
 
20
+ Tested up to: 4.5-alpha
21
  Requires at least: 4.2
22
 
23
  Requires PHP: 5.2+
169
 
170
  == Upgrade Notice ==
171
 
172
+ = v160303 =
173
 
174
  (Maintenance Release) Upgrade immediately.
175
 
176
  == Changelog ==
177
 
178
+ = v160303 =
179
+
180
+ - (s2Member/s2Member Pro) **Comet Cache Compat.:** This release improves compatibility with Comet Cache (formerly ZenCache), whenever you have it configured to cache logged-in users. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/888). Props @KTS915 for reporting!
181
+
182
+ - (s2Member Pro) **ClickBank IPN v6 Compat.:** Version 6 of the ClickBank IPN system was recently updated in a way that causes it to return `transactionType = CANCEL-TEST-REBILL` in test mode, instead of the previous value, which was: `TEST_CANCEL-REBILL`. s2Member Pro has been updated to understand either/or. See also [this GitHub issue](https://github.com/websharks/s2member/issues/882) for further details.
183
+
184
+ - (s2Member Pro) **Stripe Bug Fix:** This release corrects a bug caused by typos in the source code that were preventing refunds from being processed as expected whenever Stripe was integrated. Props @YearOfBenj for reporting this important issue. Props @patdumond for relaying vital information. See also [this GitHub issue](https://github.com/websharks/s2member/issues/874) if you'd like additional details.
185
+
186
+ - (s2Member Pro) **PayPal Bug Fix:** Under some conditions, the EOT behavior in s2Member Pro (when integrated with PayPal Pro) would immediately terminate access whenever a customer's subscription naturally expires. Recent versions of the Payflow system set the status to `EXPIRED`, and this was handled as an immediate EOT instead of as a delayed EOT that is subject to date calculations to determine the correct date on which a customer should lose access; i.e., based on what they have already paid for. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/873) if you'd like additional details.
187
+
188
+ - (s2Member Pro) **One-Time Offer Bug Fix:** This release corrects some inconsistencies in the One-Time Offers system that comes with s2Member Pro. Symptoms included seemingly unpredictable behavior whenever redirections were configured without a specific Membership Level. Props @jacobposey for reporting. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/855) if you'd like additional details.
189
+
190
+ - (s2Member/s2Member Pro) **Bug Fix:** s2Member was not properly respecting `DISALLOW_FILE_MODS` in a specific scenario related to GZIP. Props @renzms @kristineds. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/832) for further details.
191
+
192
+ - (s2Member,s2Member Pro) **Bug Fix:** Resolved a minor glitch in the **WordPress Dashboard → Settings → General** panel, where s2Member's notice regarding Open Registration was inadvertently forcing the entire page into italics. Props @renzms @kristineds @raamdev ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/831) if you'd like additional details.
193
+
194
+ - (s2Member/s2Member Pro) **PayPal Sandbox:** This release updates the inline documentation under the PayPal Account Settings section of s2Member. We now suggest that instead of enabling PayPal Sandbox Mode (sometimes buggy at best), that site owners run tests with low-dollar amounts against a live PayPal account instead; e.g., $0.01 test transactions in live mode work great also. See [this GitHub issue](https://github.com/websharks/s2member/issues/891) if you'd like additional details. Props @raamdev for mentioning this again.
195
+
196
  = v160120 =
197
 
198
  - (s2Member,s2Member Pro) **Bug Fix:** Resolved a minor glitch in the **WordPress Dashboard → Settings → General** panel, where s2Member's notice regarding Open Registration was inadvertently forcing the entire page into italics. Props @renzms @kristineds @raamdev ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/831) if you'd like additional details.
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 160120
23
- Stable tag: 160120
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
@@ -35,7 +35,7 @@ Authorize.Net Compatible: yes w/s2Member Pro
35
  Google Wallet Compatible: yes w/s2Member Pro
36
  ClickBank Compatible: yes w/s2Member Pro
37
 
38
- Tested up to: 4.4
39
  Requires at least: 4.2
40
 
41
  Requires PHP: 5.2+
@@ -81,7 +81,7 @@ if(!defined('WPINC')) // MUST have WordPress.
81
  * @var string
82
  */
83
  if(!defined('WS_PLUGIN__S2MEMBER_VERSION'))
84
- define('WS_PLUGIN__S2MEMBER_VERSION', '160120' /* !#distro-version#! */);
85
  /**
86
  * Minimum PHP version required to run s2Member.
87
  *
@@ -111,7 +111,7 @@ if(!defined('WS_PLUGIN__S2MEMBER_MIN_WP_VERSION'))
111
  * @var string
112
  */
113
  if(!defined('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION'))
114
- define('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION', '160120' /* !#distro-version#! */);
115
  /*
116
  Several compatibility checks.
117
  If all pass, load the s2Member plugin.
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
+ Version: 160303
23
+ Stable tag: 160303
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
35
  Google Wallet Compatible: yes w/s2Member Pro
36
  ClickBank Compatible: yes w/s2Member Pro
37
 
38
+ Tested up to: 4.5-alpha
39
  Requires at least: 4.2
40
 
41
  Requires PHP: 5.2+
81
  * @var string
82
  */
83
  if(!defined('WS_PLUGIN__S2MEMBER_VERSION'))
84
+ define('WS_PLUGIN__S2MEMBER_VERSION', '160303' /* !#distro-version#! */);
85
  /**
86
  * Minimum PHP version required to run s2Member.
87
  *
111
  * @var string
112
  */
113
  if(!defined('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION'))
114
+ define('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION', '160303' /* !#distro-version#! */);
115
  /*
116
  Several compatibility checks.
117
  If all pass, load the s2Member plugin.