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

Version Description

= v160423 =

(Maintenance Release) Upgrade immediately.

Download this release

Release Info

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

Code changes from version 160303 to 160423

changelog.md CHANGED
@@ -1,3 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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!
1
+ = v160423 =
2
+
3
+ - (s2Member/s2Member Pro) **WP v4.5 Compatibility.** This release offers full compatibility with the latest release of WordPress v4.5. Nothing major was changed for standard WordPress installations, but there were a few subtle tweaks here and there to improve v4.5 compatibility. We encourage all users to upgrade right away.
4
+
5
+ **NOTE: WP v4.5 for Multisite Networks running s2Member Pro:** This release corrects a bug first introduced in the previous release of s2Member Pro that resulted in an error message (`Uncaught Error: Class 'c_ws_plugin__s2member_mms_patches' not found`) when updating to WP v4.5. It has been corrected in this release, but in order to avoid this problem altogether please follow this procedure when upgrading WordPress.
6
+
7
+ **WP v4.5 Multisite Upgrade Procedure:**
8
+
9
+ - Upgrade s2Member and s2Member Pro ​_before_​ updating WordPress core.
10
+ - Then upgrade WordPress core and observe that Multisite Patches are applied properly.
11
+
12
+ _If you have already upgraded to WP v4.5 and worked past this issue by patching manually, that's fine. You can still upgrade s2Member and s2Member Pro. After the upgrade you may feel free to enable automatic patching again if that's desirable._
13
+
14
+ - (s2Member/s2Member Pro) **Bug Fix:** This release corrects a bug first introduced in the previous release which was causing a PHP warning about `cf_stream_extn_resource_exclusions`. A symptom was to have mysterious problems with `[s2Stream /]` or the `[s2File /]` shortcode. Fixed in this release. Props at @raamdev @renzms for reporting. See also [this GitHub issue](https://github.com/websharks/s2member/issues/901) for details.
15
+
16
+ - (s2Member/s2Member Pro) **PayPal SSL Compatibility:** This release of s2Member provides an `https://` IPN URL for PayPal IPN integrations. It also provides a helpful note (in the Dashboard) about a new requirement that PayPal has with respect to the IPN URL that you configure at PayPal.com. s2Member has been updated to help you with this new requirement.
17
+
18
+ **New PayPal.com IPN Requirement:** PayPal.com is now requiring any new IPN URL that you configure to be entered as an `https://` URL; i.e., if you log into your PayPal.com account and try to configure a _brand new_ IPN URL, that URL _must_ use `https://`. PayPal.com will refuse it otherwise.
19
+
20
+ However, the `notify_url=` parameter in standard PayPal buttons should continue to work with either `http://` or `https://`, and any existing configurations out there that still use an `http://` IPN URL should continue to work as well. So this is about planning for the future. We have been told that PayPal will eventually _require_ that all IPN URLs use an `https://` protocol; i.e., they will eventually stop supporting `http://` IPN URLs altogether (at some point in the future), they are not giving anyone a date yet. For this reason we strongly suggest that you [review the details given here](https://github.com/websharks/s2member/issues/914).
21
+
22
+ Since PayPal is moving in a direction that will eventually require all site owners to have an SSL certificate in the future, s2Member's instructions (and the IPN URL it provides you with) will now be presented in the form of an `https://` URL with additional details to help you through the process of configuring an IPN handler for PayPal.
23
+
24
+ See: **Dashboard → s2Member → PayPal Options → PayPal IPN Integration**
25
+
26
+ Props @codeforest for reporting. See [this GitHub issue](https://github.com/websharks/s2member/issues/914) for further details.
27
+
28
+ - (s2Member/s2Member Pro) **Bug Fix:** Email field on Registration page not shown as required via `*` symbol like other fields in this form. Caused by a change in WordPress core. Fixed in this release. Props @spottydog63 @renzms. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/907) for details.
29
+
30
+ - (s2Member/s2Member Pro) **Bug Fix:** `E_NOTICE` level errors in cache handler when running in `WP_DEBUG` mode. Props at @KTS915 for reporting. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/917).
31
+
32
+ - (s2Member/s2Member Pro) **i18n Compatibility:** This release of s2Member moves the `load_plugin_textdomain()` call into the `plugins_loaded` hook instead of it being run on `init`. Props @KTS915 for reporting. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/899) for details.
33
+
34
+ - (s2Member Pro) **Multisite Patches:** Fixed a bug (`Uncaught Error: Class 'c_ws_plugin__s2member_mms_patches' not found`) whenever WordPress was being updated and Multisite Patches were being applied in the pro version of s2Member. See: [this GitHub issue](https://github.com/websharks/s2member/issues/929) for details.
35
+
36
+ - (s2Member/s2Member Pro) **Security Enhancement:** This release of s2Member defaults PayPal Button Encryption to a value of `on` instead of `off`; i.e., there is a new default behavior. Existing s2Member installations are unaffected by this change, but if you install s2Member on a new site you will notice that (if using PayPal Buttons), Button Encryption will be enabled by default.
37
+
38
+ _Note that in order for Button Encryption to work, you must fill-in the API credentials for s2Member under: **Dashboard → s2Member → PayPal Options → PayPal Account Details**_
39
+
40
  = v160303 =
41
 
42
  - (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!
checksum.txt CHANGED
@@ -1 +1 @@
1
- b155b61fde7bcce8dfd5e9eb3e002338
1
+ 65cb8fb2c54e7bc8e9bc128514c4b0f5
includes/classes/cache.inc.php CHANGED
@@ -11,94 +11,82 @@
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\Cache
15
  * @since 3.5
16
  */
17
- if(!defined('WPINC')) // MUST have WordPress.
18
- exit("Do not access this file directly.");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
- if (!class_exists ("c_ws_plugin__s2member_cache"))
21
- {
22
- /**
23
- * s2Member's caching routines.
24
- *
25
- * @package s2Member\Cache
26
- * @since 3.5
27
- */
28
- class c_ws_plugin__s2member_cache
29
- {
30
- /**
31
- * Page links needed for Constants.
32
- *
33
- * Page links are cached into the s2Member options on 15 min intervals.
34
- * This allows the API Constants to provide quick access to them without being
35
- * forced to execute {@link http://codex.wordpress.org/Function_Reference/get_page_link get_page_link()}
36
- * all the time, which piles up DB queries.
37
- *
38
- * @package s2Member\Cache
39
- * @since 3.5
40
- *
41
- * @return array Array of cached Page links.
42
- */
43
- public static function cached_page_links ()
44
- {
45
- do_action("ws_plugin__s2member_before_cached_page_links", get_defined_vars ());
46
 
47
- $lwp = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["login_welcome_page"];
48
- $mop = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"];
49
- $fdlep = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"];
50
 
51
- $lwp_cache = @$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["login_welcome_page"];
52
- $mop_cache = @$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["membership_options_page"];
53
- $fdlep_cache = @$GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["file_download_limit_exceeded_page"];
54
 
55
- $links = array("login_welcome_page" => "", "membership_options_page" => "", "file_download_limit_exceeded_page" => "");
 
56
 
57
- if (isset ($lwp_cache["page"], $lwp_cache["time"], $lwp_cache["link"]) && $lwp_cache["page"] === $lwp && $lwp_cache["time"] >= strtotime ("-15 minutes") && $lwp_cache["link"])
58
- {
59
- $links["login_welcome_page"] = $lwp_cache["link"];
60
- }
61
- else // Otherwise, query the database using ``get_page_link()`` and update the cache.
62
- {
63
- $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["login_welcome_page"]["page"] = $lwp;
64
- $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["login_welcome_page"]["time"] = time ();
65
- $links["login_welcome_page"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["login_welcome_page"]["link"] = ($lwp) ? get_page_link ($lwp) : home_url("/");
66
 
67
- $cache_needs_updating = /* Flag for cache update. */ true;
68
- }
69
- if (isset ($mop_cache["page"], $mop_cache["time"], $mop_cache["link"]) && $mop_cache["page"] === $mop && $mop_cache["time"] >= strtotime ("-15 minutes") && $mop_cache["link"])
70
- {
71
- $links["membership_options_page"] = $mop_cache["link"];
72
- }
73
- else // Otherwise, query the database using ``get_page_link()`` and update the cache.
74
- {
75
- $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["membership_options_page"]["page"] = $mop;
76
- $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["membership_options_page"]["time"] = time ();
77
- $links["membership_options_page"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["membership_options_page"]["link"] = ($mop) ? get_page_link ($mop) : home_url("/");
78
-
79
- $cache_needs_updating = /* Flag for cache update. */ true;
80
- }
81
- if (isset ($fdlep_cache["page"], $fdlep_cache["time"], $fdlep_cache["link"]) && $fdlep_cache["page"] === $fdlep && $fdlep_cache["time"] >= strtotime ("-15 minutes") && $fdlep_cache["link"])
82
- {
83
- $links["file_download_limit_exceeded_page"] = $fdlep_cache["link"];
84
- }
85
- else // Otherwise, query the database using ``get_page_link()`` and update the cache.
86
- {
87
- $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["file_download_limit_exceeded_page"]["page"] = $fdlep;
88
- $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["file_download_limit_exceeded_page"]["time"] = time ();
89
- $links["file_download_limit_exceeded_page"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]["file_download_limit_exceeded_page"]["link"] = ($fdlep) ? get_page_link ($fdlep) : home_url("/");
90
-
91
- $cache_needs_updating = /* Flag for cache update. */ true;
92
- }
93
- if /* Cache is also reset dynamically during back-end option updates. */ (isset($cache_needs_updating) && $cache_needs_updating)
94
- {
95
- update_option ("ws_plugin__s2member_cache", $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["cache"]);
96
- }
97
- $scheme = /* SSL mode? */ (is_ssl ()) ? "https" : "http";
98
- foreach /* Conversions for SSL and non-SSL mode. */ ($links as &$link)
99
- $link = preg_replace ("/^https?\:\/\//i", $scheme . "://", $link);
100
-
101
- return apply_filters("ws_plugin__s2member_cached_page_links", $links, get_defined_vars ());
102
- }
103
- }
104
- }
11
  * along with this software. In the main directory, see: /licensing/
12
  * If not, see: {@link http://www.gnu.org/licenses/}.
13
  *
 
14
  * @since 3.5
15
  */
16
+ if (!defined('WPINC')) { // MUST have WordPress.
17
+ exit('Do not access this file directly.');
18
+ }
19
+ if (!class_exists('c_ws_plugin__s2member_cache')) {
20
+ /**
21
+ * s2Member's caching routines.
22
+ *
23
+ * @since 3.5
24
+ */
25
+ class c_ws_plugin__s2member_cache
26
+ {
27
+ /**
28
+ * Page links needed for Constants.
29
+ *
30
+ * Page links are cached into the s2Member options on 15 min intervals.
31
+ * This allows the API Constants to provide quick access to them without being
32
+ * forced to execute {@link http://codex.wordpress.org/Function_Reference/get_page_link get_page_link()}
33
+ * all the time, which piles up DB queries.
34
+ *
35
+ * @since 3.5
36
+ *
37
+ * @return array Array of cached Page links.
38
+ */
39
+ public static function cached_page_links()
40
+ {
41
+ do_action('ws_plugin__s2member_before_cached_page_links', get_defined_vars());
42
 
43
+ $lwp = $GLOBALS['WS_PLUGIN__']['s2member']['o']['login_welcome_page'];
44
+ $mop = $GLOBALS['WS_PLUGIN__']['s2member']['o']['membership_options_page'];
45
+ $fdlep = $GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_limit_exceeded_page'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
 
47
+ $lwp_cache = isset($GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['login_welcome_page'])
48
+ ? $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['login_welcome_page'] : null;
 
49
 
50
+ $mop_cache = isset($GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['membership_options_page'])
51
+ ? $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['membership_options_page'] : null;
 
52
 
53
+ $fdlep_cache = isset($GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['file_download_limit_exceeded_page'])
54
+ ? $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['file_download_limit_exceeded_page'] : null;
55
 
56
+ $links = ['login_welcome_page' => '', 'membership_options_page' => '', 'file_download_limit_exceeded_page' => ''];
 
 
 
 
 
 
 
 
57
 
58
+ if (isset($lwp_cache['page'], $lwp_cache['time'], $lwp_cache['link']) && $lwp_cache['page'] === $lwp && $lwp_cache['time'] >= strtotime('-15 minutes') && $lwp_cache['link']) {
59
+ $links['login_welcome_page'] = $lwp_cache['link'];
60
+ } else { // Otherwise, query the database using ``get_page_link()`` and update the cache.
61
+ $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['login_welcome_page']['page'] = $lwp;
62
+ $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['login_welcome_page']['time'] = time();
63
+ $links['login_welcome_page'] = $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['login_welcome_page']['link'] = ($lwp) ? get_page_link($lwp) : home_url('/');
64
+ $cache_needs_updating = true; // Flag for cache update.
65
+ }
66
+ if (isset($mop_cache['page'], $mop_cache['time'], $mop_cache['link']) && $mop_cache['page'] === $mop && $mop_cache['time'] >= strtotime('-15 minutes') && $mop_cache['link']) {
67
+ $links['membership_options_page'] = $mop_cache['link'];
68
+ } else { // Otherwise, query the database using ``get_page_link()`` and update the cache.
69
+ $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['membership_options_page']['page'] = $mop;
70
+ $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['membership_options_page']['time'] = time();
71
+ $links['membership_options_page'] = $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['membership_options_page']['link'] = ($mop) ? get_page_link($mop) : home_url('/');
72
+ $cache_needs_updating = true; // Flag for cache update.
73
+ }
74
+ if (isset($fdlep_cache['page'], $fdlep_cache['time'], $fdlep_cache['link']) && $fdlep_cache['page'] === $fdlep && $fdlep_cache['time'] >= strtotime('-15 minutes') && $fdlep_cache['link']) {
75
+ $links['file_download_limit_exceeded_page'] = $fdlep_cache['link'];
76
+ } else { // Otherwise, query the database using ``get_page_link()`` and update the cache.
77
+ $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['file_download_limit_exceeded_page']['page'] = $fdlep;
78
+ $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['file_download_limit_exceeded_page']['time'] = time();
79
+ $links['file_download_limit_exceeded_page'] = $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']['file_download_limit_exceeded_page']['link'] = ($fdlep) ? get_page_link($fdlep) : home_url('/');
80
+ $cache_needs_updating = true; // Flag for cache update.
81
+ }
82
+ if (isset($cache_needs_updating) && $cache_needs_updating) {
83
+ update_option('ws_plugin__s2member_cache', $GLOBALS['WS_PLUGIN__']['s2member']['c']['cache']);
84
+ }
85
+ $scheme = is_ssl() ? 'https' : 'http';
86
+ foreach ($links as &$link) { // Update scheme.
87
+ $link = preg_replace('/^https?\:\/\//i', $scheme.'://', $link);
88
+ }
89
+ return apply_filters('ws_plugin__s2member_cached_page_links', $links, get_defined_vars());
90
+ }
91
+ }
92
+ }
 
 
 
includes/classes/files-in.inc.php CHANGED
@@ -996,8 +996,9 @@ if(!class_exists('c_ws_plugin__s2member_files_in'))
996
 
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'].'}}}]}';
996
 
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));
1000
  $cf_ip_res = c_ws_plugin__s2member_utils_conds::is_localhost() || ($stream && !$cfc['rtmp_policy_include_ip']) ? FALSE : TRUE;
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'].'}}}]}';
includes/classes/paypal-notify-in.inc.php CHANGED
@@ -158,6 +158,11 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in'))
158
  }
159
  else // Extensive log reporting here. This is an area where many site owners find trouble. Depending on server configuration; remote HTTPS connections may fail.
160
  {
 
 
 
 
 
161
  $paypal['s2member_log'][] = 'Unable to verify $_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility.';
162
  $paypal['s2member_log'][] = 'Please see this KB article: `http://www.s2member.com/kb/server-scanner/`. We suggest that you run the s2Member Server Scanner.';
163
  $paypal['s2member_log'][] = var_export($_REQUEST, TRUE); // Recording _POST + _GET vars for analysis and debugging.
@@ -195,11 +200,20 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in'))
195
  do_action('ws_plugin__s2member_during_paypal_notify', get_defined_vars());
196
  unset($__refs, $__v);
197
  /*
198
- Output response headers; and perhaps a proxy return URL upon request.
199
  */
200
- status_header(200);
201
  header('Content-Type: text/plain; charset=UTF-8');
202
- while(@ob_end_clean()); exit (!empty($paypal['s2member_paypal_proxy_return_url']) ? $paypal['s2member_paypal_proxy_return_url'] : '');
 
 
 
 
 
 
 
 
 
203
  }
204
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
205
  do_action('ws_plugin__s2member_after_paypal_notify', get_defined_vars());
158
  }
159
  else // Extensive log reporting here. This is an area where many site owners find trouble. Depending on server configuration; remote HTTPS connections may fail.
160
  {
161
+ if (!empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'GET' && !empty($_SERVER['HTTP_USER_AGENT'])) {
162
+ if (preg_match('/(msie|trident|gecko|webkit|presto|konqueror|playstation)[\/ ]([0-9\.]+)/i', $_SERVER['HTTP_USER_AGENT'])) {
163
+ $paypal['s2member_indicator'] = 'This PayPal IPN Handler by s2Member® is active & listening.';
164
+ }
165
+ }
166
  $paypal['s2member_log'][] = 'Unable to verify $_POST vars. This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility.';
167
  $paypal['s2member_log'][] = 'Please see this KB article: `http://www.s2member.com/kb/server-scanner/`. We suggest that you run the s2Member Server Scanner.';
168
  $paypal['s2member_log'][] = var_export($_REQUEST, TRUE); // Recording _POST + _GET vars for analysis and debugging.
200
  do_action('ws_plugin__s2member_during_paypal_notify', get_defined_vars());
201
  unset($__refs, $__v);
202
  /*
203
+ Output response headers & content body.
204
  */
205
+ status_header(200); // OK status code.
206
  header('Content-Type: text/plain; charset=UTF-8');
207
+
208
+ while(@ob_end_clean()); // Clean output buffers.
209
+
210
+ if (!empty($paypal['s2member_paypal_proxy_return_url'])) {
211
+ exit($paypal['s2member_paypal_proxy_return_url']);
212
+ } elseif (!empty($paypal['s2member_indicator'])) {
213
+ exit($paypal['s2member_indicator']);
214
+ } else {
215
+ exit(); // Default behavior.
216
+ }
217
  }
218
  foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
219
  do_action('ws_plugin__s2member_after_paypal_notify', get_defined_vars());
includes/classes/sc-paypal-button-e.inc.php CHANGED
@@ -46,7 +46,12 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_e"))
46
  do_action("ws_plugin__s2member_before_sc_paypal_button_encryption", get_defined_vars ());
47
  unset($__refs, $__v);
48
 
49
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_btn_encryption"] && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"] && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_username"])
 
 
 
 
 
50
  {
51
  $cache = /* Are we caching? */ apply_filters("ws_plugin__s2member_sc_paypal_button_encryption_cache", true, get_defined_vars ());
52
 
46
  do_action("ws_plugin__s2member_before_sc_paypal_button_encryption", get_defined_vars ());
47
  unset($__refs, $__v);
48
 
49
+ if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_btn_encryption"]
50
+ && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"]
51
+ && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_username"]
52
+ && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_password"]
53
+ && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_api_signature"]
54
+ ) // Only if it is possible to connect to the PayPal API.
55
  {
56
  $cache = /* Are we caching? */ apply_filters("ws_plugin__s2member_sc_paypal_button_encryption_cache", true, get_defined_vars ());
57
 
includes/classes/sc-paypal-button-in.inc.php CHANGED
@@ -64,6 +64,9 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_in"))
64
  $attr["rr"] = /* Independent Ccaps require Buy Now. Only after running shortcode_atts(). */ ($attr["level"] === "*") ? "BN" : $attr["rr"];
65
  $attr["ns"] = /* No shipping directive must be 1 for digital items. After shortcode_atts(). */ ($attr["dg"] === "1") ? "1" : $attr["ns"];
66
 
 
 
 
67
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
68
  do_action("ws_plugin__s2member_before_sc_paypal_button_after_shortcode_atts", get_defined_vars ());
69
  unset($__refs, $__v);
@@ -106,7 +109,7 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_in"))
106
 
107
  $attr["sp_ids_exp"] = /* Combined "sp:ids:expiration hours". */ "sp:" . $attr["ids"] . ":" . $attr["exp"];
108
 
109
- $success_return_url = /* s2Member handles this all by itself. However, it can be Filtered. */ home_url ("/?s2member_paypal_return=1");
110
  $success_return_url = apply_filters("ws_plugin__s2member_during_sc_paypal_button_success_return_url", $success_return_url, get_defined_vars ());
111
 
112
  $code = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-sp-checkout-button.php")));
@@ -117,7 +120,7 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_in"))
117
  $code = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $code);
118
  $code = preg_replace ("/%%paypal_merchant_id%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_merchant_id"])), $code);
119
  $code = preg_replace ("/%%cancel_return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/"))), $code);
120
- $code = preg_replace ("/%%notify_url%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/?s2member_paypal_notify=1"))), $code);
121
  $code = preg_replace ("/%%return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($success_return_url)), $code);
122
  $code = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($attr["custom"])), $code);
123
 
@@ -162,7 +165,7 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_in"))
162
  $attr["level_ccaps_eotper"] = ($attr["rr"] === "BN" && $attr["rt"] !== "L") ? $attr["level"] . ":" . $attr["ccaps"] . ":" . $attr["rp"] . " " . $attr["rt"] : $attr["level"] . ":" . $attr["ccaps"];
163
  $attr["level_ccaps_eotper"] = /* Clean any trailing separators from this string. */ rtrim ($attr["level_ccaps_eotper"], ":");
164
 
165
- $success_return_url = /* s2Member handles this all by itself. However, it can be Filtered. */ home_url ("/?s2member_paypal_return=1");
166
  $success_return_url = apply_filters("ws_plugin__s2member_during_sc_paypal_button_success_return_url", $success_return_url, get_defined_vars ());
167
 
168
  $code = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-ccaps-checkout-button.php")));
@@ -173,7 +176,7 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_in"))
173
  $code = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $code);
174
  $code = preg_replace ("/%%paypal_merchant_id%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_merchant_id"])), $code);
175
  $code = preg_replace ("/%%cancel_return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/"))), $code);
176
- $code = preg_replace ("/%%notify_url%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/?s2member_paypal_notify=1"))), $code);
177
  $code = preg_replace ("/%%return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($success_return_url)), $code);
178
  $code = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($attr["custom"])), $code);
179
 
@@ -222,7 +225,7 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_in"))
222
 
223
  $success_return_tra = array("ta" => $attr["ta"], "tp" => $attr["tp"], "tt" => $attr["tt"], "ra" => $attr["ra"], "rp" => $attr["rp"], "rt" => $attr["rt"], "rr" => $attr["rr"], "rrt" => $attr["rrt"], "rra" => $attr["rra"], "invoice" => $paypal_invoice_input_value, "checksum" => md5 ($paypal_invoice_input_value . $_SERVER["REMOTE_ADDR"] . $attr["level_ccaps_eotper"]));
224
 
225
- $success_return_url = /* s2Member handles this all by itself. However, it can be Filtered (see below). */ home_url ("/?s2member_paypal_return=1");
226
  $success_return_url = add_query_arg ("s2member_paypal_return_tra", urlencode (c_ws_plugin__s2member_utils_encryption::encrypt (serialize ($success_return_tra))), $success_return_url);
227
  $success_return_url = apply_filters("ws_plugin__s2member_during_sc_paypal_button_success_return_url", $success_return_url, get_defined_vars ());
228
 
@@ -235,7 +238,7 @@ if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_in"))
235
  $code = preg_replace ("/%%paypal_merchant_id%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_merchant_id"])), $code);
236
  $code = preg_replace ("/%%level_label%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $attr["level"] . "_label"])), $code);
237
  $code = preg_replace ("/%%cancel_return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/"))), $code); // This brings them back to Front Page.
238
- $code = preg_replace ("/%%notify_url%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/?s2member_paypal_notify=1"))), $code);
239
  $code = preg_replace ("/%%return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($success_return_url)), $code);
240
  $code = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($attr["custom"])), $code);
241
  $code = preg_replace ("/%%level%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($attr["level"])), $code);
64
  $attr["rr"] = /* Independent Ccaps require Buy Now. Only after running shortcode_atts(). */ ($attr["level"] === "*") ? "BN" : $attr["rr"];
65
  $attr["ns"] = /* No shipping directive must be 1 for digital items. After shortcode_atts(). */ ($attr["dg"] === "1") ? "1" : $attr["ns"];
66
 
67
+ $force_notify_url_scheme = apply_filters("ws_plugin__s2member_during_sc_paypal_button_force_notify_url_scheme", null, get_defined_vars ());
68
+ $force_return_url_scheme = apply_filters("ws_plugin__s2member_during_sc_paypal_button_force_return_url_scheme", null, get_defined_vars ());
69
+
70
  foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
71
  do_action("ws_plugin__s2member_before_sc_paypal_button_after_shortcode_atts", get_defined_vars ());
72
  unset($__refs, $__v);
109
 
110
  $attr["sp_ids_exp"] = /* Combined "sp:ids:expiration hours". */ "sp:" . $attr["ids"] . ":" . $attr["exp"];
111
 
112
+ $success_return_url = /* s2Member handles this all by itself. However, it can be Filtered. */ home_url ("/?s2member_paypal_return=1", $force_return_url_scheme);
113
  $success_return_url = apply_filters("ws_plugin__s2member_during_sc_paypal_button_success_return_url", $success_return_url, get_defined_vars ());
114
 
115
  $code = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-sp-checkout-button.php")));
120
  $code = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $code);
121
  $code = preg_replace ("/%%paypal_merchant_id%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_merchant_id"])), $code);
122
  $code = preg_replace ("/%%cancel_return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/"))), $code);
123
+ $code = preg_replace ("/%%notify_url%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/?s2member_paypal_notify=1", $force_notify_url_scheme))), $code);
124
  $code = preg_replace ("/%%return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($success_return_url)), $code);
125
  $code = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($attr["custom"])), $code);
126
 
165
  $attr["level_ccaps_eotper"] = ($attr["rr"] === "BN" && $attr["rt"] !== "L") ? $attr["level"] . ":" . $attr["ccaps"] . ":" . $attr["rp"] . " " . $attr["rt"] : $attr["level"] . ":" . $attr["ccaps"];
166
  $attr["level_ccaps_eotper"] = /* Clean any trailing separators from this string. */ rtrim ($attr["level_ccaps_eotper"], ":");
167
 
168
+ $success_return_url = /* s2Member handles this all by itself. However, it can be Filtered. */ home_url ("/?s2member_paypal_return=1", $force_return_url_scheme);
169
  $success_return_url = apply_filters("ws_plugin__s2member_during_sc_paypal_button_success_return_url", $success_return_url, get_defined_vars ());
170
 
171
  $code = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/buttons/paypal-ccaps-checkout-button.php")));
176
  $code = preg_replace ("/%%paypal_business%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_business"])), $code);
177
  $code = preg_replace ("/%%paypal_merchant_id%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_merchant_id"])), $code);
178
  $code = preg_replace ("/%%cancel_return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/"))), $code);
179
+ $code = preg_replace ("/%%notify_url%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/?s2member_paypal_notify=1", $force_notify_url_scheme))), $code);
180
  $code = preg_replace ("/%%return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($success_return_url)), $code);
181
  $code = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($attr["custom"])), $code);
182
 
225
 
226
  $success_return_tra = array("ta" => $attr["ta"], "tp" => $attr["tp"], "tt" => $attr["tt"], "ra" => $attr["ra"], "rp" => $attr["rp"], "rt" => $attr["rt"], "rr" => $attr["rr"], "rrt" => $attr["rrt"], "rra" => $attr["rra"], "invoice" => $paypal_invoice_input_value, "checksum" => md5 ($paypal_invoice_input_value . $_SERVER["REMOTE_ADDR"] . $attr["level_ccaps_eotper"]));
227
 
228
+ $success_return_url = /* s2Member handles this all by itself. However, it can be Filtered (see below). */ home_url ("/?s2member_paypal_return=1", $force_return_url_scheme);
229
  $success_return_url = add_query_arg ("s2member_paypal_return_tra", urlencode (c_ws_plugin__s2member_utils_encryption::encrypt (serialize ($success_return_tra))), $success_return_url);
230
  $success_return_url = apply_filters("ws_plugin__s2member_during_sc_paypal_button_success_return_url", $success_return_url, get_defined_vars ());
231
 
238
  $code = preg_replace ("/%%paypal_merchant_id%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["paypal_merchant_id"])), $code);
239
  $code = preg_replace ("/%%level_label%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $attr["level"] . "_label"])), $code);
240
  $code = preg_replace ("/%%cancel_return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/"))), $code); // This brings them back to Front Page.
241
+ $code = preg_replace ("/%%notify_url%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr (home_url ("/?s2member_paypal_notify=1", $force_notify_url_scheme))), $code);
242
  $code = preg_replace ("/%%return%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($success_return_url)), $code);
243
  $code = preg_replace ("/%%custom%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($attr["custom"])), $code);
244
  $code = preg_replace ("/%%level%%/", c_ws_plugin__s2member_utils_strings::esc_refs (esc_attr ($attr["level"])), $code);
includes/classes/translations.inc.php CHANGED
@@ -33,7 +33,7 @@ if(!class_exists("c_ws_plugin__s2member_translations"))
33
  * @package s2Member\Translations
34
  * @since 110815
35
  *
36
- * @attaches-to ``add_action("init");``
37
  *
38
  * @return null
39
  */
@@ -73,6 +73,8 @@ if(!class_exists("c_ws_plugin__s2member_translations"))
73
  global $current_site, $current_blog; // In support of Multisite Networking.
74
  static $s = array(); // This static array optimizes all of these routines.
75
 
 
 
76
  if((isset ($s["is_wp_login"]) && $s["is_wp_login"]) || (!isset ($s["is_wp_login"]) && ($s["is_wp_login"] = (strpos($_SERVER["REQUEST_URI"], "/wp-login.php") !== FALSE && empty($_REQUEST["action"]) && empty($_REQUEST["checkemail"])) ? TRUE : FALSE)))
77
  {
78
  if($original === "Username") // Give Filters a chance here.
@@ -94,7 +96,7 @@ if(!class_exists("c_ws_plugin__s2member_translations"))
94
  {
95
  $translated = apply_filters("ws_plugin__s2member_translation_mangler", _x("Password *", "s2member-front", "s2member"), get_defined_vars());
96
  }
97
- else if($original === "E-mail") // Give Filters a chance here.
98
  {
99
  $translated = apply_filters("ws_plugin__s2member_translation_mangler", _x("Email Address *", "s2member-front", "s2member"), get_defined_vars());
100
  }
33
  * @package s2Member\Translations
34
  * @since 110815
35
  *
36
+ * @attaches-to ``add_action("plugins_loaded");``
37
  *
38
  * @return null
39
  */
73
  global $current_site, $current_blog; // In support of Multisite Networking.
74
  static $s = array(); // This static array optimizes all of these routines.
75
 
76
+ if(!did_action("init")) return $translated; // Do nothing until `init` has been fired by WP core.
77
+
78
  if((isset ($s["is_wp_login"]) && $s["is_wp_login"]) || (!isset ($s["is_wp_login"]) && ($s["is_wp_login"] = (strpos($_SERVER["REQUEST_URI"], "/wp-login.php") !== FALSE && empty($_REQUEST["action"]) && empty($_REQUEST["checkemail"])) ? TRUE : FALSE)))
79
  {
80
  if($original === "Username") // Give Filters a chance here.
96
  {
97
  $translated = apply_filters("ws_plugin__s2member_translation_mangler", _x("Password *", "s2member-front", "s2member"), get_defined_vars());
98
  }
99
+ else if($original === "Email") // Give Filters a chance here.
100
  {
101
  $translated = apply_filters("ws_plugin__s2member_translation_mangler", _x("Email Address *", "s2member-front", "s2member"), get_defined_vars());
102
  }
includes/hooks.inc.php CHANGED
@@ -19,9 +19,9 @@ if(!defined('WPINC')) // MUST have WordPress.
19
  /*
20
  Add the plugin Actions/Filters here.
21
  */
22
- add_action('set_current_user', 'c_ws_plugin__s2member_user_securities::set_current_user', 2);
23
 
24
- add_action('init', 'c_ws_plugin__s2member_translations::load', 2);
25
 
26
  add_action('init', 'c_ws_plugin__s2member_ssl::check_force_ssl', 3);
27
  add_action('init', 'c_ws_plugin__s2member_user_securities::initialize', 3);
19
  /*
20
  Add the plugin Actions/Filters here.
21
  */
22
+ add_action('plugins_loaded', 'c_ws_plugin__s2member_translations::load');
23
 
24
+ add_action('set_current_user', 'c_ws_plugin__s2member_user_securities::set_current_user', 2);
25
 
26
  add_action('init', 'c_ws_plugin__s2member_ssl::check_force_ssl', 3);
27
  add_action('init', 'c_ws_plugin__s2member_user_securities::initialize', 3);
includes/menu-pages/down-ops.inc.php CHANGED
@@ -58,7 +58,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
58
  echo '<div class="ws-menu-page-section ws-plugin--s2member-restrictions-section">'."\n";
59
  echo '<h3>File Download Restrictions (required, if providing access to protected files)</h3>'."\n";
60
  echo '<p>If your Membership offering allows access to restricted files, you\'ll want to configure these options.</p>'."\n";
61
- echo '<p class="info"><strong>NOTE:</strong> If you intend to offer File Downloads in one way or another, you must configure at least one of the options below. For security purposes, s2Member\'s File Download functionality is disabled unless &amp; until at least one of the options below have been configured; i.e., s2Member expects you to configure Basic Downloads for at least one Membership Level before any sort of download-related functionality will work. This includes functionality associated with the <code>[s2File /]</code> and <code>[s2Stream /]</code> Shortcodes also.</p>'."\n";
62
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_restrictions", get_defined_vars());
63
 
64
  echo '<div class="ws-menu-page-hr"></div>'."\n";
58
  echo '<div class="ws-menu-page-section ws-plugin--s2member-restrictions-section">'."\n";
59
  echo '<h3>File Download Restrictions (required, if providing access to protected files)</h3>'."\n";
60
  echo '<p>If your Membership offering allows access to restricted files, you\'ll want to configure these options.</p>'."\n";
61
+ echo '<p class="info"><strong>NOTE:</strong> If you intend to offer File Downloads in one way or another, you must configure at least one of the options below (i.e., by filling in at least one row w/ the number of downloads and the number of days too). For security purposes, s2Member\'s File Download functionality is disabled unless &amp; until at least one of the options below have been configured; i.e., s2Member expects you to configure Basic Downloads for at least one Membership Level before any sort of download-related functionality will work. This includes functionality associated with the <code>[s2File /]</code> and <code>[s2Stream /]</code> Shortcodes also.</p>'."\n";
62
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_restrictions", get_defined_vars());
63
 
64
  echo '<div class="ws-menu-page-hr"></div>'."\n";
includes/menu-pages/paypal-ops.inc.php CHANGED
@@ -348,11 +348,16 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
348
 
349
  echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-ipn-section">'."\n";
350
  echo '<h3>PayPal IPN / Instant Payment Notifications (required, please enable)</h3>'."\n";
351
- echo '<p>Log into your PayPal account and navigate to this section:<br /><strong>Account Profile → Instant Payment Notification Preferences</strong></p>'."\n";
352
  echo '<p>Edit your IPN settings &amp; turn IPN Notifications: <strong><code>On</code></strong></p>'."\n";
353
- echo '<p>You\'ll need your IPN URL, which is:<br /><code>'.esc_html(home_url("/?s2member_paypal_notify=1")).'</code></p>'."\n";
354
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn", get_defined_vars());
355
 
 
 
 
 
 
356
  echo '<h3 style="margin:0;">More Information (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-details\').toggle(); return false;" class="ws-dotted-link">click here</a>)</h3>'."\n";
357
  echo '<div id="ws-plugin--s2member-paypal-ipn-details" style="margin-top:10px; display:none;">'."\n";
358
  echo '<p><em><strong>Quick Tip:</strong> In addition to the <a href="http://s2member.com/r/paypal-ipn-setup/" target="_blank" rel="external">default IPN settings inside your PayPal account</a>, the IPN URL is also set on a per-transaction basis by the special PayPal Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal account, that\'s OK. s2Member dynamically sets the IPN URL for each transaction. The result is that the IPN URL configured from within your PayPal account, becomes the default, which is then overwritten on a per-transaction basis. In fact, PayPal recently updated their system to support IPN URL preservation. One PayPal account can handle multiple sites, all using different IPN URLs.</em></p>'."\n";
@@ -365,7 +370,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
365
  echo '<h3 style="margin:0;">IPN w/ Proxy Key (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-proxy-details\').toggle(); return false;" class="ws-dotted-link">optional, for 3rd-party integrations</a>)</h3>'."\n";
366
  echo '<div id="ws-plugin--s2member-paypal-ipn-proxy-details" style="margin-top:10px; display:none;">'."\n";
367
  echo '<p>If you\'re using a 3rd-party application that needs to POST simulated IPN transactions to your s2Member installation, you can use this alternate IPN URL, which includes a Proxy Key. This encrypted Proxy Key verifies incoming data being received by s2Member\'s IPN processor. You can change <em>[proxy-gateway]</em> to whatever you like. The <em>[proxy-gateway]</em> value is required. It will be stored by s2Member as the Customer\'s Paid Subscr. Gateway. Your [proxy-gateway] value will also be reflected in s2Member\'s IPN log.</p>'."\n";
368
- echo '<input type="text" autocomplete="off" value="'.format_to_edit(home_url("/?s2member_paypal_notify=1&s2member_paypal_proxy=[proxy-gateway]&s2member_paypal_proxy_verification=".urlencode(c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen()))).'" style="width:99%;" />'."\n";
369
  echo '<p><em>Any 3rd-party application that is sending IPN transactions to your s2Member installation must include the <code>custom</code> POST variable, and that variable must always start with your installation domain (i.e., custom=<code>'.esc_html($_SERVER["HTTP_HOST"]).'</code>). In addition, the <code>item_number</code> variable must always match a format that s2Member looks for. Generally speaking, the <code>item_number</code> should be <code>1, 2, 3, or 4</code>, indicating a specific s2Member Level #. However, s2Member also uses some advanced formats in this field. Just to be sure, we suggest creating a PayPal Button with the s2Member Button Generator, and then taking a look at the Full Button Code to see how s2Member expects <code>item_number</code> to be formatted. Other than the aforementioned exceptions, all other POST variables should follow PayPal standards. Please see: <a href="http://www.s2member.com/paypal-ipn-pdt-vars" target="_blank" rel="external">PayPal\'s IPN/PDT reference guide</a> for full documentation.</em></p>'."\n";
370
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_proxy", get_defined_vars());
371
  echo '</div>'."\n";
348
 
349
  echo '<div class="ws-menu-page-section ws-plugin--s2member-paypal-ipn-section">'."\n";
350
  echo '<h3>PayPal IPN / Instant Payment Notifications (required, please enable)</h3>'."\n";
351
+ echo '<p>Log into your PayPal account and navigate to this section:<br /><strong>Account Profile → <a href="http://s2member.com/r/paypal-com-ipn-configuration-page/" target="_blank" rel="external">Instant Payment Notification Preferences</a></strong></p>'."\n";
352
  echo '<p>Edit your IPN settings &amp; turn IPN Notifications: <strong><code>On</code></strong></p>'."\n";
353
+ echo '<p>You\'ll need your IPN URL, which is:<br /><code>'.esc_html(home_url("/?s2member_paypal_notify=1", "https")).'</code></p>'."\n";
354
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn", get_defined_vars());
355
 
356
+ echo '<h4 style="margin-bottom:0;"><strong class="ws-menu-page-hilite">Note: SSL is required by PayPal</strong></h4>'."\n";
357
+ echo '<p style="margin-top:0;">If you configure your PayPal.com account using the URL above, your site <strong><em>must</em> support SSL</strong> (i.e., the <code>https://</code> protocol). In other words, PayPal\'s system will refuse to accept any URL that does not begin with <code>https://</code>. The IPN URL that s2Member provides (see above) <em>does</em> start with <code>https://</code>. However, that doesn\'t necessarily mean that the URL actually works. Please be sure that your hosting account is configured with a valid SSL certificate before giving this URL to PayPal.</p>'."\n";
358
+
359
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
360
+
361
  echo '<h3 style="margin:0;">More Information (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-details\').toggle(); return false;" class="ws-dotted-link">click here</a>)</h3>'."\n";
362
  echo '<div id="ws-plugin--s2member-paypal-ipn-details" style="margin-top:10px; display:none;">'."\n";
363
  echo '<p><em><strong>Quick Tip:</strong> In addition to the <a href="http://s2member.com/r/paypal-ipn-setup/" target="_blank" rel="external">default IPN settings inside your PayPal account</a>, the IPN URL is also set on a per-transaction basis by the special PayPal Button Code that s2Member provides you with. In other words, if you have multiple sites operating on one PayPal account, that\'s OK. s2Member dynamically sets the IPN URL for each transaction. The result is that the IPN URL configured from within your PayPal account, becomes the default, which is then overwritten on a per-transaction basis. In fact, PayPal recently updated their system to support IPN URL preservation. One PayPal account can handle multiple sites, all using different IPN URLs.</em></p>'."\n";
370
  echo '<h3 style="margin:0;">IPN w/ Proxy Key (<a href="#" onclick="jQuery(\'div#ws-plugin--s2member-paypal-ipn-proxy-details\').toggle(); return false;" class="ws-dotted-link">optional, for 3rd-party integrations</a>)</h3>'."\n";
371
  echo '<div id="ws-plugin--s2member-paypal-ipn-proxy-details" style="margin-top:10px; display:none;">'."\n";
372
  echo '<p>If you\'re using a 3rd-party application that needs to POST simulated IPN transactions to your s2Member installation, you can use this alternate IPN URL, which includes a Proxy Key. This encrypted Proxy Key verifies incoming data being received by s2Member\'s IPN processor. You can change <em>[proxy-gateway]</em> to whatever you like. The <em>[proxy-gateway]</em> value is required. It will be stored by s2Member as the Customer\'s Paid Subscr. Gateway. Your [proxy-gateway] value will also be reflected in s2Member\'s IPN log.</p>'."\n";
373
+ echo '<input type="text" autocomplete="off" value="'.format_to_edit(home_url("/?s2member_paypal_notify=1&s2member_paypal_proxy=[proxy-gateway]&s2member_paypal_proxy_verification=".urlencode(c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen()), "https")).'" style="width:99%;" />'."\n";
374
  echo '<p><em>Any 3rd-party application that is sending IPN transactions to your s2Member installation must include the <code>custom</code> POST variable, and that variable must always start with your installation domain (i.e., custom=<code>'.esc_html($_SERVER["HTTP_HOST"]).'</code>). In addition, the <code>item_number</code> variable must always match a format that s2Member looks for. Generally speaking, the <code>item_number</code> should be <code>1, 2, 3, or 4</code>, indicating a specific s2Member Level #. However, s2Member also uses some advanced formats in this field. Just to be sure, we suggest creating a PayPal Button with the s2Member Button Generator, and then taking a look at the Full Button Code to see how s2Member expects <code>item_number</code> to be formatted. Other than the aforementioned exceptions, all other POST variables should follow PayPal standards. Please see: <a href="http://www.s2member.com/paypal-ipn-pdt-vars" target="_blank" rel="external">PayPal\'s IPN/PDT reference guide</a> for full documentation.</em></p>'."\n";
375
  do_action("ws_plugin__s2member_during_paypal_ops_page_during_left_sections_during_paypal_ipn_after_proxy", get_defined_vars());
376
  echo '</div>'."\n";
includes/syscon.inc.php CHANGED
@@ -225,7 +225,7 @@ if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults'))
225
  $default_options['paypal_api_password'] = '';
226
  $default_options['paypal_api_signature'] = '';
227
  $default_options['paypal_identity_token'] = '';
228
- $default_options['paypal_btn_encryption'] = '0';
229
 
230
  $default_options['paypal_payflow_api_username'] = '';
231
  $default_options['paypal_payflow_api_partner'] = 'PayPal';
225
  $default_options['paypal_api_password'] = '';
226
  $default_options['paypal_api_signature'] = '';
227
  $default_options['paypal_identity_token'] = '';
228
+ $default_options['paypal_btn_encryption'] = '1';
229
 
230
  $default_options['paypal_payflow_api_username'] = '';
231
  $default_options['paypal_payflow_api_partner'] = 'PayPal';
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: 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,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: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,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: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,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:1067
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: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,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: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,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: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,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: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,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: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,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: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,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: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,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: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,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: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,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:1359
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: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,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: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,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: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,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: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,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: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 ""
@@ -1033,11 +1033,11 @@ msgctxt "s2member-front"
1033
  msgid "—"
1034
  msgstr ""
1035
 
1036
- #: s2member/includes/classes/sc-paypal-button-e.inc.php:77
1037
- #: s2member/includes/classes/sc-paypal-button-in.inc.php:73
1038
- #: s2member/includes/classes/sc-paypal-button-in.inc.php:97
1039
- #: s2member/includes/classes/sc-paypal-button-in.inc.php:152
1040
- #: s2member/includes/classes/sc-paypal-button-in.inc.php:208
1041
  #: s2member/includes/templates/buttons/paypal-cancellation-button.php:7
1042
  #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:34
1043
  #: s2member/includes/templates/buttons/paypal-checkout-button.php:46
@@ -1049,37 +1049,37 @@ msgctxt "s2member-front paypal-button-lang-code"
1049
  msgid "en_US"
1050
  msgstr ""
1051
 
1052
- #: s2member/includes/classes/translations.inc.php:80
1053
  msgctxt "s2member-front"
1054
  msgid "Username:"
1055
  msgstr ""
1056
 
1057
- #: s2member/includes/classes/translations.inc.php:84
1058
  msgctxt "s2member-front"
1059
  msgid "My Password:"
1060
  msgstr ""
1061
 
1062
- #: s2member/includes/classes/translations.inc.php:91
1063
  msgctxt "s2member-front"
1064
  msgid "Username *"
1065
  msgstr ""
1066
 
1067
- #: s2member/includes/classes/translations.inc.php:95
1068
  msgctxt "s2member-front"
1069
  msgid "Password *"
1070
  msgstr ""
1071
 
1072
- #: s2member/includes/classes/translations.inc.php:99
1073
  msgctxt "s2member-front"
1074
  msgid "Email Address *"
1075
  msgstr ""
1076
 
1077
- #: s2member/includes/classes/translations.inc.php:106
1078
  msgctxt "s2member-front"
1079
  msgid "Registration complete. Please log in."
1080
  msgstr ""
1081
 
1082
- #: s2member/includes/classes/translations.inc.php:113
1083
  msgctxt "s2member-front"
1084
  msgid ""
1085
  "You have been invited to join `%1$s` at\n"
@@ -1088,25 +1088,25 @@ msgid ""
1088
  "%4$s\n"
1089
  msgstr ""
1090
 
1091
- #: s2member/includes/classes/translations.inc.php:120
1092
  msgctxt "s2member-front"
1093
  msgid "Your account is now active. <a href=\"%1$s\">Visit site</a> or <a href=\"%2$s\">Log in</a>."
1094
  msgstr ""
1095
 
1096
- #: s2member/includes/classes/translations.inc.php:140
1097
- #: s2member/includes/classes/translations.inc.php:161
1098
  msgctxt "s2member-front"
1099
  msgid "By filling out the form below, you can <strong>add a site to your account</strong>."
1100
  msgstr ""
1101
 
1102
- #: s2member/includes/classes/translations.inc.php:140
1103
  msgctxt "s2member-front"
1104
  msgid "You may create <strong>%s</strong> site."
1105
  msgid_plural "You may create up to <strong>%s</strong> sites."
1106
  msgstr[0] ""
1107
  msgstr[1] ""
1108
 
1109
- #: s2member/includes/classes/translations.inc.php:161
1110
  msgctxt "s2member-front"
1111
  msgid "You may create up to <strong>%s</strong> site."
1112
  msgid_plural "You may create up to <strong>%s</strong> sites."
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: 160423\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
+ "POT-Creation-Date: 2016-04-23 17:22:23+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: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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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
  #. 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 ""
1033
  msgid "—"
1034
  msgstr ""
1035
 
1036
+ #: s2member/includes/classes/sc-paypal-button-e.inc.php:82
1037
+ #: s2member/includes/classes/sc-paypal-button-in.inc.php:76
1038
+ #: s2member/includes/classes/sc-paypal-button-in.inc.php:100
1039
+ #: s2member/includes/classes/sc-paypal-button-in.inc.php:155
1040
+ #: s2member/includes/classes/sc-paypal-button-in.inc.php:211
1041
  #: s2member/includes/templates/buttons/paypal-cancellation-button.php:7
1042
  #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:34
1043
  #: s2member/includes/templates/buttons/paypal-checkout-button.php:46
1049
  msgid "en_US"
1050
  msgstr ""
1051
 
1052
+ #: s2member/includes/classes/translations.inc.php:82
1053
  msgctxt "s2member-front"
1054
  msgid "Username:"
1055
  msgstr ""
1056
 
1057
+ #: s2member/includes/classes/translations.inc.php:86
1058
  msgctxt "s2member-front"
1059
  msgid "My Password:"
1060
  msgstr ""
1061
 
1062
+ #: s2member/includes/classes/translations.inc.php:93
1063
  msgctxt "s2member-front"
1064
  msgid "Username *"
1065
  msgstr ""
1066
 
1067
+ #: s2member/includes/classes/translations.inc.php:97
1068
  msgctxt "s2member-front"
1069
  msgid "Password *"
1070
  msgstr ""
1071
 
1072
+ #: s2member/includes/classes/translations.inc.php:101
1073
  msgctxt "s2member-front"
1074
  msgid "Email Address *"
1075
  msgstr ""
1076
 
1077
+ #: s2member/includes/classes/translations.inc.php:108
1078
  msgctxt "s2member-front"
1079
  msgid "Registration complete. Please log in."
1080
  msgstr ""
1081
 
1082
+ #: s2member/includes/classes/translations.inc.php:115
1083
  msgctxt "s2member-front"
1084
  msgid ""
1085
  "You have been invited to join `%1$s` at\n"
1088
  "%4$s\n"
1089
  msgstr ""
1090
 
1091
+ #: s2member/includes/classes/translations.inc.php:122
1092
  msgctxt "s2member-front"
1093
  msgid "Your account is now active. <a href=\"%1$s\">Visit site</a> or <a href=\"%2$s\">Log in</a>."
1094
  msgstr ""
1095
 
1096
+ #: s2member/includes/classes/translations.inc.php:142
1097
+ #: s2member/includes/classes/translations.inc.php:163
1098
  msgctxt "s2member-front"
1099
  msgid "By filling out the form below, you can <strong>add a site to your account</strong>."
1100
  msgstr ""
1101
 
1102
+ #: s2member/includes/classes/translations.inc.php:142
1103
  msgctxt "s2member-front"
1104
  msgid "You may create <strong>%s</strong> site."
1105
  msgid_plural "You may create up to <strong>%s</strong> sites."
1106
  msgstr[0] ""
1107
  msgstr[1] ""
1108
 
1109
+ #: s2member/includes/classes/translations.inc.php:163
1110
  msgctxt "s2member-front"
1111
  msgid "You may create up to <strong>%s</strong> site."
1112
  msgid_plural "You may create up to <strong>%s</strong> sites."
readme.txt CHANGED
@@ -1,7 +1,7 @@
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
@@ -169,12 +169,51 @@ Released under the terms of the [GNU General Public License](http://www.gnu.org/
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!
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 160423
4
+ Stable tag: 160423
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
169
 
170
  == Upgrade Notice ==
171
 
172
+ = v160423 =
173
 
174
  (Maintenance Release) Upgrade immediately.
175
 
176
  == Changelog ==
177
 
178
+ = v160423 =
179
+
180
+ - (s2Member/s2Member Pro) **WP v4.5 Compatibility.** This release offers full compatibility with the latest release of WordPress v4.5. Nothing major was changed for standard WordPress installations, but there were a few subtle tweaks here and there to improve v4.5 compatibility. We encourage all users to upgrade right away.
181
+
182
+ **NOTE: WP v4.5 for Multisite Networks running s2Member Pro:** This release corrects a bug first introduced in the previous release of s2Member Pro that resulted in an error message (`Uncaught Error: Class 'c_ws_plugin__s2member_mms_patches' not found`) when updating to WP v4.5. It has been corrected in this release, but in order to avoid this problem altogether please follow this procedure when upgrading WordPress.
183
+
184
+ **WP v4.5 Multisite Upgrade Procedure:**
185
+
186
+ - Upgrade s2Member and s2Member Pro ​_before_​ updating WordPress core.
187
+ - Then upgrade WordPress core and observe that Multisite Patches are applied properly.
188
+
189
+ _If you have already upgraded to WP v4.5 and worked past this issue by patching manually, that's fine. You can still upgrade s2Member and s2Member Pro. After the upgrade you may feel free to enable automatic patching again if that's desirable._
190
+
191
+ - (s2Member/s2Member Pro) **Bug Fix:** This release corrects a bug first introduced in the previous release which was causing a PHP warning about `cf_stream_extn_resource_exclusions`. A symptom was to have mysterious problems with `[s2Stream /]` or the `[s2File /]` shortcode. Fixed in this release. Props at @raamdev @renzms for reporting. See also [this GitHub issue](https://github.com/websharks/s2member/issues/901) for details.
192
+
193
+ - (s2Member/s2Member Pro) **PayPal SSL Compatibility:** This release of s2Member provides an `https://` IPN URL for PayPal IPN integrations. It also provides a helpful note (in the Dashboard) about a new requirement that PayPal has with respect to the IPN URL that you configure at PayPal.com. s2Member has been updated to help you with this new requirement.
194
+
195
+ **New PayPal.com IPN Requirement:** PayPal.com is now requiring any new IPN URL that you configure to be entered as an `https://` URL; i.e., if you log into your PayPal.com account and try to configure a _brand new_ IPN URL, that URL _must_ use `https://`. PayPal.com will refuse it otherwise.
196
+
197
+ However, the `notify_url=` parameter in standard PayPal buttons should continue to work with either `http://` or `https://`, and any existing configurations out there that still use an `http://` IPN URL should continue to work as well. So this is about planning for the future. We have been told that PayPal will eventually _require_ that all IPN URLs use an `https://` protocol; i.e., they will eventually stop supporting `http://` IPN URLs altogether (at some point in the future), they are not giving anyone a date yet. For this reason we strongly suggest that you [review the details given here](https://github.com/websharks/s2member/issues/914).
198
+
199
+ Since PayPal is moving in a direction that will eventually require all site owners to have an SSL certificate in the future, s2Member's instructions (and the IPN URL it provides you with) will now be presented in the form of an `https://` URL with additional details to help you through the process of configuring an IPN handler for PayPal.
200
+
201
+ See: **Dashboard → s2Member → PayPal Options → PayPal IPN Integration**
202
+
203
+ Props @codeforest for reporting. See [this GitHub issue](https://github.com/websharks/s2member/issues/914) for further details.
204
+
205
+ - (s2Member/s2Member Pro) **Bug Fix:** Email field on Registration page not shown as required via `*` symbol like other fields in this form. Caused by a change in WordPress core. Fixed in this release. Props @spottydog63 @renzms. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/907) for details.
206
+
207
+ - (s2Member/s2Member Pro) **Bug Fix:** `E_NOTICE` level errors in cache handler when running in `WP_DEBUG` mode. Props at @KTS915 for reporting. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/917).
208
+
209
+ - (s2Member/s2Member Pro) **i18n Compatibility:** This release of s2Member moves the `load_plugin_textdomain()` call into the `plugins_loaded` hook instead of it being run on `init`. Props @KTS915 for reporting. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/899) for details.
210
+
211
+ - (s2Member Pro) **Multisite Patches:** Fixed a bug (`Uncaught Error: Class 'c_ws_plugin__s2member_mms_patches' not found`) whenever WordPress was being updated and Multisite Patches were being applied in the pro version of s2Member. See: [this GitHub issue](https://github.com/websharks/s2member/issues/929) for details.
212
+
213
+ - (s2Member/s2Member Pro) **Security Enhancement:** This release of s2Member defaults PayPal Button Encryption to a value of `on` instead of `off`; i.e., there is a new default behavior. Existing s2Member installations are unaffected by this change, but if you install s2Member on a new site you will notice that (if using PayPal Buttons), Button Encryption will be enabled by default.
214
+
215
+ _Note that in order for Button Encryption to work, you must fill-in the API credentials for s2Member under: **Dashboard → s2Member → PayPal Options → PayPal Account Details**_
216
+
217
  = v160303 =
218
 
219
  - (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!
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 160303
23
- Stable tag: 160303
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
@@ -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', '160303' /* !#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', '160303' /* !#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: 160423
23
+ Stable tag: 160423
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
81
  * @var string
82
  */
83
  if(!defined('WS_PLUGIN__S2MEMBER_VERSION'))
84
+ define('WS_PLUGIN__S2MEMBER_VERSION', '160423' /* !#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', '160423' /* !#distro-version#! */);
115
  /*
116
  Several compatibility checks.
117
  If all pass, load the s2Member plugin.