Version Description
Download this release
Release Info
Developer | PriMoThemes |
Plugin | s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) |
Version | 111216 |
Comparing to | |
See all releases |
Code changes from version 111206 to 111216
- includes/classes/files-in.inc.php +110 -109
- includes/classes/files.inc.php +6 -9
- includes/classes/menu-pages.inc.php +28 -15
- includes/classes/utils-arrays.inc.php +29 -6
- includes/classes/utils-urls.inc.php +27 -19
- includes/menu-pages/down-ops.inc.php +5 -5
- includes/menu-pages/menu-pages-s.js +1 -1
- includes/translations/s2member.pot +78 -78
- readme.txt +7 -2
- s2member.php +10 -10
includes/classes/files-in.inc.php
CHANGED
@@ -50,8 +50,8 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
50 |
$_g = !empty ($_GET) ? $_GET : array ();
|
51 |
$_g = c_ws_plugin__s2member_utils_strings::trim_deep (stripslashes_deep ($_g));
|
52 |
/**/
|
53 |
-
$creating = (is_array ($create = $create_file_download_url)) ? true : false;
|
54 |
-
$serving =
|
55 |
/**/
|
56 |
$req["file_download"] = ($creating) ? @$create["file_download"] : @$_g["s2member_file_download"];
|
57 |
$req["file_download_key"] = ($creating) ? @$create["file_download_key"] : @$_g["s2member_file_download_key"];
|
@@ -75,18 +75,18 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
75 |
{
|
76 |
$using_amazon_s3_storage = ((!$req["file_storage"] || strcasecmp ((string)$req["file_storage"], "s3") === 0) && c_ws_plugin__s2member_utils_conds::using_amazon_s3_storage ()) ? true : false;
|
77 |
$using_amazon_cf_storage = ((!$req["file_storage"] || strcasecmp ((string)$req["file_storage"], "cf") === 0) && c_ws_plugin__s2member_utils_conds::using_amazon_cf_storage ()) ? true : false;
|
78 |
-
$using_amazon_storage = ($using_amazon_s3_storage || $using_amazon_cf_storage) ? true : false;
|
79 |
/**/
|
80 |
$excluded = apply_filters ("ws_plugin__s2member_check_file_download_access_excluded", false, get_defined_vars ());
|
81 |
$valid_file_download_key = ($req["file_download_key"] && is_string ($req["file_download_key"])) ? c_ws_plugin__s2member_files_in::check_file_download_key ($req["file_download"], $req["file_download_key"]) : false;
|
82 |
$checking_user = ($excluded || $valid_file_download_key || ($creating && (!isset ($req["check_user"]) || !filter_var ($req["check_user"], FILTER_VALIDATE_BOOLEAN)) && (!isset ($req["count_against_user"]) || !filter_var ($req["count_against_user"], FILTER_VALIDATE_BOOLEAN)))) ? false : true;
|
83 |
$updating_user_counter = (!$checking_user || ($creating && (!isset ($req["count_against_user"]) || !filter_var ($req["count_against_user"], FILTER_VALIDATE_BOOLEAN)))) ? false : true;
|
84 |
/**/
|
85 |
-
if (
|
86 |
{
|
87 |
if (!$using_amazon_storage && !file_exists ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $req["file_download"]))
|
88 |
{
|
89 |
-
if
|
90 |
status_header (404) . header ("Content-Type: text/html; charset=utf-8") . eval ('while (@ob_end_clean ());') #
|
91 |
. exit (_x ('<strong>404: Sorry, file not found.</strong> Please contact Support for assistance.', "s2member-front", "s2member"));
|
92 |
/**/
|
@@ -96,7 +96,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
96 |
/**/
|
97 |
else if ($req["file_download_key"] && is_string ($req["file_download_key"]) && !$valid_file_download_key)
|
98 |
{
|
99 |
-
if
|
100 |
status_header (503) . header ("Content-Type: text/html; charset=utf-8") . eval ('while (@ob_end_clean ());') #
|
101 |
. exit (_x ('<strong>503 ( Invalid Key ):</strong> Sorry, your access to this file has expired. Please contact Support for assistance.', "s2member-front", "s2member"));
|
102 |
/**/
|
@@ -106,17 +106,17 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
106 |
/**/
|
107 |
else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"] || ($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads ()) === false)
|
108 |
{
|
109 |
-
if
|
110 |
if (!has_filter ("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization"))
|
111 |
add_filter ("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization", 10, 2);
|
112 |
/**/
|
113 |
-
if
|
114 |
if (has_filter ("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization"))
|
115 |
remove_filter ("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization", 10, 2);
|
116 |
/**/
|
117 |
if ((isset ($file_downloads_enabled_by_site_owner, $min_level_4_downloads) && $file_downloads_enabled_by_site_owner === false) || ($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads ()) === false)
|
118 |
{
|
119 |
-
if
|
120 |
status_header (503) . header ("Content-Type: text/html; charset=utf-8") . eval ('while (@ob_end_clean ());') #
|
121 |
. exit (_x ('<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <code>s2Member -> Download Options -> Basic Download Restrictions</code>.', "s2member-front", "s2member"));
|
122 |
/**/
|
@@ -128,7 +128,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
128 |
{
|
129 |
if (preg_match ("/^access[_\-]s2member[_\-]level([0-9]+)\//", $req["file_download"], $m) && strlen ($req_level = $m[1]) && (!is_object ($user) || empty ($user->ID) || !$user->has_cap ("access_s2member_level" . $req_level)))
|
130 |
{
|
131 |
-
if
|
132 |
c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars /* Configure MOP Vars here. */ ("file", $req["file_download"], "level", $req_level, $_SERVER["REQUEST_URI"]) . exit ();
|
133 |
/**/
|
134 |
else /* Else return false. */
|
@@ -137,14 +137,14 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
137 |
/**/
|
138 |
else if (preg_match ("/^access[_\-]s2member[_\-]ccap[_\-](.+?)\//", $req["file_download"], $m) && strlen ($req_ccap = preg_replace ("/-/", "_", $m[1])) && (!is_object ($user) || empty ($user->ID) || !$user->has_cap ("access_s2member_ccap_" . $req_ccap)))
|
139 |
{
|
140 |
-
if
|
141 |
c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars /* Configure MOP Vars here. */ ("file", $req["file_download"], "ccap", $req_ccap, $_SERVER["REQUEST_URI"]) . exit ();
|
142 |
/**/
|
143 |
else /* Else return false. */
|
144 |
return false;
|
145 |
}
|
146 |
/**/
|
147 |
-
else if
|
148 |
c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars /* Configure MOP Vars here. */ ("file", $req["file_download"], "level", $min_level_4_downloads, $_SERVER["REQUEST_URI"]) . exit ();
|
149 |
/**/
|
150 |
else /* Else return false. */
|
@@ -153,7 +153,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
153 |
/**/
|
154 |
else if (preg_match ("/^access[_\-]s2member[_\-]level([0-9]+)\//", $req["file_download"], $m) && strlen ($req_level = $m[1]) && !$user->has_cap ("access_s2member_level" . $req_level))
|
155 |
{
|
156 |
-
if
|
157 |
c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars /* Configure MOP Vars here. */ ("file", $req["file_download"], "level", $req_level, $_SERVER["REQUEST_URI"]) . exit ();
|
158 |
/**/
|
159 |
else /* Else return false. */
|
@@ -162,16 +162,16 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
162 |
/**/
|
163 |
else if (preg_match ("/^access[_\-]s2member[_\-]ccap[_\-](.+?)\//", $req["file_download"], $m) && strlen ($req_ccap = preg_replace ("/-/", "_", $m[1])) && !$user->has_cap ("access_s2member_ccap_" . $req_ccap))
|
164 |
{
|
165 |
-
if
|
166 |
c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars /* Configure MOP Vars here. */ ("file", $req["file_download"], "ccap", $req_ccap, $_SERVER["REQUEST_URI"]) . exit ();
|
167 |
/**/
|
168 |
else /* Else return false. */
|
169 |
return false;
|
170 |
}
|
171 |
/**/
|
172 |
-
else if
|
173 |
{
|
174 |
-
$user_previous_file_downloads =
|
175 |
$user_already_downloaded_this_file = $user_already_downloaded_a_streaming_variation_of_this_file = false;
|
176 |
/**/
|
177 |
$user_file_download_access_log = (is_array ($user_file_download_access_log = get_user_option ("s2member_file_download_access_log", $user_id))) ? $user_file_download_access_log : array ();
|
@@ -186,18 +186,18 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
186 |
{
|
187 |
if (strtotime ($user_file_download_access_log_entry["date"]) < strtotime ("-" . $user_file_downloads["allowed_days"] . " days"))
|
188 |
{
|
189 |
-
unset
|
190 |
-
$user_file_download_access_arc[] =
|
191 |
}
|
192 |
else if (strtotime ($user_file_download_access_log_entry["date"]) >= strtotime ("-" . $user_file_downloads["allowed_days"] . " days"))
|
193 |
{
|
194 |
-
$user_previous_file_downloads++; /* Previous files always count against this User/Member
|
195 |
/**/
|
196 |
$_user_file_download_access_log_entry = &$user_file_download_access_log[$user_file_download_access_log_entry_key];
|
197 |
$_user_already_downloaded_this_file = $_user_already_downloaded_a_streaming_variation_of_this_file = false;
|
198 |
/**/
|
199 |
-
if
|
200 |
-
$user_already_downloaded_this_file = $_user_already_downloaded_this_file =
|
201 |
/**/
|
202 |
else if (preg_replace ($streaming_variations, "", $user_file_download_access_log_entry["file"]) === preg_replace ($streaming_variations, "", $req["file_download"]))
|
203 |
$user_already_downloaded_this_file = $_user_already_downloaded_this_file = $user_already_downloaded_a_streaming_variation_of_this_file = $_user_already_downloaded_a_streaming_variation_of_this_file = true;
|
@@ -213,21 +213,21 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
213 |
}
|
214 |
}
|
215 |
}
|
216 |
-
else /* Weed out empty log entries. Some older versions of s2Member may have corrupt/empty log entries
|
217 |
-
unset ($user_file_download_access_log[$user_file_download_access_log_entry_key]); /* Remove
|
218 |
}
|
219 |
if ( /* Updating counter? */$updating_user_counter && /* Do we need a new log entry for this file? */ !$user_already_downloaded_this_file && !$user_already_downloaded_a_streaming_variation_of_this_file)
|
220 |
$user_file_download_access_log[] = array ("date" => date ("Y-m-d"), "time" => time (), "ltime" => time (), "file" => $req["file_download"], "counter" => 1);
|
221 |
/**/
|
222 |
if ($user_previous_file_downloads >= $user_file_downloads["allowed"] && !$user_already_downloaded_this_file && !$user_already_downloaded_a_streaming_variation_of_this_file && !$user->has_cap ("administrator"))
|
223 |
{
|
224 |
-
if
|
225 |
wp_redirect (add_query_arg (urlencode_deep (array ("_s2member_seeking" => array ("type" => "file", "file" => $req["file_download"], "_uri" => base64_encode ($_SERVER["REQUEST_URI"])), "s2member_seeking" => "file-" . $req["file_download"])), get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"])), apply_filters ("ws_plugin__s2member_content_redirect_status", 301, get_defined_vars ())) . exit ();
|
226 |
/**/
|
227 |
else /* Else return false. */
|
228 |
return false;
|
229 |
}
|
230 |
-
else if /* Save/update counter?
|
231 |
update_user_option ($user_id, "s2member_file_download_access_log", c_ws_plugin__s2member_utils_arrays::array_unique ($user_file_download_access_log)) . update_user_option ($user_id, "s2member_file_download_access_arc", c_ws_plugin__s2member_utils_arrays::array_unique ($user_file_download_access_arc));
|
232 |
}
|
233 |
}
|
@@ -236,7 +236,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
236 |
{
|
237 |
if (!$using_amazon_storage && !file_exists ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $req["file_download"]))
|
238 |
{
|
239 |
-
if
|
240 |
status_header (404) . header ("Content-Type: text/html; charset=utf-8") . eval ('while (@ob_end_clean ());') #
|
241 |
. exit (_x ('<strong>404: Sorry, file not found.</strong> Please contact Support for assistance.', "s2member-front", "s2member"));
|
242 |
/**/
|
@@ -245,7 +245,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
245 |
}
|
246 |
}
|
247 |
/**/
|
248 |
-
if
|
249 |
{
|
250 |
$basename = basename ($req["file_download"]);
|
251 |
$mimetypes = parse_ini_file (dirname (dirname (dirname (__FILE__))) . "/includes/mime-types.ini");
|
@@ -276,7 +276,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
276 |
/**/
|
277 |
if ($using_amazon_s3_storage && ($serving || ($creating && $url_to_storage_source)))
|
278 |
{
|
279 |
-
if
|
280 |
wp_redirect (c_ws_plugin__s2member_files_in::amazon_s3_url ($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype)) . exit ();
|
281 |
/**/
|
282 |
else /* Else return File Download URL. */
|
@@ -285,14 +285,14 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
285 |
/**/
|
286 |
else if ($using_amazon_cf_storage && ($serving || ($creating && $url_to_storage_source)))
|
287 |
{
|
288 |
-
if
|
289 |
wp_redirect (c_ws_plugin__s2member_files_in::amazon_cf_url ($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype)) . exit ();
|
290 |
/**/
|
291 |
else /* Else return File Download URL. */
|
292 |
return apply_filters ("ws_plugin__s2member_file_download_access_url", c_ws_plugin__s2member_files_in::amazon_cf_url ($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype), get_defined_vars ());
|
293 |
}
|
294 |
/**/
|
295 |
-
else if
|
296 |
{
|
297 |
$url = ($rewrite_base) ? rtrim ($rewrite_base, "/") : rtrim ($rewrite_base_guess, "/");
|
298 |
$url .= (isset ($req["file_download_key"])) ? (($key) ? "/s2member-file-download-key-" . $key : "") : "";
|
@@ -302,15 +302,14 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
302 |
$url .= (isset ($req["file_remote"])) ? (($remote) ? "/s2member-file-remote" : "/s2member-file-remote-no") : "";
|
303 |
$url .= (isset ($req["skip_confirmation"])) ? (($skip_confirmation) ? "/s2member-skip-confirmation" : "/s2member-skip-confirmation-no") : "";
|
304 |
/**/
|
305 |
-
$url =
|
306 |
$url = ($ssl) ? preg_replace ("/^https?/", "https", $url) : preg_replace ("/^https?/", "http", $url);
|
307 |
/**/
|
308 |
return apply_filters ("ws_plugin__s2member_file_download_access_url", $url, get_defined_vars ());
|
309 |
}
|
310 |
/**/
|
311 |
-
else if
|
312 |
-
{
|
313 |
-
/* * Note: we don't URL encode unreserved chars. Improves media player compatibility. */
|
314 |
$_url_e_key = ($key) ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep (urlencode ($key)) : "";
|
315 |
$_url_e_storage = ($storage) ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep (urlencode ($storage)) : "";
|
316 |
$_url_e_file = c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep (urlencode ($req["file_download"]));
|
@@ -328,14 +327,14 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
328 |
return apply_filters ("ws_plugin__s2member_file_download_access_url", $url, get_defined_vars ());
|
329 |
}
|
330 |
/**/
|
331 |
-
else /* Else, ``if ($serving)
|
332 |
{
|
333 |
@set_time_limit (0) . @ini_set ("zlib.output_compression", 0);
|
334 |
/**/
|
335 |
-
status_header
|
336 |
/**/
|
|
|
337 |
header ("Accept-Ranges: none");
|
338 |
-
header ("Content-Encoding: none");
|
339 |
header ("Content-Type: " . $mimetype);
|
340 |
header ("Expires: " . gmdate ("D, d M Y H:i:s", strtotime ("-1 week")) . " GMT");
|
341 |
header ("Last-Modified: " . gmdate ("D, d M Y H:i:s") . " GMT");
|
@@ -345,7 +344,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
345 |
/**/
|
346 |
header ('Content-Disposition: ' . (($inline) ? "inline" : "attachment") . '; filename="' . $basename . '"');
|
347 |
/**/
|
348 |
-
eval
|
349 |
/**/
|
350 |
$_chunk_file = ($_SERVER["SERVER_PROTOCOL"] === "HTTP/1.1" && preg_match ("/apache/i", $_SERVER["SERVER_SOFTWARE"])) ? true : false;
|
351 |
/**/
|
@@ -356,7 +355,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
356 |
if (apply_filters ("ws_plugin__s2member_chunk_file_downloads_w_content_length", true, get_defined_vars ()))
|
357 |
header ("Content-Length: " . $length);
|
358 |
/**/
|
359 |
-
header
|
360 |
/**/
|
361 |
while (!feof ($resource) && ($chunk_size = strlen ($data = fread ($resource, $_chunk_size))))
|
362 |
eval ('echo dechex ($chunk_size) . "\r\n". $data . "\r\n"; @flush ();');
|
@@ -371,11 +370,11 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
371 |
header ("Content-Length: " . $length);
|
372 |
/**/
|
373 |
while (!feof ($resource) && ($flush_size = strlen ($data = fread ($resource, $_flush_size))))
|
374 |
-
eval ('echo $data; @flush ();');
|
375 |
}
|
376 |
-
else if
|
377 |
{
|
378 |
-
@ini_set ("memory_limit", WP_MAX_MEMORY_LIMIT);
|
379 |
header ("Content-Length: " . $length) . exit (file_get_contents ($file));
|
380 |
}
|
381 |
else /* Else, we have an empty file with no length. */
|
@@ -386,16 +385,16 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
386 |
}
|
387 |
}
|
388 |
/**/
|
389 |
-
else if
|
390 |
status_header (503) . header ("Content-Type: text/html; charset=utf-8") . eval ('while (@ob_end_clean ());') #
|
391 |
. exit (_x ('<strong>503: Access denied.</strong> Invalid File Download specs.', "s2member-front", "s2member"));
|
392 |
/**/
|
393 |
-
else if
|
394 |
return false;
|
395 |
/**/
|
396 |
do_action ("ws_plugin__s2member_after_file_download_access", get_defined_vars ());
|
397 |
/**/
|
398 |
-
return ($creating) ?
|
399 |
}
|
400 |
/**
|
401 |
* Generates a File Download URL for access to a file protected by s2Member.
|
@@ -413,10 +412,10 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
413 |
public static function create_file_download_url ($config = FALSE, $get_streamer_array = FALSE)
|
414 |
{
|
415 |
eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
|
416 |
-
do_action ("ws_plugin__s2member_before_create_file_download_url", get_defined_vars ());
|
417 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
418 |
/**/
|
419 |
-
$config = (is_array ($config)) ? $config :
|
420 |
/**/
|
421 |
$config["file_download"] = (isset ($config["file_download"]) && is_string ($config["file_download"])) ? trim ($config["file_download"], "/") : @$config["file_download"];
|
422 |
$config["file_download_key"] = (isset ($config["file_download"]) && is_string ($config["file_download"]) && !empty ($config["file_download_key"])) ? c_ws_plugin__s2member_files::file_download_key ($config["file_download"], ((in_array ($config["file_download_key"], array ("ip-forever", "universal", "cache-compatible"))) ? $config["file_download_key"] : false)) : @$config["file_download_key"];
|
@@ -424,10 +423,10 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
424 |
$config["url_to_storage_source"] = /* Force a streaming URL here via ``$get_streamer_array``? */ ($get_streamer_array) ? true : @$config["url_to_storage_source"];
|
425 |
$config["file_stream"] = /* Force a streaming URL here via ``$get_streamer_array``? */ ($get_streamer_array) ? true : @$config["file_stream"];
|
426 |
/**/
|
427 |
-
if (($_url = c_ws_plugin__s2member_files_in::check_file_download_access
|
428 |
{
|
429 |
eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
|
430 |
-
do_action ("ws_plugin__s2member_during_create_file_download_url", get_defined_vars ());
|
431 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
432 |
/**/
|
433 |
$extension = strtolower (substr ($config["file_download"], strrpos ($config["file_download"], ".") + 1));
|
@@ -440,11 +439,11 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
440 |
else if ($get_streamer_array && $streaming && is_array ($ups = c_ws_plugin__s2member_utils_urls::parse_url ($_url)) && isset ($ups["scheme"], $ups["host"]) && ($streamer = $ups["scheme"] . "://" . $ups["host"] . ((!empty ($ups["port"])) ? ":" . $ups["port"] : "")) && ($url = c_ws_plugin__s2member_files_in::check_file_download_access (array_merge ($config, array ("file_stream" => false, "check_user" => false, "count_against_user" => false)))))
|
441 |
$return = array ("streamer" => $streamer, "file" => preg_replace ("/^" . preg_quote ($streamer, "/") . "\//", "", $_url), "url" => preg_replace ("/^.+?\:/", (($ssl) ? "https:" : "http:"), $url));
|
442 |
/**/
|
443 |
-
else if
|
444 |
-
$return =
|
445 |
/**/
|
446 |
else /* Else return URL string ( ``$get_streamer_array`` is false ). */
|
447 |
-
$return =
|
448 |
}
|
449 |
/**/
|
450 |
return apply_filters ("ws_plugin__s2member_create_file_download_url", ((isset ($return)) ? $return : false), get_defined_vars ());
|
@@ -476,18 +475,17 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
476 |
{
|
477 |
header ('WWW-Authenticate: Basic realm="' . c_ws_plugin__s2member_utils_strings::esc_dq (strip_tags (_x ("Members Only", "s2member-front", "s2member"))) . '"');
|
478 |
/**/
|
479 |
-
status_header
|
480 |
-
header ("Content-Type: text/html; charset=utf-8");
|
481 |
-
eval
|
482 |
/**/
|
483 |
exit (_x ('<strong>401:</strong> Sorry, access denied.', "s2member-front", "s2member"));
|
484 |
}
|
485 |
else if (is_object ($_user = new WP_User ($_SERVER["PHP_AUTH_USER"])) && !empty ($_user->ID))
|
486 |
-
$user =
|
487 |
/**/
|
488 |
do_action ("ws_plugin__s2member_during_check_file_remote_authorization_after", get_defined_vars ());
|
489 |
}
|
490 |
-
/**/
|
491 |
return apply_filters ("ws_plugin__s2member_check_file_remote_authorization", $user, get_defined_vars ());
|
492 |
}
|
493 |
/**
|
@@ -506,16 +504,15 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
506 |
do_action ("_ws_plugin__s2member_before_check_file_download_key", get_defined_vars ());
|
507 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
508 |
/**/
|
509 |
-
if ($file && is_string ($file) && ($file = trim ($file, "/")) && $key && is_string ($key))
|
510 |
{
|
511 |
if ($key === c_ws_plugin__s2member_files::file_download_key ($file) || $key === c_ws_plugin__s2member_files::file_download_key ("/" . $file))
|
512 |
-
$valid =
|
513 |
else if ($key === c_ws_plugin__s2member_files::file_download_key ($file, "ip-forever") || $key === c_ws_plugin__s2member_files::file_download_key ("/" . $file, "ip-forever"))
|
514 |
-
$valid =
|
515 |
else if ($key === c_ws_plugin__s2member_files::file_download_key ($file, "universal") || $key === c_ws_plugin__s2member_files::file_download_key ("/" . $file, "universal"))
|
516 |
-
$valid =
|
517 |
}
|
518 |
-
/**/
|
519 |
return apply_filters ("ws_plugin__s2member_check_file_download_key", ((isset ($valid) && $valid) ? true : false), get_defined_vars ());
|
520 |
}
|
521 |
/**
|
@@ -549,7 +546,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
549 |
*/
|
550 |
public static function amazon_s3_url ($file = FALSE, $stream = FALSE, $inline = FALSE, $ssl = FALSE, $basename = FALSE, $mimetype = FALSE)
|
551 |
{
|
552 |
-
$file = trim ((string)$file, "/");
|
553 |
/**/
|
554 |
foreach ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"] as $option => $option_value)
|
555 |
if (preg_match ("/^amazon_s3_files_/", $option) && ($option = preg_replace ("/^amazon_s3_files_/", "", $option)))
|
@@ -562,6 +559,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
562 |
$s3_signature = base64_encode (c_ws_plugin__s2member_files_in::amazon_s3_sign ("GET\n\n\n" . $s3c["expires"] . "\n" . "/" . $s3c["bucket"] . $s3_raw_file));
|
563 |
/**/
|
564 |
$s3_url = ((strtolower ($s3c["bucket"]) !== $s3c["bucket"])) ? "http" . (($ssl) ? "s" : "") . "://s3.amazonaws.com/" . $s3c["bucket"] . $s3_file : "http" . (($ssl) ? "s" : "") . "://" . $s3c["bucket"] . ".s3.amazonaws.com" . $s3_file;
|
|
|
565 |
return add_query_arg (c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep /* Don't encode unreserved chars. Maximizes media player compatibility. */
|
566 |
(urlencode_deep (array ("AWSAccessKeyId" => $s3c["access_key"], "Expires" => $s3c["expires"], "Signature" => $s3_signature))), $s3_url);
|
567 |
}
|
@@ -582,7 +580,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
582 |
/**/
|
583 |
$cfc["distros_s3_access_id"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distros_s3_access_id"];
|
584 |
/**/
|
585 |
-
if ($s3c["bucket"] && $s3c["access_key"] && $s3c["secret_key"])
|
586 |
{
|
587 |
$s3_date = gmdate ("D, d M Y H:i:s") . " GMT";
|
588 |
$s3_location = ((strtolower ($s3c["bucket"]) !== $s3c["bucket"])) ? "/" . $s3c["bucket"] . "/?acl" : "/?acl";
|
@@ -602,7 +600,8 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
602 |
if (($s3_response = c_ws_plugin__s2member_utils_urls::remote ("https://" . $s3_domain . $s3_location, false, array_merge ($s3_args, array ("timeout" => 20)), "array")) && $s3_response["code"] === 200)
|
603 |
{
|
604 |
$s3_location = ((strtolower ($s3c["bucket"]) !== $s3c["bucket"])) ? "/" . $s3c["bucket"] . "/?policy" : "/?policy";
|
605 |
-
$
|
|
|
606 |
$s3_signature = base64_encode (c_ws_plugin__s2member_files_in::amazon_s3_sign ("PUT\n\napplication/json\n" . $s3_date . "\n/" . $s3c["bucket"] . "/?policy"));
|
607 |
$s3_args = array ("method" => "PUT", "body" => $s3_policy_json, "headers" => array ("Host" => $s3_domain, "Content-Type" => "application/json", "Date" => $s3_date, "Authorization" => "AWS " . $s3c["access_key"] . ":" . $s3_signature));
|
608 |
/**/
|
@@ -614,7 +613,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
614 |
$s3_args = array ("method" => "PUT", "body" => $s3_policy_xml, "headers" => array ("Host" => $s3_domain, "Content-Type" => "text/xml", "Date" => $s3_date, "X-Amz-Acl" => "public-read", "Authorization" => "AWS " . $s3c["access_key"] . ":" . $s3_signature));
|
615 |
/**/
|
616 |
if (($s3_response = c_ws_plugin__s2member_utils_urls::remote ("https://" . $s3_domain . $s3_location, false, array_merge ($s3_args, array ("timeout" => 20)), "array")) && $s3_response["code"] === 200)
|
617 |
-
return array ("success" => true, "code" => null, "message" => null);
|
618 |
/**/
|
619 |
else if (isset ($s3_response["code"], $s3_response["message"]))
|
620 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® S3 API call. Feel free to exclude `%s` if you like. */
|
@@ -699,7 +698,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
699 |
*/
|
700 |
public static function amazon_cf_url ($file = FALSE, $stream = FALSE, $inline = FALSE, $ssl = FALSE, $basename = FALSE, $mimetype = FALSE)
|
701 |
{
|
702 |
-
$file = trim ((string)$file, "/");
|
703 |
/**/
|
704 |
foreach ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"] as $option => $option_value)
|
705 |
if (preg_match ("/^amazon_cf_files_/", $option) && ($option = preg_replace ("/^amazon_cf_files_/", "", $option)))
|
@@ -707,8 +706,8 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
707 |
/**/
|
708 |
$cfc["expires"] = strtotime ("+" . apply_filters ("ws_plugin__s2member_amazon_cf_file_expires_time", "24 hours", get_defined_vars ()));
|
709 |
/**/
|
710 |
-
$cf_extn =
|
711 |
-
$cf_ip_res =
|
712 |
$cf_stream_extn_resource_exclusions = array_unique ((array)apply_filters ("ws_plugin__s2member_amazon_cf_file_streaming_extension_resource_exclusions", array ("mp3" /* MP3 files should NOT include an extension in their resource reference. */), get_defined_vars ()));
|
713 |
$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"]) . "/" . $file;
|
714 |
$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"]) . "/" . $file;
|
@@ -740,63 +739,63 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
740 |
$cfc["access_key"] = $s3c["access_key"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_access_key"];
|
741 |
$cfc["secret_key"] = $s3c["secret_key"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_secret_key"];
|
742 |
/**/
|
743 |
-
if ($s3c["bucket"] && $s3c["access_key"] && $s3c["secret_key"])
|
744 |
{
|
745 |
-
if
|
746 |
{
|
747 |
if (!$cfc["distro_downloads_id"] || ($cfc["distro_downloads_id"] && ($cf_get_response = c_ws_plugin__s2member_files_in::amazon_cf_get_distro ($cfc["distro_downloads_id"], "downloads")) && ($cf_get_response["success"] || $cf_get_response["code"] === 404)))
|
748 |
{
|
749 |
if (!$cfc["distro_downloads_id"] || ($cfc["distro_downloads_id"] && $cf_get_response && !$cf_get_response["success"] && $cf_get_response["code"] === 404))
|
750 |
-
$cf_distro_downloads_clear =
|
751 |
/**/
|
752 |
else if ($cfc["distro_downloads_id"] && $cf_get_response && $cf_get_response["success"] && !$cf_get_response["deployed"])
|
753 |
return array ("success" => false, "code" => -86, "message" => _x ("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.", "s2member-admin", "s2member"));
|
754 |
/**/
|
755 |
else if ($cfc["distro_downloads_id"] && $cf_get_response && $cf_get_response["success"] && $cf_get_response["deployed"] && ($cf_del_response = c_ws_plugin__s2member_files_in::amazon_cf_del_distro ($cfc["distro_downloads_id"], $cf_get_response["etag"], $cf_get_response["xml"])) && $cf_del_response["success"])
|
756 |
-
$cf_distro_downloads_clear =
|
757 |
/**/
|
758 |
else if (isset ($cf_del_response["code"], $cf_del_response["message"]))
|
759 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
760 |
return array ("success" => false, "code" => $cf_del_response["code"], "message" => sprintf (_x ("Unable to delete existing Amazon® CloudFront Downloads Distro. %s", "s2member-admin", "s2member"), $cf_del_response["message"]));
|
761 |
/**/
|
762 |
-
if
|
763 |
{
|
764 |
-
unset
|
765 |
/**/
|
766 |
if (!$cfc["distro_streaming_id"] || ($cfc["distro_streaming_id"] && ($cf_get_response = c_ws_plugin__s2member_files_in::amazon_cf_get_distro ($cfc["distro_streaming_id"], "streaming")) && ($cf_get_response["success"] || $cf_get_response["code"] === 404)))
|
767 |
{
|
768 |
if (!$cfc["distro_streaming_id"] || ($cfc["distro_streaming_id"] && $cf_get_response && !$cf_get_response["success"] && $cf_get_response["code"] === 404))
|
769 |
-
$cf_distro_streaming_clear =
|
770 |
/**/
|
771 |
else if ($cfc["distro_streaming_id"] && $cf_get_response && $cf_get_response["success"] && !$cf_get_response["deployed"])
|
772 |
return array ("success" => false, "code" => -87, "message" => _x ("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.", "s2member-admin", "s2member"));
|
773 |
/**/
|
774 |
else if ($cfc["distro_streaming_id"] && $cf_get_response && $cf_get_response["success"] && $cf_get_response["deployed"] && ($cf_del_response = c_ws_plugin__s2member_files_in::amazon_cf_del_distro ($cfc["distro_streaming_id"], $cf_get_response["etag"], $cf_get_response["xml"])) && $cf_del_response["success"])
|
775 |
-
$cf_distro_streaming_clear =
|
776 |
/**/
|
777 |
else if (isset ($cf_del_response["code"], $cf_del_response["message"]))
|
778 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
779 |
return array ("success" => false, "code" => $cf_del_response["code"], "message" => sprintf (_x ("Unable to delete existing Amazon® CloudFront Streaming Distro. %s", "s2member-admin", "s2member"), $cf_del_response["message"]));
|
780 |
/**/
|
781 |
-
if
|
782 |
{
|
783 |
-
unset
|
784 |
/**/
|
785 |
if (!$cfc["distros_access_id"] || ($cfc["distros_access_id"] && ($cf_get_response = c_ws_plugin__s2member_files_in::amazon_cf_get_access_origin_identity ($cfc["distros_access_id"])) && ($cf_get_response["success"] || $cf_get_response["code"] === 404)))
|
786 |
{
|
787 |
if (!$cfc["distros_access_id"] || ($cfc["distros_access_id"] && $cf_get_response && !$cf_get_response["success"] && $cf_get_response["code"] === 404))
|
788 |
-
$cf_distros_access_clear =
|
789 |
/**/
|
790 |
else if ($cfc["distros_access_id"] && $cf_get_response && $cf_get_response["success"] && ($cf_del_response = c_ws_plugin__s2member_files_in::amazon_cf_del_access_origin_identity ($cfc["distros_access_id"], $cf_get_response["etag"], $cf_get_response["xml"])) && $cf_del_response["success"])
|
791 |
-
$cf_distros_access_clear =
|
792 |
/**/
|
793 |
else if (isset ($cf_del_response["code"], $cf_del_response["message"]))
|
794 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
795 |
return array ("success" => false, "code" => $cf_del_response["code"], "message" => sprintf (_x ("Unable to delete existing Amazon® CloudFront Origin Access Identity. %s", "s2member-admin", "s2member"), $cf_del_response["message"]));
|
796 |
/**/
|
797 |
-
if
|
798 |
{
|
799 |
-
unset
|
800 |
/**/
|
801 |
$cfc = array_merge ($cfc, array ("distros_access_id" => "", "distros_s3_access_id" => "", "distro_downloads_id" => "", "distro_downloads_dname" => "", "distro_streaming_id" => "", "distro_streaming_dname" => "", "distros_auto_config_status" => ""));
|
802 |
$cf_options = array ("ws_plugin__s2member_amazon_cf_files_distros_access_id" => "", "ws_plugin__s2member_amazon_cf_files_distros_s3_access_id" => "", "ws_plugin__s2member_amazon_cf_files_distro_downloads_id" => "", "ws_plugin__s2member_amazon_cf_files_distro_downloads_dname" => "", "ws_plugin__s2member_amazon_cf_files_distro_streaming_id" => "", "ws_plugin__s2member_amazon_cf_files_distro_streaming_dname" => "", "ws_plugin__s2member_amazon_cf_files_distros_auto_config_status" => "");
|
@@ -820,16 +819,18 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
820 |
$cf_options = array ("ws_plugin__s2member_amazon_cf_files_distro_streaming_id" => $cf_response["distro_streaming_id"], "ws_plugin__s2member_amazon_cf_files_distro_streaming_dname" => $cf_response["distro_streaming_dname"]);
|
821 |
c_ws_plugin__s2member_menu_pages::update_all_options ($cf_options, true, false, false, false, false);
|
822 |
/**/
|
823 |
-
|
824 |
-
|
825 |
-
|
826 |
-
|
827 |
-
|
828 |
-
|
829 |
-
|
830 |
-
|
831 |
-
|
832 |
-
|
|
|
|
|
833 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® S3 API call. Feel free to exclude `%s` if you like. */
|
834 |
return array ("success" => false, "code" => $s3_response["code"], "message" => sprintf (_x ("Unable to update existing Amazon® S3 ACLs. %s", "s2member-admin", "s2member"), $s3_response["message"]));
|
835 |
/**/
|
@@ -905,7 +906,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
905 |
*/
|
906 |
public static function amazon_cf_get_access_origin_identity ($access_id = FALSE)
|
907 |
{
|
908 |
-
if ($access_id && is_string ($access_id))
|
909 |
{
|
910 |
foreach ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"] as $option => $option_value)
|
911 |
if (preg_match ("/^amazon_cf_files_/", $option) && ($option = preg_replace ("/^amazon_cf_files_/", "", $option)))
|
@@ -970,7 +971,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
970 |
$cf_args = array ("method" => "DELETE", "headers" => array ("Host" => $cf_domain, "Date" => $cf_date, "If-Match" => $access_id_etag, "Authorization" => "AWS " . $cfc["access_key"] . ":" . $cf_signature));
|
971 |
/**/
|
972 |
if (($cf_response = c_ws_plugin__s2member_utils_urls::remote ("https://" . $cf_domain . $cf_location, false, array_merge ($cf_args, array ("timeout" => 20)), "array")) && ($cf_response["code"] === 200 || $cf_response["code"] === 204 /* Deleted. */))
|
973 |
-
return array ("success" => true, "code" => null, "message" => null);
|
974 |
/**/
|
975 |
else if (isset ($cf_response["code"], $cf_response["message"]))
|
976 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
@@ -1085,13 +1086,11 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
1085 |
*/
|
1086 |
public static function amazon_cf_disable_distro ($distro_id = FALSE, $distro_id_etag = FALSE, $distro_id_xml = FALSE)
|
1087 |
{
|
1088 |
-
if ($distro_id && is_string ($distro_id) && $distro_id_etag && is_string ($distro_id_etag) && $distro_id_xml && is_string ($distro_id_xml)
|
1089 |
-
&& ($distro_id_type = (stripos ($distro_id_xml, "<StreamingDistribution") !== false) ? "streaming" : ((stripos ($distro_id_xml, "<Distribution") !== false) ? "downloads" : false)) #
|
1090 |
-
&& preg_match ("/\<CallerReference\>(.+?)\<\/CallerReference\>/is", $distro_id_xml, $distro_id_reference_tag) && ($distro_id_reference = $distro_id_reference_tag[1]))
|
1091 |
{
|
1092 |
-
if
|
1093 |
{
|
1094 |
-
if (stripos ($distro_id_xml, "<Status>Deployed</Status>") !== false)
|
1095 |
{
|
1096 |
foreach ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"] as $option => $option_value)
|
1097 |
if (preg_match ("/^amazon_cf_files_/", $option) && ($option = preg_replace ("/^amazon_cf_files_/", "", $option)))
|
@@ -1141,11 +1140,9 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
1141 |
*/
|
1142 |
public static function amazon_cf_del_distro ($distro_id = FALSE, $distro_id_etag = FALSE, $distro_id_xml = FALSE)
|
1143 |
{
|
1144 |
-
if ($distro_id && is_string ($distro_id) && $distro_id_etag && is_string ($distro_id_etag) && $distro_id_xml && is_string ($distro_id_xml)
|
1145 |
-
&& ($distro_id_type = (stripos ($distro_id_xml, "<StreamingDistribution") !== false) ? "streaming" : ((stripos ($distro_id_xml, "<Distribution") !== false) ? "downloads" : false)) #
|
1146 |
-
&& preg_match ("/\<CallerReference\>(.+?)\<\/CallerReference\>/is", $distro_id_xml, $distro_id_reference_tag) && ($distro_id_reference = $distro_id_reference_tag[1]))
|
1147 |
{
|
1148 |
-
if
|
1149 |
{
|
1150 |
if (($cf_response = c_ws_plugin__s2member_files_in::amazon_cf_disable_distro ($distro_id, $distro_id_etag, $distro_id_xml)) && $cf_response["success"])
|
1151 |
{
|
@@ -1166,7 +1163,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
1166 |
$cf_args = array ("method" => "DELETE", "headers" => array ("Host" => $cf_domain, "Date" => $cf_date, "If-Match" => $cf_response["etag"], "Authorization" => "AWS " . $cfc["access_key"] . ":" . $cf_signature));
|
1167 |
/**/
|
1168 |
if (($cf_response = c_ws_plugin__s2member_utils_urls::remote ("https://" . $cf_domain . $cf_location, false, array_merge ($cf_args, array ("timeout" => 20)), "array")) && ($cf_response["code"] === 200 || $cf_response["code"] === 204 /* Deleted. */))
|
1169 |
-
return array ("success" => true, "code" => null, "message" => null);
|
1170 |
/**/
|
1171 |
else if (isset ($cf_response["code"], $cf_response["message"]))
|
1172 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
@@ -1225,9 +1222,9 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
1225 |
$cf_date = gmdate ("D, d M Y H:i:s") . " GMT";
|
1226 |
$cf_signature = base64_encode (c_ws_plugin__s2member_files_in::amazon_cf_sign ($cf_date));
|
1227 |
/**/
|
1228 |
-
if
|
1229 |
{
|
1230 |
-
$cf_location = "/2010-11-01/distribution";
|
1231 |
$cf_distro_downloads_reference = time () . "." . md5 ("downloads" . $s3c["bucket"] . $s3c["access_key"] . $s3c["secret_key"] . $cfc["private_key"] . $cfc["private_key_id"] . $cfc["distro_downloads_cname"]);
|
1232 |
$cf_distro_downloads_xml = '<?xml version="1.0" encoding="UTF-8"?><DistributionConfig xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/"><S3Origin><DNSName>' . esc_html ($s3c["bucket"]) . '.s3.amazonaws.com</DNSName><OriginAccessIdentity>origin-access-identity/cloudfront/' . esc_html ($cfc["distros_access_id"]) . '</OriginAccessIdentity></S3Origin><CallerReference>' . esc_html ($cf_distro_downloads_reference) . '</CallerReference>' . (($cfc["distro_downloads_cname"]) ? '<CNAME>' . esc_html ($cfc["distro_downloads_cname"]) . '</CNAME>' : '') . '<Comment>' . esc_html (sprintf (_x ("Created by s2Member, for S3 Bucket: %s.", "s2member-admin", "s2member"), $s3c["bucket"])) . '</Comment><Enabled>true</Enabled><DefaultRootObject>index.html</DefaultRootObject><TrustedSigners><Self/></TrustedSigners></DistributionConfig>';
|
1233 |
$cf_args = array ("method" => "POST", "body" => $cf_distro_downloads_xml, "headers" => array ("Host" => $cf_domain, "Content-Type" => "application/xml", "Date" => $cf_date, "Authorization" => "AWS " . $cfc["access_key"] . ":" . $cf_signature));
|
@@ -1236,19 +1233,21 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
1236 |
{
|
1237 |
if (preg_match ("/\<Distribution.*?\>(.+?)\<\/Distribution\>/is", $cf_response["body"], $cf_distro_downloads_tag) && preg_match ("/\<Id\>(.+?)\<\/Id\>/is", $cf_distro_downloads_tag[1], $cf_distro_downloads_id_tag) && preg_match ("/\<DomainName\>(.+?)\<\/DomainName\>/is", $cf_distro_downloads_tag[1], $cf_distro_downloads_dname_tag))
|
1238 |
return array ("success" => true, "code" => null, "message" => null, "distro_downloads_id" => trim ($cf_distro_downloads_id_tag[1]), "distro_downloads_dname" => trim ($cf_distro_downloads_dname_tag[1]));
|
|
|
1239 |
else /* Else, we use a default error code and message. */
|
1240 |
return array ("success" => false, "code" => -97, "message" => _x ("Unable to create/read Amazon® CloudFront Downloads Distro. Unexpected response.", "s2member-admin", "s2member"));
|
1241 |
}
|
1242 |
else if (isset ($cf_response["code"], $cf_response["message"]))
|
1243 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
1244 |
return array ("success" => false, "code" => $cf_response["code"], "message" => sprintf (_x ("Unable to create Amazon® CloudFront Downloads Distro. %s", "s2member-admin", "s2member"), $cf_response["message"]));
|
|
|
1245 |
else /* Else, we use a default error code and message. */
|
1246 |
return array ("success" => false, "code" => -98, "message" => _x ("Unable to create Amazon® CloudFront Downloads Distro. Connection failed.", "s2member-admin", "s2member"));
|
1247 |
}
|
1248 |
/**/
|
1249 |
-
else if
|
1250 |
{
|
1251 |
-
$cf_location = "/2010-11-01/streaming-distribution";
|
1252 |
$cf_distro_streaming_reference = time () . "." . md5 ("streaming" . $s3c["bucket"] . $s3c["access_key"] . $s3c["secret_key"] . $cfc["private_key"] . $cfc["private_key_id"] . $cfc["distro_streaming_cname"]);
|
1253 |
$cf_distro_streaming_xml = '<?xml version="1.0" encoding="UTF-8"?><StreamingDistributionConfig xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/"><S3Origin><DNSName>' . esc_html ($s3c["bucket"]) . '.s3.amazonaws.com</DNSName><OriginAccessIdentity>origin-access-identity/cloudfront/' . esc_html ($cfc["distros_access_id"]) . '</OriginAccessIdentity></S3Origin><CallerReference>' . esc_html ($cf_distro_streaming_reference) . '</CallerReference>' . (($cfc["distro_streaming_cname"]) ? '<CNAME>' . esc_html ($cfc["distro_streaming_cname"]) . '</CNAME>' : '') . '<Comment>' . esc_html (sprintf (_x ("Created by s2Member, for S3 Bucket: %s.", "s2member-admin", "s2member"), $s3c["bucket"])) . '</Comment><Enabled>true</Enabled><DefaultRootObject>index.html</DefaultRootObject><TrustedSigners><Self/></TrustedSigners></StreamingDistributionConfig>';
|
1254 |
$cf_args = array ("method" => "POST", "body" => $cf_distro_streaming_xml, "headers" => array ("Host" => $cf_domain, "Content-Type" => "application/xml", "Date" => $cf_date, "Authorization" => "AWS " . $cfc["access_key"] . ":" . $cf_signature));
|
@@ -1257,12 +1256,14 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
|
|
1257 |
{
|
1258 |
if (preg_match ("/\<StreamingDistribution.*?\>(.+?)\<\/StreamingDistribution\>/is", $cf_response["body"], $cf_distro_streaming_tag) && preg_match ("/\<Id\>(.+?)\<\/Id\>/is", $cf_distro_streaming_tag[1], $cf_distro_streaming_id_tag) && preg_match ("/\<DomainName\>(.+?)\<\/DomainName\>/is", $cf_distro_streaming_tag[1], $cf_distro_streaming_dname_tag))
|
1259 |
return array ("success" => true, "code" => null, "message" => null, "distro_streaming_id" => trim ($cf_distro_streaming_id_tag[1]), "distro_streaming_dname" => trim ($cf_distro_streaming_dname_tag[1]));
|
|
|
1260 |
else /* Else, we use a default error code and message. */
|
1261 |
return array ("success" => false, "code" => -97, "message" => _x ("Unable to create/read Amazon® CloudFront Streaming Distro. Unexpected response.", "s2member-admin", "s2member"));
|
1262 |
}
|
1263 |
else if (isset ($cf_response["code"], $cf_response["message"]))
|
1264 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
1265 |
return array ("success" => false, "code" => $cf_response["code"], "message" => sprintf (_x ("Unable to create Amazon® CloudFront Streaming Distro. %s", "s2member-admin", "s2member"), $cf_response["message"]));
|
|
|
1266 |
else /* Else, we use a default error code and message. */
|
1267 |
return array ("success" => false, "code" => -98, "message" => _x ("Unable to create Amazon® CloudFront Streaming Distro. Connection failed.", "s2member-admin", "s2member"));
|
1268 |
}
|
50 |
$_g = !empty ($_GET) ? $_GET : array ();
|
51 |
$_g = c_ws_plugin__s2member_utils_strings::trim_deep (stripslashes_deep ($_g));
|
52 |
/**/
|
53 |
+
$creating = /* Creating URL? */ (is_array ($create = $create_file_download_url)) ? true : false;
|
54 |
+
$serving = /* If NOT creating a File Download URL, we're serving one. */ (!$creating) ? true : false;
|
55 |
/**/
|
56 |
$req["file_download"] = ($creating) ? @$create["file_download"] : @$_g["s2member_file_download"];
|
57 |
$req["file_download_key"] = ($creating) ? @$create["file_download_key"] : @$_g["s2member_file_download_key"];
|
75 |
{
|
76 |
$using_amazon_s3_storage = ((!$req["file_storage"] || strcasecmp ((string)$req["file_storage"], "s3") === 0) && c_ws_plugin__s2member_utils_conds::using_amazon_s3_storage ()) ? true : false;
|
77 |
$using_amazon_cf_storage = ((!$req["file_storage"] || strcasecmp ((string)$req["file_storage"], "cf") === 0) && c_ws_plugin__s2member_utils_conds::using_amazon_cf_storage ()) ? true : false;
|
78 |
+
$using_amazon_storage = /* Either/or? */ ($using_amazon_s3_storage || $using_amazon_cf_storage) ? true : false;
|
79 |
/**/
|
80 |
$excluded = apply_filters ("ws_plugin__s2member_check_file_download_access_excluded", false, get_defined_vars ());
|
81 |
$valid_file_download_key = ($req["file_download_key"] && is_string ($req["file_download_key"])) ? c_ws_plugin__s2member_files_in::check_file_download_key ($req["file_download"], $req["file_download_key"]) : false;
|
82 |
$checking_user = ($excluded || $valid_file_download_key || ($creating && (!isset ($req["check_user"]) || !filter_var ($req["check_user"], FILTER_VALIDATE_BOOLEAN)) && (!isset ($req["count_against_user"]) || !filter_var ($req["count_against_user"], FILTER_VALIDATE_BOOLEAN)))) ? false : true;
|
83 |
$updating_user_counter = (!$checking_user || ($creating && (!isset ($req["count_against_user"]) || !filter_var ($req["count_against_user"], FILTER_VALIDATE_BOOLEAN)))) ? false : true;
|
84 |
/**/
|
85 |
+
if ( /* In either case, the following routines apply whenever we ARE ``$checking_user``. */($serving || $creating) && $checking_user)
|
86 |
{
|
87 |
if (!$using_amazon_storage && !file_exists ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $req["file_download"]))
|
88 |
{
|
89 |
+
if /* We only need this section when/if we're actually serving. */ ($serving)
|
90 |
status_header (404) . header ("Content-Type: text/html; charset=utf-8") . eval ('while (@ob_end_clean ());') #
|
91 |
. exit (_x ('<strong>404: Sorry, file not found.</strong> Please contact Support for assistance.', "s2member-front", "s2member"));
|
92 |
/**/
|
96 |
/**/
|
97 |
else if ($req["file_download_key"] && is_string ($req["file_download_key"]) && !$valid_file_download_key)
|
98 |
{
|
99 |
+
if /* We only need this section when/if we're actually serving. */ ($serving)
|
100 |
status_header (503) . header ("Content-Type: text/html; charset=utf-8") . eval ('while (@ob_end_clean ());') #
|
101 |
. exit (_x ('<strong>503 ( Invalid Key ):</strong> Sorry, your access to this file has expired. Please contact Support for assistance.', "s2member-front", "s2member"));
|
102 |
/**/
|
106 |
/**/
|
107 |
else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"] || ($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads ()) === false)
|
108 |
{
|
109 |
+
if /* We only need remote functionality when/if we're actually serving. */ ($serving)
|
110 |
if (!has_filter ("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization"))
|
111 |
add_filter ("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization", 10, 2);
|
112 |
/**/
|
113 |
+
if /* We only need remote functionality when/if we're actually serving. */ ($creating)
|
114 |
if (has_filter ("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization"))
|
115 |
remove_filter ("ws_plugin__s2member_check_file_download_access_user", "c_ws_plugin__s2member_files_in::check_file_remote_authorization", 10, 2);
|
116 |
/**/
|
117 |
if ((isset ($file_downloads_enabled_by_site_owner, $min_level_4_downloads) && $file_downloads_enabled_by_site_owner === false) || ($file_downloads_enabled_by_site_owner = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads ()) === false)
|
118 |
{
|
119 |
+
if /* We only need this section when/if we're actually serving. */ ($serving)
|
120 |
status_header (503) . header ("Content-Type: text/html; charset=utf-8") . eval ('while (@ob_end_clean ());') #
|
121 |
. exit (_x ('<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <code>s2Member -> Download Options -> Basic Download Restrictions</code>.', "s2member-front", "s2member"));
|
122 |
/**/
|
128 |
{
|
129 |
if (preg_match ("/^access[_\-]s2member[_\-]level([0-9]+)\//", $req["file_download"], $m) && strlen ($req_level = $m[1]) && (!is_object ($user) || empty ($user->ID) || !$user->has_cap ("access_s2member_level" . $req_level)))
|
130 |
{
|
131 |
+
if /* We only need this section when/if we're actually serving. */ ($serving)
|
132 |
c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars /* Configure MOP Vars here. */ ("file", $req["file_download"], "level", $req_level, $_SERVER["REQUEST_URI"]) . exit ();
|
133 |
/**/
|
134 |
else /* Else return false. */
|
137 |
/**/
|
138 |
else if (preg_match ("/^access[_\-]s2member[_\-]ccap[_\-](.+?)\//", $req["file_download"], $m) && strlen ($req_ccap = preg_replace ("/-/", "_", $m[1])) && (!is_object ($user) || empty ($user->ID) || !$user->has_cap ("access_s2member_ccap_" . $req_ccap)))
|
139 |
{
|
140 |
+
if /* We only need this section when/if we're actually serving. */ ($serving)
|
141 |
c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars /* Configure MOP Vars here. */ ("file", $req["file_download"], "ccap", $req_ccap, $_SERVER["REQUEST_URI"]) . exit ();
|
142 |
/**/
|
143 |
else /* Else return false. */
|
144 |
return false;
|
145 |
}
|
146 |
/**/
|
147 |
+
else if /* We only need this section when/if we're actually serving. */ ($serving)
|
148 |
c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars /* Configure MOP Vars here. */ ("file", $req["file_download"], "level", $min_level_4_downloads, $_SERVER["REQUEST_URI"]) . exit ();
|
149 |
/**/
|
150 |
else /* Else return false. */
|
153 |
/**/
|
154 |
else if (preg_match ("/^access[_\-]s2member[_\-]level([0-9]+)\//", $req["file_download"], $m) && strlen ($req_level = $m[1]) && !$user->has_cap ("access_s2member_level" . $req_level))
|
155 |
{
|
156 |
+
if /* We only need this section when/if we're actually serving. */ ($serving)
|
157 |
c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars /* Configure MOP Vars here. */ ("file", $req["file_download"], "level", $req_level, $_SERVER["REQUEST_URI"]) . exit ();
|
158 |
/**/
|
159 |
else /* Else return false. */
|
162 |
/**/
|
163 |
else if (preg_match ("/^access[_\-]s2member[_\-]ccap[_\-](.+?)\//", $req["file_download"], $m) && strlen ($req_ccap = preg_replace ("/-/", "_", $m[1])) && !$user->has_cap ("access_s2member_ccap_" . $req_ccap))
|
164 |
{
|
165 |
+
if /* We only need this section when/if we're actually serving. */ ($serving)
|
166 |
c_ws_plugin__s2member_mo_page::wp_redirect_w_mop_vars /* Configure MOP Vars here. */ ("file", $req["file_download"], "ccap", $req_ccap, $_SERVER["REQUEST_URI"]) . exit ();
|
167 |
/**/
|
168 |
else /* Else return false. */
|
169 |
return false;
|
170 |
}
|
171 |
/**/
|
172 |
+
else if /* In either case, the following routines apply. */ ($serving || $creating)
|
173 |
{
|
174 |
+
$user_previous_file_downloads = /* Downloads the User has already; in current period/cycle. */ 0;
|
175 |
$user_already_downloaded_this_file = $user_already_downloaded_a_streaming_variation_of_this_file = false;
|
176 |
/**/
|
177 |
$user_file_download_access_log = (is_array ($user_file_download_access_log = get_user_option ("s2member_file_download_access_log", $user_id))) ? $user_file_download_access_log : array ();
|
186 |
{
|
187 |
if (strtotime ($user_file_download_access_log_entry["date"]) < strtotime ("-" . $user_file_downloads["allowed_days"] . " days"))
|
188 |
{
|
189 |
+
unset /* Remove it from the `log`. */ ($user_file_download_access_log[$user_file_download_access_log_entry_key]);
|
190 |
+
$user_file_download_access_arc[] = /* Move `log` entry to the `archive` now. */ $user_file_download_access_log_entry;
|
191 |
}
|
192 |
else if (strtotime ($user_file_download_access_log_entry["date"]) >= strtotime ("-" . $user_file_downloads["allowed_days"] . " days"))
|
193 |
{
|
194 |
+
$user_previous_file_downloads++; /* Previous files always count against this User/Member. */
|
195 |
/**/
|
196 |
$_user_file_download_access_log_entry = &$user_file_download_access_log[$user_file_download_access_log_entry_key];
|
197 |
$_user_already_downloaded_this_file = $_user_already_downloaded_a_streaming_variation_of_this_file = false;
|
198 |
/**/
|
199 |
+
if /* Already downloaded this file? If yes, mark this flag as true. */ ($user_file_download_access_log_entry["file"] === $req["file_download"])
|
200 |
+
$user_already_downloaded_this_file = $_user_already_downloaded_this_file = /* Already downloaded this file? If yes, mark as true. */ true;
|
201 |
/**/
|
202 |
else if (preg_replace ($streaming_variations, "", $user_file_download_access_log_entry["file"]) === preg_replace ($streaming_variations, "", $req["file_download"]))
|
203 |
$user_already_downloaded_this_file = $_user_already_downloaded_this_file = $user_already_downloaded_a_streaming_variation_of_this_file = $_user_already_downloaded_a_streaming_variation_of_this_file = true;
|
213 |
}
|
214 |
}
|
215 |
}
|
216 |
+
else /* Weed out empty log entries. Some older versions of s2Member may have corrupt/empty log entries. */
|
217 |
+
unset ($user_file_download_access_log[$user_file_download_access_log_entry_key]); /* Remove. */
|
218 |
}
|
219 |
if ( /* Updating counter? */$updating_user_counter && /* Do we need a new log entry for this file? */ !$user_already_downloaded_this_file && !$user_already_downloaded_a_streaming_variation_of_this_file)
|
220 |
$user_file_download_access_log[] = array ("date" => date ("Y-m-d"), "time" => time (), "ltime" => time (), "file" => $req["file_download"], "counter" => 1);
|
221 |
/**/
|
222 |
if ($user_previous_file_downloads >= $user_file_downloads["allowed"] && !$user_already_downloaded_this_file && !$user_already_downloaded_a_streaming_variation_of_this_file && !$user->has_cap ("administrator"))
|
223 |
{
|
224 |
+
if /* We only need this section when/if we're actually serving. */ ($serving)
|
225 |
wp_redirect (add_query_arg (urlencode_deep (array ("_s2member_seeking" => array ("type" => "file", "file" => $req["file_download"], "_uri" => base64_encode ($_SERVER["REQUEST_URI"])), "s2member_seeking" => "file-" . $req["file_download"])), get_page_link ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["file_download_limit_exceeded_page"])), apply_filters ("ws_plugin__s2member_content_redirect_status", 301, get_defined_vars ())) . exit ();
|
226 |
/**/
|
227 |
else /* Else return false. */
|
228 |
return false;
|
229 |
}
|
230 |
+
else if /* Save/update counter? By default, we do NOT update the counter when a URL is simply being created for access. */ ($updating_user_counter)
|
231 |
update_user_option ($user_id, "s2member_file_download_access_log", c_ws_plugin__s2member_utils_arrays::array_unique ($user_file_download_access_log)) . update_user_option ($user_id, "s2member_file_download_access_arc", c_ws_plugin__s2member_utils_arrays::array_unique ($user_file_download_access_arc));
|
232 |
}
|
233 |
}
|
236 |
{
|
237 |
if (!$using_amazon_storage && !file_exists ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $req["file_download"]))
|
238 |
{
|
239 |
+
if /* We only need this section when/if we're actually serving. */ ($serving)
|
240 |
status_header (404) . header ("Content-Type: text/html; charset=utf-8") . eval ('while (@ob_end_clean ());') #
|
241 |
. exit (_x ('<strong>404: Sorry, file not found.</strong> Please contact Support for assistance.', "s2member-front", "s2member"));
|
242 |
/**/
|
245 |
}
|
246 |
}
|
247 |
/**/
|
248 |
+
if /* In either case, the following routines apply. */ ($serving || $creating)
|
249 |
{
|
250 |
$basename = basename ($req["file_download"]);
|
251 |
$mimetypes = parse_ini_file (dirname (dirname (dirname (__FILE__))) . "/includes/mime-types.ini");
|
276 |
/**/
|
277 |
if ($using_amazon_s3_storage && ($serving || ($creating && $url_to_storage_source)))
|
278 |
{
|
279 |
+
if /* We only need this section when/if we're actually serving. */ ($serving)
|
280 |
wp_redirect (c_ws_plugin__s2member_files_in::amazon_s3_url ($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype)) . exit ();
|
281 |
/**/
|
282 |
else /* Else return File Download URL. */
|
285 |
/**/
|
286 |
else if ($using_amazon_cf_storage && ($serving || ($creating && $url_to_storage_source)))
|
287 |
{
|
288 |
+
if /* We only need this section when/if we're actually serving. */ ($serving)
|
289 |
wp_redirect (c_ws_plugin__s2member_files_in::amazon_cf_url ($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype)) . exit ();
|
290 |
/**/
|
291 |
else /* Else return File Download URL. */
|
292 |
return apply_filters ("ws_plugin__s2member_file_download_access_url", c_ws_plugin__s2member_files_in::amazon_cf_url ($req["file_download"], $stream, $inline, $ssl, $basename, $mimetype), get_defined_vars ());
|
293 |
}
|
294 |
/**/
|
295 |
+
else if /* Creating a rewrite URL, pointing to local storage. */ ($creating && $rewriting)
|
296 |
{
|
297 |
$url = ($rewrite_base) ? rtrim ($rewrite_base, "/") : rtrim ($rewrite_base_guess, "/");
|
298 |
$url .= (isset ($req["file_download_key"])) ? (($key) ? "/s2member-file-download-key-" . $key : "") : "";
|
302 |
$url .= (isset ($req["file_remote"])) ? (($remote) ? "/s2member-file-remote" : "/s2member-file-remote-no") : "";
|
303 |
$url .= (isset ($req["skip_confirmation"])) ? (($skip_confirmation) ? "/s2member-skip-confirmation" : "/s2member-skip-confirmation-no") : "";
|
304 |
/**/
|
305 |
+
$url = /* File Download Access URL via `mod_rewrite` functionality. */ $url . "/" . $req["file_download"];
|
306 |
$url = ($ssl) ? preg_replace ("/^https?/", "https", $url) : preg_replace ("/^https?/", "http", $url);
|
307 |
/**/
|
308 |
return apply_filters ("ws_plugin__s2member_file_download_access_url", $url, get_defined_vars ());
|
309 |
}
|
310 |
/**/
|
311 |
+
else if /* Else we're creating a URL w/ a query-string; w/ local storage. */ ($creating)
|
312 |
+
{ /* Note: we don't URL encode unreserved chars. Improves media player compatibility. */
|
|
|
313 |
$_url_e_key = ($key) ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep (urlencode ($key)) : "";
|
314 |
$_url_e_storage = ($storage) ? c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep (urlencode ($storage)) : "";
|
315 |
$_url_e_file = c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep (urlencode ($req["file_download"]));
|
327 |
return apply_filters ("ws_plugin__s2member_file_download_access_url", $url, get_defined_vars ());
|
328 |
}
|
329 |
/**/
|
330 |
+
else /* Else, ``if ($serving)``, use local storage option. */
|
331 |
{
|
332 |
@set_time_limit (0) . @ini_set ("zlib.output_compression", 0);
|
333 |
/**/
|
334 |
+
status_header /* 200 OK status header. */ (200);
|
335 |
/**/
|
336 |
+
header ("Content-Encoding:");
|
337 |
header ("Accept-Ranges: none");
|
|
|
338 |
header ("Content-Type: " . $mimetype);
|
339 |
header ("Expires: " . gmdate ("D, d M Y H:i:s", strtotime ("-1 week")) . " GMT");
|
340 |
header ("Last-Modified: " . gmdate ("D, d M Y H:i:s") . " GMT");
|
344 |
/**/
|
345 |
header ('Content-Disposition: ' . (($inline) ? "inline" : "attachment") . '; filename="' . $basename . '"');
|
346 |
/**/
|
347 |
+
eval /* End/clean any output buffers that may exist already. Prep for content delivery. */ ('while (@ob_end_clean ());');
|
348 |
/**/
|
349 |
$_chunk_file = ($_SERVER["SERVER_PROTOCOL"] === "HTTP/1.1" && preg_match ("/apache/i", $_SERVER["SERVER_SOFTWARE"])) ? true : false;
|
350 |
/**/
|
355 |
if (apply_filters ("ws_plugin__s2member_chunk_file_downloads_w_content_length", true, get_defined_vars ()))
|
356 |
header ("Content-Length: " . $length);
|
357 |
/**/
|
358 |
+
header /* `Transfer-Encoding: chunked` conserves memory. */ ("Transfer-Encoding: chunked");
|
359 |
/**/
|
360 |
while (!feof ($resource) && ($chunk_size = strlen ($data = fread ($resource, $_chunk_size))))
|
361 |
eval ('echo dechex ($chunk_size) . "\r\n". $data . "\r\n"; @flush ();');
|
370 |
header ("Content-Length: " . $length);
|
371 |
/**/
|
372 |
while (!feof ($resource) && ($flush_size = strlen ($data = fread ($resource, $_flush_size))))
|
373 |
+
eval /* Conserves memory. */ ('echo $data; @flush ();');
|
374 |
}
|
375 |
+
else if /* Else, use: ``file_get_contents()``. */ ($length)
|
376 |
{
|
377 |
+
@ini_set /* RAM/memory. */ ("memory_limit", WP_MAX_MEMORY_LIMIT);
|
378 |
header ("Content-Length: " . $length) . exit (file_get_contents ($file));
|
379 |
}
|
380 |
else /* Else, we have an empty file with no length. */
|
385 |
}
|
386 |
}
|
387 |
/**/
|
388 |
+
else if /* We only need this section when/if we're actually serving. */ ($serving && $req["file_download"])
|
389 |
status_header (503) . header ("Content-Type: text/html; charset=utf-8") . eval ('while (@ob_end_clean ());') #
|
390 |
. exit (_x ('<strong>503: Access denied.</strong> Invalid File Download specs.', "s2member-front", "s2member"));
|
391 |
/**/
|
392 |
+
else if /* We only need this section when/if we're creating a URL. */ ($creating)
|
393 |
return false;
|
394 |
/**/
|
395 |
do_action ("ws_plugin__s2member_after_file_download_access", get_defined_vars ());
|
396 |
/**/
|
397 |
+
return ($creating) ? /* If creating, false. */ false : null;
|
398 |
}
|
399 |
/**
|
400 |
* Generates a File Download URL for access to a file protected by s2Member.
|
412 |
public static function create_file_download_url ($config = FALSE, $get_streamer_array = FALSE)
|
413 |
{
|
414 |
eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
|
415 |
+
do_action ("ws_plugin__s2member_before_create_file_download_url", get_defined_vars ());
|
416 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
417 |
/**/
|
418 |
+
$config = (is_array ($config)) ? $config : /* This absolutely MUST be an array. */ array ();
|
419 |
/**/
|
420 |
$config["file_download"] = (isset ($config["file_download"]) && is_string ($config["file_download"])) ? trim ($config["file_download"], "/") : @$config["file_download"];
|
421 |
$config["file_download_key"] = (isset ($config["file_download"]) && is_string ($config["file_download"]) && !empty ($config["file_download_key"])) ? c_ws_plugin__s2member_files::file_download_key ($config["file_download"], ((in_array ($config["file_download_key"], array ("ip-forever", "universal", "cache-compatible"))) ? $config["file_download_key"] : false)) : @$config["file_download_key"];
|
423 |
$config["url_to_storage_source"] = /* Force a streaming URL here via ``$get_streamer_array``? */ ($get_streamer_array) ? true : @$config["url_to_storage_source"];
|
424 |
$config["file_stream"] = /* Force a streaming URL here via ``$get_streamer_array``? */ ($get_streamer_array) ? true : @$config["file_stream"];
|
425 |
/**/
|
426 |
+
if (($_url = c_ws_plugin__s2member_files_in::check_file_download_access /* Successfully created a URL to the file? */ (($create_file_download_url = $config))))
|
427 |
{
|
428 |
eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
|
429 |
+
do_action ("ws_plugin__s2member_during_create_file_download_url", get_defined_vars ());
|
430 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
431 |
/**/
|
432 |
$extension = strtolower (substr ($config["file_download"], strrpos ($config["file_download"], ".") + 1));
|
439 |
else if ($get_streamer_array && $streaming && is_array ($ups = c_ws_plugin__s2member_utils_urls::parse_url ($_url)) && isset ($ups["scheme"], $ups["host"]) && ($streamer = $ups["scheme"] . "://" . $ups["host"] . ((!empty ($ups["port"])) ? ":" . $ups["port"] : "")) && ($url = c_ws_plugin__s2member_files_in::check_file_download_access (array_merge ($config, array ("file_stream" => false, "check_user" => false, "count_against_user" => false)))))
|
440 |
$return = array ("streamer" => $streamer, "file" => preg_replace ("/^" . preg_quote ($streamer, "/") . "\//", "", $_url), "url" => preg_replace ("/^.+?\:/", (($ssl) ? "https:" : "http:"), $url));
|
441 |
/**/
|
442 |
+
else if /* If streamer, we MUST return false here; unable to acquire streamer/file. */ ($get_streamer_array)
|
443 |
+
$return = /* We MUST return false here, unable to acquire streamer/file. */ false;
|
444 |
/**/
|
445 |
else /* Else return URL string ( ``$get_streamer_array`` is false ). */
|
446 |
+
$return = /* Else return URL string. */ $_url;
|
447 |
}
|
448 |
/**/
|
449 |
return apply_filters ("ws_plugin__s2member_create_file_download_url", ((isset ($return)) ? $return : false), get_defined_vars ());
|
475 |
{
|
476 |
header ('WWW-Authenticate: Basic realm="' . c_ws_plugin__s2member_utils_strings::esc_dq (strip_tags (_x ("Members Only", "s2member-front", "s2member"))) . '"');
|
477 |
/**/
|
478 |
+
status_header /* Send an unauthorized 401 status header now. */ (401);
|
479 |
+
header /* Content-Type with UTF-8. */ ("Content-Type: text/html; charset=utf-8");
|
480 |
+
eval /* End/clean any output buffers that may exist. */ ('while (@ob_end_clean ());');
|
481 |
/**/
|
482 |
exit (_x ('<strong>401:</strong> Sorry, access denied.', "s2member-front", "s2member"));
|
483 |
}
|
484 |
else if (is_object ($_user = new WP_User ($_SERVER["PHP_AUTH_USER"])) && !empty ($_user->ID))
|
485 |
+
$user = /* Now assign ``$user``. */ $_user;
|
486 |
/**/
|
487 |
do_action ("ws_plugin__s2member_during_check_file_remote_authorization_after", get_defined_vars ());
|
488 |
}
|
|
|
489 |
return apply_filters ("ws_plugin__s2member_check_file_remote_authorization", $user, get_defined_vars ());
|
490 |
}
|
491 |
/**
|
504 |
do_action ("_ws_plugin__s2member_before_check_file_download_key", get_defined_vars ());
|
505 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
506 |
/**/
|
507 |
+
if ($file && is_string ($file) && ($file = trim ($file, "/")) && $key && is_string ($key))
|
508 |
{
|
509 |
if ($key === c_ws_plugin__s2member_files::file_download_key ($file) || $key === c_ws_plugin__s2member_files::file_download_key ("/" . $file))
|
510 |
+
$valid = /* File Download Key is valid. */ true;
|
511 |
else if ($key === c_ws_plugin__s2member_files::file_download_key ($file, "ip-forever") || $key === c_ws_plugin__s2member_files::file_download_key ("/" . $file, "ip-forever"))
|
512 |
+
$valid = /* File Download Key is valid. */ true;
|
513 |
else if ($key === c_ws_plugin__s2member_files::file_download_key ($file, "universal") || $key === c_ws_plugin__s2member_files::file_download_key ("/" . $file, "universal"))
|
514 |
+
$valid = /* File Download Key is valid. */ true;
|
515 |
}
|
|
|
516 |
return apply_filters ("ws_plugin__s2member_check_file_download_key", ((isset ($valid) && $valid) ? true : false), get_defined_vars ());
|
517 |
}
|
518 |
/**
|
546 |
*/
|
547 |
public static function amazon_s3_url ($file = FALSE, $stream = FALSE, $inline = FALSE, $ssl = FALSE, $basename = FALSE, $mimetype = FALSE)
|
548 |
{
|
549 |
+
$file = /* Trim / force string. */ trim ((string)$file, "/");
|
550 |
/**/
|
551 |
foreach ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"] as $option => $option_value)
|
552 |
if (preg_match ("/^amazon_s3_files_/", $option) && ($option = preg_replace ("/^amazon_s3_files_/", "", $option)))
|
559 |
$s3_signature = base64_encode (c_ws_plugin__s2member_files_in::amazon_s3_sign ("GET\n\n\n" . $s3c["expires"] . "\n" . "/" . $s3c["bucket"] . $s3_raw_file));
|
560 |
/**/
|
561 |
$s3_url = ((strtolower ($s3c["bucket"]) !== $s3c["bucket"])) ? "http" . (($ssl) ? "s" : "") . "://s3.amazonaws.com/" . $s3c["bucket"] . $s3_file : "http" . (($ssl) ? "s" : "") . "://" . $s3c["bucket"] . ".s3.amazonaws.com" . $s3_file;
|
562 |
+
/**/
|
563 |
return add_query_arg (c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep /* Don't encode unreserved chars. Maximizes media player compatibility. */
|
564 |
(urlencode_deep (array ("AWSAccessKeyId" => $s3c["access_key"], "Expires" => $s3c["expires"], "Signature" => $s3_signature))), $s3_url);
|
565 |
}
|
580 |
/**/
|
581 |
$cfc["distros_s3_access_id"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distros_s3_access_id"];
|
582 |
/**/
|
583 |
+
if /* Must have Amazon® S3 Bucket/Keys. */ ($s3c["bucket"] && $s3c["access_key"] && $s3c["secret_key"])
|
584 |
{
|
585 |
$s3_date = gmdate ("D, d M Y H:i:s") . " GMT";
|
586 |
$s3_location = ((strtolower ($s3c["bucket"]) !== $s3c["bucket"])) ? "/" . $s3c["bucket"] . "/?acl" : "/?acl";
|
600 |
if (($s3_response = c_ws_plugin__s2member_utils_urls::remote ("https://" . $s3_domain . $s3_location, false, array_merge ($s3_args, array ("timeout" => 20)), "array")) && $s3_response["code"] === 200)
|
601 |
{
|
602 |
$s3_location = ((strtolower ($s3c["bucket"]) !== $s3c["bucket"])) ? "/" . $s3c["bucket"] . "/?policy" : "/?policy";
|
603 |
+
($s3_policy_id = md5 (uniqid ("s2Member/CloudFront:", true))) . ($s3_policy_sid = md5 (uniqid ("s2Member/CloudFront:", true)));
|
604 |
+
$s3_policy_json = '{"Version":"2008-10-17","Id":"' . c_ws_plugin__s2member_utils_strings::esc_dq ($s3_policy_id) . '","Statement":[{"Sid":"' . c_ws_plugin__s2member_utils_strings::esc_dq ($s3_policy_sid) . '","Effect":"Allow","Principal":{"CanonicalUser":"' . c_ws_plugin__s2member_utils_strings::esc_dq ($cfc["distros_s3_access_id"]) . '"},"Action":"s3:GetObject","Resource":"arn:aws:s3:::' . c_ws_plugin__s2member_utils_strings::esc_dq ($s3c["bucket"]) . '/*"}]}';
|
605 |
$s3_signature = base64_encode (c_ws_plugin__s2member_files_in::amazon_s3_sign ("PUT\n\napplication/json\n" . $s3_date . "\n/" . $s3c["bucket"] . "/?policy"));
|
606 |
$s3_args = array ("method" => "PUT", "body" => $s3_policy_json, "headers" => array ("Host" => $s3_domain, "Content-Type" => "application/json", "Date" => $s3_date, "Authorization" => "AWS " . $s3c["access_key"] . ":" . $s3_signature));
|
607 |
/**/
|
613 |
$s3_args = array ("method" => "PUT", "body" => $s3_policy_xml, "headers" => array ("Host" => $s3_domain, "Content-Type" => "text/xml", "Date" => $s3_date, "X-Amz-Acl" => "public-read", "Authorization" => "AWS " . $s3c["access_key"] . ":" . $s3_signature));
|
614 |
/**/
|
615 |
if (($s3_response = c_ws_plugin__s2member_utils_urls::remote ("https://" . $s3_domain . $s3_location, false, array_merge ($s3_args, array ("timeout" => 20)), "array")) && $s3_response["code"] === 200)
|
616 |
+
return /* Successfully configured Amazon® S3 Bucket ACLs and Policy. */ array ("success" => true, "code" => null, "message" => null);
|
617 |
/**/
|
618 |
else if (isset ($s3_response["code"], $s3_response["message"]))
|
619 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® S3 API call. Feel free to exclude `%s` if you like. */
|
698 |
*/
|
699 |
public static function amazon_cf_url ($file = FALSE, $stream = FALSE, $inline = FALSE, $ssl = FALSE, $basename = FALSE, $mimetype = FALSE)
|
700 |
{
|
701 |
+
$file = /* Trim / force string. */ trim ((string)$file, "/");
|
702 |
/**/
|
703 |
foreach ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"] as $option => $option_value)
|
704 |
if (preg_match ("/^amazon_cf_files_/", $option) && ($option = preg_replace ("/^amazon_cf_files_/", "", $option)))
|
706 |
/**/
|
707 |
$cfc["expires"] = strtotime ("+" . apply_filters ("ws_plugin__s2member_amazon_cf_file_expires_time", "24 hours", get_defined_vars ()));
|
708 |
/**/
|
709 |
+
$cf_extn = /* Parses the file extension out so we can scan it in some special scenarios. */ strtolower (substr ($file, strrpos ($file, ".") + 1));
|
710 |
+
$cf_ip_res = /* Do NOT restrict access to a particular IP during `localhost` development. The IP may NOT be the same one Amazon® CloudFront sees. */ (c_ws_plugin__s2member_utils_conds::is_localhost ()) ? false : true;
|
711 |
$cf_stream_extn_resource_exclusions = array_unique ((array)apply_filters ("ws_plugin__s2member_amazon_cf_file_streaming_extension_resource_exclusions", array ("mp3" /* MP3 files should NOT include an extension in their resource reference. */), get_defined_vars ()));
|
712 |
$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"]) . "/" . $file;
|
713 |
$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"]) . "/" . $file;
|
739 |
$cfc["access_key"] = $s3c["access_key"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_access_key"];
|
740 |
$cfc["secret_key"] = $s3c["secret_key"] = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_secret_key"];
|
741 |
/**/
|
742 |
+
if /* We MUST have an Amazon® S3 Bucket and Keys. */ ($s3c["bucket"] && $s3c["access_key"] && $s3c["secret_key"])
|
743 |
{
|
744 |
+
if /* We MUST have Amazon® CloudFront Keys in order to auto-configure. */ ($cfc["private_key"] && $cfc["private_key_id"])
|
745 |
{
|
746 |
if (!$cfc["distro_downloads_id"] || ($cfc["distro_downloads_id"] && ($cf_get_response = c_ws_plugin__s2member_files_in::amazon_cf_get_distro ($cfc["distro_downloads_id"], "downloads")) && ($cf_get_response["success"] || $cf_get_response["code"] === 404)))
|
747 |
{
|
748 |
if (!$cfc["distro_downloads_id"] || ($cfc["distro_downloads_id"] && $cf_get_response && !$cf_get_response["success"] && $cf_get_response["code"] === 404))
|
749 |
+
$cf_distro_downloads_clear = /* Clear, ready for a new one. */ true;
|
750 |
/**/
|
751 |
else if ($cfc["distro_downloads_id"] && $cf_get_response && $cf_get_response["success"] && !$cf_get_response["deployed"])
|
752 |
return array ("success" => false, "code" => -86, "message" => _x ("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.", "s2member-admin", "s2member"));
|
753 |
/**/
|
754 |
else if ($cfc["distro_downloads_id"] && $cf_get_response && $cf_get_response["success"] && $cf_get_response["deployed"] && ($cf_del_response = c_ws_plugin__s2member_files_in::amazon_cf_del_distro ($cfc["distro_downloads_id"], $cf_get_response["etag"], $cf_get_response["xml"])) && $cf_del_response["success"])
|
755 |
+
$cf_distro_downloads_clear = /* Clear, ready for a new one. */ true;
|
756 |
/**/
|
757 |
else if (isset ($cf_del_response["code"], $cf_del_response["message"]))
|
758 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
759 |
return array ("success" => false, "code" => $cf_del_response["code"], "message" => sprintf (_x ("Unable to delete existing Amazon® CloudFront Downloads Distro. %s", "s2member-admin", "s2member"), $cf_del_response["message"]));
|
760 |
/**/
|
761 |
+
if /* Successfully cleared? Ready for a new one? */ (isset ($cf_distro_downloads_clear) && $cf_distro_downloads_clear)
|
762 |
{
|
763 |
+
unset /* Unset these before processing additional routines. Prevents problems in error reporting. */ ($cf_get_response, $cf_del_response);
|
764 |
/**/
|
765 |
if (!$cfc["distro_streaming_id"] || ($cfc["distro_streaming_id"] && ($cf_get_response = c_ws_plugin__s2member_files_in::amazon_cf_get_distro ($cfc["distro_streaming_id"], "streaming")) && ($cf_get_response["success"] || $cf_get_response["code"] === 404)))
|
766 |
{
|
767 |
if (!$cfc["distro_streaming_id"] || ($cfc["distro_streaming_id"] && $cf_get_response && !$cf_get_response["success"] && $cf_get_response["code"] === 404))
|
768 |
+
$cf_distro_streaming_clear = /* Clear, ready for a new one. */ true;
|
769 |
/**/
|
770 |
else if ($cfc["distro_streaming_id"] && $cf_get_response && $cf_get_response["success"] && !$cf_get_response["deployed"])
|
771 |
return array ("success" => false, "code" => -87, "message" => _x ("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.", "s2member-admin", "s2member"));
|
772 |
/**/
|
773 |
else if ($cfc["distro_streaming_id"] && $cf_get_response && $cf_get_response["success"] && $cf_get_response["deployed"] && ($cf_del_response = c_ws_plugin__s2member_files_in::amazon_cf_del_distro ($cfc["distro_streaming_id"], $cf_get_response["etag"], $cf_get_response["xml"])) && $cf_del_response["success"])
|
774 |
+
$cf_distro_streaming_clear = /* Clear, ready for a new one. */ true;
|
775 |
/**/
|
776 |
else if (isset ($cf_del_response["code"], $cf_del_response["message"]))
|
777 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
778 |
return array ("success" => false, "code" => $cf_del_response["code"], "message" => sprintf (_x ("Unable to delete existing Amazon® CloudFront Streaming Distro. %s", "s2member-admin", "s2member"), $cf_del_response["message"]));
|
779 |
/**/
|
780 |
+
if /* Successfully cleared? Ready for a new one? */ (isset ($cf_distro_streaming_clear) && $cf_distro_streaming_clear)
|
781 |
{
|
782 |
+
unset /* Unset these before processing additional routines. Prevents problems in error reporting. */ ($cf_get_response, $cf_del_response);
|
783 |
/**/
|
784 |
if (!$cfc["distros_access_id"] || ($cfc["distros_access_id"] && ($cf_get_response = c_ws_plugin__s2member_files_in::amazon_cf_get_access_origin_identity ($cfc["distros_access_id"])) && ($cf_get_response["success"] || $cf_get_response["code"] === 404)))
|
785 |
{
|
786 |
if (!$cfc["distros_access_id"] || ($cfc["distros_access_id"] && $cf_get_response && !$cf_get_response["success"] && $cf_get_response["code"] === 404))
|
787 |
+
$cf_distros_access_clear = /* Clear, ready for a new one. */ true;
|
788 |
/**/
|
789 |
else if ($cfc["distros_access_id"] && $cf_get_response && $cf_get_response["success"] && ($cf_del_response = c_ws_plugin__s2member_files_in::amazon_cf_del_access_origin_identity ($cfc["distros_access_id"], $cf_get_response["etag"], $cf_get_response["xml"])) && $cf_del_response["success"])
|
790 |
+
$cf_distros_access_clear = /* Clear, ready for a new one. */ true;
|
791 |
/**/
|
792 |
else if (isset ($cf_del_response["code"], $cf_del_response["message"]))
|
793 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
794 |
return array ("success" => false, "code" => $cf_del_response["code"], "message" => sprintf (_x ("Unable to delete existing Amazon® CloudFront Origin Access Identity. %s", "s2member-admin", "s2member"), $cf_del_response["message"]));
|
795 |
/**/
|
796 |
+
if /* Successfully cleared? Ready for a new one? */ (isset ($cf_distros_access_clear) && $cf_distros_access_clear)
|
797 |
{
|
798 |
+
unset /* Unset these before processing additional routines. Prevents problems in error reporting. */ ($cf_get_response, $cf_del_response);
|
799 |
/**/
|
800 |
$cfc = array_merge ($cfc, array ("distros_access_id" => "", "distros_s3_access_id" => "", "distro_downloads_id" => "", "distro_downloads_dname" => "", "distro_streaming_id" => "", "distro_streaming_dname" => "", "distros_auto_config_status" => ""));
|
801 |
$cf_options = array ("ws_plugin__s2member_amazon_cf_files_distros_access_id" => "", "ws_plugin__s2member_amazon_cf_files_distros_s3_access_id" => "", "ws_plugin__s2member_amazon_cf_files_distro_downloads_id" => "", "ws_plugin__s2member_amazon_cf_files_distro_downloads_dname" => "", "ws_plugin__s2member_amazon_cf_files_distro_streaming_id" => "", "ws_plugin__s2member_amazon_cf_files_distro_streaming_dname" => "", "ws_plugin__s2member_amazon_cf_files_distros_auto_config_status" => "");
|
819 |
$cf_options = array ("ws_plugin__s2member_amazon_cf_files_distro_streaming_id" => $cf_response["distro_streaming_id"], "ws_plugin__s2member_amazon_cf_files_distro_streaming_dname" => $cf_response["distro_streaming_dname"]);
|
820 |
c_ws_plugin__s2member_menu_pages::update_all_options ($cf_options, true, false, false, false, false);
|
821 |
/**/
|
822 |
+
for ($a = 1, $attempts = 4, $sleep = 2, sleep ($sleep); $a <= $attempts; $a++, (($a <= $attempts) ? sleep ($sleep) : null))
|
823 |
+
/* Allow a generous propagation time here. Amazon's high-availability services do NOT guarantee real-time updates.
|
824 |
+
Since we DO need a fully propagated Origin Access Identity now, we need to make several attempts at success.
|
825 |
+
For further details, please see this thread: <https://forums.aws.amazon.com/message.jspa?messageID=42875>. */
|
826 |
+
if (($s3_response = c_ws_plugin__s2member_files_in::amazon_s3_auto_configure_acls ()) && $s3_response["success"])
|
827 |
+
{
|
828 |
+
$cfc = array_merge ($cfc, array ("distros_auto_config_status" => "configured"));
|
829 |
+
$cf_options = array ("ws_plugin__s2member_amazon_cf_files_distros_auto_config_status" => "configured");
|
830 |
+
c_ws_plugin__s2member_menu_pages::update_all_options ( /* Now configured! */$cf_options, true, false, false, false, false);
|
831 |
+
return /* Successfully configured Amazon® S3/CloudFront distros. */ array ("success" => true, "code" => null, "message" => null);
|
832 |
+
}
|
833 |
+
if (isset ($s3_response["code"], $s3_response["message"]))
|
834 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® S3 API call. Feel free to exclude `%s` if you like. */
|
835 |
return array ("success" => false, "code" => $s3_response["code"], "message" => sprintf (_x ("Unable to update existing Amazon® S3 ACLs. %s", "s2member-admin", "s2member"), $s3_response["message"]));
|
836 |
/**/
|
906 |
*/
|
907 |
public static function amazon_cf_get_access_origin_identity ($access_id = FALSE)
|
908 |
{
|
909 |
+
if /* Valid parameters? */ ($access_id && is_string ($access_id))
|
910 |
{
|
911 |
foreach ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"] as $option => $option_value)
|
912 |
if (preg_match ("/^amazon_cf_files_/", $option) && ($option = preg_replace ("/^amazon_cf_files_/", "", $option)))
|
971 |
$cf_args = array ("method" => "DELETE", "headers" => array ("Host" => $cf_domain, "Date" => $cf_date, "If-Match" => $access_id_etag, "Authorization" => "AWS " . $cfc["access_key"] . ":" . $cf_signature));
|
972 |
/**/
|
973 |
if (($cf_response = c_ws_plugin__s2member_utils_urls::remote ("https://" . $cf_domain . $cf_location, false, array_merge ($cf_args, array ("timeout" => 20)), "array")) && ($cf_response["code"] === 200 || $cf_response["code"] === 204 /* Deleted. */))
|
974 |
+
return /* Deleted successfully. */ array ("success" => true, "code" => null, "message" => null);
|
975 |
/**/
|
976 |
else if (isset ($cf_response["code"], $cf_response["message"]))
|
977 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
1086 |
*/
|
1087 |
public static function amazon_cf_disable_distro ($distro_id = FALSE, $distro_id_etag = FALSE, $distro_id_xml = FALSE)
|
1088 |
{
|
1089 |
+
if ($distro_id && is_string ($distro_id) && $distro_id_etag && is_string ($distro_id_etag) && $distro_id_xml && is_string ($distro_id_xml) && ($distro_id_type = (stripos ($distro_id_xml, "<StreamingDistribution") !== false) ? "streaming" : ((stripos ($distro_id_xml, "<Distribution") !== false) ? "downloads" : false)) && preg_match ("/\<CallerReference\>(.+?)\<\/CallerReference\>/is", $distro_id_xml, $distro_id_reference_tag) && ($distro_id_reference = $distro_id_reference_tag[1]))
|
|
|
|
|
1090 |
{
|
1091 |
+
if /* Only if it has NOT already been disabled. We do NOT need to do it again. */ (stripos ($distro_id_xml, "<Enabled>false</Enabled>") === false)
|
1092 |
{
|
1093 |
+
if /* Check distro status before we even begin processing. */ (stripos ($distro_id_xml, "<Status>Deployed</Status>") !== false)
|
1094 |
{
|
1095 |
foreach ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"] as $option => $option_value)
|
1096 |
if (preg_match ("/^amazon_cf_files_/", $option) && ($option = preg_replace ("/^amazon_cf_files_/", "", $option)))
|
1140 |
*/
|
1141 |
public static function amazon_cf_del_distro ($distro_id = FALSE, $distro_id_etag = FALSE, $distro_id_xml = FALSE)
|
1142 |
{
|
1143 |
+
if ($distro_id && is_string ($distro_id) && $distro_id_etag && is_string ($distro_id_etag) && $distro_id_xml && is_string ($distro_id_xml) && ($distro_id_type = (stripos ($distro_id_xml, "<StreamingDistribution") !== false) ? "streaming" : ((stripos ($distro_id_xml, "<Distribution") !== false) ? "downloads" : false)) && preg_match ("/\<CallerReference\>(.+?)\<\/CallerReference\>/is", $distro_id_xml, $distro_id_reference_tag) && ($distro_id_reference = $distro_id_reference_tag[1]))
|
|
|
|
|
1144 |
{
|
1145 |
+
if /* Check distro status before we even begin processing this deletion. */ (stripos ($distro_id_xml, "<Status>Deployed</Status>") !== false)
|
1146 |
{
|
1147 |
if (($cf_response = c_ws_plugin__s2member_files_in::amazon_cf_disable_distro ($distro_id, $distro_id_etag, $distro_id_xml)) && $cf_response["success"])
|
1148 |
{
|
1163 |
$cf_args = array ("method" => "DELETE", "headers" => array ("Host" => $cf_domain, "Date" => $cf_date, "If-Match" => $cf_response["etag"], "Authorization" => "AWS " . $cfc["access_key"] . ":" . $cf_signature));
|
1164 |
/**/
|
1165 |
if (($cf_response = c_ws_plugin__s2member_utils_urls::remote ("https://" . $cf_domain . $cf_location, false, array_merge ($cf_args, array ("timeout" => 20)), "array")) && ($cf_response["code"] === 200 || $cf_response["code"] === 204 /* Deleted. */))
|
1166 |
+
return /* Deleted successfully. */ array ("success" => true, "code" => null, "message" => null);
|
1167 |
/**/
|
1168 |
else if (isset ($cf_response["code"], $cf_response["message"]))
|
1169 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
1222 |
$cf_date = gmdate ("D, d M Y H:i:s") . " GMT";
|
1223 |
$cf_signature = base64_encode (c_ws_plugin__s2member_files_in::amazon_cf_sign ($cf_date));
|
1224 |
/**/
|
1225 |
+
if /* Create a `downloads` Distro? This uses a different XML schema. */ ($distro_type === "downloads")
|
1226 |
{
|
1227 |
+
$cf_location = /* Create distro. */ "/2010-11-01/distribution";
|
1228 |
$cf_distro_downloads_reference = time () . "." . md5 ("downloads" . $s3c["bucket"] . $s3c["access_key"] . $s3c["secret_key"] . $cfc["private_key"] . $cfc["private_key_id"] . $cfc["distro_downloads_cname"]);
|
1229 |
$cf_distro_downloads_xml = '<?xml version="1.0" encoding="UTF-8"?><DistributionConfig xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/"><S3Origin><DNSName>' . esc_html ($s3c["bucket"]) . '.s3.amazonaws.com</DNSName><OriginAccessIdentity>origin-access-identity/cloudfront/' . esc_html ($cfc["distros_access_id"]) . '</OriginAccessIdentity></S3Origin><CallerReference>' . esc_html ($cf_distro_downloads_reference) . '</CallerReference>' . (($cfc["distro_downloads_cname"]) ? '<CNAME>' . esc_html ($cfc["distro_downloads_cname"]) . '</CNAME>' : '') . '<Comment>' . esc_html (sprintf (_x ("Created by s2Member, for S3 Bucket: %s.", "s2member-admin", "s2member"), $s3c["bucket"])) . '</Comment><Enabled>true</Enabled><DefaultRootObject>index.html</DefaultRootObject><TrustedSigners><Self/></TrustedSigners></DistributionConfig>';
|
1230 |
$cf_args = array ("method" => "POST", "body" => $cf_distro_downloads_xml, "headers" => array ("Host" => $cf_domain, "Content-Type" => "application/xml", "Date" => $cf_date, "Authorization" => "AWS " . $cfc["access_key"] . ":" . $cf_signature));
|
1233 |
{
|
1234 |
if (preg_match ("/\<Distribution.*?\>(.+?)\<\/Distribution\>/is", $cf_response["body"], $cf_distro_downloads_tag) && preg_match ("/\<Id\>(.+?)\<\/Id\>/is", $cf_distro_downloads_tag[1], $cf_distro_downloads_id_tag) && preg_match ("/\<DomainName\>(.+?)\<\/DomainName\>/is", $cf_distro_downloads_tag[1], $cf_distro_downloads_dname_tag))
|
1235 |
return array ("success" => true, "code" => null, "message" => null, "distro_downloads_id" => trim ($cf_distro_downloads_id_tag[1]), "distro_downloads_dname" => trim ($cf_distro_downloads_dname_tag[1]));
|
1236 |
+
/**/
|
1237 |
else /* Else, we use a default error code and message. */
|
1238 |
return array ("success" => false, "code" => -97, "message" => _x ("Unable to create/read Amazon® CloudFront Downloads Distro. Unexpected response.", "s2member-admin", "s2member"));
|
1239 |
}
|
1240 |
else if (isset ($cf_response["code"], $cf_response["message"]))
|
1241 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
1242 |
return array ("success" => false, "code" => $cf_response["code"], "message" => sprintf (_x ("Unable to create Amazon® CloudFront Downloads Distro. %s", "s2member-admin", "s2member"), $cf_response["message"]));
|
1243 |
+
/**/
|
1244 |
else /* Else, we use a default error code and message. */
|
1245 |
return array ("success" => false, "code" => -98, "message" => _x ("Unable to create Amazon® CloudFront Downloads Distro. Connection failed.", "s2member-admin", "s2member"));
|
1246 |
}
|
1247 |
/**/
|
1248 |
+
else if /* Create a `streaming` Distro? A different XML schema. */ ($distro_type === "streaming")
|
1249 |
{
|
1250 |
+
$cf_location = /* Create streaming distro. */ "/2010-11-01/streaming-distribution";
|
1251 |
$cf_distro_streaming_reference = time () . "." . md5 ("streaming" . $s3c["bucket"] . $s3c["access_key"] . $s3c["secret_key"] . $cfc["private_key"] . $cfc["private_key_id"] . $cfc["distro_streaming_cname"]);
|
1252 |
$cf_distro_streaming_xml = '<?xml version="1.0" encoding="UTF-8"?><StreamingDistributionConfig xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/"><S3Origin><DNSName>' . esc_html ($s3c["bucket"]) . '.s3.amazonaws.com</DNSName><OriginAccessIdentity>origin-access-identity/cloudfront/' . esc_html ($cfc["distros_access_id"]) . '</OriginAccessIdentity></S3Origin><CallerReference>' . esc_html ($cf_distro_streaming_reference) . '</CallerReference>' . (($cfc["distro_streaming_cname"]) ? '<CNAME>' . esc_html ($cfc["distro_streaming_cname"]) . '</CNAME>' : '') . '<Comment>' . esc_html (sprintf (_x ("Created by s2Member, for S3 Bucket: %s.", "s2member-admin", "s2member"), $s3c["bucket"])) . '</Comment><Enabled>true</Enabled><DefaultRootObject>index.html</DefaultRootObject><TrustedSigners><Self/></TrustedSigners></StreamingDistributionConfig>';
|
1253 |
$cf_args = array ("method" => "POST", "body" => $cf_distro_streaming_xml, "headers" => array ("Host" => $cf_domain, "Content-Type" => "application/xml", "Date" => $cf_date, "Authorization" => "AWS " . $cfc["access_key"] . ":" . $cf_signature));
|
1256 |
{
|
1257 |
if (preg_match ("/\<StreamingDistribution.*?\>(.+?)\<\/StreamingDistribution\>/is", $cf_response["body"], $cf_distro_streaming_tag) && preg_match ("/\<Id\>(.+?)\<\/Id\>/is", $cf_distro_streaming_tag[1], $cf_distro_streaming_id_tag) && preg_match ("/\<DomainName\>(.+?)\<\/DomainName\>/is", $cf_distro_streaming_tag[1], $cf_distro_streaming_dname_tag))
|
1258 |
return array ("success" => true, "code" => null, "message" => null, "distro_streaming_id" => trim ($cf_distro_streaming_id_tag[1]), "distro_streaming_dname" => trim ($cf_distro_streaming_dname_tag[1]));
|
1259 |
+
/**/
|
1260 |
else /* Else, we use a default error code and message. */
|
1261 |
return array ("success" => false, "code" => -97, "message" => _x ("Unable to create/read Amazon® CloudFront Streaming Distro. Unexpected response.", "s2member-admin", "s2member"));
|
1262 |
}
|
1263 |
else if (isset ($cf_response["code"], $cf_response["message"]))
|
1264 |
/* translators: In this translation, `%s` may be filled with an English message, which comes from the Amazon® CloudFront API call. Feel free to exclude `%s` if you like. */
|
1265 |
return array ("success" => false, "code" => $cf_response["code"], "message" => sprintf (_x ("Unable to create Amazon® CloudFront Streaming Distro. %s", "s2member-admin", "s2member"), $cf_response["message"]));
|
1266 |
+
/**/
|
1267 |
else /* Else, we use a default error code and message. */
|
1268 |
return array ("success" => false, "code" => -98, "message" => _x ("Unable to create Amazon® CloudFront Streaming Distro. Connection failed.", "s2member-admin", "s2member"));
|
1269 |
}
|
includes/classes/files.inc.php
CHANGED
@@ -157,19 +157,16 @@ if (!class_exists ("c_ws_plugin__s2member_files"))
|
|
157 |
/**/
|
158 |
$file = ($file && is_string ($file) && ($file = trim ($file, "/"))) ? $file : "";
|
159 |
/**/
|
160 |
-
if ($directive === "ip-forever"
|
161 |
-
|
162 |
/**/
|
163 |
else if ($directive === "universal" || $directive === "cache-compatible" || $directive)
|
164 |
-
|
165 |
/**/
|
166 |
-
else
|
167 |
-
|
168 |
/**/
|
169 |
-
$key = md5 (c_ws_plugin__s2member_utils_encryption::xencrypt ($salt, false, false));
|
170 |
-
/**/
|
171 |
-
if ($allow_caching === false) /* Disallow caching? */
|
172 |
-
c_ws_plugin__s2member_no_cache::no_cache_constants (true);
|
173 |
/**/
|
174 |
return apply_filters ("ws_plugin__s2member_file_download_key", $key, get_defined_vars ());
|
175 |
}
|
157 |
/**/
|
158 |
$file = ($file && is_string ($file) && ($file = trim ($file, "/"))) ? $file : "";
|
159 |
/**/
|
160 |
+
if ($directive === "ip-forever" && c_ws_plugin__s2member_no_cache::no_cache_constants (true))
|
161 |
+
$salt = $file . $_SERVER["REMOTE_ADDR"];
|
162 |
/**/
|
163 |
else if ($directive === "universal" || $directive === "cache-compatible" || $directive)
|
164 |
+
$salt = /* Just the file name. This IS cachable. */ $file;
|
165 |
/**/
|
166 |
+
else if (c_ws_plugin__s2member_no_cache::no_cache_constants (true))
|
167 |
+
$salt = date ("Y-m-d") . $_SERVER["REMOTE_ADDR"] . $_SERVER["HTTP_USER_AGENT"] . $file;
|
168 |
/**/
|
169 |
+
$key = (!empty ($salt)) ? md5 (c_ws_plugin__s2member_utils_encryption::xencrypt ($salt, false, false)) : "";
|
|
|
|
|
|
|
170 |
/**/
|
171 |
return apply_filters ("ws_plugin__s2member_file_download_key", $key, get_defined_vars ());
|
172 |
}
|
includes/classes/menu-pages.inc.php
CHANGED
@@ -15,7 +15,7 @@
|
|
15 |
* @since 3.5
|
16 |
*/
|
17 |
if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
|
18 |
-
exit
|
19 |
/**/
|
20 |
if (!class_exists ("c_ws_plugin__s2member_menu_pages"))
|
21 |
{
|
@@ -27,6 +27,15 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages"))
|
|
27 |
*/
|
28 |
class c_ws_plugin__s2member_menu_pages
|
29 |
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
/**
|
31 |
* Saves all options from any menu page.
|
32 |
*
|
@@ -48,7 +57,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages"))
|
|
48 |
{
|
49 |
$updated_all_options = false; /* Initialize this to a value of false. Initializing this variable here makes it an available reference-variable to Hooks/Filters. */
|
50 |
/**/
|
51 |
-
eval
|
52 |
do_action ("ws_plugin__s2member_before_update_all_options", get_defined_vars ()); /* If you use this Hook, be sure to use ``wp_verify_nonce()``. */
|
53 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
54 |
/**/
|
@@ -70,7 +79,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages"))
|
|
70 |
/**/
|
71 |
unset ($key, $value); /* Unset these utility variables now. This prevents bleeding vars into Hooks/Filters that are of no use. */
|
72 |
/**/
|
73 |
-
eval
|
74 |
do_action ("ws_plugin__s2member_during_update_all_options", get_defined_vars ()); /* If you use this Hook, be sure to use ``wp_verify_nonce()``. */
|
75 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
76 |
/**/
|
@@ -110,7 +119,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages"))
|
|
110 |
$updated_all_options = true; /* Flag indicating this routine was processed successfully; and that all s2Member options have been updated successfully.*/
|
111 |
}
|
112 |
/**/
|
113 |
-
eval
|
114 |
do_action ("ws_plugin__s2member_after_update_all_options", get_defined_vars ()); /* If you use this Hook, be sure to use ``wp_verify_nonce()``. */
|
115 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
116 |
/**/
|
@@ -261,7 +270,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages"))
|
|
261 |
*/
|
262 |
public static function _add_settings_link ($actions = FALSE, $plugin_file = FALSE)
|
263 |
{
|
264 |
-
eval
|
265 |
do_action ("_ws_plugin__s2member_before_add_settings_link", get_defined_vars ());
|
266 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
267 |
/**/
|
@@ -270,7 +279,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages"))
|
|
270 |
$settings = '<a href="' . esc_attr (admin_url ("/admin.php?page=ws-plugin--s2member-gen-ops")) . '">Settings</a>';
|
271 |
array_unshift ($actions, apply_filters ("ws_plugin__s2member_add_settings_link", $settings, get_defined_vars ()));
|
272 |
/**/
|
273 |
-
eval
|
274 |
do_action ("_ws_plugin__s2member_during_add_settings_link", get_defined_vars ());
|
275 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
276 |
}
|
@@ -293,10 +302,10 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages"))
|
|
293 |
/**/
|
294 |
if (!empty ($_GET["page"]) && preg_match ("/ws-plugin--s2member-/", $_GET["page"]))
|
295 |
{
|
296 |
-
wp_enqueue_script
|
297 |
-
wp_enqueue_script
|
298 |
-
wp_enqueue_script
|
299 |
-
wp_enqueue_script
|
300 |
wp_enqueue_script ("jquery-sprintf", $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/includes/jquery/jquery.sprintf/jquery.sprintf-min.js", array ("jquery"), c_ws_plugin__s2member_utilities::ver_checksum ());
|
301 |
wp_enqueue_script ("jquery-json-ps", $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/includes/jquery/jquery.json-ps/jquery.json-ps-min.js", array ("jquery"), c_ws_plugin__s2member_utilities::ver_checksum ());
|
302 |
wp_enqueue_script ("jquery-ui-effects", $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/includes/jquery/jquery.ui-effects/jquery.ui-effects-min.js", array ("jquery", "jquery-ui-core"), c_ws_plugin__s2member_utilities::ver_checksum ());
|
@@ -325,7 +334,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages"))
|
|
325 |
/**/
|
326 |
if (!empty ($_GET["page"]) && preg_match ("/ws-plugin--s2member-/", $_GET["page"]))
|
327 |
{
|
328 |
-
wp_enqueue_style
|
329 |
wp_enqueue_style ("ws-plugin--s2member-menu-pages", site_url ("/?ws_plugin__s2member_menu_pages_css=" . urlencode (mt_rand ())), array ("thickbox"), c_ws_plugin__s2member_utilities::ver_checksum (), "all");
|
330 |
/**/
|
331 |
do_action ("ws_plugin__s2member_during_add_admin_styles", get_defined_vars ());
|
@@ -495,12 +504,16 @@ if (!class_exists ("c_ws_plugin__s2member_menu_pages"))
|
|
495 |
c_ws_plugin__s2member_admin_notices::display_admin_notice ('Unprotected. The .htaccess protection file ( <code>' . esc_html (c_ws_plugin__s2member_utils_dirs::doc_root_path ($htaccess)) . '</code> ) does not contain <code>deny from all</code>. Inside your .htaccess file, add this:<br /><pre>' . esc_html ($htaccess_contents) . '</pre>', true);
|
496 |
/**/
|
497 |
if (!empty ($_POST["ws_plugin__s2member_amazon_cf_files_auto_configure_distros"]) && ($nonce = $_POST["ws_plugin__s2member_amazon_cf_files_auto_configure_distros"]) && wp_verify_nonce ($nonce, "ws-plugin--s2member-amazon-cf-files-auto-configure-distros"))
|
498 |
-
|
499 |
-
if (($amazon_cf_auto_configure_distros = c_ws_plugin__s2member_files_in::amazon_cf_auto_configure_distros ()) && $amazon_cf_auto_configure_distros["success"]) /* CNAME instructions here too. */
|
500 |
c_ws_plugin__s2member_admin_notices::display_admin_notice ('Amazon® CloudFront Distributions auto-configured successfully. Please allow 30 minutes for propagation.' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_downloads_cname"]) ? '<br /><em>Downloads Distribution CNAME: <code>' . esc_html ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_downloads_cname"]) . ' —» ' . esc_html ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_downloads_dname"]) . '</code></em>' : '') . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_streaming_cname"]) ? '<br /><em>Streaming Distribution CNAME: <code>' . esc_html ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_streaming_cname"]) . ' —» ' . esc_html ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_streaming_dname"]) . '</code></em>' : ''));
|
501 |
-
/**/
|
502 |
else /* Else there was an error. We need to report this back to the site owner so they can understand what's going on. */
|
503 |
-
(
|
|
|
|
|
|
|
|
|
|
|
|
|
504 |
/**/
|
505 |
include_once dirname (dirname (__FILE__)) . "/menu-pages/down-ops.inc.php";
|
506 |
/**/
|
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_menu_pages"))
|
21 |
{
|
27 |
*/
|
28 |
class c_ws_plugin__s2member_menu_pages
|
29 |
{
|
30 |
+
/**
|
31 |
+
* Pre-display errors.
|
32 |
+
*
|
33 |
+
* @package s2Member\Menu_Pages
|
34 |
+
* @since 111209
|
35 |
+
*
|
36 |
+
* @var array
|
37 |
+
*/
|
38 |
+
public static $pre_display_errors = array ();
|
39 |
/**
|
40 |
* Saves all options from any menu page.
|
41 |
*
|
57 |
{
|
58 |
$updated_all_options = false; /* Initialize this to a value of false. Initializing this variable here makes it an available reference-variable to Hooks/Filters. */
|
59 |
/**/
|
60 |
+
eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
|
61 |
do_action ("ws_plugin__s2member_before_update_all_options", get_defined_vars ()); /* If you use this Hook, be sure to use ``wp_verify_nonce()``. */
|
62 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
63 |
/**/
|
79 |
/**/
|
80 |
unset ($key, $value); /* Unset these utility variables now. This prevents bleeding vars into Hooks/Filters that are of no use. */
|
81 |
/**/
|
82 |
+
eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
|
83 |
do_action ("ws_plugin__s2member_during_update_all_options", get_defined_vars ()); /* If you use this Hook, be sure to use ``wp_verify_nonce()``. */
|
84 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
85 |
/**/
|
119 |
$updated_all_options = true; /* Flag indicating this routine was processed successfully; and that all s2Member options have been updated successfully.*/
|
120 |
}
|
121 |
/**/
|
122 |
+
eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
|
123 |
do_action ("ws_plugin__s2member_after_update_all_options", get_defined_vars ()); /* If you use this Hook, be sure to use ``wp_verify_nonce()``. */
|
124 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
125 |
/**/
|
270 |
*/
|
271 |
public static function _add_settings_link ($actions = FALSE, $plugin_file = FALSE)
|
272 |
{
|
273 |
+
eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
|
274 |
do_action ("_ws_plugin__s2member_before_add_settings_link", get_defined_vars ());
|
275 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
276 |
/**/
|
279 |
$settings = '<a href="' . esc_attr (admin_url ("/admin.php?page=ws-plugin--s2member-gen-ops")) . '">Settings</a>';
|
280 |
array_unshift ($actions, apply_filters ("ws_plugin__s2member_add_settings_link", $settings, get_defined_vars ()));
|
281 |
/**/
|
282 |
+
eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;');
|
283 |
do_action ("_ws_plugin__s2member_during_add_settings_link", get_defined_vars ());
|
284 |
unset ($__refs, $__v); /* Unset defined __refs, __v. */
|
285 |
}
|
302 |
/**/
|
303 |
if (!empty ($_GET["page"]) && preg_match ("/ws-plugin--s2member-/", $_GET["page"]))
|
304 |
{
|
305 |
+
wp_enqueue_script("jquery");
|
306 |
+
wp_enqueue_script("thickbox");
|
307 |
+
wp_enqueue_script("media-upload");
|
308 |
+
wp_enqueue_script("jquery-ui-core");
|
309 |
wp_enqueue_script ("jquery-sprintf", $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/includes/jquery/jquery.sprintf/jquery.sprintf-min.js", array ("jquery"), c_ws_plugin__s2member_utilities::ver_checksum ());
|
310 |
wp_enqueue_script ("jquery-json-ps", $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/includes/jquery/jquery.json-ps/jquery.json-ps-min.js", array ("jquery"), c_ws_plugin__s2member_utilities::ver_checksum ());
|
311 |
wp_enqueue_script ("jquery-ui-effects", $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"] . "/includes/jquery/jquery.ui-effects/jquery.ui-effects-min.js", array ("jquery", "jquery-ui-core"), c_ws_plugin__s2member_utilities::ver_checksum ());
|
334 |
/**/
|
335 |
if (!empty ($_GET["page"]) && preg_match ("/ws-plugin--s2member-/", $_GET["page"]))
|
336 |
{
|
337 |
+
wp_enqueue_style("thickbox");
|
338 |
wp_enqueue_style ("ws-plugin--s2member-menu-pages", site_url ("/?ws_plugin__s2member_menu_pages_css=" . urlencode (mt_rand ())), array ("thickbox"), c_ws_plugin__s2member_utilities::ver_checksum (), "all");
|
339 |
/**/
|
340 |
do_action ("ws_plugin__s2member_during_add_admin_styles", get_defined_vars ());
|
504 |
c_ws_plugin__s2member_admin_notices::display_admin_notice ('Unprotected. The .htaccess protection file ( <code>' . esc_html (c_ws_plugin__s2member_utils_dirs::doc_root_path ($htaccess)) . '</code> ) does not contain <code>deny from all</code>. Inside your .htaccess file, add this:<br /><pre>' . esc_html ($htaccess_contents) . '</pre>', true);
|
505 |
/**/
|
506 |
if (!empty ($_POST["ws_plugin__s2member_amazon_cf_files_auto_configure_distros"]) && ($nonce = $_POST["ws_plugin__s2member_amazon_cf_files_auto_configure_distros"]) && wp_verify_nonce ($nonce, "ws-plugin--s2member-amazon-cf-files-auto-configure-distros"))
|
507 |
+
if (($amazon_cf_auto_configure_distros = c_ws_plugin__s2member_files_in::amazon_cf_auto_configure_distros ()) && $amazon_cf_auto_configure_distros["success"])
|
|
|
508 |
c_ws_plugin__s2member_admin_notices::display_admin_notice ('Amazon® CloudFront Distributions auto-configured successfully. Please allow 30 minutes for propagation.' . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_downloads_cname"]) ? '<br /><em>Downloads Distribution CNAME: <code>' . esc_html ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_downloads_cname"]) . ' —» ' . esc_html ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_downloads_dname"]) . '</code></em>' : '') . (($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_streaming_cname"]) ? '<br /><em>Streaming Distribution CNAME: <code>' . esc_html ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_streaming_cname"]) . ' —» ' . esc_html ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_streaming_dname"]) . '</code></em>' : ''));
|
|
|
509 |
else /* Else there was an error. We need to report this back to the site owner so they can understand what's going on. */
|
510 |
+
(c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"] = true) . c_ws_plugin__s2member_admin_notices::display_admin_notice ('Unable to auto-configure Amazon® CloudFront Distributions.<br />Error code: <code>' . esc_html ($amazon_cf_auto_configure_distros["code"]) . '</code>. Error Message: <code>' . esc_html ($amazon_cf_auto_configure_distros["message"]) . '</code>', true);
|
511 |
+
/**/
|
512 |
+
if (!empty ($_POST["ws_plugin__s2member_amazon_s3_files_auto_configure_acls"]) && ($nonce = $_POST["ws_plugin__s2member_amazon_s3_files_auto_configure_acls"]) && wp_verify_nonce ($nonce, "ws-plugin--s2member-amazon-s3-files-auto-configure-acls"))
|
513 |
+
if (($amazon_s3_auto_configure_acls = c_ws_plugin__s2member_files_in::amazon_s3_auto_configure_acls ()) && $amazon_s3_auto_configure_acls["success"])
|
514 |
+
c_ws_plugin__s2member_admin_notices::display_admin_notice ('Amazon® S3 ACLs auto-configured successfully.');
|
515 |
+
else /* Else there was an error. We need to report this back to the site owner so they can understand what's going on. */
|
516 |
+
(c_ws_plugin__s2member_menu_pages::$pre_display_errors["s3_files_auto_configure_acls"] = true) . c_ws_plugin__s2member_admin_notices::display_admin_notice ('Unable to auto-configure Amazon® S3 ACLs.<br />Error code: <code>' . esc_html ($amazon_s3_auto_configure_acls["code"]) . '</code>. Error Message: <code>' . esc_html ($amazon_s3_auto_configure_acls["message"]) . '</code>', true);
|
517 |
/**/
|
518 |
include_once dirname (dirname (__FILE__)) . "/menu-pages/down-ops.inc.php";
|
519 |
/**/
|
includes/classes/utils-arrays.inc.php
CHANGED
@@ -15,7 +15,7 @@
|
|
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_utils_arrays"))
|
21 |
{
|
@@ -114,13 +114,13 @@ if (!class_exists ("c_ws_plugin__s2member_utils_arrays"))
|
|
114 |
return false;
|
115 |
}
|
116 |
/**
|
117 |
-
* Removes all null
|
118 |
*
|
119 |
* @package s2Member\Utilities
|
120 |
* @since 111101
|
121 |
*
|
122 |
* @param array $array An input array.
|
123 |
-
* @return array Returns the ``$array`` after having reduced
|
124 |
*/
|
125 |
public static function remove_nulls ($array = FALSE)
|
126 |
{
|
@@ -129,10 +129,33 @@ if (!class_exists ("c_ws_plugin__s2member_utils_arrays"))
|
|
129 |
foreach ($array as $key => &$value)
|
130 |
{
|
131 |
if (is_array ($value) /* Recursive function call here. */)
|
132 |
-
$value = c_ws_plugin__s2member_utils_arrays::
|
133 |
/**/
|
134 |
-
else if (is_null
|
135 |
-
unset($array[$key]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
136 |
}
|
137 |
return $array;
|
138 |
}
|
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_utils_arrays"))
|
21 |
{
|
114 |
return false;
|
115 |
}
|
116 |
/**
|
117 |
+
* Removes all null values from an array *( or even a multi-dimensional array )*.
|
118 |
*
|
119 |
* @package s2Member\Utilities
|
120 |
* @since 111101
|
121 |
*
|
122 |
* @param array $array An input array.
|
123 |
+
* @return array Returns the ``$array`` after having reduced its set of values.
|
124 |
*/
|
125 |
public static function remove_nulls ($array = FALSE)
|
126 |
{
|
129 |
foreach ($array as $key => &$value)
|
130 |
{
|
131 |
if (is_array ($value) /* Recursive function call here. */)
|
132 |
+
$value = c_ws_plugin__s2member_utils_arrays::remove_nulls ($value);
|
133 |
/**/
|
134 |
+
else if (is_null /* Is it null? */ ($value))
|
135 |
+
unset ($array[$key]);
|
136 |
+
}
|
137 |
+
return $array;
|
138 |
+
}
|
139 |
+
/**
|
140 |
+
* Removes all 0-byte strings from an array *( or even a multi-dimensional array )*.
|
141 |
+
*
|
142 |
+
* @package s2Member\Utilities
|
143 |
+
* @since 111216
|
144 |
+
*
|
145 |
+
* @param array $array An input array.
|
146 |
+
* @return array Returns the ``$array`` after having reduced its set of values.
|
147 |
+
*/
|
148 |
+
public static function remove_0b_strings ($array = FALSE)
|
149 |
+
{
|
150 |
+
$array = (array)$array;
|
151 |
+
/**/
|
152 |
+
foreach ($array as $key => &$value)
|
153 |
+
{
|
154 |
+
if (is_array ($value) /* Recursive function call here. */)
|
155 |
+
$value = c_ws_plugin__s2member_utils_arrays::remove_0b_strings ($value);
|
156 |
+
/**/
|
157 |
+
else if (is_string ($value) && !strlen ($value))
|
158 |
+
unset ($array[$key]);
|
159 |
}
|
160 |
return $array;
|
161 |
}
|
includes/classes/utils-urls.inc.php
CHANGED
@@ -64,7 +64,7 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
|
|
64 |
if ( /* If BuddyPress is installed. */c_ws_plugin__s2member_utils_conds::bp_is_installed ())
|
65 |
return site_url (((function_exists ("bp_get_signup_slug")) ? bp_get_signup_slug () . "/" : BP_REGISTER_SLUG . "/"));
|
66 |
/**/
|
67 |
-
return
|
68 |
}
|
69 |
/**
|
70 |
* Filters content redirection status *( uses 302s for browsers )*.
|
@@ -161,12 +161,12 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
|
|
161 |
/**/
|
162 |
if (is_string ($url_uri) && /* And, there is a query string? */ strpos ($url_uri, "?") !== false)
|
163 |
{
|
164 |
-
list ($_, $query) = preg_split
|
165 |
$query = /* See: <https://bugs.php.net/bug.php?id=38143>. */ str_replace ("://", urlencode ("://"), $query);
|
166 |
$url_uri = /* Put it all back together again, after the above modifications. */ $_ . "?" . $query;
|
167 |
unset /* A little housekeeping here. Unset these vars. */ ($_, $query);
|
168 |
}
|
169 |
-
$parse = /* Let PHP work its magic via ``parse_url()``. */
|
170 |
/**/
|
171 |
if ($clean_path && isset ($parse["path"]) && is_string ($parse["path"]) && !empty ($parse["path"]))
|
172 |
$parse["path"] = /* Clean up the path now. */ preg_replace ("/\/+/", "/", $parse["path"]);
|
@@ -184,23 +184,29 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
|
|
184 |
* @param str $url Full URL with possible query string parameters.
|
185 |
* @param str|array $post_vars Optional. Either a string of POST vars, or an array.
|
186 |
* @param array $args Optional. An array of additional arguments used by ``wp_remote_request()``.
|
187 |
-
* @param bool $
|
188 |
-
* `code` *(http response code)*, `message` *(http response message)*, `headers` *(an array of lowercase headers)*, `body` *(the response body string)*, `response` *(response array)*.
|
189 |
-
* @return str|array|bool Requested response
|
190 |
*/
|
191 |
-
public static function remote ($url = FALSE, $post_vars = FALSE, $args = FALSE, $
|
192 |
{
|
193 |
-
if ($url &&
|
194 |
{
|
195 |
-
$args = (!is_array ($args)) ? array (): $args;
|
196 |
$args["sslverify"] = (!isset ($args["sslverify"])) ? /* Off. */ false : $args["sslverify"];
|
197 |
/**/
|
198 |
if ((is_array ($post_vars) || is_string ($post_vars)) && !empty ($post_vars))
|
199 |
$args = array_merge ($args, array ("method" => "POST", "body" => $post_vars));
|
200 |
/**/
|
201 |
-
|
|
|
|
|
202 |
/**/
|
203 |
-
|
|
|
|
|
|
|
|
|
204 |
{
|
205 |
$a = array ("code" => (int)wp_remote_retrieve_response_code ($response));
|
206 |
$a = array_merge ($a, array ("message" => wp_remote_retrieve_response_message ($response)));
|
@@ -238,23 +244,23 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
|
|
238 |
$default_url_shortener = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"];
|
239 |
$default_custom_str_url_shortener = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_custom_str_url_shortener"];
|
240 |
/**/
|
241 |
-
$apis =
|
242 |
/**/
|
243 |
if ($url && ($api = /* If specific, use it. Otherwise, use the default shortening API. */ ($api_sp) ? $api_sp : $default_url_shortener))
|
244 |
{
|
245 |
if (!$api_sp && ($custom_url = trim (apply_filters ("ws_plugin__s2member_url_shorten", false, get_defined_vars ()))) && stripos ($custom_url, "http") === 0)
|
246 |
-
return
|
247 |
/**/
|
248 |
else if (!$api_sp && stripos ($default_custom_str_url_shortener, "http") === 0 && ($custom_url = trim (c_ws_plugin__s2member_utils_urls::remote (str_ireplace (array ("%%s2_long_url%%", "%%s2_long_url_md5%%"), array (rawurlencode ($url), urlencode (md5 ($url))), $default_custom_str_url_shortener)))) && stripos ($custom_url, "http") === 0)
|
249 |
-
return
|
250 |
/**/
|
251 |
else if ($api === "tiny_url" && ($tiny_url = trim (c_ws_plugin__s2member_utils_urls::remote ("http://tinyurl.com/api-create.php?url=" . rawurlencode ($url)))) && stripos ($tiny_url, "http") === 0)
|
252 |
-
return
|
253 |
/**/
|
254 |
else if ($api === "goo_gl" && ($goo_gl = json_decode (trim (c_ws_plugin__s2member_utils_urls::remote ("https://www.googleapis.com/urlshortener/v1/url" . ((($goo_gl_key = apply_filters ("ws_plugin__s2member_url_shorten_api_goo_gl_key", false))) ? "?key=" . urlencode ($goo_gl_key) : ""), json_encode (array ("longUrl" => $url)), array ("headers" => array ("Content-Type" => "application/json")))), true)) && !empty ($goo_gl["id"]) && is_string ($goo_gl_url = $goo_gl["id"]) && stripos ($goo_gl_url, "http") === 0)
|
255 |
-
return
|
256 |
/**/
|
257 |
-
else if
|
258 |
/**/
|
259 |
foreach /* Try other backup APIs now. */ (array_diff ($apis, array ($api)) as $backup)
|
260 |
if (($backup = c_ws_plugin__s2member_utils_urls::shorten ($url, $backup, false)))
|
@@ -304,7 +310,8 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
|
|
304 |
if ($url_uri_query && is_string /* We DO allow empty query strings. So we can sign a URL without one. */ ($query))
|
305 |
{
|
306 |
wp_parse_str /* Parse the query string into an array of ``$vars``. Then sort & serialize them into a string. */ ($query, $vars);
|
307 |
-
$vars =
|
|
|
308 |
/**/
|
309 |
$sig = /* The s2Member-generated signature. */ ($time = time ()) . "-" . md5 ($key . $time . $vars);
|
310 |
/**/
|
@@ -341,7 +348,8 @@ if (!class_exists ("c_ws_plugin__s2member_utils_urls"))
|
|
341 |
$query = /* Remove existing s2Member-generated signatures. */ c_ws_plugin__s2member_utils_urls::remove_s2member_sigs ($query, $sig_var);
|
342 |
/**/
|
343 |
wp_parse_str /* Parse the query string into an array of ``$vars``. Then sort & serialize them into a string. */ ($query, $vars);
|
344 |
-
$vars =
|
|
|
345 |
/**/
|
346 |
($time = $sigs[1][($i = count ($sigs[1]) - 1)]) . ($sig = $sigs[2][$i]) . ($valid_sig = md5 ($key . $time . $vars));
|
347 |
/**/
|
64 |
if ( /* If BuddyPress is installed. */c_ws_plugin__s2member_utils_conds::bp_is_installed ())
|
65 |
return site_url (((function_exists ("bp_get_signup_slug")) ? bp_get_signup_slug () . "/" : BP_REGISTER_SLUG . "/"));
|
66 |
/**/
|
67 |
+
return /* Default return false. */ false;
|
68 |
}
|
69 |
/**
|
70 |
* Filters content redirection status *( uses 302s for browsers )*.
|
161 |
/**/
|
162 |
if (is_string ($url_uri) && /* And, there is a query string? */ strpos ($url_uri, "?") !== false)
|
163 |
{
|
164 |
+
list ($_, $query) = preg_split /* Split @ query string marker. */ ("/\?/", $url_uri, 2);
|
165 |
$query = /* See: <https://bugs.php.net/bug.php?id=38143>. */ str_replace ("://", urlencode ("://"), $query);
|
166 |
$url_uri = /* Put it all back together again, after the above modifications. */ $_ . "?" . $query;
|
167 |
unset /* A little housekeeping here. Unset these vars. */ ($_, $query);
|
168 |
}
|
169 |
+
$parse = @parse_url /* Let PHP work its magic via ``parse_url()``. */ ($url_uri, $component);
|
170 |
/**/
|
171 |
if ($clean_path && isset ($parse["path"]) && is_string ($parse["path"]) && !empty ($parse["path"]))
|
172 |
$parse["path"] = /* Clean up the path now. */ preg_replace ("/\/+/", "/", $parse["path"]);
|
184 |
* @param str $url Full URL with possible query string parameters.
|
185 |
* @param str|array $post_vars Optional. Either a string of POST vars, or an array.
|
186 |
* @param array $args Optional. An array of additional arguments used by ``wp_remote_request()``.
|
187 |
+
* @param bool $return_array Optional. If true, instead of a string, we return an array with elements:
|
188 |
+
* `code` *(http response code)*, `message` *(http response message)*, `headers` *(an array of lowercase headers)*, `body` *(the response body string)*, `response` *(full response array)*.
|
189 |
+
* @return str|array|bool Requested response str|array from remote location *(see ``$return_array`` parameter )*; else (bool)`false` on failure.
|
190 |
*/
|
191 |
+
public static function remote ($url = FALSE, $post_vars = FALSE, $args = FALSE, $return_array = FALSE)
|
192 |
{
|
193 |
+
if ($url && /* We MUST have a valid full URL (string) before we do anything in this routine. */ is_string ($url))
|
194 |
{
|
195 |
+
$args = /* Force array, and disable SSL verification. */ (!is_array ($args)) ? array (): $args;
|
196 |
$args["sslverify"] = (!isset ($args["sslverify"])) ? /* Off. */ false : $args["sslverify"];
|
197 |
/**/
|
198 |
if ((is_array ($post_vars) || is_string ($post_vars)) && !empty ($post_vars))
|
199 |
$args = array_merge ($args, array ("method" => "POST", "body" => $post_vars));
|
200 |
/**/
|
201 |
+
if (!empty ($args["method"]) && strcasecmp ((string)$args["method"], "DELETE") === 0)
|
202 |
+
/* WordPress® v3.3 and prior, does NOT support `DELETE` via cURL unfortunately. */
|
203 |
+
add_filter ("use_curl_transport", "__return_false", /* ID via priority. */ 111209554);
|
204 |
/**/
|
205 |
+
$response = /* Process remote request via ``wp_remote_request()``. */ wp_remote_request ($url, $args);
|
206 |
+
/**/
|
207 |
+
remove_filter /* Remove this Filter now. */ ("use_curl_transport", "__return_false", 111209554);
|
208 |
+
/**/
|
209 |
+
if ($return_array && !is_wp_error ($response) && is_array ($response))
|
210 |
{
|
211 |
$a = array ("code" => (int)wp_remote_retrieve_response_code ($response));
|
212 |
$a = array_merge ($a, array ("message" => wp_remote_retrieve_response_message ($response)));
|
244 |
$default_url_shortener = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_url_shortener"];
|
245 |
$default_custom_str_url_shortener = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["default_custom_str_url_shortener"];
|
246 |
/**/
|
247 |
+
$apis = /* The shortening APIs currently pre-integrated in this release of s2Member. */ array ("tiny_url", "goo_gl");
|
248 |
/**/
|
249 |
if ($url && ($api = /* If specific, use it. Otherwise, use the default shortening API. */ ($api_sp) ? $api_sp : $default_url_shortener))
|
250 |
{
|
251 |
if (!$api_sp && ($custom_url = trim (apply_filters ("ws_plugin__s2member_url_shorten", false, get_defined_vars ()))) && stripos ($custom_url, "http") === 0)
|
252 |
+
return /* Using whatever other shortener API you prefer, over the ones available by default with s2Member. */ ($shorter_url = $custom_url);
|
253 |
/**/
|
254 |
else if (!$api_sp && stripos ($default_custom_str_url_shortener, "http") === 0 && ($custom_url = trim (c_ws_plugin__s2member_utils_urls::remote (str_ireplace (array ("%%s2_long_url%%", "%%s2_long_url_md5%%"), array (rawurlencode ($url), urlencode (md5 ($url))), $default_custom_str_url_shortener)))) && stripos ($custom_url, "http") === 0)
|
255 |
+
return /* Using whatever other shortener API that a site owner prefers, over the ones available by default with s2Member. */ ($shorter_url = $custom_url);
|
256 |
/**/
|
257 |
else if ($api === "tiny_url" && ($tiny_url = trim (c_ws_plugin__s2member_utils_urls::remote ("http://tinyurl.com/api-create.php?url=" . rawurlencode ($url)))) && stripos ($tiny_url, "http") === 0)
|
258 |
+
return /* The default tinyURL API: <http://tinyurl.com/api-create.php?url=http://www.example.com/>. */ ($shorter_url = $tiny_url);
|
259 |
/**/
|
260 |
else if ($api === "goo_gl" && ($goo_gl = json_decode (trim (c_ws_plugin__s2member_utils_urls::remote ("https://www.googleapis.com/urlshortener/v1/url" . ((($goo_gl_key = apply_filters ("ws_plugin__s2member_url_shorten_api_goo_gl_key", false))) ? "?key=" . urlencode ($goo_gl_key) : ""), json_encode (array ("longUrl" => $url)), array ("headers" => array ("Content-Type" => "application/json")))), true)) && !empty ($goo_gl["id"]) && is_string ($goo_gl_url = $goo_gl["id"]) && stripos ($goo_gl_url, "http") === 0)
|
261 |
+
return /* Google® API: <http://code.google.com/apis/urlshortener/v1/getting_started.html>. */ ($shorter_url = $goo_gl_url);
|
262 |
/**/
|
263 |
+
else if /* Try backups? This way we can still shorten the URL with a backup. */ ($try_backups && count ($apis) > 1)
|
264 |
/**/
|
265 |
foreach /* Try other backup APIs now. */ (array_diff ($apis, array ($api)) as $backup)
|
266 |
if (($backup = c_ws_plugin__s2member_utils_urls::shorten ($url, $backup, false)))
|
310 |
if ($url_uri_query && is_string /* We DO allow empty query strings. So we can sign a URL without one. */ ($query))
|
311 |
{
|
312 |
wp_parse_str /* Parse the query string into an array of ``$vars``. Then sort & serialize them into a string. */ ($query, $vars);
|
313 |
+
$vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings (c_ws_plugin__s2member_utils_strings::trim_deep ($vars));
|
314 |
+
$vars = serialize (c_ws_plugin__s2member_utils_arrays::ksort_deep ($vars));
|
315 |
/**/
|
316 |
$sig = /* The s2Member-generated signature. */ ($time = time ()) . "-" . md5 ($key . $time . $vars);
|
317 |
/**/
|
348 |
$query = /* Remove existing s2Member-generated signatures. */ c_ws_plugin__s2member_utils_urls::remove_s2member_sigs ($query, $sig_var);
|
349 |
/**/
|
350 |
wp_parse_str /* Parse the query string into an array of ``$vars``. Then sort & serialize them into a string. */ ($query, $vars);
|
351 |
+
$vars = c_ws_plugin__s2member_utils_arrays::remove_0b_strings (c_ws_plugin__s2member_utils_strings::trim_deep ($vars));
|
352 |
+
$vars = serialize (c_ws_plugin__s2member_utils_arrays::ksort_deep ($vars));
|
353 |
/**/
|
354 |
($time = $sigs[1][($i = count ($sigs[1]) - 1)]) . ($sig = $sigs[2][$i]) . ($valid_sig = md5 ($key . $time . $vars));
|
355 |
/**/
|
includes/menu-pages/down-ops.inc.php
CHANGED
@@ -15,7 +15,7 @@
|
|
15 |
* @since 3.0
|
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_menu_page_down_ops"))
|
21 |
{
|
@@ -248,7 +248,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
248 |
{
|
249 |
do_action ("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_amazon_s3", get_defined_vars ());
|
250 |
/**/
|
251 |
-
echo '<div class="ws-menu-page-group" title="Amazon® S3/CDN Storage Option"' . ((
|
252 |
/**/
|
253 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-s3-section">' . "\n";
|
254 |
echo '<h3>Amazon® S3/CDN Storage & Delivery ( optional )</h3>' . "\n";
|
@@ -333,7 +333,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
333 |
{
|
334 |
do_action ("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_amazon_cf", get_defined_vars ());
|
335 |
/**/
|
336 |
-
echo '<div class="ws-menu-page-group" title="Amazon® S3/CloudFront CDN Storage Option"' . ((
|
337 |
/**/
|
338 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-cf-section">' . "\n";
|
339 |
echo '<h3>Amazon® S3/CloudFront CDN Storage & Delivery ( optional )</h3>' . "\n";
|
@@ -410,7 +410,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
410 |
echo '<tr>' . "\n";
|
411 |
/**/
|
412 |
echo '<td>' . "\n";
|
413 |
-
echo '<input type="checkbox" name="ws_plugin__s2member_amazon_cf_files_auto_configure_distros" id="ws-plugin--s2member-amazon-cf-files-auto-configure-distros" value="' . esc_attr (wp_create_nonce ("ws-plugin--s2member-amazon-cf-files-auto-configure-distros")) . '"' . ((
|
414 |
echo '<em>s2Member will auto-configure and/or delete & re-configure your Amazon® CloudFront Distributions for you.</em>' . "\n";
|
415 |
echo '</td>' . "\n";
|
416 |
/**/
|
@@ -418,7 +418,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_down_ops"))
|
|
418 |
echo '<tr>' . "\n";
|
419 |
/**/
|
420 |
echo '<td>' . "\n";
|
421 |
-
echo '<input type="checkbox" name="ws_plugin__s2member_amazon_cf_files_auto_configure_distros_w_cnames" id="ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames" value="' . esc_attr (wp_create_nonce ("ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames")) . '"' . ((
|
422 |
echo '<em>* Optional, do NOT check this box unless you know what you\'re doing. This requires DNS changes.</em>' . "\n";
|
423 |
echo '</td>' . "\n";
|
424 |
/**/
|
15 |
* @since 3.0
|
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_menu_page_down_ops"))
|
21 |
{
|
248 |
{
|
249 |
do_action ("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_amazon_s3", get_defined_vars ());
|
250 |
/**/
|
251 |
+
echo '<div class="ws-menu-page-group" title="Amazon® S3/CDN Storage Option"' . ((c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"]) ? ' default-state="open"' : '') . '>' . "\n";
|
252 |
/**/
|
253 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-s3-section">' . "\n";
|
254 |
echo '<h3>Amazon® S3/CDN Storage & Delivery ( optional )</h3>' . "\n";
|
333 |
{
|
334 |
do_action ("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_amazon_cf", get_defined_vars ());
|
335 |
/**/
|
336 |
+
echo '<div class="ws-menu-page-group" title="Amazon® S3/CloudFront CDN Storage Option"' . ((c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"]) ? ' default-state="open"' : '') . '>' . "\n";
|
337 |
/**/
|
338 |
echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-cf-section">' . "\n";
|
339 |
echo '<h3>Amazon® S3/CloudFront CDN Storage & Delivery ( optional )</h3>' . "\n";
|
410 |
echo '<tr>' . "\n";
|
411 |
/**/
|
412 |
echo '<td>' . "\n";
|
413 |
+
echo '<input type="checkbox" name="ws_plugin__s2member_amazon_cf_files_auto_configure_distros" id="ws-plugin--s2member-amazon-cf-files-auto-configure-distros" value="' . esc_attr (wp_create_nonce ("ws-plugin--s2member-amazon-cf-files-auto-configure-distros")) . '"' . ((c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"]) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--s2member-amazon-cf-files-auto-configure-distros"><strong>Yes</strong>, automatically configure my Amazon® CloudFront Distributions & Amazon® S3 ACLs for me.</label><br />' . "\n";
|
414 |
echo '<em>s2Member will auto-configure and/or delete & re-configure your Amazon® CloudFront Distributions for you.</em>' . "\n";
|
415 |
echo '</td>' . "\n";
|
416 |
/**/
|
418 |
echo '<tr>' . "\n";
|
419 |
/**/
|
420 |
echo '<td>' . "\n";
|
421 |
+
echo '<input type="checkbox" name="ws_plugin__s2member_amazon_cf_files_auto_configure_distros_w_cnames" id="ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames" value="' . esc_attr (wp_create_nonce ("ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames")) . '"' . ((c_ws_plugin__s2member_menu_pages::$pre_display_errors["cf_files_auto_configure_distros"] && ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_downloads_cname"] || $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_cf_files_distro_streaming_cname"])) ? ' checked="checked"' : '') . ' /> <label for="ws-plugin--s2member-amazon-cf-files-auto-configure-distros-w-cnames"><strong>Yes</strong>, I want s2Member to auto-configure using custom CNAMES that I\'ll setup.</label><br />' . "\n";
|
422 |
echo '<em>* Optional, do NOT check this box unless you know what you\'re doing. This requires DNS changes.</em>' . "\n";
|
423 |
echo '</td>' . "\n";
|
424 |
/**/
|
includes/menu-pages/menu-pages-s.js
CHANGED
@@ -20,7 +20,7 @@ jQuery(document).ready (function($)
|
|
20 |
return String(str).replace (/"/g, '"').replace (/\</g, '<').replace (/\>/g, '>');
|
21 |
};
|
22 |
/**/
|
23 |
-
if (location.href.match /* Any
|
24 |
{
|
25 |
$('input.ws-plugin--s2member-update-roles-button, input.ws-plugin--s2member-reset-roles-button').click (function()
|
26 |
{
|
20 |
return String(str).replace (/"/g, '"').replace (/\</g, '<').replace (/\>/g, '>');
|
21 |
};
|
22 |
/**/
|
23 |
+
if (location.href.match /* Any & all s2Member® pages. */ (/page\=ws-plugin--s2member/))
|
24 |
{
|
25 |
$('input.ws-plugin--s2member-update-roles-button, input.ws-plugin--s2member-reset-roles-button').click (function()
|
26 |
{
|
includes/translations/s2member.pot
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
# Copyright (C) 2010
|
2 |
-
# This file is distributed under the same license as the
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
-
"Project-Id-Version:
|
6 |
"Report-Msgid-Bugs-To: http://wordpress.org/tag/.__s2member\n"
|
7 |
-
"POT-Creation-Date: 2011-12-
|
8 |
"MIME-Version: 1.0\n"
|
9 |
"Content-Type: text/plain; charset=UTF-8\n"
|
10 |
"Content-Transfer-Encoding: 8bit\n"
|
@@ -92,17 +92,17 @@ msgctxt "s2member-front"
|
|
92 |
msgid "<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <code>s2Member -> Download Options -> Basic Download Restrictions</code>."
|
93 |
msgstr ""
|
94 |
|
95 |
-
#: s2member/includes/classes/files-in.inc.php:
|
96 |
msgctxt "s2member-front"
|
97 |
msgid "<strong>503: Access denied.</strong> Invalid File Download specs."
|
98 |
msgstr ""
|
99 |
|
100 |
-
#: s2member/includes/classes/files-in.inc.php:
|
101 |
msgctxt "s2member-front"
|
102 |
msgid "Members Only"
|
103 |
msgstr ""
|
104 |
|
105 |
-
#: s2member/includes/classes/files-in.inc.php:
|
106 |
msgctxt "s2member-front"
|
107 |
msgid "<strong>401:</strong> Sorry, access denied."
|
108 |
msgstr ""
|
@@ -111,12 +111,12 @@ msgstr ""
|
|
111 |
#. message, which comes from the Amazon® S3 API call. Feel free to exclude
|
112 |
#. `%s` if you like.
|
113 |
|
114 |
-
#: s2member/includes/classes/files-in.inc.php:
|
115 |
msgctxt "s2member-admin"
|
116 |
msgid "Unable to update existing Amazon® S3 Cross-Domain Policy. %s"
|
117 |
msgstr ""
|
118 |
|
119 |
-
#: s2member/includes/classes/files-in.inc.php:
|
120 |
msgctxt "s2member-admin"
|
121 |
msgid "Unable to update existing Amazon® S3 Cross-Domain Policy. Connection failed."
|
122 |
msgstr ""
|
@@ -125,12 +125,12 @@ msgstr ""
|
|
125 |
#. message, which comes from the Amazon® S3 API call. Feel free to exclude
|
126 |
#. `%s` if you like.
|
127 |
|
128 |
-
#: s2member/includes/classes/files-in.inc.php:
|
129 |
msgctxt "s2member-admin"
|
130 |
msgid "Unable to update existing Amazon® S3 Bucket Policy. %s"
|
131 |
msgstr ""
|
132 |
|
133 |
-
#: s2member/includes/classes/files-in.inc.php:
|
134 |
msgctxt "s2member-admin"
|
135 |
msgid "Unable to update existing Amazon® S3 Bucket Policy. Connection failed."
|
136 |
msgstr ""
|
@@ -139,17 +139,17 @@ msgstr ""
|
|
139 |
#. message, which comes from the Amazon® S3 API call. Feel free to exclude
|
140 |
#. `%s` if you like.
|
141 |
|
142 |
-
#: s2member/includes/classes/files-in.inc.php:
|
143 |
msgctxt "s2member-admin"
|
144 |
msgid "Unable to update existing Amazon® S3 Bucket ACLs. %s"
|
145 |
msgstr ""
|
146 |
|
147 |
-
#: s2member/includes/classes/files-in.inc.php:
|
148 |
msgctxt "s2member-admin"
|
149 |
msgid "Unable to update existing Amazon® S3 Bucket ACLs. Connection failed."
|
150 |
msgstr ""
|
151 |
|
152 |
-
#: s2member/includes/classes/files-in.inc.php:
|
153 |
msgctxt "s2member-admin"
|
154 |
msgid "Unable to acquire/read existing Amazon® S3 Bucket ACLs. Unexpected response."
|
155 |
msgstr ""
|
@@ -158,22 +158,22 @@ msgstr ""
|
|
158 |
#. message, which comes from the Amazon® S3 API call. Feel free to exclude
|
159 |
#. `%s` if you like.
|
160 |
|
161 |
-
#: s2member/includes/classes/files-in.inc.php:
|
162 |
msgctxt "s2member-admin"
|
163 |
msgid "Unable to acquire existing Amazon® S3 Bucket ACLs. %s"
|
164 |
msgstr ""
|
165 |
|
166 |
-
#: s2member/includes/classes/files-in.inc.php:
|
167 |
msgctxt "s2member-admin"
|
168 |
msgid "Unable to acquire existing Amazon® S3 Bucket ACLs. Connection failed."
|
169 |
msgstr ""
|
170 |
|
171 |
-
#: s2member/includes/classes/files-in.inc.php:
|
172 |
msgctxt "s2member-admin"
|
173 |
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."
|
174 |
msgstr ""
|
175 |
|
176 |
-
#: s2member/includes/classes/files-in.inc.php:
|
177 |
msgctxt "s2member-admin"
|
178 |
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."
|
179 |
msgstr ""
|
@@ -182,12 +182,12 @@ msgstr ""
|
|
182 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
183 |
#. exclude `%s` if you like.
|
184 |
|
185 |
-
#: s2member/includes/classes/files-in.inc.php:
|
186 |
msgctxt "s2member-admin"
|
187 |
msgid "Unable to delete existing Amazon® CloudFront Downloads Distro. %s"
|
188 |
msgstr ""
|
189 |
|
190 |
-
#: s2member/includes/classes/files-in.inc.php:
|
191 |
msgctxt "s2member-admin"
|
192 |
msgid "Unable to delete existing Amazon® CloudFront Streaming Distro. Still in a `pending` state. Please wait 15 minutes, then try again. There is a certain process that s2Member must strictly adhere to when re-configuring your Amazon® CloudFront Distros. You may have to tick the auto-configure checkbox again, and re-run s2Member's auto-configuration routine many times, because s2Member will likely run into several `pending` challenges, as it works to completely re-configure your Amazon® CloudFront Distros for you. Thanks for your patience. Please wait 15 minutes, then try again."
|
193 |
msgstr ""
|
@@ -196,7 +196,7 @@ msgstr ""
|
|
196 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
197 |
#. exclude `%s` if you like.
|
198 |
|
199 |
-
#: s2member/includes/classes/files-in.inc.php:
|
200 |
msgctxt "s2member-admin"
|
201 |
msgid "Unable to delete existing Amazon® CloudFront Streaming Distro. %s"
|
202 |
msgstr ""
|
@@ -205,8 +205,8 @@ msgstr ""
|
|
205 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
206 |
#. exclude `%s` if you like.
|
207 |
|
208 |
-
#: s2member/includes/classes/files-in.inc.php:
|
209 |
-
#: s2member/includes/classes/files-in.inc.php:
|
210 |
msgctxt "s2member-admin"
|
211 |
msgid "Unable to delete existing Amazon® CloudFront Origin Access Identity. %s"
|
212 |
msgstr ""
|
@@ -215,12 +215,12 @@ msgstr ""
|
|
215 |
#. message, which comes from the Amazon® S3 API call. Feel free to exclude
|
216 |
#. `%s` if you like.
|
217 |
|
218 |
-
#: s2member/includes/classes/files-in.inc.php:
|
219 |
msgctxt "s2member-admin"
|
220 |
msgid "Unable to update existing Amazon® S3 ACLs. %s"
|
221 |
msgstr ""
|
222 |
|
223 |
-
#: s2member/includes/classes/files-in.inc.php:
|
224 |
msgctxt "s2member-admin"
|
225 |
msgid "Unable to update existing Amazon® S3 ACLs. Connection failed."
|
226 |
msgstr ""
|
@@ -229,14 +229,14 @@ msgstr ""
|
|
229 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
230 |
#. exclude `%s` if you like.
|
231 |
|
232 |
-
#: s2member/includes/classes/files-in.inc.php:
|
233 |
#: s2member/includes/classes/files-in.inc.php:1265
|
234 |
msgctxt "s2member-admin"
|
235 |
msgid "Unable to create Amazon® CloudFront Streaming Distro. %s"
|
236 |
msgstr ""
|
237 |
|
238 |
-
#: s2member/includes/classes/files-in.inc.php:
|
239 |
-
#: s2member/includes/classes/files-in.inc.php:
|
240 |
msgctxt "s2member-admin"
|
241 |
msgid "Unable to create Amazon® CloudFront Streaming Distro. Connection failed."
|
242 |
msgstr ""
|
@@ -245,14 +245,14 @@ msgstr ""
|
|
245 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
246 |
#. exclude `%s` if you like.
|
247 |
|
248 |
-
#: s2member/includes/classes/files-in.inc.php:
|
249 |
-
#: s2member/includes/classes/files-in.inc.php:
|
250 |
msgctxt "s2member-admin"
|
251 |
msgid "Unable to create Amazon® CloudFront Downloads Distro. %s"
|
252 |
msgstr ""
|
253 |
|
254 |
-
#: s2member/includes/classes/files-in.inc.php:
|
255 |
-
#: s2member/includes/classes/files-in.inc.php:
|
256 |
msgctxt "s2member-admin"
|
257 |
msgid "Unable to create Amazon® CloudFront Downloads Distro. Connection failed."
|
258 |
msgstr ""
|
@@ -261,19 +261,19 @@ msgstr ""
|
|
261 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
262 |
#. exclude `%s` if you like.
|
263 |
|
264 |
-
#: s2member/includes/classes/files-in.inc.php:
|
265 |
-
#: s2member/includes/classes/files-in.inc.php:
|
266 |
msgctxt "s2member-admin"
|
267 |
msgid "Unable to create Amazon® CloudFront Origin Access Identity. %s"
|
268 |
msgstr ""
|
269 |
|
270 |
-
#: s2member/includes/classes/files-in.inc.php:
|
271 |
-
#: s2member/includes/classes/files-in.inc.php:
|
272 |
msgctxt "s2member-admin"
|
273 |
msgid "Unable to create Amazon® CloudFront Origin Access Identity. Connection failed."
|
274 |
msgstr ""
|
275 |
|
276 |
-
#: s2member/includes/classes/files-in.inc.php:
|
277 |
msgctxt "s2member-admin"
|
278 |
msgid "Unable to clear existing Amazon® CloudFront Origin Access Identity."
|
279 |
msgstr ""
|
@@ -282,19 +282,19 @@ msgstr ""
|
|
282 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
283 |
#. exclude `%s` if you like.
|
284 |
|
285 |
-
#: s2member/includes/classes/files-in.inc.php:
|
286 |
-
#: s2member/includes/classes/files-in.inc.php:
|
287 |
msgctxt "s2member-admin"
|
288 |
msgid "Unable to acquire existing Amazon® CloudFront Origin Access Identity. %s"
|
289 |
msgstr ""
|
290 |
|
291 |
-
#: s2member/includes/classes/files-in.inc.php:
|
292 |
-
#: s2member/includes/classes/files-in.inc.php:
|
293 |
msgctxt "s2member-admin"
|
294 |
msgid "Unable to acquire existing Amazon® CloudFront Origin Access Identity. Connection failed."
|
295 |
msgstr ""
|
296 |
|
297 |
-
#: s2member/includes/classes/files-in.inc.php:
|
298 |
msgctxt "s2member-admin"
|
299 |
msgid "Unable to clear existing Amazon® CloudFront Streaming Distro."
|
300 |
msgstr ""
|
@@ -303,17 +303,17 @@ msgstr ""
|
|
303 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
304 |
#. exclude `%s` if you like.
|
305 |
|
306 |
-
#: s2member/includes/classes/files-in.inc.php:
|
307 |
msgctxt "s2member-admin"
|
308 |
msgid "Unable to acquire existing Amazon® CloudFront Streaming Distro. %s"
|
309 |
msgstr ""
|
310 |
|
311 |
-
#: s2member/includes/classes/files-in.inc.php:
|
312 |
msgctxt "s2member-admin"
|
313 |
msgid "Unable to acquire existing Amazon® CloudFront Streaming Distro. Connection failed."
|
314 |
msgstr ""
|
315 |
|
316 |
-
#: s2member/includes/classes/files-in.inc.php:
|
317 |
msgctxt "s2member-admin"
|
318 |
msgid "Unable to clear existing Amazon® CloudFront Downloads Distro."
|
319 |
msgstr ""
|
@@ -322,22 +322,22 @@ msgstr ""
|
|
322 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
323 |
#. exclude `%s` if you like.
|
324 |
|
325 |
-
#: s2member/includes/classes/files-in.inc.php:
|
326 |
msgctxt "s2member-admin"
|
327 |
msgid "Unable to acquire existing Amazon® CloudFront Downloads Distro. %s"
|
328 |
msgstr ""
|
329 |
|
330 |
-
#: s2member/includes/classes/files-in.inc.php:
|
331 |
msgctxt "s2member-admin"
|
332 |
msgid "Unable to acquire existing Amazon® CloudFront Downloads Distro. Connection failed."
|
333 |
msgstr ""
|
334 |
|
335 |
-
#: s2member/includes/classes/files-in.inc.php:
|
336 |
msgctxt "s2member-admin"
|
337 |
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."
|
338 |
msgstr ""
|
339 |
|
340 |
-
#: s2member/includes/classes/files-in.inc.php:
|
341 |
msgctxt "s2member-admin"
|
342 |
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."
|
343 |
msgstr ""
|
@@ -346,34 +346,34 @@ msgstr ""
|
|
346 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
347 |
#. exclude `%s` if you like.
|
348 |
|
349 |
-
#: s2member/includes/classes/files-in.inc.php:
|
350 |
msgctxt "s2member-admin"
|
351 |
msgid "Existing Amazon® CloudFront Origin Access Identity NOT found. %s"
|
352 |
msgstr ""
|
353 |
|
354 |
-
#: s2member/includes/classes/files-in.inc.php:
|
355 |
msgctxt "s2member-admin"
|
356 |
msgid "Unable to acquire existing Amazon® CloudFront Origin Access Identity. Invalid Access ID."
|
357 |
msgstr ""
|
358 |
|
359 |
-
#: s2member/includes/classes/files-in.inc.php:
|
360 |
msgctxt "s2member-admin"
|
361 |
msgid "Unable to delete existing Amazon® CloudFront Origin Access Identity. Connection failed."
|
362 |
msgstr ""
|
363 |
|
364 |
-
#: s2member/includes/classes/files-in.inc.php:
|
365 |
msgctxt "s2member-admin"
|
366 |
msgid "Unable to delete existing Amazon® CloudFront Origin Access Identity. Invalid Access ID, ETag, or XML config."
|
367 |
msgstr ""
|
368 |
|
369 |
-
#: s2member/includes/classes/files-in.inc.php:
|
370 |
-
#: s2member/includes/classes/files-in.inc.php:
|
371 |
-
#: s2member/includes/classes/files-in.inc.php:
|
372 |
msgctxt "s2member-admin"
|
373 |
msgid "Created by s2Member, for S3 Bucket: %s."
|
374 |
msgstr ""
|
375 |
|
376 |
-
#: s2member/includes/classes/files-in.inc.php:
|
377 |
msgctxt "s2member-admin"
|
378 |
msgid "Unable to create/read Amazon® CloudFront Origin Access Identity. Unexpected response."
|
379 |
msgstr ""
|
@@ -382,7 +382,7 @@ msgstr ""
|
|
382 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
383 |
#. exclude `%s` if you like.
|
384 |
|
385 |
-
#: s2member/includes/classes/files-in.inc.php:
|
386 |
msgctxt "s2member-admin"
|
387 |
msgid "Existing Amazon® CloudFront Distro NOT found. %s"
|
388 |
msgstr ""
|
@@ -391,17 +391,17 @@ msgstr ""
|
|
391 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
392 |
#. exclude `%s` if you like.
|
393 |
|
394 |
-
#: s2member/includes/classes/files-in.inc.php:
|
395 |
msgctxt "s2member-admin"
|
396 |
msgid "Unable to acquire existing Amazon® CloudFront Distro. %s"
|
397 |
msgstr ""
|
398 |
|
399 |
-
#: s2member/includes/classes/files-in.inc.php:
|
400 |
msgctxt "s2member-admin"
|
401 |
msgid "Unable to acquire existing Amazon® CloudFront Distro. Connection failed."
|
402 |
msgstr ""
|
403 |
|
404 |
-
#: s2member/includes/classes/files-in.inc.php:
|
405 |
msgctxt "s2member-admin"
|
406 |
msgid "Unable to acquire existing Amazon® CloudFront Distro. Invalid Distro ID and/or Distro type."
|
407 |
msgstr ""
|
@@ -410,24 +410,24 @@ msgstr ""
|
|
410 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
411 |
#. exclude `%s` if you like.
|
412 |
|
413 |
-
#: s2member/includes/classes/files-in.inc.php:
|
414 |
-
#: s2member/includes/classes/files-in.inc.php:
|
415 |
msgctxt "s2member-admin"
|
416 |
msgid "Unable to disable existing Amazon® CloudFront Distro. %s"
|
417 |
msgstr ""
|
418 |
|
419 |
-
#: s2member/includes/classes/files-in.inc.php:
|
420 |
-
#: s2member/includes/classes/files-in.inc.php:
|
421 |
msgctxt "s2member-admin"
|
422 |
msgid "Unable to disable existing Amazon® CloudFront Distro. Connection failed."
|
423 |
msgstr ""
|
424 |
|
425 |
-
#: s2member/includes/classes/files-in.inc.php:
|
426 |
msgctxt "s2member-admin"
|
427 |
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."
|
428 |
msgstr ""
|
429 |
|
430 |
-
#: s2member/includes/classes/files-in.inc.php:
|
431 |
msgctxt "s2member-admin"
|
432 |
msgid "Unable to disable existing Amazon® CloudFront Distro. Invalid Distro ID, ETag, or XML config."
|
433 |
msgstr ""
|
@@ -436,12 +436,12 @@ msgstr ""
|
|
436 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
437 |
#. exclude `%s` if you like.
|
438 |
|
439 |
-
#: s2member/includes/classes/files-in.inc.php:
|
440 |
msgctxt "s2member-admin"
|
441 |
msgid "Unable to delete existing Amazon® CloudFront Distro. %s"
|
442 |
msgstr ""
|
443 |
|
444 |
-
#: s2member/includes/classes/files-in.inc.php:
|
445 |
msgctxt "s2member-admin"
|
446 |
msgid "Unable to delete existing Amazon® CloudFront Distro. Connection failed."
|
447 |
msgstr ""
|
@@ -450,7 +450,7 @@ msgstr ""
|
|
450 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
451 |
#. exclude `%s` if you like.
|
452 |
|
453 |
-
#: s2member/includes/classes/files-in.inc.php:
|
454 |
msgctxt "s2member-admin"
|
455 |
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."
|
456 |
msgstr ""
|
@@ -459,27 +459,27 @@ msgstr ""
|
|
459 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
460 |
#. exclude `%s` if you like.
|
461 |
|
462 |
-
#: s2member/includes/classes/files-in.inc.php:
|
463 |
msgctxt "s2member-admin"
|
464 |
msgid "Unable to check status of existing Amazon® CloudFront Distro. %s"
|
465 |
msgstr ""
|
466 |
|
467 |
-
#: s2member/includes/classes/files-in.inc.php:
|
468 |
msgctxt "s2member-admin"
|
469 |
msgid "Unable to check status of existing Amazon® CloudFront Distro. Connection failed."
|
470 |
msgstr ""
|
471 |
|
472 |
-
#: s2member/includes/classes/files-in.inc.php:
|
473 |
msgctxt "s2member-admin"
|
474 |
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."
|
475 |
msgstr ""
|
476 |
|
477 |
-
#: s2member/includes/classes/files-in.inc.php:
|
478 |
msgctxt "s2member-admin"
|
479 |
msgid "Unable to delete existing Amazon® CloudFront Distro. Invalid Distro ID or ETag."
|
480 |
msgstr ""
|
481 |
|
482 |
-
#: s2member/includes/classes/files-in.inc.php:
|
483 |
msgctxt "s2member-admin"
|
484 |
msgid "Unable to create/read Amazon® CloudFront Downloads Distro. Unexpected response."
|
485 |
msgstr ""
|
@@ -489,7 +489,7 @@ msgctxt "s2member-admin"
|
|
489 |
msgid "Unable to create/read Amazon® CloudFront Streaming Distro. Unexpected response."
|
490 |
msgstr ""
|
491 |
|
492 |
-
#: s2member/includes/classes/files-in.inc.php:
|
493 |
msgctxt "s2member-admin"
|
494 |
msgid "Unable to create Amazon® CloudFront Distro. Invalid Distro type."
|
495 |
msgstr ""
|
@@ -3387,7 +3387,7 @@ msgctxt "s2member-front"
|
|
3387 |
msgid "<div>Sorry, your Coupon is N/A, invalid or expired.</div>"
|
3388 |
msgstr ""
|
3389 |
|
3390 |
-
#: s2member-pro/includes/classes/gateways/clickbank/clickbank-return-in.inc.php:
|
3391 |
msgctxt "s2member-front"
|
3392 |
msgid ""
|
3393 |
"ERROR: Unexpected txnType. Please contact Support for assistance.\n"
|
@@ -3395,7 +3395,7 @@ msgid ""
|
|
3395 |
"The ClickBank® txnType did not match a required action."
|
3396 |
msgstr ""
|
3397 |
|
3398 |
-
#: s2member-pro/includes/classes/gateways/clickbank/clickbank-return-in.inc.php:
|
3399 |
msgctxt "s2member-front"
|
3400 |
msgid ""
|
3401 |
"ERROR: Unable to verify POST vars. Please contact Support for assistance.\n"
|
1 |
+
# Copyright (C) 2010 s2Member
|
2 |
+
# This file is distributed under the same license as the s2Member package.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
+
"Project-Id-Version: s2Member 111216\n"
|
6 |
"Report-Msgid-Bugs-To: http://wordpress.org/tag/.__s2member\n"
|
7 |
+
"POT-Creation-Date: 2011-12-16 07:13:27+00:00\n"
|
8 |
"MIME-Version: 1.0\n"
|
9 |
"Content-Type: text/plain; charset=UTF-8\n"
|
10 |
"Content-Transfer-Encoding: 8bit\n"
|
92 |
msgid "<strong>503: Basic File Downloads are NOT enabled yet.</strong> Please contact Support for assistance. If you are the site owner, please configure: <code>s2Member -> Download Options -> Basic Download Restrictions</code>."
|
93 |
msgstr ""
|
94 |
|
95 |
+
#: s2member/includes/classes/files-in.inc.php:390
|
96 |
msgctxt "s2member-front"
|
97 |
msgid "<strong>503: Access denied.</strong> Invalid File Download specs."
|
98 |
msgstr ""
|
99 |
|
100 |
+
#: s2member/includes/classes/files-in.inc.php:476
|
101 |
msgctxt "s2member-front"
|
102 |
msgid "Members Only"
|
103 |
msgstr ""
|
104 |
|
105 |
+
#: s2member/includes/classes/files-in.inc.php:482
|
106 |
msgctxt "s2member-front"
|
107 |
msgid "<strong>401:</strong> Sorry, access denied."
|
108 |
msgstr ""
|
111 |
#. message, which comes from the Amazon® S3 API call. Feel free to exclude
|
112 |
#. `%s` if you like.
|
113 |
|
114 |
+
#: s2member/includes/classes/files-in.inc.php:620
|
115 |
msgctxt "s2member-admin"
|
116 |
msgid "Unable to update existing Amazon® S3 Cross-Domain Policy. %s"
|
117 |
msgstr ""
|
118 |
|
119 |
+
#: s2member/includes/classes/files-in.inc.php:623
|
120 |
msgctxt "s2member-admin"
|
121 |
msgid "Unable to update existing Amazon® S3 Cross-Domain Policy. Connection failed."
|
122 |
msgstr ""
|
125 |
#. message, which comes from the Amazon® S3 API call. Feel free to exclude
|
126 |
#. `%s` if you like.
|
127 |
|
128 |
+
#: s2member/includes/classes/files-in.inc.php:627
|
129 |
msgctxt "s2member-admin"
|
130 |
msgid "Unable to update existing Amazon® S3 Bucket Policy. %s"
|
131 |
msgstr ""
|
132 |
|
133 |
+
#: s2member/includes/classes/files-in.inc.php:630
|
134 |
msgctxt "s2member-admin"
|
135 |
msgid "Unable to update existing Amazon® S3 Bucket Policy. Connection failed."
|
136 |
msgstr ""
|
139 |
#. message, which comes from the Amazon® S3 API call. Feel free to exclude
|
140 |
#. `%s` if you like.
|
141 |
|
142 |
+
#: s2member/includes/classes/files-in.inc.php:634
|
143 |
msgctxt "s2member-admin"
|
144 |
msgid "Unable to update existing Amazon® S3 Bucket ACLs. %s"
|
145 |
msgstr ""
|
146 |
|
147 |
+
#: s2member/includes/classes/files-in.inc.php:637
|
148 |
msgctxt "s2member-admin"
|
149 |
msgid "Unable to update existing Amazon® S3 Bucket ACLs. Connection failed."
|
150 |
msgstr ""
|
151 |
|
152 |
+
#: s2member/includes/classes/files-in.inc.php:640
|
153 |
msgctxt "s2member-admin"
|
154 |
msgid "Unable to acquire/read existing Amazon® S3 Bucket ACLs. Unexpected response."
|
155 |
msgstr ""
|
158 |
#. message, which comes from the Amazon® S3 API call. Feel free to exclude
|
159 |
#. `%s` if you like.
|
160 |
|
161 |
+
#: s2member/includes/classes/files-in.inc.php:644
|
162 |
msgctxt "s2member-admin"
|
163 |
msgid "Unable to acquire existing Amazon® S3 Bucket ACLs. %s"
|
164 |
msgstr ""
|
165 |
|
166 |
+
#: s2member/includes/classes/files-in.inc.php:647
|
167 |
msgctxt "s2member-admin"
|
168 |
msgid "Unable to acquire existing Amazon® S3 Bucket ACLs. Connection failed."
|
169 |
msgstr ""
|
170 |
|
171 |
+
#: s2member/includes/classes/files-in.inc.php:650
|
172 |
msgctxt "s2member-admin"
|
173 |
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."
|
174 |
msgstr ""
|
175 |
|
176 |
+
#: s2member/includes/classes/files-in.inc.php:752
|
177 |
msgctxt "s2member-admin"
|
178 |
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."
|
179 |
msgstr ""
|
182 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
183 |
#. exclude `%s` if you like.
|
184 |
|
185 |
+
#: s2member/includes/classes/files-in.inc.php:759
|
186 |
msgctxt "s2member-admin"
|
187 |
msgid "Unable to delete existing Amazon® CloudFront Downloads Distro. %s"
|
188 |
msgstr ""
|
189 |
|
190 |
+
#: s2member/includes/classes/files-in.inc.php:771
|
191 |
msgctxt "s2member-admin"
|
192 |
msgid "Unable to delete existing Amazon® CloudFront Streaming Distro. Still in a `pending` state. Please wait 15 minutes, then try again. There is a certain process that s2Member must strictly adhere to when re-configuring your Amazon® CloudFront Distros. You may have to tick the auto-configure checkbox again, and re-run s2Member's auto-configuration routine many times, because s2Member will likely run into several `pending` challenges, as it works to completely re-configure your Amazon® CloudFront Distros for you. Thanks for your patience. Please wait 15 minutes, then try again."
|
193 |
msgstr ""
|
196 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
197 |
#. exclude `%s` if you like.
|
198 |
|
199 |
+
#: s2member/includes/classes/files-in.inc.php:778
|
200 |
msgctxt "s2member-admin"
|
201 |
msgid "Unable to delete existing Amazon® CloudFront Streaming Distro. %s"
|
202 |
msgstr ""
|
205 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
206 |
#. exclude `%s` if you like.
|
207 |
|
208 |
+
#: s2member/includes/classes/files-in.inc.php:794
|
209 |
+
#: s2member/includes/classes/files-in.inc.php:978
|
210 |
msgctxt "s2member-admin"
|
211 |
msgid "Unable to delete existing Amazon® CloudFront Origin Access Identity. %s"
|
212 |
msgstr ""
|
215 |
#. message, which comes from the Amazon® S3 API call. Feel free to exclude
|
216 |
#. `%s` if you like.
|
217 |
|
218 |
+
#: s2member/includes/classes/files-in.inc.php:835
|
219 |
msgctxt "s2member-admin"
|
220 |
msgid "Unable to update existing Amazon® S3 ACLs. %s"
|
221 |
msgstr ""
|
222 |
|
223 |
+
#: s2member/includes/classes/files-in.inc.php:838
|
224 |
msgctxt "s2member-admin"
|
225 |
msgid "Unable to update existing Amazon® S3 ACLs. Connection failed."
|
226 |
msgstr ""
|
229 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
230 |
#. exclude `%s` if you like.
|
231 |
|
232 |
+
#: s2member/includes/classes/files-in.inc.php:842
|
233 |
#: s2member/includes/classes/files-in.inc.php:1265
|
234 |
msgctxt "s2member-admin"
|
235 |
msgid "Unable to create Amazon® CloudFront Streaming Distro. %s"
|
236 |
msgstr ""
|
237 |
|
238 |
+
#: s2member/includes/classes/files-in.inc.php:845
|
239 |
+
#: s2member/includes/classes/files-in.inc.php:1268
|
240 |
msgctxt "s2member-admin"
|
241 |
msgid "Unable to create Amazon® CloudFront Streaming Distro. Connection failed."
|
242 |
msgstr ""
|
245 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
246 |
#. exclude `%s` if you like.
|
247 |
|
248 |
+
#: s2member/includes/classes/files-in.inc.php:849
|
249 |
+
#: s2member/includes/classes/files-in.inc.php:1242
|
250 |
msgctxt "s2member-admin"
|
251 |
msgid "Unable to create Amazon® CloudFront Downloads Distro. %s"
|
252 |
msgstr ""
|
253 |
|
254 |
+
#: s2member/includes/classes/files-in.inc.php:852
|
255 |
+
#: s2member/includes/classes/files-in.inc.php:1245
|
256 |
msgctxt "s2member-admin"
|
257 |
msgid "Unable to create Amazon® CloudFront Downloads Distro. Connection failed."
|
258 |
msgstr ""
|
261 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
262 |
#. exclude `%s` if you like.
|
263 |
|
264 |
+
#: s2member/includes/classes/files-in.inc.php:856
|
265 |
+
#: s2member/includes/classes/files-in.inc.php:1023
|
266 |
msgctxt "s2member-admin"
|
267 |
msgid "Unable to create Amazon® CloudFront Origin Access Identity. %s"
|
268 |
msgstr ""
|
269 |
|
270 |
+
#: s2member/includes/classes/files-in.inc.php:859
|
271 |
+
#: s2member/includes/classes/files-in.inc.php:1026
|
272 |
msgctxt "s2member-admin"
|
273 |
msgid "Unable to create Amazon® CloudFront Origin Access Identity. Connection failed."
|
274 |
msgstr ""
|
275 |
|
276 |
+
#: s2member/includes/classes/files-in.inc.php:862
|
277 |
msgctxt "s2member-admin"
|
278 |
msgid "Unable to clear existing Amazon® CloudFront Origin Access Identity."
|
279 |
msgstr ""
|
282 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
283 |
#. exclude `%s` if you like.
|
284 |
|
285 |
+
#: s2member/includes/classes/files-in.inc.php:866
|
286 |
+
#: s2member/includes/classes/files-in.inc.php:935
|
287 |
msgctxt "s2member-admin"
|
288 |
msgid "Unable to acquire existing Amazon® CloudFront Origin Access Identity. %s"
|
289 |
msgstr ""
|
290 |
|
291 |
+
#: s2member/includes/classes/files-in.inc.php:869
|
292 |
+
#: s2member/includes/classes/files-in.inc.php:938
|
293 |
msgctxt "s2member-admin"
|
294 |
msgid "Unable to acquire existing Amazon® CloudFront Origin Access Identity. Connection failed."
|
295 |
msgstr ""
|
296 |
|
297 |
+
#: s2member/includes/classes/files-in.inc.php:872
|
298 |
msgctxt "s2member-admin"
|
299 |
msgid "Unable to clear existing Amazon® CloudFront Streaming Distro."
|
300 |
msgstr ""
|
303 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
304 |
#. exclude `%s` if you like.
|
305 |
|
306 |
+
#: s2member/includes/classes/files-in.inc.php:876
|
307 |
msgctxt "s2member-admin"
|
308 |
msgid "Unable to acquire existing Amazon® CloudFront Streaming Distro. %s"
|
309 |
msgstr ""
|
310 |
|
311 |
+
#: s2member/includes/classes/files-in.inc.php:879
|
312 |
msgctxt "s2member-admin"
|
313 |
msgid "Unable to acquire existing Amazon® CloudFront Streaming Distro. Connection failed."
|
314 |
msgstr ""
|
315 |
|
316 |
+
#: s2member/includes/classes/files-in.inc.php:882
|
317 |
msgctxt "s2member-admin"
|
318 |
msgid "Unable to clear existing Amazon® CloudFront Downloads Distro."
|
319 |
msgstr ""
|
322 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
323 |
#. exclude `%s` if you like.
|
324 |
|
325 |
+
#: s2member/includes/classes/files-in.inc.php:886
|
326 |
msgctxt "s2member-admin"
|
327 |
msgid "Unable to acquire existing Amazon® CloudFront Downloads Distro. %s"
|
328 |
msgstr ""
|
329 |
|
330 |
+
#: s2member/includes/classes/files-in.inc.php:889
|
331 |
msgctxt "s2member-admin"
|
332 |
msgid "Unable to acquire existing Amazon® CloudFront Downloads Distro. Connection failed."
|
333 |
msgstr ""
|
334 |
|
335 |
+
#: s2member/includes/classes/files-in.inc.php:892
|
336 |
msgctxt "s2member-admin"
|
337 |
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."
|
338 |
msgstr ""
|
339 |
|
340 |
+
#: s2member/includes/classes/files-in.inc.php:895
|
341 |
msgctxt "s2member-admin"
|
342 |
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."
|
343 |
msgstr ""
|
346 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
347 |
#. exclude `%s` if you like.
|
348 |
|
349 |
+
#: s2member/includes/classes/files-in.inc.php:931
|
350 |
msgctxt "s2member-admin"
|
351 |
msgid "Existing Amazon® CloudFront Origin Access Identity NOT found. %s"
|
352 |
msgstr ""
|
353 |
|
354 |
+
#: s2member/includes/classes/files-in.inc.php:941
|
355 |
msgctxt "s2member-admin"
|
356 |
msgid "Unable to acquire existing Amazon® CloudFront Origin Access Identity. Invalid Access ID."
|
357 |
msgstr ""
|
358 |
|
359 |
+
#: s2member/includes/classes/files-in.inc.php:981
|
360 |
msgctxt "s2member-admin"
|
361 |
msgid "Unable to delete existing Amazon® CloudFront Origin Access Identity. Connection failed."
|
362 |
msgstr ""
|
363 |
|
364 |
+
#: s2member/includes/classes/files-in.inc.php:984
|
365 |
msgctxt "s2member-admin"
|
366 |
msgid "Unable to delete existing Amazon® CloudFront Origin Access Identity. Invalid Access ID, ETag, or XML config."
|
367 |
msgstr ""
|
368 |
|
369 |
+
#: s2member/includes/classes/files-in.inc.php:1010
|
370 |
+
#: s2member/includes/classes/files-in.inc.php:1229
|
371 |
+
#: s2member/includes/classes/files-in.inc.php:1252
|
372 |
msgctxt "s2member-admin"
|
373 |
msgid "Created by s2Member, for S3 Bucket: %s."
|
374 |
msgstr ""
|
375 |
|
376 |
+
#: s2member/includes/classes/files-in.inc.php:1019
|
377 |
msgctxt "s2member-admin"
|
378 |
msgid "Unable to create/read Amazon® CloudFront Origin Access Identity. Unexpected response."
|
379 |
msgstr ""
|
382 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
383 |
#. exclude `%s` if you like.
|
384 |
|
385 |
+
#: s2member/includes/classes/files-in.inc.php:1063
|
386 |
msgctxt "s2member-admin"
|
387 |
msgid "Existing Amazon® CloudFront Distro NOT found. %s"
|
388 |
msgstr ""
|
391 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
392 |
#. exclude `%s` if you like.
|
393 |
|
394 |
+
#: s2member/includes/classes/files-in.inc.php:1067
|
395 |
msgctxt "s2member-admin"
|
396 |
msgid "Unable to acquire existing Amazon® CloudFront Distro. %s"
|
397 |
msgstr ""
|
398 |
|
399 |
+
#: s2member/includes/classes/files-in.inc.php:1070
|
400 |
msgctxt "s2member-admin"
|
401 |
msgid "Unable to acquire existing Amazon® CloudFront Distro. Connection failed."
|
402 |
msgstr ""
|
403 |
|
404 |
+
#: s2member/includes/classes/files-in.inc.php:1073
|
405 |
msgctxt "s2member-admin"
|
406 |
msgid "Unable to acquire existing Amazon® CloudFront Distro. Invalid Distro ID and/or Distro type."
|
407 |
msgstr ""
|
410 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
411 |
#. exclude `%s` if you like.
|
412 |
|
413 |
+
#: s2member/includes/classes/files-in.inc.php:1115
|
414 |
+
#: s2member/includes/classes/files-in.inc.php:1188
|
415 |
msgctxt "s2member-admin"
|
416 |
msgid "Unable to disable existing Amazon® CloudFront Distro. %s"
|
417 |
msgstr ""
|
418 |
|
419 |
+
#: s2member/includes/classes/files-in.inc.php:1118
|
420 |
+
#: s2member/includes/classes/files-in.inc.php:1191
|
421 |
msgctxt "s2member-admin"
|
422 |
msgid "Unable to disable existing Amazon® CloudFront Distro. Connection failed."
|
423 |
msgstr ""
|
424 |
|
425 |
+
#: s2member/includes/classes/files-in.inc.php:1121
|
426 |
msgctxt "s2member-admin"
|
427 |
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."
|
428 |
msgstr ""
|
429 |
|
430 |
+
#: s2member/includes/classes/files-in.inc.php:1127
|
431 |
msgctxt "s2member-admin"
|
432 |
msgid "Unable to disable existing Amazon® CloudFront Distro. Invalid Distro ID, ETag, or XML config."
|
433 |
msgstr ""
|
436 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
437 |
#. exclude `%s` if you like.
|
438 |
|
439 |
+
#: s2member/includes/classes/files-in.inc.php:1170
|
440 |
msgctxt "s2member-admin"
|
441 |
msgid "Unable to delete existing Amazon® CloudFront Distro. %s"
|
442 |
msgstr ""
|
443 |
|
444 |
+
#: s2member/includes/classes/files-in.inc.php:1173
|
445 |
msgctxt "s2member-admin"
|
446 |
msgid "Unable to delete existing Amazon® CloudFront Distro. Connection failed."
|
447 |
msgstr ""
|
450 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
451 |
#. exclude `%s` if you like.
|
452 |
|
453 |
+
#: s2member/includes/classes/files-in.inc.php:1177
|
454 |
msgctxt "s2member-admin"
|
455 |
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."
|
456 |
msgstr ""
|
459 |
#. message, which comes from the Amazon® CloudFront API call. Feel free to
|
460 |
#. exclude `%s` if you like.
|
461 |
|
462 |
+
#: s2member/includes/classes/files-in.inc.php:1181
|
463 |
msgctxt "s2member-admin"
|
464 |
msgid "Unable to check status of existing Amazon® CloudFront Distro. %s"
|
465 |
msgstr ""
|
466 |
|
467 |
+
#: s2member/includes/classes/files-in.inc.php:1184
|
468 |
msgctxt "s2member-admin"
|
469 |
msgid "Unable to check status of existing Amazon® CloudFront Distro. Connection failed."
|
470 |
msgstr ""
|
471 |
|
472 |
+
#: s2member/includes/classes/files-in.inc.php:1194
|
473 |
msgctxt "s2member-admin"
|
474 |
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."
|
475 |
msgstr ""
|
476 |
|
477 |
+
#: s2member/includes/classes/files-in.inc.php:1197
|
478 |
msgctxt "s2member-admin"
|
479 |
msgid "Unable to delete existing Amazon® CloudFront Distro. Invalid Distro ID or ETag."
|
480 |
msgstr ""
|
481 |
|
482 |
+
#: s2member/includes/classes/files-in.inc.php:1238
|
483 |
msgctxt "s2member-admin"
|
484 |
msgid "Unable to create/read Amazon® CloudFront Downloads Distro. Unexpected response."
|
485 |
msgstr ""
|
489 |
msgid "Unable to create/read Amazon® CloudFront Streaming Distro. Unexpected response."
|
490 |
msgstr ""
|
491 |
|
492 |
+
#: s2member/includes/classes/files-in.inc.php:1272
|
493 |
msgctxt "s2member-admin"
|
494 |
msgid "Unable to create Amazon® CloudFront Distro. Invalid Distro type."
|
495 |
msgstr ""
|
3387 |
msgid "<div>Sorry, your Coupon is N/A, invalid or expired.</div>"
|
3388 |
msgstr ""
|
3389 |
|
3390 |
+
#: s2member-pro/includes/classes/gateways/clickbank/clickbank-return-in.inc.php:181
|
3391 |
msgctxt "s2member-front"
|
3392 |
msgid ""
|
3393 |
"ERROR: Unexpected txnType. Please contact Support for assistance.\n"
|
3395 |
"The ClickBank® txnType did not match a required action."
|
3396 |
msgstr ""
|
3397 |
|
3398 |
+
#: s2member-pro/includes/classes/gateways/clickbank/clickbank-return-in.inc.php:216
|
3399 |
msgctxt "s2member-front"
|
3400 |
msgid ""
|
3401 |
"ERROR: Unable to verify POST vars. Please contact Support for assistance.\n"
|
readme.txt
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
=== s2Member® ( Membership w/ PayPal® ) ===
|
2 |
|
3 |
-
Version:
|
4 |
-
Stable tag:
|
5 |
Framework: WS-P-110523
|
6 |
|
7 |
SSL Compatible: yes
|
@@ -179,6 +179,11 @@ Please visit s2Member.com for [video tutorials](http://www.s2member.com/videos/)
|
|
179 |
|
180 |
== Changelog ==
|
181 |
|
|
|
|
|
|
|
|
|
|
|
182 |
= v111206 =
|
183 |
* (s2Member/s2Member Pro) **WordPress® v3.3**. Updates for compatibility with WordPress® v3.3. This release of s2Member also remains compatible with the WordPress® v3.2.x series.
|
184 |
* (s2Member/s2Member Pro) **Bug fix**. An important bug was identified in s2Member's handling of certain EOT events associated with Subscr. Modifications *( under the right scenario )*. Fixed in this release.
|
1 |
=== s2Member® ( Membership w/ PayPal® ) ===
|
2 |
|
3 |
+
Version: 111216
|
4 |
+
Stable tag: 111216
|
5 |
Framework: WS-P-110523
|
6 |
|
7 |
SSL Compatible: yes
|
179 |
|
180 |
== Changelog ==
|
181 |
|
182 |
+
= v111216 =
|
183 |
+
* (s2Member/s2Member Pro) **Bug fix**. ClickBank® not passing all s2 Vars after return from a non-recurring transaction. Fixed in this release. For further details, please see [this thread](http://www.primothemes.com/forums/viewtopic.php?f=4&t=16256#p56649).
|
184 |
+
* (s2Member) **Bug fix**. Amazon® S3/CloudFront issues with ACLs upon auto-configuration routine. Leading to a 400 error code. Fixed in this release. For further details, please see [this thread](http://www.primothemes.com/forums/viewtopic.php?f=4&t=15853&p=56158#p56159).
|
185 |
+
* (s2Member/s2Member Pro) **WordPress® v3.3 / v3.4**. Updates for compatibility with WordPress® v3.3, and initial compatibility scans against WordPress® v3.4-alpha. Everything looks good. This release of s2Member also remains compatible with the WordPress® v3.2.x series.
|
186 |
+
|
187 |
= v111206 =
|
188 |
* (s2Member/s2Member Pro) **WordPress® v3.3**. Updates for compatibility with WordPress® v3.3. This release of s2Member also remains compatible with the WordPress® v3.2.x series.
|
189 |
* (s2Member/s2Member Pro) **Bug fix**. An important bug was identified in s2Member's handling of certain EOT events associated with Subscr. Modifications *( under the right scenario )*. Fixed in this release.
|
s2member.php
CHANGED
@@ -19,8 +19,8 @@
|
|
19 |
*/
|
20 |
/* -- This section for WordPress® parsing. ------------------------------------------------------------------------------
|
21 |
|
22 |
-
Version:
|
23 |
-
Stable tag:
|
24 |
Framework: WS-P-110523
|
25 |
|
26 |
SSL Compatible: yes
|
@@ -31,12 +31,12 @@ WP Multisite Compatible: yes
|
|
31 |
Multisite Blog Farm Compatible: yes
|
32 |
|
33 |
PayPal® Standard Compatible: yes
|
34 |
-
PayPal® Pro Compatible: w/ s2Member Pro
|
35 |
-
Google® Checkout Compatible: w/ s2Member Pro
|
36 |
-
Authorize.Net® Compatible: w/ s2Member Pro
|
37 |
-
ClickBank® Compatible: w/ s2Member Pro
|
38 |
-
AliPay® Compatible: w/ s2Member Pro
|
39 |
-
ccBill® Compatible: w/ s2Member Pro
|
40 |
|
41 |
Tested up to: 3.3
|
42 |
Requires at least: 3.2
|
@@ -76,7 +76,7 @@ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
|
|
76 |
* @var str
|
77 |
*/
|
78 |
if (!defined ("WS_PLUGIN__S2MEMBER_VERSION"))
|
79 |
-
define ("WS_PLUGIN__S2MEMBER_VERSION", "
|
80 |
/**
|
81 |
* Minimum PHP version required to run s2Member.
|
82 |
*
|
@@ -106,7 +106,7 @@ if (!defined ("WS_PLUGIN__S2MEMBER_MIN_WP_VERSION"))
|
|
106 |
* @var str
|
107 |
*/
|
108 |
if (!defined ("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
|
109 |
-
define ("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "
|
110 |
/*
|
111 |
Several compatibility checks.
|
112 |
If all pass, load the s2Member plugin.
|
19 |
*/
|
20 |
/* -- This section for WordPress® parsing. ------------------------------------------------------------------------------
|
21 |
|
22 |
+
Version: 111216
|
23 |
+
Stable tag: 111216
|
24 |
Framework: WS-P-110523
|
25 |
|
26 |
SSL Compatible: yes
|
31 |
Multisite Blog Farm Compatible: yes
|
32 |
|
33 |
PayPal® Standard Compatible: yes
|
34 |
+
PayPal® Pro Compatible: yes w/ s2Member Pro
|
35 |
+
Google® Checkout Compatible: yes w/ s2Member Pro
|
36 |
+
Authorize.Net® Compatible: yes w/ s2Member Pro
|
37 |
+
ClickBank® Compatible: yes w/ s2Member Pro
|
38 |
+
AliPay® Compatible: yes w/ s2Member Pro
|
39 |
+
ccBill® Compatible: yes w/ s2Member Pro
|
40 |
|
41 |
Tested up to: 3.3
|
42 |
Requires at least: 3.2
|
76 |
* @var str
|
77 |
*/
|
78 |
if (!defined ("WS_PLUGIN__S2MEMBER_VERSION"))
|
79 |
+
define ("WS_PLUGIN__S2MEMBER_VERSION", "111216");
|
80 |
/**
|
81 |
* Minimum PHP version required to run s2Member.
|
82 |
*
|
106 |
* @var str
|
107 |
*/
|
108 |
if (!defined ("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION"))
|
109 |
+
define ("WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION", "111216");
|
110 |
/*
|
111 |
Several compatibility checks.
|
112 |
If all pass, load the s2Member plugin.
|