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

Version Description

= v130617 = (Maintenance Release) Upgrade immediately.

Download this release

Release Info

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

Code changes from version 130513 to 130617

checksum.txt CHANGED
@@ -1 +1 @@
1
- 166c616c7ba979776c192f9e6fcc5769
1
+ 4a206d6b3eba4c0a8d51bed207aac656
includes/classes/ip-restrictions.inc.php CHANGED
@@ -1,292 +1,301 @@
1
  <?php
2
  /**
3
- * IP Restrictions.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\IP_Restrictions
15
- * @since 3.5
16
- */
17
  if(realpath(__FILE__) === realpath($_SERVER["SCRIPT_FILENAME"]))
18
- exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_ip_restrictions"))
21
- {
22
- /**
23
- * IP Restrictions.
24
- *
25
- * @package s2Member\IP_Restrictions
26
- * @since 3.5
27
- */
28
- class c_ws_plugin__s2member_ip_restrictions
29
- {
30
- /**
31
- * Handles IP Restrictions.
32
- *
33
- * IP address details are stored as Transients.
34
- *
35
- * @package s2Member\IP_Restrictions
36
- * @since 3.5
37
- *
38
- * @param str $ip IP Address.
39
- * @param str $restriction Unique IP Restriction name/identifier. Such as a Username, or a unique access code.
40
- * @return bool True if IP Restrictions are OK, otherwise this function will exit script execution after issuing a warning.
41
- */
42
- public static function ip_restrictions_ok($ip = FALSE, $restriction = FALSE)
43
- {
44
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
45
- do_action("ws_plugin__s2member_before_ip_restrictions_ok", get_defined_vars());
46
- unset /* Unset defined __refs, __v. */ ($__refs, $__v);
47
-
48
- if(!apply_filters("ws_plugin__s2member_disable_all_ip_restrictions", false, get_defined_vars())
49
- /* Also allow specific exclusions here. */ && !apply_filters("ws_plugin__s2member_disable_specific_ip_restriction", false, get_defined_vars())
50
- /* And enabled by site owner? */ && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"] /* And a valid ``$restriction``? */ && $restriction && is_string($restriction)
51
- /* Flag indicating that we ARE processing this IP Restriction. Useful in Hooks/Filters. */ && ($processing = true))
52
- {
53
- $msg_503 = _x('<strong>503: Service Temporarily Unavailable</strong><br />Too many IP addresses accessing one secure area<em>!</em><br />Please contact Support if you need assistance.', "s2member-front", "s2member");
54
-
55
- $prefix = /* s2Member Transient prefix for all IP Restrictions. Allows s2Member to find these easily. */ "s2m_ipr_";
56
-
57
- $transient_entries = $prefix.md5("s2member_ip_restrictions_".$restriction."_entries");
58
- $transient_security_breach = $prefix.md5("s2member_ip_restrictions_".$restriction."_security_breach");
59
-
60
- // If you add Filters, use a string compatible with PHP's strtotime() function.
61
- $concurrency = apply_filters("ws_plugin__s2member_ip_restrictions__concurrency_time_per_ip", "30 days");
62
-
63
- $entries = (is_array($entries = get_transient($transient_entries))) ? $entries : array();
64
-
65
- foreach /* Auto-expire entries, based on time. */($entries as $_entry => $_time)
66
- if /* Based on time. */($_time < strtotime("-".$concurrency))
67
- unset /* Unset this entry value. */($entries[$_entry]);
68
-
69
- $ip = ($ip && is_string($ip)) ? $ip : /* Allow empty IPs. */ "empty";
70
- $entries[$ip] = /* Log entry. Add IP with entry time. */ strtotime("now");
71
- set_transient($transient_entries, $entries, 2 * (strtotime("+".$concurrency) - strtotime("now")));
72
-
73
- if /* Already breached security? */(get_transient($transient_security_breach))
74
- {
75
- c_ws_plugin__s2member_no_cache::no_cache_constants(true);
76
-
77
- status_header /* Send a 503 error status header; temporarily unavailable. */(503);
78
- wp_clear_auth_cookie /* Clear authorization cookies; we need to log them out now. */();
79
- header /* Content-Type text/html with UTF-8. */("Content-Type: text/html; charset=UTF-8");
80
- while (@ob_end_clean ()); // Clean any existing output buffers.
81
-
82
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
83
- do_action("ws_plugin__s2member_during_ip_restrictions_ok_no", get_defined_vars());
84
- unset /* Unset defined __refs, __v. */ ($__refs, $__v);
85
-
86
- exit /* Clean exit with 503 error message. */($msg_503);
87
- }
88
-
89
- else if(count($entries) > $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"])
90
- {
91
- c_ws_plugin__s2member_no_cache::no_cache_constants(true);
92
-
93
- set_transient // A security breach has just occurred. We need to set this Transient now.
94
- ($transient_security_breach, 1, $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction_time"]);
95
-
96
- status_header /* Send a 503 error status header; temporarily unavailable. */(503);
97
- wp_clear_auth_cookie /* Clear authorization cookies; we need to log them out now. */();
98
- header /* Content-Type text/html with UTF-8. */("Content-Type: text/html; charset=UTF-8");
99
- while (@ob_end_clean ()); // Clean any existing output buffers.
100
-
101
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
102
- do_action("ws_plugin__s2member_during_ip_restrictions_ok_no", get_defined_vars());
103
- unset /* Unset defined __refs, __v. */ ($__refs, $__v);
104
-
105
- exit /* Clean exit with 503 error message. */($msg_503);
106
- }
107
-
108
- else // OK, this looks legitimate. Apply Filters here and return true.
109
- {
110
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
111
- do_action("ws_plugin__s2member_during_ip_restrictions_ok_yes", get_defined_vars());
112
- unset /* Unset defined __refs, __v. */ ($__refs, $__v);
113
-
114
- return apply_filters("ws_plugin__s2member_ip_restrictions_ok", true, get_defined_vars());
115
- }
116
- }
117
-
118
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
119
- do_action("ws_plugin__s2member_during_ip_restrictions_ok_yes", get_defined_vars());
120
- unset /* Unset defined __refs, __v. */ ($__refs, $__v);
121
-
122
- return apply_filters("ws_plugin__s2member_ip_restrictions_ok", true, get_defined_vars());
123
- }
124
- /**
125
- * Queries Transients for specific IP Restrictions at or above max allowable.
126
- *
127
- * @package s2Member\IP_Restrictions
128
- * @since 130407
129
- *
130
- * @param str $restriction Unique IP Restriction name/identifier. Such as Username, or a unique access code.
131
- * @return bool TRUE if at or above max allowable IPs; else FALSE.
132
- */
133
- public static function specific_ip_restriction_at_or_above_max($restriction = FALSE)
134
- {
135
- do_action("ws_plugin__s2member_before_specific_ip_restriction_at_or_above_max", get_defined_vars());
136
-
137
- if(apply_filters("ws_plugin__s2member_disable_all_ip_restrictions", false, get_defined_vars())
138
- || apply_filters("ws_plugin__s2member_disable_specific_ip_restriction", false, get_defined_vars())
139
- || !$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"])
140
- return false; // No IP Restrictions in this case.
141
-
142
- $prefix = /* s2Member Transient prefix for all IP Restrictions. Allows s2Member to find these easily. */ "s2m_ipr_";
143
- $transient_entries = $prefix.md5("s2member_ip_restrictions_".(string)$restriction."_entries");
144
-
145
- // If you add Filters, use a string compatible with PHP's strtotime() function.
146
- $concurrency = apply_filters("ws_plugin__s2member_ip_restrictions__concurrency_time_per_ip", "30 days");
147
-
148
- $entries = (is_array($entries = get_transient($transient_entries))) ? $entries : array();
149
-
150
- foreach /* Auto-expire entries, based on time. */($entries as $_entry => $_time)
151
- if /* Based on time. */($_time < strtotime("-".$concurrency))
152
- unset /* Unset this entry value. */($entries[$_entry]);
153
-
154
- $at_or_above_max = (count($entries) >= $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"]);
155
-
156
- return apply_filters("ws_plugin__s2member_specific_ip_restriction_at_or_above_max", $at_or_above_max, get_defined_vars());
157
- }
158
- /**
159
- * Queries Transients for specific IP Restrictions associated with a security breach.
160
- *
161
- * @package s2Member\IP_Restrictions
162
- * @since 3.5
163
- *
164
- * @param str $restriction Unique IP Restriction name/identifier. Such as a Username, or a unique access code.
165
- * @return bool True if the specific IP Restriction is associated with a security breach, else false.
166
- */
167
- public static function specific_ip_restriction_breached_security($restriction = FALSE)
168
- {
169
- do_action("ws_plugin__s2member_before_specific_ip_restriction_breached_security", get_defined_vars());
170
-
171
- $prefix = /* s2Member Transient prefix for all IP Restrictions. */ "s2m_ipr_";
172
- $transient_security_breach = $prefix.md5("s2member_ip_restrictions_".(string)$restriction."_security_breach");
173
- $breached_security = $associated_with_security_breach = (get_transient($transient_security_breach)) ? true : false;
174
-
175
- return apply_filters("ws_plugin__s2member_specific_ip_restriction_breached_security", $breached_security, get_defined_vars());
176
- }
177
- /**
178
- * Resets/deletes specific IP Restrictions.
179
- *
180
- * @package s2Member\IP_Restrictions
181
- * @since 3.5
182
- *
183
- * @param str $restriction Unique IP Restriction name/identifier. Such as a Username, or a unique access code.
184
- * @return bool Always returns a `true` value.
185
- *
186
- * @todo Make return value conditional, based on success.
187
- */
188
- public static function delete_reset_specific_ip_restrictions($restriction = FALSE)
189
- {
190
- global /* Need global database object. */ $wpdb;
191
-
192
- do_action("ws_plugin__s2member_before_delete_reset_specific_ip_restrictions", get_defined_vars());
193
-
194
- $prefix /* s2Member Transient prefix for all IP Restrictions. */ = "s2m_ipr_";
195
- $transient_entries = $prefix.md5("s2member_ip_restrictions_".(string)$restriction."_entries");
196
- $transient_security_breach = $prefix.md5("s2member_ip_restrictions_".(string)$restriction."_security_breach");
197
-
198
- $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '%".esc_sql(like_escape($transient_entries))."'");
199
- $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '%".esc_sql(like_escape($transient_security_breach))."'");
200
-
201
- do_action("ws_plugin__s2member_after_delete_reset_specific_ip_restrictions", get_defined_vars());
202
-
203
- return apply_filters("ws_plugin__s2member_delete_reset_specific_ip_restrictions", true, get_defined_vars());
204
- }
205
- /**
206
- * Resets/deletes specific IP Restrictions via AJAX.
207
- *
208
- * @package s2Member\IP_Restrictions
209
- * @since 3.5
210
- *
211
- * @attaches-to ``add_action("wp_ajax_ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax");``
212
- *
213
- * @return null Exits script execution after returning data for AJAX caller.
214
- */
215
- public static function delete_reset_specific_ip_restrictions_via_ajax()
216
- {
217
- do_action("ws_plugin__s2member_before_delete_reset_specific_ip_restrictions_via_ajax", get_defined_vars());
218
-
219
- status_header /* Send a 200 OK status header. */(200);
220
- header /* Content-Type with UTF-8. */("Content-Type: text/plain; charset=UTF-8");
221
- while (@ob_end_clean ()); // Clean any existing output buffers.
222
-
223
- if /* Check privileges. Ability to create Users? */(current_user_can("create_users"))
224
-
225
- if(!empty($_POST["ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax"]))
226
- if(($nonce = $_POST["ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax"]))
227
- if(wp_verify_nonce($nonce, "ws-plugin--s2member-delete-reset-specific-ip-restrictions-via-ajax"))
228
-
229
- if(!empty($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))
230
- if(is_string /* Must be a string here. */($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))
231
- if(($restriction = trim(stripslashes($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))))
232
-
233
- if(c_ws_plugin__s2member_ip_restrictions::delete_reset_specific_ip_restrictions($restriction))
234
- $success = /* Yes, this IP Restriction was deleted/reset. */ true;
235
-
236
- exit(apply_filters("ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax", ((isset($success) && $success) ? "1" : "0"), get_defined_vars()));
237
- }
238
- /**
239
- * Resets/deletes all IP Restrictions.
240
- *
241
- * @package s2Member\IP_Restrictions
242
- * @since 3.5
243
- *
244
- * @return bool Always returns a `true` value.
245
- *
246
- * @todo Make return value conditional, based on success.
247
- */
248
- public static function delete_reset_all_ip_restrictions()
249
- {
250
- global /* Need global database object. */ $wpdb;
251
-
252
- do_action("ws_plugin__s2member_before_delete_reset_all_ip_restrictions", get_defined_vars());
253
-
254
- $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '".esc_sql(like_escape("_transient_s2m_ipr_"))."%'");
255
- $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '".esc_sql(like_escape("_transient_timeout_s2m_ipr_"))."%'");
256
-
257
- do_action("ws_plugin__s2member_after_delete_reset_all_ip_restrictions", get_defined_vars());
258
-
259
- return apply_filters("ws_plugin__s2member_delete_reset_all_ip_restrictions", true, get_defined_vars());
260
- }
261
- /**
262
- * Resets/deletes all IP Restrictions via AJAX.
263
- *
264
- * @package s2Member\IP_Restrictions
265
- * @since 3.5
266
- *
267
- * @attaches-to ``add_action("wp_ajax_ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax");``
268
- *
269
- * @return null Exits script execution after returning data for AJAX caller.
270
- */
271
- public static function delete_reset_all_ip_restrictions_via_ajax()
272
- {
273
- do_action("ws_plugin__s2member_before_delete_reset_all_ip_restrictions_via_ajax", get_defined_vars());
274
-
275
- status_header /* Send a 200 OK status header. */(200);
276
- header /* Content-Type with UTF-8. */("Content-Type: text/plain; charset=UTF-8");
277
- while (@ob_end_clean ()); // Clean any existing output buffers.
278
-
279
- if /* Check privileges. Ability to create Users? */(current_user_can("create_users"))
280
-
281
- if(!empty($_POST["ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax"]))
282
- if(($nonce = $_POST["ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax"]))
283
- if(wp_verify_nonce($nonce, "ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax"))
284
-
285
- if(c_ws_plugin__s2member_ip_restrictions::delete_reset_all_ip_restrictions())
286
- $success = /* Yes, all IP Restrictions were deleted/reset. */ true;
287
-
288
- exit(apply_filters("ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax", ((isset($success) && $success) ? "1" : "0"), get_defined_vars()));
289
- }
290
- }
291
- }
 
 
 
 
 
 
 
 
 
292
  ?>
1
  <?php
2
  /**
3
+ * IP Restrictions.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\IP_Restrictions
15
+ * @since 3.5
16
+ */
17
  if(realpath(__FILE__) === realpath($_SERVER["SCRIPT_FILENAME"]))
18
+ exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_ip_restrictions"))
21
+ {
22
+ /**
23
+ * IP Restrictions.
24
+ *
25
+ * @package s2Member\IP_Restrictions
26
+ * @since 3.5
27
+ */
28
+ class c_ws_plugin__s2member_ip_restrictions
29
+ {
30
+ /**
31
+ * Handles IP Restrictions.
32
+ *
33
+ * IP address details are stored as Transients.
34
+ *
35
+ * @package s2Member\IP_Restrictions
36
+ * @since 3.5
37
+ *
38
+ * @param str $ip IP Address.
39
+ * @param str $restriction Unique IP Restriction name/identifier. Such as a Username, or a unique access code.
40
+ * @return bool True if IP Restrictions are OK, otherwise this function will exit script execution after issuing a warning.
41
+ */
42
+ public static function ip_restrictions_ok($ip = FALSE, $restriction = FALSE)
43
+ {
44
+ foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
45
+ do_action("ws_plugin__s2member_before_ip_restrictions_ok", get_defined_vars());
46
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
47
+
48
+ if(!apply_filters("ws_plugin__s2member_disable_all_ip_restrictions", false, get_defined_vars())
49
+ /* Also allow specific exclusions here. */ && !apply_filters("ws_plugin__s2member_disable_specific_ip_restriction", false, get_defined_vars())
50
+ /* And enabled by site owner? */ && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"] /* And a valid ``$restriction``? */ && $restriction && is_string($restriction)
51
+ /* Flag indicating that we ARE processing this IP Restriction. Useful in Hooks/Filters. */ && ($processing = true))
52
+ {
53
+ $prefix = /* s2Member Transient prefix for all IP Restrictions. */ "s2m_ipr_";
54
+ $transient_entries = $prefix.md5("s2member_ip_restrictions_".$restriction."_entries");
55
+ $transient_security_breach = $prefix.md5("s2member_ip_restrictions_".$restriction."_security_breach");
56
+
57
+ // If you add Filters, use a string compatible with PHP's strtotime() function.
58
+ $concurrency = apply_filters("ws_plugin__s2member_ip_restrictions__concurrency_time_per_ip", "30 days");
59
+
60
+ $entries = (is_array($entries = get_transient($transient_entries))) ? $entries : array();
61
+
62
+ foreach /* Auto-expire entries, based on time. */($entries as $_entry => $_time)
63
+ if /* Based on time. */($_time < strtotime("-".$concurrency))
64
+ unset /* Unset this entry value. */($entries[$_entry]);
65
+
66
+ $ip = ($ip && is_string($ip)) ? $ip : /* Allow empty IPs. */ "empty";
67
+ $entries[$ip] = /* Log entry. Add IP with entry time. */ strtotime("now");
68
+ set_transient($transient_entries, $entries, 2 * (strtotime("+".$concurrency) - strtotime("now")));
69
+
70
+ if /* Already breached security? */(get_transient($transient_security_breach))
71
+ {
72
+ c_ws_plugin__s2member_no_cache::no_cache_constants(true);
73
+
74
+ status_header /* Send a 503 error status header; temporarily unavailable. */(503);
75
+ wp_clear_auth_cookie /* Clear authorization cookies; we need to log them out now. */();
76
+ header /* Content-Type text/html with UTF-8. */("Content-Type: text/html; charset=UTF-8");
77
+ while (@ob_end_clean ()); // Clean any existing output buffers.
78
+
79
+ $custom_template = (file_exists (TEMPLATEPATH . "/" . "ip-restrictions.php")) ? TEMPLATEPATH . "/" . "ip-restrictions.php" : false;
80
+ $custom_template = (file_exists (WP_CONTENT_DIR . "/" . "ip-restrictions.php")) ? WP_CONTENT_DIR . "/" . "ip-restrictions.php" : $custom_template;
81
+
82
+ $msg_503 = trim(file_get_contents((($custom_template) ? $custom_template : dirname(dirname(__FILE__))."/templates/errors/ip-restrictions.php")));
83
+ $msg_503 = trim(((!$custom_template || !is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? c_ws_plugin__s2member_utilities::evl($msg_503) : $msg_503));
84
+
85
+ foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
86
+ do_action("ws_plugin__s2member_during_ip_restrictions_ok_no", get_defined_vars());
87
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
88
+
89
+ exit /* Clean exit with 503 error message. */($msg_503);
90
+ }
91
+
92
+ else if(count($entries) > $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"])
93
+ {
94
+ c_ws_plugin__s2member_no_cache::no_cache_constants(true);
95
+
96
+ set_transient // A security breach has just occurred. We need to set this Transient now.
97
+ ($transient_security_breach, 1, $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction_time"]);
98
+
99
+ status_header /* Send a 503 error status header; temporarily unavailable. */(503);
100
+ wp_clear_auth_cookie /* Clear authorization cookies; we need to log them out now. */();
101
+ header /* Content-Type text/html with UTF-8. */("Content-Type: text/html; charset=UTF-8");
102
+ while (@ob_end_clean ()); // Clean any existing output buffers.
103
+
104
+ $custom_template = (file_exists (TEMPLATEPATH . "/" . "ip-restrictions.php")) ? TEMPLATEPATH . "/" . "ip-restrictions.php" : false;
105
+ $custom_template = (file_exists (WP_CONTENT_DIR . "/" . "ip-restrictions.php")) ? WP_CONTENT_DIR . "/" . "ip-restrictions.php" : $custom_template;
106
+
107
+ $msg_503 = trim(file_get_contents((($custom_template) ? $custom_template : dirname(dirname(__FILE__))."/templates/errors/ip-restrictions.php")));
108
+ $msg_503 = trim(((!$custom_template || !is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) ? c_ws_plugin__s2member_utilities::evl($msg_503) : $msg_503));
109
+
110
+ foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
111
+ do_action("ws_plugin__s2member_during_ip_restrictions_ok_no", get_defined_vars());
112
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
113
+
114
+ exit /* Clean exit with 503 error message. */($msg_503);
115
+ }
116
+
117
+ else // OK, this looks legitimate. Apply Filters here and return true.
118
+ {
119
+ foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
120
+ do_action("ws_plugin__s2member_during_ip_restrictions_ok_yes", get_defined_vars());
121
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
122
+
123
+ return apply_filters("ws_plugin__s2member_ip_restrictions_ok", true, get_defined_vars());
124
+ }
125
+ }
126
+
127
+ foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
128
+ do_action("ws_plugin__s2member_during_ip_restrictions_ok_yes", get_defined_vars());
129
+ unset /* Unset defined __refs, __v. */ ($__refs, $__v);
130
+
131
+ return apply_filters("ws_plugin__s2member_ip_restrictions_ok", true, get_defined_vars());
132
+ }
133
+ /**
134
+ * Queries Transients for specific IP Restrictions at or above max allowable.
135
+ *
136
+ * @package s2Member\IP_Restrictions
137
+ * @since 130407
138
+ *
139
+ * @param str $restriction Unique IP Restriction name/identifier. Such as Username, or a unique access code.
140
+ * @return bool TRUE if at or above max allowable IPs; else FALSE.
141
+ */
142
+ public static function specific_ip_restriction_at_or_above_max($restriction = FALSE)
143
+ {
144
+ do_action("ws_plugin__s2member_before_specific_ip_restriction_at_or_above_max", get_defined_vars());
145
+
146
+ if(apply_filters("ws_plugin__s2member_disable_all_ip_restrictions", false, get_defined_vars())
147
+ || apply_filters("ws_plugin__s2member_disable_specific_ip_restriction", false, get_defined_vars())
148
+ || !$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"])
149
+ return false; // No IP Restrictions in this case.
150
+
151
+ $prefix = /* s2Member Transient prefix for all IP Restrictions. Allows s2Member to find these easily. */ "s2m_ipr_";
152
+ $transient_entries = $prefix.md5("s2member_ip_restrictions_".(string)$restriction."_entries");
153
+
154
+ // If you add Filters, use a string compatible with PHP's strtotime() function.
155
+ $concurrency = apply_filters("ws_plugin__s2member_ip_restrictions__concurrency_time_per_ip", "30 days");
156
+
157
+ $entries = (is_array($entries = get_transient($transient_entries))) ? $entries : array();
158
+
159
+ foreach /* Auto-expire entries, based on time. */($entries as $_entry => $_time)
160
+ if /* Based on time. */($_time < strtotime("-".$concurrency))
161
+ unset /* Unset this entry value. */($entries[$_entry]);
162
+
163
+ $at_or_above_max = (count($entries) >= $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["max_ip_restriction"]);
164
+
165
+ return apply_filters("ws_plugin__s2member_specific_ip_restriction_at_or_above_max", $at_or_above_max, get_defined_vars());
166
+ }
167
+ /**
168
+ * Queries Transients for specific IP Restrictions associated with a security breach.
169
+ *
170
+ * @package s2Member\IP_Restrictions
171
+ * @since 3.5
172
+ *
173
+ * @param str $restriction Unique IP Restriction name/identifier. Such as a Username, or a unique access code.
174
+ * @return bool True if the specific IP Restriction is associated with a security breach, else false.
175
+ */
176
+ public static function specific_ip_restriction_breached_security($restriction = FALSE)
177
+ {
178
+ do_action("ws_plugin__s2member_before_specific_ip_restriction_breached_security", get_defined_vars());
179
+
180
+ $prefix = /* s2Member Transient prefix for all IP Restrictions. */ "s2m_ipr_";
181
+ $transient_security_breach = $prefix.md5("s2member_ip_restrictions_".(string)$restriction."_security_breach");
182
+ $breached_security = $associated_with_security_breach = (get_transient($transient_security_breach)) ? true : false;
183
+
184
+ return apply_filters("ws_plugin__s2member_specific_ip_restriction_breached_security", $breached_security, get_defined_vars());
185
+ }
186
+ /**
187
+ * Resets/deletes specific IP Restrictions.
188
+ *
189
+ * @package s2Member\IP_Restrictions
190
+ * @since 3.5
191
+ *
192
+ * @param str $restriction Unique IP Restriction name/identifier. Such as a Username, or a unique access code.
193
+ * @return bool Always returns a `true` value.
194
+ *
195
+ * @todo Make return value conditional, based on success.
196
+ */
197
+ public static function delete_reset_specific_ip_restrictions($restriction = FALSE)
198
+ {
199
+ global /* Need global database object. */ $wpdb;
200
+
201
+ do_action("ws_plugin__s2member_before_delete_reset_specific_ip_restrictions", get_defined_vars());
202
+
203
+ $prefix /* s2Member Transient prefix for all IP Restrictions. */ = "s2m_ipr_";
204
+ $transient_entries = $prefix.md5("s2member_ip_restrictions_".(string)$restriction."_entries");
205
+ $transient_security_breach = $prefix.md5("s2member_ip_restrictions_".(string)$restriction."_security_breach");
206
+
207
+ $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '%".esc_sql(like_escape($transient_entries))."'");
208
+ $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '%".esc_sql(like_escape($transient_security_breach))."'");
209
+
210
+ do_action("ws_plugin__s2member_after_delete_reset_specific_ip_restrictions", get_defined_vars());
211
+
212
+ return apply_filters("ws_plugin__s2member_delete_reset_specific_ip_restrictions", true, get_defined_vars());
213
+ }
214
+ /**
215
+ * Resets/deletes specific IP Restrictions via AJAX.
216
+ *
217
+ * @package s2Member\IP_Restrictions
218
+ * @since 3.5
219
+ *
220
+ * @attaches-to ``add_action("wp_ajax_ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax");``
221
+ *
222
+ * @return null Exits script execution after returning data for AJAX caller.
223
+ */
224
+ public static function delete_reset_specific_ip_restrictions_via_ajax()
225
+ {
226
+ do_action("ws_plugin__s2member_before_delete_reset_specific_ip_restrictions_via_ajax", get_defined_vars());
227
+
228
+ status_header /* Send a 200 OK status header. */(200);
229
+ header /* Content-Type with UTF-8. */("Content-Type: text/plain; charset=UTF-8");
230
+ while (@ob_end_clean ()); // Clean any existing output buffers.
231
+
232
+ if /* Check privileges. Ability to create Users? */(current_user_can("create_users"))
233
+
234
+ if(!empty($_POST["ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax"]))
235
+ if(($nonce = $_POST["ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax"]))
236
+ if(wp_verify_nonce($nonce, "ws-plugin--s2member-delete-reset-specific-ip-restrictions-via-ajax"))
237
+
238
+ if(!empty($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))
239
+ if(is_string /* Must be a string here. */($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))
240
+ if(($restriction = trim(stripslashes($_POST["ws_plugin__s2member_delete_reset_specific_ip_restriction"]))))
241
+
242
+ if(c_ws_plugin__s2member_ip_restrictions::delete_reset_specific_ip_restrictions($restriction))
243
+ $success = /* Yes, this IP Restriction was deleted/reset. */ true;
244
+
245
+ exit(apply_filters("ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax", ((isset($success) && $success) ? "1" : "0"), get_defined_vars()));
246
+ }
247
+ /**
248
+ * Resets/deletes all IP Restrictions.
249
+ *
250
+ * @package s2Member\IP_Restrictions
251
+ * @since 3.5
252
+ *
253
+ * @return bool Always returns a `true` value.
254
+ *
255
+ * @todo Make return value conditional, based on success.
256
+ */
257
+ public static function delete_reset_all_ip_restrictions()
258
+ {
259
+ global /* Need global database object. */ $wpdb;
260
+
261
+ do_action("ws_plugin__s2member_before_delete_reset_all_ip_restrictions", get_defined_vars());
262
+
263
+ $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '".esc_sql(like_escape("_transient_s2m_ipr_"))."%'");
264
+ $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '".esc_sql(like_escape("_transient_timeout_s2m_ipr_"))."%'");
265
+
266
+ do_action("ws_plugin__s2member_after_delete_reset_all_ip_restrictions", get_defined_vars());
267
+
268
+ return apply_filters("ws_plugin__s2member_delete_reset_all_ip_restrictions", true, get_defined_vars());
269
+ }
270
+ /**
271
+ * Resets/deletes all IP Restrictions via AJAX.
272
+ *
273
+ * @package s2Member\IP_Restrictions
274
+ * @since 3.5
275
+ *
276
+ * @attaches-to ``add_action("wp_ajax_ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax");``
277
+ *
278
+ * @return null Exits script execution after returning data for AJAX caller.
279
+ */
280
+ public static function delete_reset_all_ip_restrictions_via_ajax()
281
+ {
282
+ do_action("ws_plugin__s2member_before_delete_reset_all_ip_restrictions_via_ajax", get_defined_vars());
283
+
284
+ status_header /* Send a 200 OK status header. */(200);
285
+ header /* Content-Type with UTF-8. */("Content-Type: text/plain; charset=UTF-8");
286
+ while (@ob_end_clean ()); // Clean any existing output buffers.
287
+
288
+ if /* Check privileges. Ability to create Users? */(current_user_can("create_users"))
289
+
290
+ if(!empty($_POST["ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax"]))
291
+ if(($nonce = $_POST["ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax"]))
292
+ if(wp_verify_nonce($nonce, "ws-plugin--s2member-delete-reset-all-ip-restrictions-via-ajax"))
293
+
294
+ if(c_ws_plugin__s2member_ip_restrictions::delete_reset_all_ip_restrictions())
295
+ $success = /* Yes, all IP Restrictions were deleted/reset. */ true;
296
+
297
+ exit(apply_filters("ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax", ((isset($success) && $success) ? "1" : "0"), get_defined_vars()));
298
+ }
299
+ }
300
+ }
301
  ?>
includes/menu-pages/down-ops.inc.php CHANGED
@@ -300,7 +300,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
300
 
301
  echo '<td>'."\n";
302
  echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_files_access_key" id="ws-plugin--s2member-amazon-s3-files-access-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_access_key"]).'" /><br />'."\n";
303
- echo 'See: <code>Amazon® Web Services Account -› Security Credentials -› Access Credentials</code>.'."\n";
304
  echo '</td>'."\n";
305
 
306
  echo '</tr>'."\n";
@@ -317,7 +317,8 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
317
 
318
  echo '<td>'."\n";
319
  echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_files_secret_key" id="ws-plugin--s2member-amazon-s3-files-secret-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_secret_key"]).'" /><br />'."\n";
320
- echo 'See: <code>Amazon® Web Services Account -› Security Credentials -› Access Credentials</code>.'."\n";
 
321
  echo '</td>'."\n";
322
 
323
  echo '</tr>'."\n";
300
 
301
  echo '<td>'."\n";
302
  echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_files_access_key" id="ws-plugin--s2member-amazon-s3-files-access-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_access_key"]).'" /><br />'."\n";
303
+ echo 'See: <code>Amazon® Web Services Account -› Security Credentials -› Access Keys</code>.'."\n";
304
  echo '</td>'."\n";
305
 
306
  echo '</tr>'."\n";
317
 
318
  echo '<td>'."\n";
319
  echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_files_secret_key" id="ws-plugin--s2member-amazon-s3-files-secret-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_secret_key"]).'" /><br />'."\n";
320
+ echo 'See: <code>Amazon® Web Services Account -› Security Credentials -› Access Keys (leading to: Legacy Security Credentials)</code>.<br />'."\n";
321
+ echo 'Amazon® is deprecating Secret Access Keys, but they ARE still required for digitally signed URLs.'."\n";
322
  echo '</td>'."\n";
323
 
324
  echo '</tr>'."\n";
includes/templates/cfg-files/s2-cross-xml.php CHANGED
@@ -3,7 +3,7 @@ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
6
- <?xml version="1.0"?>
7
  <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
8
  <cross-domain-policy>
9
  <allow-access-from domain="*" />
3
  exit("Do not access this file directly.");
4
  ?>
5
 
6
+ <?php echo '<?xml version="1.0"?>'."\n"; ?>
7
  <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
8
  <cross-domain-policy>
9
  <allow-access-from domain="*" />
includes/templates/errors/index.php ADDED
File without changes
includes/templates/errors/ip-restrictions.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
+ exit("Do not access this file directly.");
4
+ ?>
5
+
6
+ <!DOCTYPE html>
7
+ <html>
8
+ <head>
9
+ <meta charset="UTF-8">
10
+ <title><?php echo _x('503: Service Temporarily Unavailable', "s2member-front", "s2member"); ?></title>
11
+ </head>
12
+ <body>
13
+ <?php echo _x('<strong>503: Service Temporarily Unavailable</strong><br />Too many IP addresses accessing one secure area<em>!</em><br />Please contact Support if you need assistance.', "s2member-front", "s2member"); ?>
14
+ </body>
15
+ </html>
includes/translations/s2member.pot CHANGED
@@ -4,7 +4,7 @@ msgid ""
4
  msgstr ""
5
  "Project-Id-Version: s2Member® Framework 130513\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
- "POT-Creation-Date: 2013-05-13 20:44:42+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -494,11 +494,6 @@ msgctxt "s2member-admin"
494
  msgid "Unable to create Amazon® CloudFront Distro. Invalid Distro type."
495
  msgstr ""
496
 
497
- #: s2member/includes/classes/ip-restrictions.inc.php:53
498
- msgctxt "s2member-front"
499
- msgid "<strong>503: Service Temporarily Unavailable</strong><br />Too many IP addresses accessing one secure area<em>!</em><br />Please contact Support if you need assistance."
500
- msgstr ""
501
-
502
  #: s2member/includes/classes/login-redirects.inc.php:51
503
  msgctxt "s2member-front"
504
  msgid "<strong>ERROR</strong>: Invalid username for this site."
@@ -817,8 +812,8 @@ msgstr ""
817
  #: s2member/includes/templates/buttons/paypal-checkout-button.php:46
818
  #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:34
819
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
820
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:267
821
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:511
822
  msgctxt "s2member-front paypal-button-lang-code"
823
  msgid "en_US"
824
  msgstr ""
@@ -1217,35 +1212,35 @@ msgstr ""
1217
  #: s2member/includes/s2member.js:231 s2member/includes/s2member.js:263
1218
  #: s2member/includes/s2member.js:290
1219
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1220
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:63
1221
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:70
1222
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:157
1223
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:164
1224
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:229
1225
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:236
1226
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:243
1227
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:250
1228
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:450
1229
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:457
1230
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:678
1231
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:685
1232
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:692
1233
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:699
1234
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1235
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:63
1236
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:70
1237
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:157
1238
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:164
1239
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:229
1240
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:236
1241
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:243
1242
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:250
1243
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:486
1244
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:493
1245
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:750
1246
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:757
1247
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:764
1248
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:771
1249
  msgctxt "s2member-front"
1250
  msgid "— Oops, you missed something: —"
1251
  msgstr ""
@@ -1253,11 +1248,11 @@ msgstr ""
1253
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:87
1254
  #: s2member/includes/s2member.js:192
1255
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1256
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:236
1257
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:685
1258
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1259
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:236
1260
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:757
1261
  msgctxt "s2member-front"
1262
  msgid "Passwords do not match up. Please try again."
1263
  msgstr ""
@@ -1265,11 +1260,11 @@ msgstr ""
1265
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:94
1266
  #: s2member/includes/s2member.js:199
1267
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1268
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:243
1269
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:692
1270
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1271
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:243
1272
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:764
1273
  msgctxt "s2member-front"
1274
  msgid "Password MUST be at least 6 characters. Please try again."
1275
  msgstr ""
@@ -1650,6 +1645,16 @@ msgctxt "s2member-admin"
1650
  msgid "Customizes Prices, Payments & Billing Cycle"
1651
  msgstr ""
1652
 
 
 
 
 
 
 
 
 
 
 
1653
  #: s2member/includes/templates/options/paypal-currencies.php:6
1654
  #: s2member-pro/includes/templates/options/authnet-currencies.php:6
1655
  #: s2member-pro/includes/templates/options/ccbill-currencies.php:6
@@ -3799,75 +3804,75 @@ msgid "My Profile Summary"
3799
  msgstr ""
3800
 
3801
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3802
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:70
3803
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:164
3804
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:250
3805
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:457
3806
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:699
3807
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3808
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:70
3809
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:164
3810
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:250
3811
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:493
3812
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:771
3813
  msgctxt "s2member-front"
3814
  msgid "Security Code missing. Please try again."
3815
  msgstr ""
3816
 
3817
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3818
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:139
3819
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:432
3820
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:660
3821
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3822
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:139
3823
  msgctxt "s2member-front"
3824
  msgid "Please choose a Billing Method."
3825
  msgstr ""
3826
 
3827
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3828
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:299
3829
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:507
3830
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3831
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:303
3832
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:547
3833
  msgctxt "s2member-front"
3834
  msgid "Calculating Sales Tax..."
3835
  msgstr ""
3836
 
3837
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3838
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:299
3839
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:507
3840
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3841
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:303
3842
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:547
3843
  msgctxt "s2member-front"
3844
  msgid "calculating sales tax..."
3845
  msgstr ""
3846
 
3847
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3848
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:310
3849
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:518
3850
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3851
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:314
3852
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:558
3853
  msgctxt "s2member-front"
3854
  msgid "<strong>Sales Tax%s:</strong> %s<br /><strong>— Total%s:</strong> %s"
3855
  msgstr ""
3856
 
3857
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3858
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:310
3859
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:518
3860
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3861
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:314
3862
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:558
3863
  msgctxt "s2member-front"
3864
  msgid "Today"
3865
  msgstr ""
3866
 
3867
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3868
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:580
3869
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3870
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:620
3871
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:47
3872
  #: s2member-pro/includes/templates/forms/authnet-registration-form.php:28
3873
  #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:47
@@ -3877,27 +3882,27 @@ msgid "Create Profile"
3877
  msgstr ""
3878
 
3879
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3880
- #: s2member-pro/includes/separates/gateways/authnet/authnet.js:581
3881
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3882
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:621
3883
  msgctxt "s2member-front"
3884
  msgid "Your Profile"
3885
  msgstr ""
3886
 
3887
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3888
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:266
3889
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:267
3890
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:510
3891
- #: s2member-pro/includes/separates/gateways/paypal/paypal.js:511
3892
  #: s2member-pro/includes/templates/forms/authnet-cancellation-form.php:34
3893
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:178
3894
  #: s2member-pro/includes/templates/forms/authnet-registration-form.php:79
3895
- #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:160
3896
  #: s2member-pro/includes/templates/forms/authnet-update-form.php:110
3897
  #: s2member-pro/includes/templates/forms/paypal-cancellation-form.php:34
3898
  #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:178
3899
  #: s2member-pro/includes/templates/forms/paypal-registration-form.php:79
3900
- #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:160
3901
  #: s2member-pro/includes/templates/forms/paypal-update-form.php:110
3902
  msgctxt "s2member-front"
3903
  msgid "Submit Form"
4
  msgstr ""
5
  "Project-Id-Version: s2Member® Framework 130513\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
+ "POT-Creation-Date: 2013-06-17 23:30:26+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
494
  msgid "Unable to create Amazon® CloudFront Distro. Invalid Distro type."
495
  msgstr ""
496
 
 
 
 
 
 
497
  #: s2member/includes/classes/login-redirects.inc.php:51
498
  msgctxt "s2member-front"
499
  msgid "<strong>ERROR</strong>: Invalid username for this site."
812
  #: s2member/includes/templates/buttons/paypal-checkout-button.php:46
813
  #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:34
814
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
815
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:270
816
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:514
817
  msgctxt "s2member-front paypal-button-lang-code"
818
  msgid "en_US"
819
  msgstr ""
1212
  #: s2member/includes/s2member.js:231 s2member/includes/s2member.js:263
1213
  #: s2member/includes/s2member.js:290
1214
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1215
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:66
1216
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:73
1217
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:160
1218
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:167
1219
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:232
1220
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:239
1221
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:246
1222
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:253
1223
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:453
1224
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:460
1225
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:681
1226
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:688
1227
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:695
1228
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:702
1229
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1230
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:66
1231
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:73
1232
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:160
1233
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:167
1234
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:232
1235
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:239
1236
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:246
1237
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:253
1238
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:489
1239
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:496
1240
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:753
1241
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:760
1242
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:767
1243
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:774
1244
  msgctxt "s2member-front"
1245
  msgid "— Oops, you missed something: —"
1246
  msgstr ""
1248
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:87
1249
  #: s2member/includes/s2member.js:192
1250
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1251
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:239
1252
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:688
1253
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1254
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:239
1255
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:760
1256
  msgctxt "s2member-front"
1257
  msgid "Passwords do not match up. Please try again."
1258
  msgstr ""
1260
  #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:94
1261
  #: s2member/includes/s2member.js:199
1262
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1263
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:246
1264
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:695
1265
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1266
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:246
1267
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:767
1268
  msgctxt "s2member-front"
1269
  msgid "Password MUST be at least 6 characters. Please try again."
1270
  msgstr ""
1645
  msgid "Customizes Prices, Payments & Billing Cycle"
1646
  msgstr ""
1647
 
1648
+ #: s2member/includes/templates/errors/ip-restrictions.php:10
1649
+ msgctxt "s2member-front"
1650
+ msgid "503: Service Temporarily Unavailable"
1651
+ msgstr ""
1652
+
1653
+ #: s2member/includes/templates/errors/ip-restrictions.php:13
1654
+ msgctxt "s2member-front"
1655
+ msgid "<strong>503: Service Temporarily Unavailable</strong><br />Too many IP addresses accessing one secure area<em>!</em><br />Please contact Support if you need assistance."
1656
+ msgstr ""
1657
+
1658
  #: s2member/includes/templates/options/paypal-currencies.php:6
1659
  #: s2member-pro/includes/templates/options/authnet-currencies.php:6
1660
  #: s2member-pro/includes/templates/options/ccbill-currencies.php:6
3804
  msgstr ""
3805
 
3806
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3807
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:73
3808
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:167
3809
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:253
3810
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:460
3811
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:702
3812
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3813
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:73
3814
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:167
3815
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:253
3816
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:496
3817
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:774
3818
  msgctxt "s2member-front"
3819
  msgid "Security Code missing. Please try again."
3820
  msgstr ""
3821
 
3822
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3823
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:142
3824
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:435
3825
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:663
3826
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3827
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:142
3828
  msgctxt "s2member-front"
3829
  msgid "Please choose a Billing Method."
3830
  msgstr ""
3831
 
3832
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3833
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:302
3834
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:510
3835
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3836
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:306
3837
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:550
3838
  msgctxt "s2member-front"
3839
  msgid "Calculating Sales Tax..."
3840
  msgstr ""
3841
 
3842
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3843
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:302
3844
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:510
3845
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3846
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:306
3847
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:550
3848
  msgctxt "s2member-front"
3849
  msgid "calculating sales tax..."
3850
  msgstr ""
3851
 
3852
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3853
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:313
3854
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:521
3855
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3856
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:317
3857
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:561
3858
  msgctxt "s2member-front"
3859
  msgid "<strong>Sales Tax%s:</strong> %s<br /><strong>— Total%s:</strong> %s"
3860
  msgstr ""
3861
 
3862
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3863
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:313
3864
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:521
3865
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3866
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:317
3867
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:561
3868
  msgctxt "s2member-front"
3869
  msgid "Today"
3870
  msgstr ""
3871
 
3872
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3873
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:583
3874
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3875
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:623
3876
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:47
3877
  #: s2member-pro/includes/templates/forms/authnet-registration-form.php:28
3878
  #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:47
3882
  msgstr ""
3883
 
3884
  #: s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
3885
+ #: s2member-pro/includes/separates/gateways/authnet/authnet.js:584
3886
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3887
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:624
3888
  msgctxt "s2member-front"
3889
  msgid "Your Profile"
3890
  msgstr ""
3891
 
3892
  #: s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
3893
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:269
3894
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:270
3895
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:513
3896
+ #: s2member-pro/includes/separates/gateways/paypal/paypal.js:514
3897
  #: s2member-pro/includes/templates/forms/authnet-cancellation-form.php:34
3898
  #: s2member-pro/includes/templates/forms/authnet-checkout-form.php:178
3899
  #: s2member-pro/includes/templates/forms/authnet-registration-form.php:79
3900
+ #: s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:159
3901
  #: s2member-pro/includes/templates/forms/authnet-update-form.php:110
3902
  #: s2member-pro/includes/templates/forms/paypal-cancellation-form.php:34
3903
  #: s2member-pro/includes/templates/forms/paypal-checkout-form.php:178
3904
  #: s2member-pro/includes/templates/forms/paypal-registration-form.php:79
3905
+ #: s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:159
3906
  #: s2member-pro/includes/templates/forms/paypal-update-form.php:110
3907
  msgctxt "s2member-front"
3908
  msgid "Submit Form"
includes/translations/translators.txt CHANGED
@@ -10,4 +10,10 @@ The file: `/s2member/includes/translations/s2member.pot` will be updated with ea
10
 
11
  If this is your first translation of a WordPress® plugin, [this article](http://codex.wordpress.org/Translating_WordPress#Localization_Technology) and/or [this article](http://urbangiraffe.com/articles/translating-wordpress-themes-and-plugins/), might be of some assistance. When you are finished translating the `s2member.pot` file, place your completed `s2member-[locale].mo` file into this directory: `/wp-content/plugins/`; and please feel free to [share your translation](http://www.s2member.com/forums/forum/community/) with the rest of the s2Member® community.
12
 
13
- Quick Tip: If you only need to translate the front-end of s2Member, please ignore entries in the `s2member.pot` file with a context matching `s2member-admin`. Those sections of s2Member are only seen by site Administrators; they are NOT used in s2Member's front-end integration with WordPress®. Skipping over translation entries with a context matching `s2member-admin` can save you time.
 
 
 
 
 
 
10
 
11
  If this is your first translation of a WordPress® plugin, [this article](http://codex.wordpress.org/Translating_WordPress#Localization_Technology) and/or [this article](http://urbangiraffe.com/articles/translating-wordpress-themes-and-plugins/), might be of some assistance. When you are finished translating the `s2member.pot` file, place your completed `s2member-[locale].mo` file into this directory: `/wp-content/plugins/`; and please feel free to [share your translation](http://www.s2member.com/forums/forum/community/) with the rest of the s2Member® community.
12
 
13
+ Quick Tip: If you only need to translate the front-end of s2Member, please ignore entries in the `s2member.pot` file with a context matching `s2member-admin`. Those sections of s2Member are only seen by site Administrators; they are NOT used in s2Member's front-end integration with WordPress®. Skipping over translation entries with a context matching `s2member-admin` can save you time.
14
+
15
+ == Existing Translations (Updating Your PO File)? ==
16
+
17
+ FUZZY translation entries: If you're updating an existing PO file (e.g. recompiling your MO file after changes in a new release of s2Member); please be sure to manually review any "fuzzy" entries. A fuzzy entry can occur as a result of changes from one release of s2Member (or s2Member Pro) to the next; where small changes in text might render your translation invalid (e.g. fuzzy).
18
+
19
+ Depending on your PO file editor, fuzzy entries may need to be reviewed and changes committed BEFORE you recompile; otherwise fuzzy entries will revert to their default state in your final MO file. Translations that are fuzzy, are NOT compiled into your final MO file. This can lead to much confusion. Please review any fuzzy entries carefully.
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member® Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 130513
4
- Stable tag: 130513
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -92,15 +92,32 @@ Please see [this FAQ entry](http://www.s2member.com/faqs/#s2-faqs-translations)
92
 
93
  == Upgrade Notice ==
94
 
95
- = v130513 =
96
  (Maintenance Release) Upgrade immediately.
97
 
98
  == Changelog ==
99
 
 
 
 
 
 
 
 
100
  = v130513 =
101
  * (s2Member/s2Member Pro) **s2Stream Shortcode Bug Fix (#256)** Fixing a bug first introduced in the previous release where we added support for `player_aspectratio`. This quick update corrects the PHP parse error at line #154 of `sc-files-in.inc.php`. It also corrects the behavior of the `player_height=""` and `player_aspectratio=""` Shortcode Attributes for the `s2Stream` Shortcode. Many thanks to everyone that reported this bug.
102
  * (s2Member Pro) **Codestyling Localization** Removing symlink creator for Codestyleing Localization compatibility. There have been some reports of problems during WordPress® automatic upgrades (when/if the symlink exists). Until we can find a way to avoid this, we're disabling the automatic symlink generator. If you're running the Codestyling Localization plugin together with s2Member Pro, you will need to create the symlink yourself if you want to make s2Member fully compatible. Please create a symlink here: `/wp-content/plugins/s2member/s2member-pro` that points to the s2Member Pro directory: `/wp-content/plugins/s2member-pro`. See notes in previous changelog for further details on this.
103
 
 
 
 
 
 
 
 
 
 
 
104
  = v130510 =
105
  * (s2Member Pro) **Authorize.Net UK (and Other Currencies) (#104)** Adding support for Authorize.Net UK and other currencies too. s2Member Pro now officially supports Authorize.Net UK Edition. It is now possible to change your Authorize.Net Pro Form Shortcode Attribute `cc="USD"` to one of these values: `cc="USD"`, or `cc="CAD"` or `cc="EUR"` or `cc="GBP"`. For further details, please see: `Dashboard -› Authorize.Net Pro Forms -› Shortcode Attributes (Explained)`.
106
  * (s2Member Pro) **ClickBank Skins (#227)** Adding support for the `cbskin=""` Shortcode Attribute. For further details, please see: `Dashboard -› ClickBank Buttons -› Shortcode Attributes (Explained)`.
@@ -122,7 +139,7 @@ Please see [this FAQ entry](http://www.s2member.com/faqs/#s2-faqs-translations)
122
  - You have a PayPal Payments Pro (Payflow Edition) account.
123
  - You charge your customers on a recurring basis.
124
  - A customer chooses PayPal as their billing method during checkout.
125
-
126
  No other part of s2Member's integration with Payflow was modified in this release.
127
 
128
  For further details, please see [this thread](http://www.s2member.com/forums/topic/paypal-expired-security-token/page/2/) (or monitor the [s2Member KB](http://www.s2member.com/kb/) for new articles on this subject).
1
  === s2Member® Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 130617
4
+ Stable tag: 130617
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
92
 
93
  == Upgrade Notice ==
94
 
95
+ = v130617 =
96
  (Maintenance Release) Upgrade immediately.
97
 
98
  == Changelog ==
99
 
100
+ = v130617 =
101
+ * (s2Member/s2Member Pro) **IP Restrictions (#148)** It is now possible to introduce a custom template file that controls the error message displayed when/if a user breaches security by exceeding your maximum unique IP addresses; as configured under `s2Member -› Restriction Options -› Unique IP Restrictions`. If you would like to use a custom template for this message, please copy the default template file from `/s2member/includes/templates/errors/ip-restrictions.php` and place this file into your active WordPress® theme directory (or into the `/wp-content/` directory if you prefer). s2Member will automatically find your custom template in one of these locations; and s2Member will use your custom template instead of the built-in default.
102
+ * (s2Member Pro) **Bug Fix (#302)** Updating Authorize.Net Pro Form Generator to support max days of `365` instead of `7`.
103
+ * (s2Member Pro) **Amazon S3 Secret Access Keys (#321)** Updating UI configuration panel to better explain what a Secret Access Key is; and adding a note about Secret Access Keys for Amazon S3 integration. Amazon® is deprecating Secret Access Keys, but they ARE still required for digitally signed URLs. This update changes nothing in s2Member's functionality. It simply adds some additional detail to a configuration field that will assist site owners integrating s2Member w/ Amazon S3 for the first time.
104
+ * (s2Member/s2Member Pro) **Translations (#317)** Updating `/s2member/includes/translations/translations.txt` (README file). Adding blurp about fuzzy translation entries in existing PO files that translate s2Member. This contains some additional tips on how to update existing PO files upon each release of s2Member and/or s2Member Pro.
105
+ * (s2Member/s2Member Pro) **Bug Fix (#321)** Fixing bug in `/s2member/includes/templates/cfg-files/s2-cross-xml.php` for S3 Buckets (resulting in `crossdomain.xml`). This file contained a parse error and was causing some problems for site owners integrating Adobe Flash content served via Amazon S3. Fixed in this release.
106
+
107
  = v130513 =
108
  * (s2Member/s2Member Pro) **s2Stream Shortcode Bug Fix (#256)** Fixing a bug first introduced in the previous release where we added support for `player_aspectratio`. This quick update corrects the PHP parse error at line #154 of `sc-files-in.inc.php`. It also corrects the behavior of the `player_height=""` and `player_aspectratio=""` Shortcode Attributes for the `s2Stream` Shortcode. Many thanks to everyone that reported this bug.
109
  * (s2Member Pro) **Codestyling Localization** Removing symlink creator for Codestyleing Localization compatibility. There have been some reports of problems during WordPress® automatic upgrades (when/if the symlink exists). Until we can find a way to avoid this, we're disabling the automatic symlink generator. If you're running the Codestyling Localization plugin together with s2Member Pro, you will need to create the symlink yourself if you want to make s2Member fully compatible. Please create a symlink here: `/wp-content/plugins/s2member/s2member-pro` that points to the s2Member Pro directory: `/wp-content/plugins/s2member-pro`. See notes in previous changelog for further details on this.
110
 
111
+ **IMPORTANT NOTE:** If you upgraded previously to v130510 (and you ran the Codestyling Localization plugin together with s2Member® v130510 — at any time); please delete this symlink via FTP: `/wp-content/plugins/s2member/s2member-pro`. Please do this BEFORE attempting an automatic upgrade via WordPress®.
112
+
113
+ If you missed this note and you've already attempted an automatic upgrade, you will have trouble. Here's how to correct the problem.
114
+
115
+ 1. Log into your site via FTP and delete these two directories manually.
116
+ `/wp-content/plugins/s2member` and `/wp-content/plugins/s2member-pro`.
117
+
118
+ 2. Now, please follow the [instructions here](http://www.s2member.com/pro/#!s2_tab_jump=s2-pro-install-update) to upgrade s2Member® Pro manually.
119
+
120
+
121
  = v130510 =
122
  * (s2Member Pro) **Authorize.Net UK (and Other Currencies) (#104)** Adding support for Authorize.Net UK and other currencies too. s2Member Pro now officially supports Authorize.Net UK Edition. It is now possible to change your Authorize.Net Pro Form Shortcode Attribute `cc="USD"` to one of these values: `cc="USD"`, or `cc="CAD"` or `cc="EUR"` or `cc="GBP"`. For further details, please see: `Dashboard -› Authorize.Net Pro Forms -› Shortcode Attributes (Explained)`.
123
  * (s2Member Pro) **ClickBank Skins (#227)** Adding support for the `cbskin=""` Shortcode Attribute. For further details, please see: `Dashboard -› ClickBank Buttons -› Shortcode Attributes (Explained)`.
139
  - You have a PayPal Payments Pro (Payflow Edition) account.
140
  - You charge your customers on a recurring basis.
141
  - A customer chooses PayPal as their billing method during checkout.
142
+
143
  No other part of s2Member's integration with Payflow was modified in this release.
144
 
145
  For further details, please see [this thread](http://www.s2member.com/forums/topic/paypal-expired-security-token/page/2/) (or monitor the [s2Member KB](http://www.s2member.com/kb/) for new articles on this subject).
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress® parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 130513
23
- Stable tag: 130513
24
 
25
  SSL Compatible: yes
26
  bbPress® Compatible: yes
@@ -75,7 +75,7 @@ if(realpath(__FILE__) === realpath($_SERVER["SCRIPT_FILENAME"]))
75
  * @var str
76
  */
77
  if(!defined("WS_PLUGIN__S2MEMBER_VERSION"))
78
- define("WS_PLUGIN__S2MEMBER_VERSION", "130513" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
@@ -105,7 +105,7 @@ if(!defined("WS_PLUGIN__S2MEMBER_MIN_WP_VERSION"))
105
  * @var str
106
  */
107
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
108
- define("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "130513" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.
19
  */
20
  /* -- This section for WordPress® parsing. ------------------------------------------------------------------------------
21
 
22
+ Version: 130617
23
+ Stable tag: 130617
24
 
25
  SSL Compatible: yes
26
  bbPress® Compatible: yes
75
  * @var str
76
  */
77
  if(!defined("WS_PLUGIN__S2MEMBER_VERSION"))
78
+ define("WS_PLUGIN__S2MEMBER_VERSION", "130617" /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
105
  * @var str
106
  */
107
  if(!defined("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
108
+ define("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "130617" /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.