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

Version Description

Download this release

Release Info

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

Code changes from version 110606 to 110617

includes/classes/files-in.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_files_in"))
21
{
@@ -45,23 +45,23 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
45
{
46
$excluded = apply_filters ("ws_plugin__s2member_check_file_download_access_excluded", false, get_defined_vars ());
47
/**/
48
- if (!($using_amazon_s3_storage = 0) && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket"] && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_access_key"] && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_secret_key"])
49
$using_amazon_s3_storage = true; /* Amazon® S3 storage has been configured! */
50
/**/
51
- if (!$excluded && (empty ($_GET["s2member_file_download_key"]) || (!empty ($_GET["s2member_file_download_key"]) && !($file_download_key_is_valid = ($_GET["s2member_file_download_key"] === c_ws_plugin__s2member_files::file_download_key ($_GET["s2member_file_download"]) || $_GET["s2member_file_download_key"] === c_ws_plugin__s2member_files::file_download_key ($_GET["s2member_file_download"], "ip-forever") || $_GET["s2member_file_download_key"] === c_ws_plugin__s2member_files::file_download_key ($_GET["s2member_file_download"], "universal"))))))
52
{
53
$_GET["s2member_file_download"] = trim ($_GET["s2member_file_download"], "/"); /* Trim slashes after Key comparison. */
54
/**/
55
if (!$using_amazon_s3_storage && !file_exists ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $_GET["s2member_file_download"]))
56
{
57
- header("HTTP/1.0 404 Not Found"); /* The file does NOT even exist. */
58
- exit("404: Sorry, file not found. Please contact Support for assistance.");
59
}
60
/**/
61
else if (!empty ($_GET["s2member_file_download_key"]) && !$file_download_key_is_valid) /* Invalid Key? */
62
{
63
- header("HTTP/1.0 503 Service Temporarily Unavailable"); /* Invalid Download Keys are handled separately. */
64
- exit("503 ( Invalid Key ): Sorry, your access to this file has expired. Please contact Support for assistance.");
65
}
66
/**/
67
else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]) /* Is a Membership Options Page configured? */
@@ -72,11 +72,11 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
72
/**/
73
if (($file_download_access_is_allowed = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads ()) === false)
74
{
75
- header("HTTP/1.0 503 Service Temporarily Unavailable"); /* File downloads are NOT yet configured? */
76
- exit("503: Sorry, File Downloads are NOT enabled yet. Please contact Support for assistance. If you are the site owner, please configure: `s2Member -> Download Options -> Basic Download Restrictions`.");
77
}
78
/**/
79
- else if (!is_object ($user = apply_filters ("ws_plugin__s2member_check_file_download_access_user", ((is_user_logged_in ()) ? wp_get_current_user () : false), get_defined_vars ())) || !($user_id = $user->ID))
80
{
81
if (preg_match ("/^access[_\-]s2member[_\-]level([0-9]+)\//", $_GET["s2member_file_download"], $m))
82
{
@@ -124,7 +124,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
124
{
125
if (strtotime ($file_download_access_log_entry["date"]) < strtotime ("-" . $max_days_logged . " days"))
126
{
127
- unset($file_download_access_log[$file_download_access_log_entry_key]);
128
$file_download_access_arc[] = $file_download_access_log_entry;
129
}
130
else if (strtotime ($file_download_access_log_entry["date"]) >= strtotime ("-" . $file_downloads["allowed_days"] . " days"))
@@ -152,14 +152,14 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
152
/**/
153
if (!$using_amazon_s3_storage && !file_exists ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $_GET["s2member_file_download"]))
154
{
155
- header("HTTP/1.0 404 Not Found"); /* The file does NOT even exist. */
156
- exit("404: Sorry, file not found. Please contact Support for assistance.");
157
}
158
}
159
/*
160
Here we are going to put together all of the File Download information.
161
*/
162
- $extension = strtolower (substr ($_GET["s2member_file_download"], strrpos ($_GET["s2member_file_download"], "."))); /* To lowercase. */
163
/**/
164
$mimetypes = parse_ini_file (dirname (dirname (dirname (__FILE__))) . "/includes/mime-types.ini"); /* Types provided by: `mime-types.ini`. */
165
$mimetype = ($mimetypes[$extension]) ? $mimetypes[$extension] : "application/octet-stream"; /* Lookup the MIME type for this file extension. */
@@ -171,7 +171,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
171
$pathinfo = (!$using_amazon_s3_storage) ? pathinfo (($file = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $_GET["s2member_file_download"])) : array ();
172
$length = (!$using_amazon_s3_storage && $file) ? filesize ($file) : -1; /* The overall file size, in bytes. */
173
/**/
174
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$__v;');
175
do_action ("ws_plugin__s2member_during_file_download_access", get_defined_vars ());
176
unset ($__refs, $__v); /* Unset defined __refs, __v. */
177
/**/
@@ -188,50 +188,50 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
188
$amazon_s3_redirection_url .= "&Expires=" . urlencode ($amazon_s3_file_expires);
189
$amazon_s3_redirection_url .= "&Signature=" . urlencode ($amazon_s3_signature);
190
/**/
191
- wp_redirect($amazon_s3_redirection_url); /* 302 redirection. */
192
/**/
193
exit (); /* Clean exit. */
194
}
195
/**/
196
else /* Else, using localized storage ( default ). */
197
{
198
- @set_time_limit(0); /* Unlimited. */
199
@ini_set ("zlib.output_compression", 0);
200
/**/
201
- header("Accept-Ranges: none");
202
- header("Content-Encoding: none");
203
- header("Content-Type: " . $mimetype);
204
- header("Expires: " . gmdate ("D, d M Y H:i:s", strtotime ("-1 week")) . " GMT");
205
- header("Last-Modified: " . gmdate ("D, d M Y H:i:s") . " GMT");
206
- header("Cache-Control: no-cache, must-revalidate, max-age=0");
207
header ("Cache-Control: post-check=0, pre-check=0", false);
208
- header("Pragma: no-cache");
209
/**/
210
- header('Content-Disposition: ' . (($inline) ? "inline" : "attachment") . '; filename="' . $basename . '"');
211
/**/
212
if ($length && apply_filters ("ws_plugin__s2member_stream_file_downloads", true, get_defined_vars ()) && ($stream = fopen ($file, "rb")))
213
{
214
$_stream_w_content_length = (preg_match ("/^win/i", PHP_OS)) ? false : true; /* Windows® IIS does not jive here. */
215
/* Windows® IIS doesn't seem to like it when both `Content-Length` and `Transfer-Encoding: chunked` are sent together. */
216
if (apply_filters ("ws_plugin__s2member_stream_file_downloads_w_content_length", $_stream_w_content_length, get_defined_vars ()))
217
- header("Content-Length: " . $length);
218
/**/
219
- header("Transfer-Encoding: chunked"); /* Uses `Transfer-Encoding: chunked` for simulated streaming. */
220
/**/
221
- eval('while (@ob_end_clean ());'); /* End/clean all output buffers that may or may not exist. */
222
/**/
223
while (!feof ($stream) && ($chunk_size = strlen ($data = fread ($stream, 2097152))))
224
- eval('echo dechex ($chunk_size) . "\r\n". $data . "\r\n"; @flush ();');
225
/**/
226
- fclose($stream);
227
/**/
228
- exit("0\r\n\r\n");
229
}
230
else if ($length) /* Else `file_get_contents()`. */
231
{
232
- header("Content-Length: " . $length);
233
/**/
234
- exit(file_get_contents ($file));
235
}
236
else
237
exit (); /* Empty file. */
@@ -252,7 +252,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
252
public static function amazon_s3_sign ($data = FALSE)
253
{
254
$key = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_secret_key"];
255
- $key = str_pad (((strlen ($key) > 64) ? pack ('H*', sha1 ($key)) : $key), 64, chr (0x00));
256
return pack ('H*', sha1 (($key ^ str_repeat (chr (0x5c), 64)) . pack ('H*', sha1 (($key ^ str_repeat (chr (0x36), 64)) . $data))));
257
}
258
/**
@@ -268,7 +268,7 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
268
*/
269
public static function _file_remote_authorization ($user = FALSE)
270
{
271
- eval('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$__v;');
272
do_action ("_ws_plugin__s2member_before_file_remote_authorization", get_defined_vars ());
273
unset ($__refs, $__v); /* Unset defined __refs, __v. */
274
/**/
@@ -278,9 +278,9 @@ if (!class_exists ("c_ws_plugin__s2member_files_in"))
278
/**/
279
if (empty ($_SERVER["PHP_AUTH_USER"]) || empty ($_SERVER["PHP_AUTH_PW"]) || !user_pass_ok ($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]))
280
{
281
- header('WWW-Authenticate: Basic realm="Members Only"');
282
- header("HTTP/1.0 401 Unauthorized");
283
- exit("Access Denied");
284
}
285
else if (is_object ($_user = new WP_User ($_SERVER["PHP_AUTH_USER"])) && $_user->ID)
286
{
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_files_in"))
21
{
45
{
46
$excluded = apply_filters ("ws_plugin__s2member_check_file_download_access_excluded", false, get_defined_vars ());
47
/**/
48
+ if (! ($using_amazon_s3_storage = 0) && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket"] && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_access_key"] && $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_secret_key"])
49
$using_amazon_s3_storage = true; /* Amazon® S3 storage has been configured! */
50
/**/
51
+ if (!$excluded && (empty ($_GET["s2member_file_download_key"]) || (!empty ($_GET["s2member_file_download_key"]) && ! ($file_download_key_is_valid = ($_GET["s2member_file_download_key"] === c_ws_plugin__s2member_files::file_download_key ($_GET["s2member_file_download"]) || $_GET["s2member_file_download_key"] === c_ws_plugin__s2member_files::file_download_key ($_GET["s2member_file_download"], "ip-forever") || $_GET["s2member_file_download_key"] === c_ws_plugin__s2member_files::file_download_key ($_GET["s2member_file_download"], "universal"))))))
52
{
53
$_GET["s2member_file_download"] = trim ($_GET["s2member_file_download"], "/"); /* Trim slashes after Key comparison. */
54
/**/
55
if (!$using_amazon_s3_storage && !file_exists ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $_GET["s2member_file_download"]))
56
{
57
+ header ("HTTP/1.0 404 Not Found"); /* The file does NOT even exist. */
58
+ exit ("404: Sorry, file not found. Please contact Support for assistance.");
59
}
60
/**/
61
else if (!empty ($_GET["s2member_file_download_key"]) && !$file_download_key_is_valid) /* Invalid Key? */
62
{
63
+ header ("HTTP/1.0 503 Service Temporarily Unavailable"); /* Invalid Download Keys are handled separately. */
64
+ exit ("503 ( Invalid Key ): Sorry, your access to this file has expired. Please contact Support for assistance.");
65
}
66
/**/
67
else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_options_page"]) /* Is a Membership Options Page configured? */
72
/**/
73
if (($file_download_access_is_allowed = $min_level_4_downloads = c_ws_plugin__s2member_files::min_level_4_downloads ()) === false)
74
{
75
+ header ("HTTP/1.0 503 Service Temporarily Unavailable"); /* File downloads are NOT yet configured? */
76
+ exit ("503: Sorry, File Downloads are NOT enabled yet. Please contact Support for assistance. If you are the site owner, please configure: `s2Member -> Download Options -> Basic Download Restrictions`.");
77
}
78
/**/
79
+ else if (!is_object ($user = apply_filters ("ws_plugin__s2member_check_file_download_access_user", ( (is_user_logged_in ()) ? wp_get_current_user () : false), get_defined_vars ())) || ! ($user_id = $user->ID))
80
{
81
if (preg_match ("/^access[_\-]s2member[_\-]level([0-9]+)\//", $_GET["s2member_file_download"], $m))
82
{
124
{
125
if (strtotime ($file_download_access_log_entry["date"]) < strtotime ("-" . $max_days_logged . " days"))
126
{
127
+ unset ($file_download_access_log[$file_download_access_log_entry_key]);
128
$file_download_access_arc[] = $file_download_access_log_entry;
129
}
130
else if (strtotime ($file_download_access_log_entry["date"]) >= strtotime ("-" . $file_downloads["allowed_days"] . " days"))
152
/**/
153
if (!$using_amazon_s3_storage && !file_exists ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $_GET["s2member_file_download"]))
154
{
155
+ header ("HTTP/1.0 404 Not Found"); /* The file does NOT even exist. */
156
+ exit ("404: Sorry, file not found. Please contact Support for assistance.");
157
}
158
}
159
/*
160
Here we are going to put together all of the File Download information.
161
*/
162
+ $extension = strtolower (substr ($_GET["s2member_file_download"], strrpos ($_GET["s2member_file_download"], ".") + 1)); /* To lowercase. */
163
/**/
164
$mimetypes = parse_ini_file (dirname (dirname (dirname (__FILE__))) . "/includes/mime-types.ini"); /* Types provided by: `mime-types.ini`. */
165
$mimetype = ($mimetypes[$extension]) ? $mimetypes[$extension] : "application/octet-stream"; /* Lookup the MIME type for this file extension. */
171
$pathinfo = (!$using_amazon_s3_storage) ? pathinfo (($file = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"] . "/" . $_GET["s2member_file_download"])) : array ();
172
$length = (!$using_amazon_s3_storage && $file) ? filesize ($file) : -1; /* The overall file size, in bytes. */
173
/**/
174
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$__v;');
175
do_action ("ws_plugin__s2member_during_file_download_access", get_defined_vars ());
176
unset ($__refs, $__v); /* Unset defined __refs, __v. */
177
/**/
188
$amazon_s3_redirection_url .= "&Expires=" . urlencode ($amazon_s3_file_expires);
189
$amazon_s3_redirection_url .= "&Signature=" . urlencode ($amazon_s3_signature);
190
/**/
191
+ wp_redirect ($amazon_s3_redirection_url); /* 302 redirection. */
192
/**/
193
exit (); /* Clean exit. */
194
}
195
/**/
196
else /* Else, using localized storage ( default ). */
197
{
198
+ @set_time_limit (0); /* Unlimited. */
199
@ini_set ("zlib.output_compression", 0);
200
/**/
201
+ header ("Accept-Ranges: none");
202
+ header ("Content-Encoding: none");
203
+ header ("Content-Type: " . $mimetype);
204
+ header ("Expires: " . gmdate ("D, d M Y H:i:s", strtotime ("-1 week")) . " GMT");
205
+ header ("Last-Modified: " . gmdate ("D, d M Y H:i:s") . " GMT");
206
+ header ("Cache-Control: no-cache, must-revalidate, max-age=0");
207
header ("Cache-Control: post-check=0, pre-check=0", false);
208
+ header ("Pragma: no-cache");
209
/**/
210
+ header ('Content-Disposition: ' . (($inline) ? "inline" : "attachment") . '; filename="' . $basename . '"');
211
/**/
212
if ($length && apply_filters ("ws_plugin__s2member_stream_file_downloads", true, get_defined_vars ()) && ($stream = fopen ($file, "rb")))
213
{
214
$_stream_w_content_length = (preg_match ("/^win/i", PHP_OS)) ? false : true; /* Windows® IIS does not jive here. */
215
/* Windows® IIS doesn't seem to like it when both `Content-Length` and `Transfer-Encoding: chunked` are sent together. */
216
if (apply_filters ("ws_plugin__s2member_stream_file_downloads_w_content_length", $_stream_w_content_length, get_defined_vars ()))
217
+ header ("Content-Length: " . $length);
218
/**/
219
+ header ("Transfer-Encoding: chunked"); /* Uses `Transfer-Encoding: chunked` for simulated streaming. */
220
/**/
221
+ eval ('while (@ob_end_clean ());'); /* End/clean all output buffers that may or may not exist. */
222
/**/
223
while (!feof ($stream) && ($chunk_size = strlen ($data = fread ($stream, 2097152))))
224
+ eval ('echo dechex ($chunk_size) . "\r\n". $data . "\r\n"; @flush ();');
225
/**/
226
+ fclose ($stream);
227
/**/
228
+ exit ("0\r\n\r\n");
229
}
230
else if ($length) /* Else `file_get_contents()`. */
231
{
232
+ header ("Content-Length: " . $length);
233
/**/
234
+ exit (file_get_contents ($file));
235
}
236
else
237
exit (); /* Empty file. */
252
public static function amazon_s3_sign ($data = FALSE)
253
{
254
$key = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_secret_key"];
255
+ $key = str_pad (( (strlen ($key) > 64) ? pack ('H*', sha1 ($key)) : $key), 64, chr (0x00));
256
return pack ('H*', sha1 (($key ^ str_repeat (chr (0x5c), 64)) . pack ('H*', sha1 (($key ^ str_repeat (chr (0x36), 64)) . $data))));
257
}
258
/**
268
*/
269
public static function _file_remote_authorization ($user = FALSE)
270
{
271
+ eval ('foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$__v;');
272
do_action ("_ws_plugin__s2member_before_file_remote_authorization", get_defined_vars ());
273
unset ($__refs, $__v); /* Unset defined __refs, __v. */
274
/**/
278
/**/
279
if (empty ($_SERVER["PHP_AUTH_USER"]) || empty ($_SERVER["PHP_AUTH_PW"]) || !user_pass_ok ($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]))
280
{
281
+ header ('WWW-Authenticate: Basic realm="Members Only"');
282
+ header ("HTTP/1.0 401 Unauthorized");
283
+ exit ("Access Denied");
284
}
285
else if (is_object ($_user = new WP_User ($_SERVER["PHP_AUTH_USER"])) && $_user->ID)
286
{
includes/mime-types.ini CHANGED
@@ -253,6 +253,9 @@ qt = video/quicktime
253
viv = video/vnd.vivo
254
vivo = video/vnd.vivo
255
mp4 = video/mp4
256
257
[image]
258
bmp = image/bmp
253
viv = video/vnd.vivo
254
vivo = video/vnd.vivo
255
mp4 = video/mp4
256
+ ogv = video/ogg
257
+ ogg = video/ogg
258
+ webm = video/webm
259
260
[image]
261
bmp = image/bmp
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
=== s2Member® ( Membership w/ PayPal® ) ===
2
3
- Version: 110606
4
- Stable tag: 110606
5
Framework: WS-P-110523
6
7
SSL Compatible: yes
@@ -173,6 +173,10 @@ Please visit s2Member.com for [video tutorials](http://www.s2member.com/videos/)
173
174
== Changelog ==
175
176
= v110606 =
177
* **(s2Member). MailChimp® over SSL.** s2Member has been updated to communicate with the MailChimp® API over SSL, for improved security. No action or reconfiguration is necessary, as this only affects the HTTP protocol used during communication with the MailChimp® API.
178
* **(s2Member). Documentation update.** s2Member has been updated to mention the PHP Execution plugin, which is required to take full advantage of `"Advanced" Download Restrictions`, through the application of a File Download Key. The creation of a File Download `Key`, requires a small PHP code snippet. In order to use PHP scripting inside your Posts/Pages, you'll need to install this handy plugin ( [PHP Execution](http://wordpress.org/extend/plugins/php-execution-plugin/) ).
1
=== s2Member® ( Membership w/ PayPal® ) ===
2
3
+ Version: 110617
4
+ Stable tag: 110617
5
Framework: WS-P-110523
6
7
SSL Compatible: yes
173
174
== Changelog ==
175
176
+ = v110617 =
177
+ * **(s2Member)** Bug fix. ** A bug first introduced in s2Member v110604 has been corrected. This bug was hindering s2Member's ability to identify MIME types for protected File Downloads.
178
+ * **(s2Member)** HTML 5 MIME types. ** s2Member has been updated to provide support through File Download protection for HTML 5 MIME types: `video/ogg` and `video/webm`.
179
+
180
= v110606 =
181
* **(s2Member). MailChimp® over SSL.** s2Member has been updated to communicate with the MailChimp® API over SSL, for improved security. No action or reconfiguration is necessary, as this only affects the HTTP protocol used during communication with the MailChimp® API.
182
* **(s2Member). Documentation update.** s2Member has been updated to mention the PHP Execution plugin, which is required to take full advantage of `"Advanced" Download Restrictions`, through the application of a File Download Key. The creation of a File Download `Key`, requires a small PHP code snippet. In order to use PHP scripting inside your Posts/Pages, you'll need to install this handy plugin ( [PHP Execution](http://wordpress.org/extend/plugins/php-execution-plugin/) ).
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
*/
20
/* -- This section for WordPress® parsing. ------------------------------------------------------------------------------
21
22
- Version: 110606
23
- Stable tag: 110606
24
Framework: WS-P-110523
25
26
SSL Compatible: yes
@@ -70,7 +70,7 @@ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
70
* @var str
71
*/
72
if (!defined ("WS_PLUGIN__S2MEMBER_VERSION"))
73
- define ("WS_PLUGIN__S2MEMBER_VERSION", "110606");
74
/**
75
* Minimum PHP version required to run s2Member.
76
*
19
*/
20
/* -- This section for WordPress® parsing. ------------------------------------------------------------------------------
21
22
+ Version: 110617
23
+ Stable tag: 110617
24
Framework: WS-P-110523
25
26
SSL Compatible: yes
70
* @var str
71
*/
72
if (!defined ("WS_PLUGIN__S2MEMBER_VERSION"))
73
+ define ("WS_PLUGIN__S2MEMBER_VERSION", "110617");
74
/**
75
* Minimum PHP version required to run s2Member.
76
*