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

Version Description

= v150203 =

(Maintenance Release) Upgrade immediately.

Download this release

Release Info

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

Code changes from version 150102 to 150203

Files changed (209) hide show
  1. changelog.md +18 -0
  2. checksum.txt +1 -1
  3. includes/classes/access-cap-times.inc.php +1 -1
  4. includes/classes/admin-css-js-in.inc.php +1 -1
  5. includes/classes/admin-css-js.inc.php +1 -1
  6. includes/classes/admin-lockouts.inc.php +1 -1
  7. includes/classes/admin-notices.inc.php +1 -1
  8. includes/classes/auto-eots.inc.php +279 -277
  9. includes/classes/aweber-e.inc.php +1 -1
  10. includes/classes/aweber.inc.php +1 -1
  11. includes/classes/brute-force.inc.php +1 -1
  12. includes/classes/cache.inc.php +1 -1
  13. includes/classes/catgs-sp.inc.php +1 -1
  14. includes/classes/catgs.inc.php +1 -1
  15. includes/classes/check-activation.inc.php +1 -1
  16. includes/classes/constants.inc.php +1 -1
  17. includes/classes/cron-jobs-in.inc.php +1 -1
  18. includes/classes/cron-jobs.inc.php +1 -1
  19. includes/classes/css-js-in.inc.php +1 -1
  20. includes/classes/css-js-themes.inc.php +1 -1
  21. includes/classes/css-js.inc.php +1 -1
  22. includes/classes/custom-reg-fields-4bp.inc.php +1 -1
  23. includes/classes/custom-reg-fields.inc.php +1 -1
  24. includes/classes/database.inc.php +1 -1
  25. includes/classes/email-configs.inc.php +1 -1
  26. includes/classes/files-in.inc.php +182 -23
  27. includes/classes/files.inc.php +374 -356
  28. includes/classes/getresponse.inc.php +1 -1
  29. includes/classes/installation.inc.php +10 -4
  30. includes/classes/ip-restrictions.inc.php +1 -1
  31. includes/classes/labels.inc.php +1 -1
  32. includes/classes/list-server-base.inc.php +1 -1
  33. includes/classes/list-servers.inc.php +1 -1
  34. includes/classes/login-checks.inc.php +1 -1
  35. includes/classes/login-customizations.inc.php +1 -1
  36. includes/classes/login-redirects-r.inc.php +1 -1
  37. includes/classes/login-redirects.inc.php +1 -1
  38. includes/classes/mailchimp-o.inc.php +1 -1
  39. includes/classes/mailchimp.inc.php +1 -1
  40. includes/classes/menu-pages-rs.inc.php +1 -1
  41. includes/classes/menu-pages-tb.inc.php +75 -74
  42. includes/classes/menu-pages.inc.php +1 -1
  43. includes/classes/meta-box-saves.inc.php +1 -1
  44. includes/classes/meta-box-security.inc.php +1 -1
  45. includes/classes/meta-boxes.inc.php +1 -1
  46. includes/classes/mms-patches.inc.php +1 -1
  47. includes/classes/mo-page-in.inc.php +1 -1
  48. includes/classes/mo-page.inc.php +1 -1
  49. includes/classes/no-cache.inc.php +23 -8
  50. includes/classes/op-notices.inc.php +1 -1
  51. includes/classes/option-forces.inc.php +1 -1
  52. includes/classes/pages-sp.inc.php +1 -1
  53. includes/classes/pages.inc.php +1 -1
  54. includes/classes/paypal-notify-in-billing-agreement-signup.inc.php +1 -1
  55. includes/classes/paypal-notify-in-cart.inc.php +1 -1
  56. includes/classes/paypal-notify-in-express-checkout.inc.php +1 -1
  57. includes/classes/paypal-notify-in-rec-profile-creation-w-level.inc.php +1 -1
  58. includes/classes/paypal-notify-in-send-money.inc.php +1 -1
  59. includes/classes/paypal-notify-in-sp-refund-reversal.inc.php +1 -1
  60. includes/classes/paypal-notify-in-subscr-modify-w-level.inc.php +1 -1
  61. includes/classes/paypal-notify-in-subscr-or-rp-cancellation-w-level.inc.php +1 -1
  62. includes/classes/paypal-notify-in-subscr-or-rp-eots-w-level.inc.php +3 -4
  63. includes/classes/paypal-notify-in-subscr-or-rp-payment-failed-w-level.inc.php +1 -1
  64. includes/classes/paypal-notify-in-subscr-or-rp-payment-w-level.inc.php +1 -1
  65. includes/classes/paypal-notify-in-subscr-or-wa-w-level.inc.php +20 -1
  66. includes/classes/paypal-notify-in-virtual-terminal.inc.php +1 -1
  67. includes/classes/paypal-notify-in-wa-ccaps-wo-level.inc.php +12 -1
  68. includes/classes/paypal-notify-in-web-accept-sp.inc.php +12 -1
  69. includes/classes/paypal-notify-in.inc.php +1 -1
  70. includes/classes/paypal-notify.inc.php +1 -1
  71. includes/classes/paypal-return-in-no-tx-data.inc.php +1 -1
  72. includes/classes/paypal-return-in-proxy-ty-email.inc.php +1 -1
  73. includes/classes/paypal-return-in-proxy-x-preview.inc.php +1 -1
  74. includes/classes/paypal-return-in-subscr-modify-w-level.inc.php +1 -1
  75. includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php +1 -1
  76. includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php +1 -1
  77. includes/classes/paypal-return-in-web-accept-sp.inc.php +1 -1
  78. includes/classes/paypal-return-in.inc.php +1 -1
  79. includes/classes/paypal-return.inc.php +1 -1
  80. includes/classes/paypal-utilities.inc.php +1 -1
  81. includes/classes/posts-sp.inc.php +1 -1
  82. includes/classes/posts.inc.php +1 -1
  83. includes/classes/profile-in.inc.php +1 -1
  84. includes/classes/profile-mods-4bp-in.inc.php +1 -1
  85. includes/classes/profile-mods-4bp.inc.php +1 -1
  86. includes/classes/profile-mods-in.inc.php +2 -2
  87. includes/classes/profile-mods.inc.php +1 -1
  88. includes/classes/profile.inc.php +1 -1
  89. includes/classes/ptags-sp.inc.php +1 -1
  90. includes/classes/ptags.inc.php +1 -1
  91. includes/classes/querys.inc.php +1 -1
  92. includes/classes/readmes.inc.php +1 -1
  93. includes/classes/register-access.inc.php +1 -1
  94. includes/classes/register-in.inc.php +1 -1
  95. includes/classes/register.inc.php +1 -1
  96. includes/classes/registration-times.inc.php +1 -1
  97. includes/classes/registrations.inc.php +16 -15
  98. includes/classes/return-templates.inc.php +1 -1
  99. includes/classes/roles-caps.inc.php +1 -1
  100. includes/classes/ruris-sp.inc.php +1 -1
  101. includes/classes/ruris.inc.php +1 -1
  102. includes/classes/s-badge-status-in.inc.php +1 -1
  103. includes/classes/s-badge-status.inc.php +1 -1
  104. includes/classes/sc-files-in.inc.php +1 -1
  105. includes/classes/sc-files.inc.php +1 -1
  106. includes/classes/sc-gets-in.inc.php +1 -1
  107. includes/classes/sc-gets.inc.php +1 -1
  108. includes/classes/sc-if-conds-in.inc.php +1 -1
  109. includes/classes/sc-if-conds.inc.php +1 -1
  110. includes/classes/sc-keys-in.inc.php +1 -1
  111. includes/classes/sc-keys.inc.php +1 -1
  112. includes/classes/sc-paypal-button-e.inc.php +1 -1
  113. includes/classes/sc-paypal-button-in.inc.php +1 -1
  114. includes/classes/sc-paypal-button.inc.php +1 -1
  115. includes/classes/sc-profile-in.inc.php +1 -1
  116. includes/classes/sc-profile.inc.php +1 -1
  117. includes/classes/sc-s-badge-in.inc.php +1 -1
  118. includes/classes/sc-s-badge.inc.php +1 -1
  119. includes/classes/security.inc.php +1 -1
  120. includes/classes/sp-access.inc.php +3 -3
  121. includes/classes/ssl-in.inc.php +1 -1
  122. includes/classes/ssl.inc.php +1 -1
  123. includes/classes/systematics-sp.inc.php +1 -1
  124. includes/classes/systematics.inc.php +1 -1
  125. includes/classes/tracking-codes.inc.php +1 -1
  126. includes/classes/tracking-cookies-in.inc.php +1 -1
  127. includes/classes/tracking-cookies.inc.php +1 -1
  128. includes/classes/translations.inc.php +1 -1
  129. includes/classes/user-access.inc.php +159 -162
  130. includes/classes/user-deletions.inc.php +2 -1
  131. includes/classes/user-new-in.inc.php +1 -1
  132. includes/classes/user-new.inc.php +1 -1
  133. includes/classes/user-notes.inc.php +1 -1
  134. includes/classes/user-securities.inc.php +1 -1
  135. includes/classes/users-list-in.inc.php +527 -529
  136. includes/classes/users-list.inc.php +1 -1
  137. includes/classes/utilities.inc.php +208 -201
  138. includes/classes/utils-arrays.inc.php +1 -1
  139. includes/classes/utils-captchas.inc.php +1 -1
  140. includes/classes/utils-conds.inc.php +1 -1
  141. includes/classes/utils-css.inc.php +1 -1
  142. includes/classes/utils-cur.inc.php +1 -1
  143. includes/classes/utils-dirs.inc.php +1 -1
  144. includes/classes/utils-encryption.inc.php +215 -167
  145. includes/classes/utils-forms.inc.php +1 -1
  146. includes/classes/utils-gets.inc.php +1 -1
  147. includes/classes/utils-html.inc.php +1 -1
  148. includes/classes/utils-logs.inc.php +1 -1
  149. includes/classes/utils-s2o.inc.php +127 -121
  150. includes/classes/utils-strings.inc.php +623 -533
  151. includes/classes/utils-time.inc.php +1 -1
  152. includes/classes/utils-urls.inc.php +1 -3
  153. includes/classes/utils-users.inc.php +1 -1
  154. includes/classes/wp-footer.inc.php +1 -1
  155. includes/codes.inc.php +1 -1
  156. includes/funcs.inc.php +1 -1
  157. includes/functions/api-functions.inc.php +1 -1
  158. includes/functions/class-autoloader.inc.php +1 -1
  159. includes/functions/deprecated.inc.php +1 -1
  160. includes/functions/pluggables.inc.php +1 -1
  161. includes/hooks.inc.php +1 -1
  162. includes/menu-pages/api-ops.inc.php +1 -1
  163. includes/menu-pages/down-ops.inc.php +111 -84
  164. includes/menu-pages/els-ops.inc.php +1 -1
  165. includes/menu-pages/gen-ops.inc.php +1 -1
  166. includes/menu-pages/info.inc.php +1 -1
  167. includes/menu-pages/integrations.inc.php +1 -1
  168. includes/menu-pages/logs.inc.php +1 -1
  169. includes/menu-pages/menu-pages.css +87 -4
  170. includes/menu-pages/mms-ops.inc.php +1 -1
  171. includes/menu-pages/paypal-buttons.inc.php +1 -1
  172. includes/menu-pages/paypal-ops.inc.php +1 -1
  173. includes/menu-pages/res-ops.inc.php +1 -1
  174. includes/menu-pages/scripting.inc.php +2 -2
  175. includes/menu-pages/start.inc.php +1 -1
  176. includes/menu-pages/trk-ops.inc.php +1 -1
  177. includes/menu-pages/updates.inc.php +1 -1
  178. includes/syscon.inc.php +6 -5
  179. includes/templates/badges/s-badge.php +1 -1
  180. includes/templates/buttons/paypal-cancellation-button.php +1 -1
  181. includes/templates/buttons/paypal-ccaps-checkout-button.php +1 -1
  182. includes/templates/buttons/paypal-checkout-button.php +1 -1
  183. includes/templates/buttons/paypal-sp-checkout-button.php +1 -1
  184. includes/templates/cfg-files/s2-cross-xml.php +2 -2
  185. includes/templates/cfg-files/s2member-files-no-gzip.php +3 -3
  186. includes/templates/cfg-files/s2member-files.php +4 -7
  187. includes/templates/cfg-files/s2member-logs.php +3 -6
  188. includes/templates/cfg-files/s2o-mu-plugins.php +18 -18
  189. includes/templates/cfg-files/s2o-nw-plugins.php +8 -8
  190. includes/templates/cfg-files/s2o-st-plugins.php +8 -8
  191. includes/templates/cfg-files/s2o-th-funcs.php +2 -2
  192. includes/templates/errors/ip-restrictions.php +1 -1
  193. includes/templates/options/paypal-currencies.php +1 -1
  194. includes/templates/options/paypal-membership-ccap-terms.php +1 -1
  195. includes/templates/options/paypal-membership-regular-terms.php +1 -1
  196. includes/templates/options/paypal-membership-trial-terms.php +1 -1
  197. includes/templates/options/paypal-sp-hours.php +1 -1
  198. includes/templates/players/jwplayer-v6-rtmp-only.php +1 -1
  199. includes/templates/players/jwplayer-v6-rtmp.php +1 -1
  200. includes/templates/players/jwplayer-v6.php +1 -1
  201. includes/templates/returns/default-return.php +1 -1
  202. includes/templates/shortcodes/paypal-cancellation-button-shortcode.php +1 -1
  203. includes/templates/shortcodes/paypal-ccaps-checkout-button-shortcode.php +1 -1
  204. includes/templates/shortcodes/paypal-checkout-button-shortcode.php +1 -1
  205. includes/templates/shortcodes/paypal-sp-checkout-button-shortcode.php +1 -1
  206. includes/translations/s2member.pot +483 -3641
  207. readme.txt +23 -4
  208. s2member-o.php +5 -1
  209. s2member.php +14 -14
changelog.md CHANGED
@@ -1,3 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  = v150102 =
2
 
3
  - (s2Member/s2Member Pro) **Custom Field Mapping:** This release of s2Member adds an internal mapping from s2Member's Custom Field values for each user, to the `get_user_option()` function in the WordPress core. This makes it possible to retrieve user custom field values like always via `get_user_field()` or now through the native `get_user_option()` function also. The benefit of this is that s2Member's custom fields are now more compatible with other themes/plugins for WordPress.
1
+ = v150203 =
2
+
3
+ - (s2Member Pro) **Gift/Redemption Codes:** This release adds a powerful new shortcode: `[s2Member-Gift-Codes /]`. This makes it easy to generate and sell access to gift codes (i.e. gift certificates) and/or to a list of redemption codes. For instance, where a single team leader might like to purchase multiple accounts they can distribute to others on a team, or in a group. Video demo here: https://www.youtube.com/watch?v=T3N_vygowbM&feature=youtu.be ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/386) for additional technical details.
4
+ - (s2Member Pro) **User-Specific Coupon Codes:** This release of s2Member makes it possible to configure Pro Form Coupon Codes that are connected (i.e. only valid) when entered by specific Users/Members who are logged into the site. See: `Dashboard ⥱ s2Member ⥱ Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/403) for additional technical details.
5
+ - (s2Member Pro) **Coupon Code Max Uses:** This release of s2Member Pro adds the ability to set a maximum number of times that a Coupon Code can be used. This makes it easy to create Coupon Codes that are designed to be used only one time, for instance; or for X number of times. After a Coupon Code is used X number of times, it will expire automatically. See: `Dashboard ⥱ s2Member ⥱ Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
6
+ - (s2Member Pro) **Coupon Code Usage Tracking:** This release of s2Member Pro adds the ability to track the number of times that each of your Coupon Codes have been used. It is also possible to alter the number of uses, and/or set a maximum number of uses. See: `Dashboard ⥱ s2Member ⥱ Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
7
+ - (s2Member Pro) **Coupon Code Active/Expires Dates:** This release of s2Member Pro makes it possible to establish both a start and end time for each of your Pro Coupon Codes. In previous versions of s2Member, it was only possible to set an expiration date. You can now create Coupon Codes that will become active at some point in the future automatically. See: `Dashboard ⥱ s2Member ⥱ Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
8
+ - (s2Member Pro) **Coupon Code UI Enhancements:** This release of s2Member Pro comes with an updated UI that makes it easier to manage your Pro Coupon Codes. See: `Dashboard ⥱ s2Member ⥱ Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
9
+ - (s2Member Pro) **Store Coupon Codes for Each User:** s2Member Pro now stores a list of all coupon codes that a customer has used on your site. See: `Dashboard ⥱ Users ⥱ Choose User [Edit]`. Scrolling down to the set of s2-related fields will reveal a new list of coupon codes. This list will be filled for new customers only; i.e. s2Member does not have this data for past purchases; only for new customers that you acquire after updating to the latest release. See also [this GitHub issue](https://github.com/websharks/s2member/issues/462) if you'd additional details.
10
+ - (s2Member/s2Member Pro) **EOT Custom Value:** In this release of s2Member, the `get_user_option('s2member_custom')` value is preserved after an EOT has taken place, making it possible for site owners to continue to read this value (along with any custom pipe-delimited values they have injected there), even after an EOT has taken place. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/449).
11
+ - (s2Member/s2Member Pro) **JW Player Broken Links:** This release corrects some broken links referenced by the inline documentation for s2Member in the WordPress Dashboard. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/448) if you'd like further details.
12
+ - (s2Member/s2Member Pro) **Security:** This release of s2Member checks for the existence of the WordPress PHP Constant: `WPINC` instead of looking for the less reliable `$_SERVER['SCRIPT_FILENAME']`. Some site owners reported this was causing trouble in a localhost environment during testing, or when running s2Member on some hosts that are missing the `SCRIPT_FILENAME` environment variable; e.g. some Windows servers. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/454) if you'd like additional details.
13
+ - (s2Member Pro) **Advanced Import/Export Compat:** This release of s2Member Pro includes compatibility and a bug fix when running on WordPress v4.1+. Three PHP notices during importation, along with some quirky behavior associated with the `role` CSV column have been corrected. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/455) for technical details.
14
+ - (s2Member Pro) **`[s2Member-List /]` Bug Fix:** This release resolves an issue with pagination in the `[s2Member-List /]` shortcode after recent improvements to the search functionality. See [this GitHub issue](https://github.com/websharks/s2member/issues/155#issuecomment-69403120) if you'd like additional details.
15
+ - (s2Member Pro) **`[s2Member-List /]` Enhancement:** This release improves search functionality in the `[s2Member-List /]` shortcode, making it so that all searches default to `*[query]*`; i.e. are automatically wrapped by wildcards. If a user enters a wildcard explicitly (or a double quote), this default behavior is overridden and the search query is taken as given in such a scenario. This makes the search functionality easier for end-users to work with, since it no longer requires an exact match. Default behavior is now a fuzzy match. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/394) if you'd like further details.
16
+ - (s2Member/s2Member Pro) **AWS v4 Authentication:** This release of s2Member adds AWS v4 Authentication support for Amazon Web Service Regions that only accept the AWS v4 authentication scheme. If you had trouble in the recent past when attempting to integrate s2Member with S3 Buckets (or with CloudFront) in regions outside the USA, this release should resolve those issues for you. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/440) if you'd like additional technical details.
17
+ - (s2Member Pro) **Bug Fix:** Pro Form Checkout Options not working in all cases whenever they are used together with Free Registration Forms. Resolved in this release.
18
+
19
  = v150102 =
20
 
21
  - (s2Member/s2Member Pro) **Custom Field Mapping:** This release of s2Member adds an internal mapping from s2Member's Custom Field values for each user, to the `get_user_option()` function in the WordPress core. This makes it possible to retrieve user custom field values like always via `get_user_field()` or now through the native `get_user_option()` function also. The benefit of this is that s2Member's custom fields are now more compatible with other themes/plugins for WordPress.
checksum.txt CHANGED
@@ -1 +1 @@
1
- a1daeda86ea085763a0951505fad6b5f
1
+ 84638519eea37bbc521b44a83b66c496
includes/classes/access-cap-times.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\CCAPS
15
  * @since 140514
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_access_cap_times'))
14
  * @package s2Member\CCAPS
15
  * @since 140514
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_access_cap_times'))
includes/classes/admin-css-js-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Admin_CSS_JS
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_admin_css_js_in"))
14
  * @package s2Member\Admin_CSS_JS
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_admin_css_js_in"))
includes/classes/admin-css-js.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Admin_CSS_JS
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_admin_css_js"))
14
  * @package s2Member\Admin_CSS_JS
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_admin_css_js"))
includes/classes/admin-lockouts.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Admin_Lockouts
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_admin_lockouts'))
14
  * @package s2Member\Admin_Lockouts
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_admin_lockouts'))
includes/classes/admin-notices.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Admin_Notices
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_admin_notices'))
14
  * @package s2Member\Admin_Notices
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_admin_notices'))
includes/classes/auto-eots.inc.php CHANGED
@@ -1,298 +1,300 @@
1
  <?php
2
  /**
3
- * s2Member's Auto-EOT System *(EOT = End Of Term)*.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\Auto_EOT_System
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_auto_eots"))
 
 
 
 
 
 
 
 
21
  {
22
  /**
23
- * s2Member's Auto-EOT System *(EOT = End Of Term)*.
24
- *
25
- * @package s2Member\Auto_EOT_System
26
- * @since 3.5
27
- */
28
- class c_ws_plugin__s2member_auto_eots
 
 
 
 
 
 
29
  {
30
- /**
31
- * Adds a scheduled task for s2Member's Auto-EOT System.
32
- *
33
- * @package s2Member\Auto_EOT_System
34
- * @since 3.5
35
- *
36
- * @return bool True if able to add Auto-EOT System schedule, else false.
37
- */
38
- public static function add_auto_eot_system ()
39
- {
40
- do_action("ws_plugin__s2member_before_add_auto_eot_system", get_defined_vars ());
41
-
42
- if (!c_ws_plugin__s2member_auto_eots::delete_auto_eot_system ())
43
- {
44
- return apply_filters("ws_plugin__s2member_add_auto_eot_system", false, get_defined_vars ());
45
- }
46
- else if /* Otherwise, we can schedule? */ (function_exists ("wp_cron"))
47
- {
48
- wp_schedule_event (time (), "every10m", "ws_plugin__s2member_auto_eot_system__schedule");
49
-
50
- return apply_filters("ws_plugin__s2member_add_auto_eot_system", true, get_defined_vars ());
51
- }
52
- else // Otherwise, it would appear that WP-Cron is not available.
53
- {
54
- return apply_filters("ws_plugin__s2member_add_auto_eot_system", false, get_defined_vars ());
55
- }
56
- }
57
- /**
58
- * Deletes all scheduled tasks for s2Member's Auto-EOT System.
59
- *
60
- * @package s2Member\Auto_EOT_System
61
- * @since 3.5
62
- *
63
- * @return bool True if able to delete Auto-EOT System schedule, else false.
64
- */
65
- public static function delete_auto_eot_system ()
66
- {
67
- do_action("ws_plugin__s2member_before_delete_auto_eot_system", get_defined_vars ());
68
 
69
- if /* Is `wp_cron()` even available? */ (function_exists ("wp_cron"))
70
- {
71
- wp_clear_scheduled_hook /* Since v3.0.3. */ ("ws_plugin__s2member_auto_eot_system__schedule");
 
 
 
 
72
 
73
- return apply_filters("ws_plugin__s2member_delete_auto_eot_system", true, get_defined_vars ());
74
- }
75
- else // Otherwise, it would appear that WP-Cron is not available.
76
- {
77
- return apply_filters("ws_plugin__s2member_delete_auto_eot_system", false, get_defined_vars ());
78
- }
79
- }
80
- /**
81
- * Processed by WP_Cron; this handles Auto-EOTs *(EOT = End Of Term)*.
82
- *
83
- * If you have a HUGE userbase, increase the max EOTs per process.
84
- * But NOTE, this runs ``$per_process`` *(per Blog)* on a Multisite Network.
85
- * To increase, use: ``add_filter ("ws_plugin__s2member_auto_eot_system_per_process");``.
86
- *
87
- * This function makes an important Hook available: `ws_plugin__s2member_after_auto_eot_system`.
88
- * This Hook is used by some of s2Member Pro's Gateway integrations; allowing CRON processing
89
- * to run for important communications; which poll Payment Gateway APIs for possible EOTs.
90
- *
91
- * @package s2Member\Auto_EOT_System
92
- * @since 3.5
93
- *
94
- * @param int $per_process Number of database records to process each time.
95
- * Can also be Filtered with `ws_plugin__s2member_auto_eot_system_per_process`.
96
- * @return null
97
- */
98
- public static function auto_eot_system ($per_process = 6)
99
- {
100
- global /* Need global DB obj. */ $wpdb;
101
- global /* Multisite. */ $current_site, $current_blog;
102
 
103
- include_once ABSPATH . "wp-admin/includes/admin.php";
 
 
 
 
 
 
104
 
105
- @set_time_limit /* Make time for processing a larger userbase. */ (0);
106
- @ini_set ("memory_limit", apply_filters("admin_memory_limit", WP_MAX_MEMORY_LIMIT));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
 
108
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
109
- do_action("ws_plugin__s2member_before_auto_eot_system", get_defined_vars ());
110
- unset($__refs, $__v);
 
 
 
 
111
 
112
- if /* Enabled? */($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["auto_eot_system_enabled"])
113
  {
114
- $per_process = apply_filters("ws_plugin__s2member_auto_eot_system_per_process", $per_process, get_defined_vars ());
115
-
116
- if (is_array($eots = $wpdb->get_results ("SELECT `user_id` AS `ID` FROM `" . $wpdb->usermeta . "` WHERE `meta_key` = '" . $wpdb->prefix . "s2member_auto_eot_time' AND `meta_value` != '' AND `meta_value` <= '" . esc_sql(strtotime ("now")) . "' LIMIT " . $per_process)))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117
  {
118
- foreach /* Go through the array of EOTS. We need to (demote|delete) each of them. */ ($eots as $eot)
119
- {
120
- if (($user_id = $eot->ID) && is_object ($user = new WP_User ($user_id)) && $user->ID)
121
- {
122
- delete_user_option /* Always delete. */ ($user_id, "s2member_auto_eot_time");
123
-
124
- if /* Do NOT process Administrator accounts. */(!$user->has_cap ("administrator"))
125
- {
126
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_eot_behavior"] === "demote")
127
  {
128
- $eot_del_type = /* Set EOT/Del type. */ "auto-eot-cancellation-expiration-demotion";
129
-
130
- $custom = get_user_option ("s2member_custom", $user_id);
131
- $subscr_gateway = get_user_option ("s2member_subscr_gateway", $user_id);
132
- $subscr_id = get_user_option ("s2member_subscr_id", $user_id);
133
- $subscr_baid = get_user_option ("s2member_subscr_baid", $user_id);
134
- $subscr_cid = get_user_option ("s2member_subscr_cid", $user_id);
135
- $fields = get_user_option ("s2member_custom_fields", $user_id);
136
- $user_reg_ip = get_user_option ("s2member_registration_ip", $user_id);
137
-
138
- $demotion_role = c_ws_plugin__s2member_option_forces::force_demotion_role ("subscriber");
139
- $existing_role = c_ws_plugin__s2member_user_access::user_access_role ($user);
140
-
141
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
142
- do_action("ws_plugin__s2member_during_auto_eot_system_during_before_demote", get_defined_vars ());
143
- do_action("ws_plugin__s2member_during_collective_mods", $user_id, get_defined_vars (), $eot_del_type, "modification", $demotion_role);
144
- do_action("ws_plugin__s2member_during_collective_eots", $user_id, get_defined_vars (), $eot_del_type, "modification");
145
- unset($__refs, $__v);
146
-
147
- if /* Only if NOT the existing Role. */($existing_role !== $demotion_role)
148
- $user->set_role /* Give User the demotion Role. */ ($demotion_role);
149
-
150
- if(apply_filters("ws_plugin__s2member_remove_ccaps_during_eot_events",
151
- (bool)$GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eots_remove_ccaps"], get_defined_vars()))
152
- foreach ($user->allcaps as $cap => $cap_enabled)
153
- if (preg_match ("/^access_s2member_ccap_/", $cap))
154
- $user->remove_cap ($ccap = $cap);
155
-
156
- delete_user_option ($user_id, "s2member_custom");
157
- delete_user_option ($user_id, "s2member_subscr_gateway");
158
- delete_user_option ($user_id, "s2member_subscr_id");
159
- delete_user_option ($user_id, "s2member_subscr_baid");
160
- delete_user_option ($user_id, "s2member_subscr_cid");
161
-
162
- delete_user_option ($user_id, "s2member_ipn_signup_vars");
163
- if (!apply_filters("ws_plugin__s2member_preserve_paid_registration_times", true, get_defined_vars ()))
164
- delete_user_option ($user_id, "s2member_paid_registration_times");
165
-
166
- delete_user_option ($user_id, "s2member_last_status_scan");
167
- delete_user_option ($user_id, "s2member_first_payment_txn_id");
168
- delete_user_option ($user_id, "s2member_last_payment_time");
169
- delete_user_option ($user_id, "s2member_auto_eot_time");
170
-
171
- delete_user_option ($user_id, "s2member_file_download_access_log");
172
- delete_user_option ($user_id, "s2member_authnet_payment_failures");
173
-
174
- c_ws_plugin__s2member_user_notes::append_user_notes ($user_id, "Demoted by s2Member: " . date ("D M j, Y g:i a T"));
175
-
176
- if($subscr_gateway && $subscr_id) // Also note the Paid Subscr. Gateway/ID so there is a reference left behind here.
177
- c_ws_plugin__s2member_user_notes::append_user_notes ($user_id, "Paid Subscr. ID @ time of demotion: ".$subscr_gateway." -› ".$subscr_id);
178
-
179
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_urls"] && is_array($cv = preg_split ("/\|/", $custom)))
180
- {
181
- foreach (preg_split ("/[\r\n\t]+/", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_urls"]) as $url) // Handle EOT Notifications.
182
-
183
- if (($url = preg_replace ("/%%cv([0-9]+)%%/ei", 'urlencode(trim(@$cv[$1]))', $url)) && ($url = preg_replace ("/%%eot_del_type%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (urlencode ("auto-eot-cancellation-expiration-demotion")), $url)) && ($url = preg_replace ("/%%subscr_id%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (urlencode ($subscr_id)), $url)))
184
- if (($url = preg_replace ("/%%user_first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (urlencode ($user->first_name)), $url)) && ($url = preg_replace ("/%%user_last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (urlencode ($user->last_name)), $url)))
185
- if (($url = preg_replace ("/%%user_full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (urlencode (trim ($user->first_name . " " . $user->last_name))), $url)))
186
- if (($url = preg_replace ("/%%user_email%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (urlencode ($user->user_email)), $url)))
187
- if (($url = preg_replace ("/%%user_login%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (urlencode ($user->user_login)), $url)))
188
- if (($url = preg_replace ("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (urlencode ($user_reg_ip)), $url)))
189
- if (($url = preg_replace ("/%%user_id%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (urlencode ($user_id)), $url)))
190
- {
191
- if (is_array($fields) && !empty($fields))
192
- foreach /* Custom Registration/Profile Fields. */ ($fields as $var => $val)
193
- if (!($url = preg_replace ("/%%" . preg_quote ($var, "/") . "%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (urlencode (maybe_serialize ($val))), $url)))
194
- break;
195
-
196
- if (($url = trim (preg_replace ("/%%(.+?)%%/i", "", $url))))
197
- c_ws_plugin__s2member_utils_urls::remote ($url);
198
- }
199
- }
200
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_recipients"] && is_array($cv = preg_split ("/\|/", $custom)))
201
- {
202
- $email_configs_were_on = c_ws_plugin__s2member_email_configs::email_config_status ();
203
- c_ws_plugin__s2member_email_configs::email_config_release ();
204
-
205
- $msg = $sbj = "(s2Member / API Notification Email) - EOT/Deletion";
206
- $msg .= /* Spacing in the message body. */"\n\n";
207
-
208
- $msg .= "eot_del_type: %%eot_del_type%%\n";
209
- $msg .= "subscr_id: %%subscr_id%%\n";
210
- $msg .= "subscr_baid: %%subscr_baid%%\n";
211
- $msg .= "subscr_cid: %%subscr_cid%%\n";
212
- $msg .= "user_first_name: %%user_first_name%%\n";
213
- $msg .= "user_last_name: %%user_last_name%%\n";
214
- $msg .= "user_full_name: %%user_full_name%%\n";
215
- $msg .= "user_email: %%user_email%%\n";
216
- $msg .= "user_login: %%user_login%%\n";
217
- $msg .= "user_ip: %%user_ip%%\n";
218
- $msg .= "user_id: %%user_id%%\n";
219
-
220
- if (is_array($fields) && !empty($fields))
221
- foreach ($fields as $var => $val)
222
- $msg .= $var . ": %%" . $var . "%%\n";
223
-
224
- $msg .= "cv0: %%cv0%%\n";
225
- $msg .= "cv1: %%cv1%%\n";
226
- $msg .= "cv2: %%cv2%%\n";
227
- $msg .= "cv3: %%cv3%%\n";
228
- $msg .= "cv4: %%cv4%%\n";
229
- $msg .= "cv5: %%cv5%%\n";
230
- $msg .= "cv6: %%cv6%%\n";
231
- $msg .= "cv7: %%cv7%%\n";
232
- $msg .= "cv8: %%cv8%%\n";
233
- $msg .= "cv9: %%cv9%%";
234
-
235
- if (($msg = preg_replace ("/%%cv([0-9]+)%%/ei", 'trim(@$cv[$1])', $msg)) && ($msg = preg_replace ("/%%eot_del_type%%/i", c_ws_plugin__s2member_utils_strings::esc_refs ("auto-eot-cancellation-expiration-demotion"), $msg)) && ($msg = preg_replace ("/%%subscr_id%%/i", c_ws_plugin__s2member_utils_strings::esc_refs ($subscr_id), $msg)))
236
- if (($msg = preg_replace ("/%%subscr_baid%%/i", c_ws_plugin__s2member_utils_strings::esc_refs ($subscr_baid), $msg)) && ($msg = preg_replace ("/%%subscr_cid%%/i", c_ws_plugin__s2member_utils_strings::esc_refs ($subscr_cid), $msg)))
237
- if (($msg = preg_replace ("/%%user_first_name%%/i", c_ws_plugin__s2member_utils_strings::esc_refs ($user->first_name), $msg)) && ($msg = preg_replace ("/%%user_last_name%%/i", c_ws_plugin__s2member_utils_strings::esc_refs ($user->last_name), $msg)))
238
- if (($msg = preg_replace ("/%%user_full_name%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (trim ($user->first_name . " " . $user->last_name)), $msg)))
239
- if (($msg = preg_replace ("/%%user_email%%/i", c_ws_plugin__s2member_utils_strings::esc_refs ($user->user_email), $msg)))
240
- if (($msg = preg_replace ("/%%user_login%%/i", c_ws_plugin__s2member_utils_strings::esc_refs ($user->user_login), $msg)))
241
- if (($msg = preg_replace ("/%%user_ip%%/i", c_ws_plugin__s2member_utils_strings::esc_refs ($user_reg_ip), $msg)))
242
- if (($msg = preg_replace ("/%%user_id%%/i", c_ws_plugin__s2member_utils_strings::esc_refs ($user_id), $msg)))
243
- {
244
- if (is_array($fields) && !empty($fields))
245
- foreach /* Custom Registration/Profile Fields. */($fields as $var => $val)
246
- if (!($msg = preg_replace ("/%%" . preg_quote ($var, "/") . "%%/i", c_ws_plugin__s2member_utils_strings::esc_refs (maybe_serialize ($val)), $msg)))
247
- break;
248
-
249
- if /* Still have a ``$sbj`` and a ``$msg``? */ ($sbj && ($msg = trim (preg_replace ("/%%(.+?)%%/i", "", $msg))))
250
-
251
- foreach (c_ws_plugin__s2member_utils_strings::parse_emails ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["eot_del_notification_recipients"]) as $recipient)
252
- wp_mail ($recipient, apply_filters("ws_plugin__s2member_eot_del_notification_email_sbj", $sbj, get_defined_vars ()), apply_filters("ws_plugin__s2member_eot_del_notification_email_msg", $msg, get_defined_vars ()), "Content-Type: text/plain; charset=UTF-8");
253
- }
254
- if($email_configs_were_on) c_ws_plugin__s2member_email_configs::email_config ();
255
- }
256
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
257
- do_action("ws_plugin__s2member_during_auto_eot_system_during_demote", get_defined_vars ());
258
- unset($__refs, $__v);
259
  }
260
- else if ($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["membership_eot_behavior"] === "delete")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  {
262
- $eot_del_type = $GLOBALS["ws_plugin__s2member_eot_del_type"] = "auto-eot-cancellation-expiration-deletion";
263
-
264
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
265
- do_action("ws_plugin__s2member_during_auto_eot_system_during_before_delete", get_defined_vars ());
266
- do_action("ws_plugin__s2member_during_collective_eots", $user_id, get_defined_vars (), $eot_del_type, "removal-deletion");
267
- unset($__refs, $__v);
268
-
269
- if /* Multisite does NOT actually delete; ONLY removes. */(is_multisite ())
270
- {
271
- remove_user_from_blog ($user_id, $current_blog->blog_id);
272
- // This will automatically trigger `eot_del_notification_urls`.
273
- c_ws_plugin__s2member_user_deletions::handle_ms_user_deletions ($user_id, $current_blog->blog_id, "s2says");
274
- }
275
- else // Otherwise, we can actually delete them.
276
- // This will automatically trigger `eot_del_notification_urls`
277
- wp_delete_user /* `c_ws_plugin__s2member_user_deletions::handle_user_deletions()` */ ($user_id);
278
-
279
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
280
- do_action("ws_plugin__s2member_during_auto_eot_system_during_delete", get_defined_vars ());
281
- unset($__refs, $__v);
282
  }
283
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
284
- do_action("ws_plugin__s2member_during_auto_eot_system", get_defined_vars ());
285
- unset($__refs, $__v);
286
- }
287
- }
288
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
289
  }
 
 
 
 
 
 
 
 
 
 
 
290
  }
291
- c_ws_plugin__s2member_utils_logs::cleanup_expired_s2m_transients();
292
-
293
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
294
- do_action("ws_plugin__s2member_after_auto_eot_system", get_defined_vars ());
295
- unset($__refs, $__v);
296
  }
 
297
  }
298
- }
 
 
 
 
 
 
 
1
  <?php
2
  /**
3
+ * s2Member's Auto-EOT System *(EOT = End Of Term)*.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Auto_EOT_System
15
+ * @since 3.5
16
+ */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
+ exit ('Do not access this file directly.');
19
+
20
+ if(!class_exists('c_ws_plugin__s2member_auto_eots'))
21
+ {
22
+ /**
23
+ * s2Member's Auto-EOT System *(EOT = End Of Term)*.
24
+ *
25
+ * @package s2Member\Auto_EOT_System
26
+ * @since 3.5
27
+ */
28
+ class c_ws_plugin__s2member_auto_eots
29
  {
30
  /**
31
+ * Adds a scheduled task for s2Member's Auto-EOT System.
32
+ *
33
+ * @package s2Member\Auto_EOT_System
34
+ * @since 3.5
35
+ *
36
+ * @return bool True if able to add Auto-EOT System schedule, else false.
37
+ */
38
+ public static function add_auto_eot_system()
39
+ {
40
+ do_action('ws_plugin__s2member_before_add_auto_eot_system', get_defined_vars());
41
+
42
+ if(!c_ws_plugin__s2member_auto_eots::delete_auto_eot_system())
43
  {
44
+ return apply_filters('ws_plugin__s2member_add_auto_eot_system', FALSE, get_defined_vars());
45
+ }
46
+ else if(function_exists('wp_cron') /* Otherwise, we can schedule? */)
47
+ {
48
+ wp_schedule_event(time(), 'every10m', 'ws_plugin__s2member_auto_eot_system__schedule');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
 
50
+ return apply_filters('ws_plugin__s2member_add_auto_eot_system', TRUE, get_defined_vars());
51
+ }
52
+ else // Otherwise, it would appear that WP-Cron is not available.
53
+ {
54
+ return apply_filters('ws_plugin__s2member_add_auto_eot_system', FALSE, get_defined_vars());
55
+ }
56
+ }
57
 
58
+ /**
59
+ * Deletes all scheduled tasks for s2Member's Auto-EOT System.
60
+ *
61
+ * @package s2Member\Auto_EOT_System
62
+ * @since 3.5
63
+ *
64
+ * @return bool True if able to delete Auto-EOT System schedule, else false.
65
+ */
66
+ public static function delete_auto_eot_system()
67
+ {
68
+ do_action('ws_plugin__s2member_before_delete_auto_eot_system', get_defined_vars());
69
+
70
+ if(function_exists('wp_cron') /* Is `wp_cron()` even available? */)
71
+ {
72
+ wp_clear_scheduled_hook('ws_plugin__s2member_auto_eot_system__schedule' /* Since v3.0.3. */);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
 
74
+ return apply_filters('ws_plugin__s2member_delete_auto_eot_system', TRUE, get_defined_vars());
75
+ }
76
+ else // Otherwise, it would appear that WP-Cron is not available.
77
+ {
78
+ return apply_filters('ws_plugin__s2member_delete_auto_eot_system', FALSE, get_defined_vars());
79
+ }
80
+ }
81
 
82
+ /**
83
+ * Processed by WP_Cron; this handles Auto-EOTs *(EOT = End Of Term)*.
84
+ *
85
+ * If you have a HUGE userbase, increase the max EOTs per process.
86
+ * But NOTE, this runs ``$per_process`` *(per Blog)* on a Multisite Network.
87
+ * To increase, use: ``add_filter ('ws_plugin__s2member_auto_eot_system_per_process');``.
88
+ *
89
+ * This function makes an important Hook available: `ws_plugin__s2member_after_auto_eot_system`.
90
+ * This Hook is used by some of s2Member Pro's Gateway integrations; allowing CRON processing
91
+ * to run for important communications; which poll Payment Gateway APIs for possible EOTs.
92
+ *
93
+ * @package s2Member\Auto_EOT_System
94
+ * @since 3.5
95
+ *
96
+ * @param int $per_process Number of database records to process each time.
97
+ * Can also be Filtered with `ws_plugin__s2member_auto_eot_system_per_process`.
98
+ *
99
+ * @return null
100
+ */
101
+ public static function auto_eot_system($per_process = 6)
102
+ {
103
+ global $wpdb;
104
+ /** @var $wpdb \wpdb */
105
+ global $current_site, $current_blog;
106
+
107
+ include_once ABSPATH.'wp-admin/includes/admin.php';
108
+
109
+ @set_time_limit(0); // Make time for processing a larger userbase.
110
+ @ini_set('memory_limit', apply_filters('admin_memory_limit', WP_MAX_MEMORY_LIMIT));
111
+
112
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
113
+ do_action('ws_plugin__s2member_before_auto_eot_system', get_defined_vars());
114
+ unset($__refs, $__v);
115
+
116
+ if($GLOBALS['WS_PLUGIN__']['s2member']['o']['auto_eot_system_enabled'] /* Enabled? */)
117
+ {
118
+ $per_process = apply_filters('ws_plugin__s2member_auto_eot_system_per_process', $per_process, get_defined_vars());
119
 
120
+ if(is_array($eots = $wpdb->get_results("SELECT `user_id` AS `ID` FROM `".$wpdb->usermeta."` WHERE `meta_key` = '".$wpdb->prefix."s2member_auto_eot_time' AND `meta_value` != '' AND `meta_value` <= '".esc_sql(strtotime("now"))."' LIMIT ".$per_process)))
121
+ {
122
+ foreach($eots as $eot) // Go through the array of EOTS. We need to (demote|delete) each of them.
123
+ {
124
+ if(($user_id = $eot->ID) && is_object($user = new WP_User ($user_id)) && $user->ID)
125
+ {
126
+ delete_user_option($user_id, 's2member_auto_eot_time'); // Always delete.
127
 
128
+ if(!$user->has_cap('administrator') /* Do NOT process Administrator accounts. */)
129
  {
130
+ if($GLOBALS['WS_PLUGIN__']['s2member']['o']['membership_eot_behavior'] === 'demote')
131
+ {
132
+ $eot_del_type = 'auto-eot-cancellation-expiration-demotion'; // Set EOT/Del type.
133
+
134
+ $custom = get_user_option('s2member_custom', $user_id);
135
+ $subscr_gateway = get_user_option('s2member_subscr_gateway', $user_id);
136
+ $subscr_id = get_user_option('s2member_subscr_id', $user_id);
137
+ $subscr_baid = get_user_option('s2member_subscr_baid', $user_id);
138
+ $subscr_cid = get_user_option('s2member_subscr_cid', $user_id);
139
+ $fields = get_user_option('s2member_custom_fields', $user_id);
140
+ $user_reg_ip = get_user_option('s2member_registration_ip', $user_id);
141
+
142
+ $demotion_role = c_ws_plugin__s2member_option_forces::force_demotion_role('subscriber');
143
+ $existing_role = c_ws_plugin__s2member_user_access::user_access_role($user);
144
+
145
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
146
+ do_action('ws_plugin__s2member_during_auto_eot_system_during_before_demote', get_defined_vars());
147
+ do_action('ws_plugin__s2member_during_collective_mods', $user_id, get_defined_vars(), $eot_del_type, 'modification', $demotion_role);
148
+ do_action('ws_plugin__s2member_during_collective_eots', $user_id, get_defined_vars(), $eot_del_type, 'modification');
149
+ unset($__refs, $__v);
150
+
151
+ if($existing_role !== $demotion_role /* Only if NOT the existing Role. */)
152
+ $user->set_role($demotion_role /* Give User the demotion Role. */);
153
+
154
+ if(apply_filters('ws_plugin__s2member_remove_ccaps_during_eot_events', (bool)$GLOBALS['WS_PLUGIN__']['s2member']['o']['eots_remove_ccaps'], get_defined_vars()))
155
+ foreach($user->allcaps as $cap => $cap_enabled)
156
+ if(preg_match('/^access_s2member_ccap_/', $cap))
157
+ $user->remove_cap($ccap = $cap);
158
+
159
+ delete_user_option($user_id, 's2member_subscr_gateway');
160
+ delete_user_option($user_id, 's2member_subscr_id');
161
+ delete_user_option($user_id, 's2member_subscr_baid');
162
+ delete_user_option($user_id, 's2member_subscr_cid');
163
+
164
+ delete_user_option($user_id, 's2member_ipn_signup_vars');
165
+ if(!apply_filters('ws_plugin__s2member_preserve_paid_registration_times', TRUE, get_defined_vars()))
166
+ delete_user_option($user_id, 's2member_paid_registration_times');
167
+
168
+ delete_user_option($user_id, 's2member_last_status_scan');
169
+ delete_user_option($user_id, 's2member_first_payment_txn_id');
170
+ delete_user_option($user_id, 's2member_last_payment_time');
171
+ delete_user_option($user_id, 's2member_auto_eot_time');
172
+
173
+ delete_user_option($user_id, 's2member_file_download_access_log');
174
+ delete_user_option($user_id, 's2member_authnet_payment_failures');
175
+
176
+ c_ws_plugin__s2member_user_notes::append_user_notes($user_id, 'Demoted by s2Member: '.date('D M j, Y g:i a T'));
177
+
178
+ if($subscr_gateway && $subscr_id) // Also note the Paid Subscr. Gateway/ID so there is a reference left behind here.
179
+ c_ws_plugin__s2member_user_notes::append_user_notes($user_id, 'Paid Subscr. ID @ time of demotion: '.$subscr_gateway.' -› '.$subscr_id);
180
+
181
+ if($GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_del_notification_urls'] && is_array($cv = preg_split('/\|/', $custom)))
182
  {
183
+ foreach(preg_split('/['."\r\n\t".']+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_del_notification_urls']) as $url) // Handle EOT Notifications.
184
+
185
+ if(($url = preg_replace('/%%cv([0-9]+)%%/ei', 'urlencode(trim(@$cv[$1]))', $url)) && ($url = preg_replace('/%%eot_del_type%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode('auto-eot-cancellation-expiration-demotion')), $url)) && ($url = preg_replace('/%%subscr_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($subscr_id)), $url)))
186
+ if(($url = preg_replace('/%%user_first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($user->first_name)), $url)) && ($url = preg_replace('/%%user_last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($user->last_name)), $url)))
187
+ if(($url = preg_replace('/%%user_full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode(trim($user->first_name.' '.$user->last_name))), $url)))
188
+ if(($url = preg_replace('/%%user_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($user->user_email)), $url)))
189
+ if(($url = preg_replace('/%%user_login%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($user->user_login)), $url)))
190
+ if(($url = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($user_reg_ip)), $url)))
191
+ if(($url = preg_replace('/%%user_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($user_id)), $url)))
192
  {
193
+ if(is_array($fields) && !empty($fields))
194
+ foreach($fields as $var => $val /* Custom Registration/Profile Fields. */)
195
+ if(!($url = preg_replace('/%%'.preg_quote($var, '/').'%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode(maybe_serialize($val))), $url)))
196
+ break;
197
+
198
+ if(($url = trim(preg_replace('/%%(.+?)%%/i', '', $url))))
199
+ c_ws_plugin__s2member_utils_urls::remote($url);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
  }
201
+ }
202
+ if($GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_del_notification_recipients'] && is_array($cv = preg_split('/\|/', $custom)))
203
+ {
204
+ $email_configs_were_on = c_ws_plugin__s2member_email_configs::email_config_status();
205
+ c_ws_plugin__s2member_email_configs::email_config_release();
206
+
207
+ $msg = $sbj = '(s2Member / API Notification Email) - EOT/Deletion';
208
+ $msg .= "\n\n"; // Spacing in the message body.
209
+
210
+ $msg .= 'eot_del_type: %%eot_del_type%%'."\n";
211
+ $msg .= 'subscr_id: %%subscr_id%%'."\n";
212
+ $msg .= 'subscr_baid: %%subscr_baid%%'."\n";
213
+ $msg .= 'subscr_cid: %%subscr_cid%%'."\n";
214
+ $msg .= 'user_first_name: %%user_first_name%%'."\n";
215
+ $msg .= 'user_last_name: %%user_last_name%%'."\n";
216
+ $msg .= 'user_full_name: %%user_full_name%%'."\n";
217
+ $msg .= 'user_email: %%user_email%%'."\n";
218
+ $msg .= 'user_login: %%user_login%%'."\n";
219
+ $msg .= 'user_ip: %%user_ip%%'."\n";
220
+ $msg .= 'user_id: %%user_id%%'."\n";
221
+
222
+ if(is_array($fields) && !empty($fields))
223
+ foreach($fields as $var => $val)
224
+ $msg .= $var.': %%'.$var.'%%'."\n";
225
+
226
+ $msg .= 'cv0: %%cv0%%'."\n";
227
+ $msg .= 'cv1: %%cv1%%'."\n";
228
+ $msg .= 'cv2: %%cv2%%'."\n";
229
+ $msg .= 'cv3: %%cv3%%'."\n";
230
+ $msg .= 'cv4: %%cv4%%'."\n";
231
+ $msg .= 'cv5: %%cv5%%'."\n";
232
+ $msg .= 'cv6: %%cv6%%'."\n";
233
+ $msg .= 'cv7: %%cv7%%'."\n";
234
+ $msg .= 'cv8: %%cv8%%'."\n";
235
+ $msg .= 'cv9: %%cv9%%';
236
+
237
+ if(($msg = preg_replace('/%%cv([0-9]+)%%/ei', 'trim(@$cv[$1])', $msg)) && ($msg = preg_replace('/%%eot_del_type%%/i', c_ws_plugin__s2member_utils_strings::esc_refs('auto-eot-cancellation-expiration-demotion'), $msg)) && ($msg = preg_replace('/%%subscr_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($subscr_id), $msg)))
238
+ if(($msg = preg_replace('/%%subscr_baid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($subscr_baid), $msg)) && ($msg = preg_replace('/%%subscr_cid%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($subscr_cid), $msg)))
239
+ if(($msg = preg_replace('/%%user_first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($user->first_name), $msg)) && ($msg = preg_replace('/%%user_last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($user->last_name), $msg)))
240
+ if(($msg = preg_replace('/%%user_full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(trim($user->first_name.' '.$user->last_name)), $msg)))
241
+ if(($msg = preg_replace('/%%user_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($user->user_email), $msg)))
242
+ if(($msg = preg_replace('/%%user_login%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($user->user_login), $msg)))
243
+ if(($msg = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($user_reg_ip), $msg)))
244
+ if(($msg = preg_replace('/%%user_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($user_id), $msg)))
245
  {
246
+ if(is_array($fields) && !empty($fields))
247
+ foreach($fields as $var => $val /* Custom Registration/Profile Fields. */)
248
+ if(!($msg = preg_replace('/%%'.preg_quote($var, '/').'%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(maybe_serialize($val)), $msg)))
249
+ break;
250
+
251
+ if($sbj && ($msg = trim(preg_replace('/%%(.+?)%%/i', '', $msg))) /* Still have a ``$sbj`` and a ``$msg``? */)
252
+
253
+ foreach(c_ws_plugin__s2member_utils_strings::parse_emails($GLOBALS['WS_PLUGIN__']['s2member']['o']['eot_del_notification_recipients']) as $recipient)
254
+ wp_mail($recipient, apply_filters('ws_plugin__s2member_eot_del_notification_email_sbj', $sbj, get_defined_vars()), apply_filters('ws_plugin__s2member_eot_del_notification_email_msg', $msg, get_defined_vars()), 'Content-Type: text/plain; charset=UTF-8');
 
 
 
 
 
 
 
 
 
 
 
255
  }
256
+ if($email_configs_were_on) c_ws_plugin__s2member_email_configs::email_config();
257
+ }
258
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
259
+ do_action('ws_plugin__s2member_during_auto_eot_system_during_demote', get_defined_vars());
260
+ unset($__refs, $__v);
261
+ }
262
+ else if($GLOBALS['WS_PLUGIN__']['s2member']['o']['membership_eot_behavior'] === 'delete')
263
+ {
264
+ $eot_del_type = $GLOBALS['ws_plugin__s2member_eot_del_type'] = 'auto-eot-cancellation-expiration-deletion';
265
+
266
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
267
+ do_action('ws_plugin__s2member_during_auto_eot_system_during_before_delete', get_defined_vars());
268
+ do_action('ws_plugin__s2member_during_collective_eots', $user_id, get_defined_vars(), $eot_del_type, 'removal-deletion');
269
+ unset($__refs, $__v);
270
+
271
+ if(is_multisite()/* Multisite does NOT actually delete; ONLY removes. */)
272
+ {
273
+ remove_user_from_blog($user_id, $current_blog->blog_id);
274
+ // This will automatically trigger `eot_del_notification_urls`.
275
+ c_ws_plugin__s2member_user_deletions::handle_ms_user_deletions($user_id, $current_blog->blog_id, 's2says');
276
  }
277
+ else // Otherwise, we can actually delete them.
278
+ // This will automatically trigger `eot_del_notification_urls`
279
+ wp_delete_user($user_id /* `c_ws_plugin__s2member_user_deletions::handle_user_deletions()` */);
280
+
281
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
282
+ do_action('ws_plugin__s2member_during_auto_eot_system_during_delete', get_defined_vars());
283
+ unset($__refs, $__v);
284
+ }
285
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
286
+ do_action('ws_plugin__s2member_during_auto_eot_system', get_defined_vars());
287
+ unset($__refs, $__v);
288
  }
289
+ }
 
 
 
 
290
  }
291
+ }
292
  }
293
+ c_ws_plugin__s2member_utils_logs::cleanup_expired_s2m_transients();
294
+
295
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
296
+ do_action('ws_plugin__s2member_after_auto_eot_system', get_defined_vars());
297
+ unset($__refs, $__v);
298
+ }
299
+ }
300
+ }
includes/classes/aweber-e.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @since 141004
15
  * @package s2Member\List_Servers
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_aweber_e'))
14
  * @since 141004
15
  * @package s2Member\List_Servers
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_aweber_e'))
includes/classes/aweber.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @since 141004
15
  * @package s2Member\List_Servers
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_aweber'))
14
  * @since 141004
15
  * @package s2Member\List_Servers
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_aweber'))
includes/classes/brute-force.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Brute_Force
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_brute_force"))
14
  * @package s2Member\Brute_Force
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_brute_force"))
includes/classes/cache.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Cache
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_cache"))
14
  * @package s2Member\Cache
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_cache"))
includes/classes/catgs-sp.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Categories
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_catgs_sp'))
14
  * @package s2Member\Categories
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_catgs_sp'))
includes/classes/catgs.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Categories
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_catgs'))
14
  * @package s2Member\Categories
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_catgs'))
includes/classes/check-activation.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Installation
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_check_activation"))
14
  * @package s2Member\Installation
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_check_activation"))
includes/classes/constants.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\API_Constants
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_constants'))
14
  * @package s2Member\API_Constants
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_constants'))
includes/classes/cron-jobs-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Cron_Jobs
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_cron_jobs_in"))
14
  * @package s2Member\Cron_Jobs
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_cron_jobs_in"))
includes/classes/cron-jobs.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Cron_Jobs
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_cron_jobs"))
14
  * @package s2Member\Cron_Jobs
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_cron_jobs"))
includes/classes/css-js-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\CSS_JS
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_css_js_in"))
14
  * @package s2Member\CSS_JS
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_css_js_in"))
includes/classes/css-js-themes.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\CSS_JS
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_css_js_themes'))
14
  * @package s2Member\CSS_JS
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_css_js_themes'))
includes/classes/css-js.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\CSS_JS
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_css_js"))
14
  * @package s2Member\CSS_JS
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_css_js"))
includes/classes/custom-reg-fields-4bp.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Custom_Reg_Fields
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_custom_reg_fields_4bp'))
14
  * @package s2Member\Custom_Reg_Fields
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_custom_reg_fields_4bp'))
includes/classes/custom-reg-fields.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Custom_Reg_Fields
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_custom_reg_fields"))
14
  * @package s2Member\Custom_Reg_Fields
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_custom_reg_fields"))
includes/classes/database.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Database
15
  * @since 130625
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_database"))
14
  * @package s2Member\Database
15
  * @since 130625
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_database"))
includes/classes/email-configs.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Email_Configs
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_email_configs"))
14
  * @package s2Member\Email_Configs
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_email_configs"))
includes/classes/files-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Files
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'))
@@ -310,9 +310,9 @@ if(!class_exists('c_ws_plugin__s2member_files_in'))
310
  else if($using_amazon_storage && $using_amazon_s3_storage && ($serving || ($creating && $url_to_storage_source)))
311
  {
312
  if($serving) // We only need this section when/if we're actually serving.
313
- wp_redirect(c_ws_plugin__s2member_files_in::amazon_s3_url($req['file_download'], $stream, $inline, $ssl, $basename, $mimetype)).exit();
314
 
315
- return apply_filters('ws_plugin__s2member_file_download_access_url', c_ws_plugin__s2member_files_in::amazon_s3_url($req['file_download'], $stream, $inline, $ssl, $basename, $mimetype), get_defined_vars());
316
  }
317
  else if($creating && $rewriting) // Creating a rewrite URL, pointing to local storage.
318
  { // Note: we don't URL encode unreserved chars. Improves media player compatibility.
@@ -538,7 +538,7 @@ if(!class_exists('c_ws_plugin__s2member_files_in'))
538
 
539
  $extension = strtolower(substr($config['file_download'], strrpos($config['file_download'], '.') + 1));
540
  $streaming = (isset($config['file_stream'])) ? filter_var($config['file_stream'], FILTER_VALIDATE_BOOLEAN) : ((in_array($extension, preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_stream_extensions']))) ? TRUE : FALSE);
541
- $ssl = (isset($config['file_ssl'])) ? filter_var($config['file_ssl'], FILTER_VALIDATE_BOOLEAN) : ((is_ssl()) ? TRUE : FALSE);
542
 
543
  if($get_streamer_array && $streaming && ($cfx = '/cfx/st') && ($cfx_pos = strpos($url_, $cfx)) !== FALSE && ($streamer = substr($url_, 0, $cfx_pos + strlen($cfx))) && ($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)))))
544
  $return = array('streamer' => $streamer, 'prefix' => $extension.':', 'file' => preg_replace('/^'.preg_quote($streamer, '/').'\//', '', $url_), 'url' => preg_replace('/^.+?\:/', (($ssl) ? 'https:' : 'http:'), $url));
@@ -573,7 +573,7 @@ if(!class_exists('c_ws_plugin__s2member_files_in'))
573
  do_action('ws_plugin__s2member_before_check_file_remote_authorization', get_defined_vars());
574
  unset($__refs, $__v); // Housekeeping.
575
 
576
- $_g = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep(((!empty($_GET)) ? $_GET : array())));
577
 
578
  if(!is_object($user) && isset($_g['s2member_file_remote']) && filter_var($_g['s2member_file_remote'], FILTER_VALIDATE_BOOLEAN))
579
  {
@@ -653,6 +653,114 @@ if(!class_exists('c_ws_plugin__s2member_files_in'))
653
  return c_ws_plugin__s2member_utils_strings::hmac_sha1_sign((string)$string, $s3c['secret_key']);
654
  }
655
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
656
  /**
657
  * Creates an Amazon S3 HMAC-SHA1 signature URL.
658
  *
@@ -689,6 +797,51 @@ if(!class_exists('c_ws_plugin__s2member_files_in'))
689
  return add_query_arg(c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode_deep(array('AWSAccessKeyId' => $s3c['access_key'], 'Expires' => $s3c['expires'], 'Signature' => $s3_signature))), $s3_url);
690
  }
691
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
692
  /**
693
  * Auto-configures an Amazon S3 Bucket's ACLs.
694
  *
@@ -708,35 +861,41 @@ if(!class_exists('c_ws_plugin__s2member_files_in'))
708
 
709
  if(!empty($s3c) && $s3c['bucket'] && $s3c['access_key'] && $s3c['secret_key']) // Must have Amazon S3 Bucket/Keys.
710
  {
711
- $s3_date = gmdate('D, d M Y H:i:s').' GMT';
712
- $s3_location = ((strtolower($s3c['bucket']) !== $s3c['bucket'])) ? '/'.$s3c['bucket'].'/?acl' : '/?acl';
713
- $s3_domain = ((strtolower($s3c['bucket']) !== $s3c['bucket'])) ? 's3.amazonaws.com' : $s3c['bucket'].'.s3.amazonaws.com';
714
- $s3_signature = base64_encode(c_ws_plugin__s2member_files_in::amazon_s3_sign('GET'."\n\n\n".$s3_date."\n".'/'.$s3c['bucket'].'/?acl'));
715
- $s3_args = array('method' => 'GET', 'redirection' => 5, 'headers' => array('Host' => $s3_domain, 'Date' => $s3_date, 'Authorization' => 'AWS '.$s3c['access_key'].':'.$s3_signature));
 
 
716
 
717
  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)
718
  {
719
  if(preg_match('/\<Owner\>(.+?)\<\/Owner\>/is', $s3_response['body'], $s3_owner_tag) && preg_match('/\<ID\>(.+?)\<\/ID\>/is', $s3_owner_tag[1], $s3_owner_id_tag) && (preg_match('/\<DisplayName\>(.*?)\<\/DisplayName\>/is', $s3_owner_tag[1], $s3_owner_display_name_tag) || ($s3_owner_display_name_tag = array('-', 'Owner'))))
720
  {
721
- $s3_owner = array('access_id' => trim($s3_owner_id_tag[1]), 'display_name' => trim($s3_owner_display_name_tag[1]));
722
- $s3_acls_xml = '<AccessControlPolicy><Owner><ID>'.esc_html($s3_owner['access_id']).'</ID><DisplayName>'.esc_html($s3_owner['display_name']).'</DisplayName></Owner><AccessControlList><Grant><Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser"><ID>'.esc_html($s3_owner['access_id']).'</ID><DisplayName>'.esc_html($s3_owner['display_name']).'</DisplayName></Grantee><Permission>FULL_CONTROL</Permission></Grant>'.(($cfc['distros_s3_access_id']) ? '<Grant><Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser"><ID>'.esc_html($cfc['distros_s3_access_id']).'</ID><DisplayName>s2Member/CloudFront</DisplayName></Grantee><Permission>READ</Permission></Grant>' : '').'</AccessControlList></AccessControlPolicy>';
723
- $s3_signature = base64_encode(c_ws_plugin__s2member_files_in::amazon_s3_sign('PUT'."\n\n".'application/xml'."\n".$s3_date."\n".'/'.$s3c['bucket'].'/?acl'));
724
- $s3_args = array('method' => 'PUT', 'redirection' => 5, 'body' => $s3_acls_xml, 'headers' => array('Host' => $s3_domain, 'Content-Type' => 'application/xml', 'Date' => $s3_date, 'Authorization' => 'AWS '.$s3c['access_key'].':'.$s3_signature));
 
725
 
726
  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)
727
  {
728
- $s3_location = ((strtolower($s3c['bucket']) !== $s3c['bucket'])) ? '/'.$s3c['bucket'].'/?policy' : '/?policy';
729
- ($s3_policy_id = md5(uniqid('s2Member/CloudFront:', TRUE))).($s3_policy_sid = md5(uniqid('s2Member/CloudFront:', TRUE)));
730
- $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']).'/*"}]}';
731
- $s3_signature = base64_encode(c_ws_plugin__s2member_files_in::amazon_s3_sign('PUT'."\n\n".'application/json'."\n".$s3_date."\n".'/'.$s3c['bucket'].'/?policy'));
732
- $s3_args = array('method' => 'PUT', 'redirection' => 5, 'body' => $s3_policy_json, 'headers' => array('Host' => $s3_domain, 'Content-Type' => 'application/json', 'Date' => $s3_date, 'Authorization' => 'AWS '.$s3c['access_key'].':'.$s3_signature));
 
 
733
 
734
  if(!$cfc['distros_s3_access_id'] || (($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 || $s3_response['code'] === 204)))
735
  {
736
- $s3_location = ((strtolower($s3c['bucket']) !== $s3c['bucket'])) ? '/'.$s3c['bucket'].'/crossdomain.xml' : '/crossdomain.xml';
737
- $s3_policy_xml = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents(dirname(dirname(__FILE__)).'/templates/cfg-files/s2-cross-xml.php')));
738
- $s3_signature = base64_encode(c_ws_plugin__s2member_files_in::amazon_s3_sign('PUT'."\n\n".'text/xml'."\n".$s3_date."\n".'x-amz-acl:public-read'."\n".'/'.$s3c['bucket'].'/crossdomain.xml'));
739
- $s3_args = array('method' => 'PUT', 'redirection' => 5, '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));
 
740
 
741
  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)
742
  return array('success' => TRUE, 'code' => NULL, 'message' => NULL); // Successfully configured Amazon S3 Bucket ACLs and Policy.
14
  * @package s2Member\Files
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_files_in'))
310
  else if($using_amazon_storage && $using_amazon_s3_storage && ($serving || ($creating && $url_to_storage_source)))
311
  {
312
  if($serving) // We only need this section when/if we're actually serving.
313
+ wp_redirect(c_ws_plugin__s2member_files_in::amazon_s34_url($req['file_download'], $stream, $inline, $ssl, $basename, $mimetype)).exit();
314
 
315
+ return apply_filters('ws_plugin__s2member_file_download_access_url', c_ws_plugin__s2member_files_in::amazon_s34_url($req['file_download'], $stream, $inline, $ssl, $basename, $mimetype), get_defined_vars());
316
  }
317
  else if($creating && $rewriting) // Creating a rewrite URL, pointing to local storage.
318
  { // Note: we don't URL encode unreserved chars. Improves media player compatibility.
538
 
539
  $extension = strtolower(substr($config['file_download'], strrpos($config['file_download'], '.') + 1));
540
  $streaming = (isset($config['file_stream'])) ? filter_var($config['file_stream'], FILTER_VALIDATE_BOOLEAN) : ((in_array($extension, preg_split('/['."\r\n\t".'\s;,]+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['file_download_stream_extensions']))) ? TRUE : FALSE);
541
+ $ssl = (isset($config['file_ssl'])) ? filter_var($config['file_ssl'], FILTER_VALIDATE_BOOLEAN) : (is_ssl() ? TRUE : FALSE);
542
 
543
  if($get_streamer_array && $streaming && ($cfx = '/cfx/st') && ($cfx_pos = strpos($url_, $cfx)) !== FALSE && ($streamer = substr($url_, 0, $cfx_pos + strlen($cfx))) && ($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)))))
544
  $return = array('streamer' => $streamer, 'prefix' => $extension.':', 'file' => preg_replace('/^'.preg_quote($streamer, '/').'\//', '', $url_), 'url' => preg_replace('/^.+?\:/', (($ssl) ? 'https:' : 'http:'), $url));
573
  do_action('ws_plugin__s2member_before_check_file_remote_authorization', get_defined_vars());
574
  unset($__refs, $__v); // Housekeeping.
575
 
576
+ $_g = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep(!empty($_GET) ? $_GET : array()));
577
 
578
  if(!is_object($user) && isset($_g['s2member_file_remote']) && filter_var($_g['s2member_file_remote'], FILTER_VALIDATE_BOOLEAN))
579
  {
653
  return c_ws_plugin__s2member_utils_strings::hmac_sha1_sign((string)$string, $s3c['secret_key']);
654
  }
655
 
656
+ /**
657
+ * Creates an Amazon S3 AWS4-HMAC-SHA256 signature.
658
+ *
659
+ * @package s2Member\Files
660
+ * @since 150108
661
+ *
662
+ * @param string $string Input string/data, to be signed by this routine.
663
+ *
664
+ * @return string An AWS4-HMAC-SHA256 signature for Amazon S3.
665
+ */
666
+ public static function amazon_s34_sign($string = '')
667
+ {
668
+ $s3c = array(); // Initialize config. keys.
669
+ foreach($GLOBALS['WS_PLUGIN__']['s2member']['o'] as $option => $option_value)
670
+ if(preg_match('/^amazon_s3_files_/', $option) && ($option = preg_replace('/^amazon_s3_files_/', '', $option)))
671
+ $s3c[$option] = $option_value;
672
+
673
+ $s3_date_key = c_ws_plugin__s2member_utils_strings::hmac_sha256_sign(gmdate('Ymd'), 'AWS4'.$s3c['secret_key'], TRUE);
674
+ $s3_date_region_key = c_ws_plugin__s2member_utils_strings::hmac_sha256_sign($s3c['bucket_region'], $s3_date_key, TRUE);
675
+ $s3_date_region_service_key = c_ws_plugin__s2member_utils_strings::hmac_sha256_sign('s3', $s3_date_region_key, TRUE);
676
+ $s3_signing_key = c_ws_plugin__s2member_utils_strings::hmac_sha256_sign('aws4_request', $s3_date_region_service_key, TRUE);
677
+
678
+ return c_ws_plugin__s2member_utils_strings::hmac_sha256_sign((string)$string, $s3_signing_key);
679
+ }
680
+
681
+ /**
682
+ * Creates an Amazon S3 AWS4-HMAC-SHA256 signature/authorization header.
683
+ *
684
+ * @package s2Member\Files
685
+ * @since 150108
686
+ *
687
+ * @param string $s3_date The date header; e.g. `YYYYMMDD'T'HHMMSS'Z'`.
688
+ * @param string $s3_domain The API endpoint domain; e.g. `[bucket].s3.amazonaws.com`.
689
+ * @param string $s3_location The API endpoint URI; e.g. `/?acl`.
690
+ * @param string $s3_method The request method; e.g. `GET`, `PUT`, `POST`, etc.
691
+ * @param array $s3_headers An associative array of all headers.
692
+ * @param string $s3_body Any input data sent with the request.
693
+ * @param boolean $sig_only Return signature only?
694
+ *
695
+ * @return string An AWS4-HMAC-SHA256 signature/authorization header for Amazon S3.
696
+ */
697
+ public static function amazon_s34_authorization($s3_date = '',
698
+ $s3_domain = 's3.amazonaws.com',
699
+ $s3_location = '/', $s3_method = 'GET',
700
+ $s3_headers = array(), $s3_body = '', $sig_only = FALSE)
701
+ {
702
+ $s3_date = trim((string)$s3_date);
703
+ $s3_domain = trim(strtolower((string)$s3_domain));
704
+ $s3_location = trim((string)$s3_location);
705
+ $s3_method = trim(strtoupper((string)$s3_method));
706
+ $s3_headers = (array)$s3_headers;
707
+ $s3_body = trim((string)$s3_body);
708
+
709
+ $s3c = array(); // Initialize config. keys.
710
+ foreach($GLOBALS['WS_PLUGIN__']['s2member']['o'] as $option => $option_value)
711
+ if(preg_match('/^amazon_s3_files_/', $option) && ($option = preg_replace('/^amazon_s3_files_/', '', $option)))
712
+ $s3c[$option] = $option_value;
713
+
714
+ $s3_iso8601_date = gmdate('Ymd\THis\Z');
715
+ $s3_location_parts = parse_url($s3_location);
716
+ $s3_canonical_path = !empty($s3_location_parts['path']) ? '/'.ltrim($s3_location_parts['path'], '/') : '/';
717
+ $s3_scope = gmdate('Ymd').'/'.$s3c['bucket_region'].'/s3/aws4_request';
718
+
719
+ $s3_canonical_query = ''; // Initialize.
720
+ wp_parse_str((string)@$s3_location_parts['query'], $query_args);
721
+ ksort($query_args, SORT_STRING);
722
+
723
+ foreach($query_args as $_key => $_value)
724
+ $s3_canonical_query .= '&'.c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(rawurlencode($_key)).
725
+ '='.c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(rawurlencode($_value));
726
+ $s3_canonical_query = ltrim($s3_canonical_query, '&');
727
+ unset($_key, $_value); // Housekeeping.
728
+
729
+ $s3_canonical_headers = '';
730
+ $s3_canonical_header_keys = array();
731
+ ksort($s3_headers, SORT_STRING);
732
+
733
+ foreach($s3_headers as $_key => $_value)
734
+ if(is_string($_key) && ($_key = strtolower($_key)))
735
+ if(in_array($_key, array('host', 'content-type'), TRUE) || stripos($_key, 'X-Amz-') === 0)
736
+ {
737
+ $s3_canonical_headers .= strtolower($_key).':'.trim($_value)."\n";
738
+ $s3_canonical_header_keys[] = strtolower($_key);
739
+ }
740
+ unset($_key, $_value); // Housekeeping.
741
+
742
+ $s3_canonicial_request = $s3_method."\n".
743
+ $s3_canonical_path."\n".
744
+ $s3_canonical_query."\n".
745
+ $s3_canonical_headers."\n".
746
+ implode(';', $s3_canonical_header_keys)."\n".
747
+ ($s3_body === 'UNSIGNED-PAYLOAD' ? $s3_body : hash('sha256', $s3_body));
748
+ $s3_string_to_sign = 'AWS4-HMAC-SHA256'."\n".
749
+ $s3_date."\n".
750
+ $s3_scope."\n".
751
+ hash('sha256', $s3_canonicial_request);
752
+ $s3_signature = self::amazon_s34_sign($s3_string_to_sign);
753
+
754
+ // header('Content-Type: text/plain; charset=UTF-8');
755
+ // echo $s3_canonicial_request."\n\n".$s3_string_to_sign."\n\n"; exit;
756
+
757
+ $s3_authorization_header_signature = 'AWS4-HMAC-SHA256 Credential='.$s3c['access_key'].'/'.$s3_scope.','.
758
+ 'SignedHeaders='.implode(';', $s3_canonical_header_keys).','.
759
+ 'Signature='.$s3_signature;
760
+
761
+ return $sig_only ? $s3_signature : $s3_authorization_header_signature;
762
+ }
763
+
764
  /**
765
  * Creates an Amazon S3 HMAC-SHA1 signature URL.
766
  *
797
  return add_query_arg(c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode_deep(array('AWSAccessKeyId' => $s3c['access_key'], 'Expires' => $s3c['expires'], 'Signature' => $s3_signature))), $s3_url);
798
  }
799
 
800
+ /**
801
+ * Creates an Amazon S3 AWS4-HMAC-SHA256 signature URL.
802
+ *
803
+ * @package s2Member\Files
804
+ * @since 150122
805
+ *
806
+ * @param string $file Input file path, to be signed by this routine.
807
+ * @param bool $stream Is this resource file to be served as streaming media?
808
+ * @param bool $inline Is this resource file to be served inline, or no?
809
+ * @param bool $ssl Is this resource file to be served via SSL, or no?
810
+ * @param string $basename The absolute basename of the resource file.
811
+ * @param string $mimetype The MIME content-type of the resource file.
812
+ *
813
+ * @return string An AWS4-HMAC-SHA256 signature URL for Amazon S3.
814
+ */
815
+ public static function amazon_s34_url($file = '', $stream = FALSE, $inline = FALSE, $ssl = FALSE, $basename = '', $mimetype = '')
816
+ {
817
+ $file = trim((string)$file, '/'); // Trim / force string.
818
+ $url_e_file = c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode($file));
819
+ $url_e_file = str_ireplace('%2F', '/', $url_e_file);
820
+
821
+ $s3c = array(); // Initialize config. keys.
822
+ foreach($GLOBALS['WS_PLUGIN__']['s2member']['o'] as $option => $option_value)
823
+ if(preg_match('/^amazon_s3_files_/', $option) && ($option = preg_replace('/^amazon_s3_files_/', '', $option)))
824
+ $s3c[$option] = $option_value;
825
+
826
+ if(!$s3c['bucket_region']) // No region configured; not possible.
827
+ return self::amazon_s3_url($file, $stream, $inline, $ssl, $basename, $mimetype);
828
+
829
+ $s3_date_ymd = date('Ymd');
830
+ $s3_iso8601_date = gmdate('Ymd\THis\Z');
831
+ $s3_date = gmdate('D, d M Y H:i:s').' GMT';
832
+ $s3_algo = 'AWS4-HMAC-SHA256'; // AWS v4 authentication.
833
+ $s3_credential = $s3c['access_key'].'/'.$s3_date_ymd.'/'.$s3c['bucket_region'].'/s3/aws4_request';
834
+ $s3_expires = strtotime('+'.apply_filters('ws_plugin__s2member_amazon_s3_file_expires_time', '24 hours', get_defined_vars())) - time();
835
+ $s3_domain = strtolower($s3c['bucket']) !== $s3c['bucket'] ? 's3.amazonaws.com' : $s3c['bucket'].'.s3.amazonaws.com';
836
+
837
+ $s3_args = array('X-Amz-Algorithm' => $s3_algo, 'X-Amz-Credential' => $s3_credential, 'X-Amz-Date' => $s3_iso8601_date, 'X-Amz-Expires' => $s3_expires, 'X-Amz-SignedHeaders' => 'host');
838
+ $s3_location = add_query_arg(c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode_deep(array_merge($s3_args, array('response-cache-control' => 'no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0', 'response-content-disposition' => ((bool)$inline ? 'inline' : 'attachment').'; filename="'.(string)$basename.'"', 'response-content-type' => (string)$mimetype, 'response-expires' => gmdate('D, d M Y H:i:s', strtotime('-1 week')).' GMT')))), '/'.$url_e_file);
839
+ $s3_url = strtolower($s3c['bucket']) !== $s3c['bucket'] ? 'http'.($ssl ? 's' : '').'://s3.amazonaws.com/'.$s3c['bucket'].$s3_location : 'http'.($ssl ? 's' : '').'://'.$s3c['bucket'].'.s3.amazonaws.com'.$s3_location;
840
+ $s3_sig = self::amazon_s34_authorization($s3_iso8601_date, $s3_domain, $s3_location, 'GET', array('Host' => $s3_domain), 'UNSIGNED-PAYLOAD', TRUE);
841
+
842
+ return add_query_arg(c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep(urlencode_deep(array('X-Amz-Signature' => $s3_sig))), $s3_url);
843
+ }
844
+
845
  /**
846
  * Auto-configures an Amazon S3 Bucket's ACLs.
847
  *
861
 
862
  if(!empty($s3c) && $s3c['bucket'] && $s3c['access_key'] && $s3c['secret_key']) // Must have Amazon S3 Bucket/Keys.
863
  {
864
+ $s3_iso8601_date = gmdate('Ymd\THis\Z');
865
+ $s3_date = gmdate('D, d M Y H:i:s').' GMT';
866
+ $s3_location = strtolower($s3c['bucket']) !== $s3c['bucket'] ? '/'.$s3c['bucket'].'/?acl' : '/?acl';
867
+ $s3_domain = strtolower($s3c['bucket']) !== $s3c['bucket'] ? 's3.amazonaws.com' : $s3c['bucket'].'.s3.amazonaws.com';
868
+ $s3_headers = array('Host' => $s3_domain, 'Date' => $s3_date, 'x-amz-date' => $s3_iso8601_date, 'x-amz-content-sha256' => hash('sha256', ''));
869
+ $s3_headers['Authorization'] = self::amazon_s34_authorization($s3_iso8601_date, $s3_domain, $s3_location, 'GET', $s3_headers, '');
870
+ $s3_args = array('method' => 'GET', 'redirection' => 5, 'headers' => $s3_headers);
871
 
872
  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)
873
  {
874
  if(preg_match('/\<Owner\>(.+?)\<\/Owner\>/is', $s3_response['body'], $s3_owner_tag) && preg_match('/\<ID\>(.+?)\<\/ID\>/is', $s3_owner_tag[1], $s3_owner_id_tag) && (preg_match('/\<DisplayName\>(.*?)\<\/DisplayName\>/is', $s3_owner_tag[1], $s3_owner_display_name_tag) || ($s3_owner_display_name_tag = array('-', 'Owner'))))
875
  {
876
+ $s3_owner = array('access_id' => trim($s3_owner_id_tag[1]), 'display_name' => trim($s3_owner_display_name_tag[1]));
877
+ $s3_acls_xml = '<AccessControlPolicy><Owner><ID>'.esc_html($s3_owner['access_id']).'</ID><DisplayName>'.esc_html($s3_owner['display_name']).'</DisplayName></Owner><AccessControlList><Grant><Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser"><ID>'.esc_html($s3_owner['access_id']).'</ID><DisplayName>'.esc_html($s3_owner['display_name']).'</DisplayName></Grantee><Permission>FULL_CONTROL</Permission></Grant>'.(($cfc['distros_s3_access_id']) ? '<Grant><Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser"><ID>'.esc_html($cfc['distros_s3_access_id']).'</ID><DisplayName>s2Member/CloudFront</DisplayName></Grantee><Permission>READ</Permission></Grant>' : '').'</AccessControlList></AccessControlPolicy>';
878
+ $s3_headers = array('Host' => $s3_domain, 'Date' => $s3_date, 'x-amz-date' => $s3_iso8601_date, 'Content-Type' => 'application/xml', 'x-amz-content-sha256' => hash('sha256', $s3_acls_xml));
879
+ $s3_headers['Authorization'] = self::amazon_s34_authorization($s3_iso8601_date, $s3_domain, $s3_location, 'PUT', $s3_headers, $s3_acls_xml);
880
+ $s3_args = array('method' => 'PUT', 'redirection' => 5, 'body' => $s3_acls_xml, 'headers' => $s3_headers);
881
 
882
  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)
883
  {
884
+ $s3_policy_id = md5(uniqid('s2Member/CloudFront:', TRUE));
885
+ $s3_policy_sid = md5(uniqid('s2Member/CloudFront:', TRUE));
886
+ $s3_location = strtolower($s3c['bucket']) !== $s3c['bucket'] ? '/'.$s3c['bucket'].'/?policy' : '/?policy';
887
+ $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']).'/*"}]}';
888
+ $s3_headers = array('Host' => $s3_domain, 'Date' => $s3_date, 'x-amz-date' => $s3_iso8601_date, 'Content-Type' => 'application/json', 'x-amz-content-sha256' => hash('sha256', $s3_policy_json));
889
+ $s3_headers['Authorization'] = self::amazon_s34_authorization($s3_iso8601_date, $s3_domain, $s3_location, 'PUT', $s3_headers, $s3_policy_json);
890
+ $s3_args = array('method' => 'PUT', 'redirection' => 5, 'body' => $s3_policy_json, 'headers' => $s3_headers);
891
 
892
  if(!$cfc['distros_s3_access_id'] || (($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 || $s3_response['code'] === 204)))
893
  {
894
+ $s3_location = strtolower($s3c['bucket']) !== $s3c['bucket'] ? '/'.$s3c['bucket'].'/crossdomain.xml' : '/crossdomain.xml';
895
+ $s3_policy_xml = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents(dirname(dirname(__FILE__)).'/templates/cfg-files/s2-cross-xml.php')));
896
+ $s3_headers = array('Host' => $s3_domain, 'Date' => $s3_date, 'x-amz-date' => $s3_iso8601_date, 'Content-Type' => 'text/xml', 'X-Amz-Acl' => 'public-read', 'x-amz-content-sha256' => hash('sha256', $s3_policy_xml));
897
+ $s3_headers['Authorization'] = self::amazon_s34_authorization($s3_iso8601_date, $s3_domain, $s3_location, 'PUT', $s3_headers, $s3_policy_xml);
898
+ $s3_args = array('method' => 'PUT', 'redirection' => 5, 'body' => $s3_policy_xml, 'headers' => $s3_headers);
899
 
900
  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)
901
  return array('success' => TRUE, 'code' => NULL, 'message' => NULL); // Successfully configured Amazon S3 Bucket ACLs and Policy.
includes/classes/files.inc.php CHANGED
@@ -1,377 +1,395 @@
1
  <?php
2
  /**
3
- * File Download routines for s2Member.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\Files
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"))
 
 
 
 
 
 
 
 
21
  {
22
  /**
23
- * File Download routines for s2Member.
24
- *
25
- * @package s2Member\Files
26
- * @since 3.5
27
- */
28
- class c_ws_plugin__s2member_files
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  {
30
- /**
31
- * Handles Download Access permissions.
32
- *
33
- * @package s2Member\Files
34
- * @since 110524RC
35
- *
36
- * @attaches-to ``add_action("init");``
37
- * @also-called-by API Function {@link s2Member\API_Functions\s2member_file_download_url()}, w/ ``$create_file_download_url`` param.
38
- *
39
- * @param array $create_file_download_url Optional. If this function is called directly, we can pass arguments through this array.
40
- * Possible array elements: `file_download` *(required)*, `file_download_key`, `file_stream`, `file_inline`, `file_storage`, `file_remote`, `file_ssl`, `file_rewrite`, `file_rewrite_base`, `skip_confirmation`, `url_to_storage_source`, `count_against_user`, `check_user`.
41
- * @return null|str If called directly with ``$create_file_download_url``, returns a string with the URL, based on configuration.
42
- * Else, this function may exit script execution after serving a File Download.
43
- */
44
- public static function check_file_download_access($create_file_download_url = FALSE)
45
  {
46
- if(is_array($create_file_download_url) || !empty($_GET["s2member_file_download"]))
47
- {
48
- return c_ws_plugin__s2member_files_in::check_file_download_access($create_file_download_url);
49
- }
 
 
 
50
  }
51
- /**
52
- * Generates a File Download URL for access to a file protected by s2Member.
53
- *
54
- * @package s2Member\Files
55
- * @since 110926
56
- *
57
- * @param array $config Required. This is an array of configuration options associated with permissions being checked against the current User/Member; and also the actual URL generated by this routine.
58
- * Possible ``$config`` array elements: `file_download` *(required)*, `file_download_key`, `file_stream`, `file_inline`, `file_storage`, `file_remote`, `file_ssl`, `file_rewrite`, `file_rewrite_base`, `skip_confirmation`, `url_to_storage_source`, `count_against_user`, `check_user`.
59
- * @param bool $get_streamer_array Optional. Defaults to `false`. If `true`, this function will return an array with the following elements: `streamer`, `file`, `url`. For further details, please review this section in your Dashboard: `s2Member -› Download Options -› JW Player & RTMP Protocol Examples`.
60
- * @return string A File Download URL string on success; or an array on success, with elements `streamer`, `file`, `url` when/if ``$get_streamer_array`` is true; else false on any type of failure.
61
- *
62
- * @see s2Member\API_Functions\s2member_file_download_url()
63
- */
64
- public static function create_file_download_url($config = FALSE, $get_streamer_array = FALSE)
65
- {
66
- return c_ws_plugin__s2member_files_in::create_file_download_url($config, $get_streamer_array);
67
- }
68
- /**
69
- * Auto-configures an Amazon S3 Bucket's ACLs.
70
- *
71
- * @package s2Member\Files
72
- * @since 110926
73
- *
74
- * @return bool|array True on success, else array on failure.
75
- * Failure array will contain a failure `code`, and a failure `message`.
76
- */
77
- public static function amazon_s3_auto_configure_acls()
78
- {
79
- return c_ws_plugin__s2member_files_in::amazon_s3_auto_configure_acls();
80
- }
81
- /**
82
- * Auto-configures Amazon CloudFront distros.
83
- *
84
- * @package s2Member\Files
85
- * @since 130209
86
- *
87
- * @return bool|array True on success, else array on failure.
88
- * Failure array will contain a failure `code`, and a failure `message`.
89
- */
90
- public static function amazon_cf_auto_configure_distros()
91
- {
92
- return c_ws_plugin__s2member_files_in::amazon_cf_auto_configure_distros();
93
- }
94
- /**
95
- * Determines the max period (in days), for Download Access.
96
- *
97
- * @package s2Member\Files
98
- * @since 3.5
99
- *
100
- * @return int Number of days, where 0 means no access to files is allowed.
101
- * Will not return a value > `365`, because this routine also controls the age of download logs to archives.
102
- *
103
- * @deprecated Deprecated in v111029. This function is no longer used by s2Member.
104
- */
105
- public static function max_download_period /* No longer used by s2Member. */()
106
- {
107
- do_action("ws_plugin__s2member_before_max_download_period", get_defined_vars());
108
 
109
- for($n = 0, $max = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
110
- if(!empty($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_file_downloads_allowed"]))
111
- if(!empty($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_file_downloads_allowed_days"]))
112
- if(($days = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_file_downloads_allowed_days"]))
113
- $max = ($max < $days) ? $days : $max;
 
 
114
 
115
- return apply_filters("ws_plugin__s2member_max_download_period", (($max > 365) ? 365 : $max), get_defined_vars());
116
- }
117
- /**
118
- * Determines the minimum Level required for File Download Access.
119
- *
120
- * @package s2Member\Files
121
- * @since 3.5
122
- *
123
- * @return bool|int False if no access is allowed, else Level number (int) 0+.
124
- */
125
- public static function min_level_4_downloads()
126
- {
127
- do_action("ws_plugin__s2member_before_min_level_4_downloads", get_defined_vars());
 
 
 
 
 
 
 
128
 
129
- for($n = 0, $min = false; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
130
- if(!empty($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_file_downloads_allowed"]))
131
- if(!empty($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_file_downloads_allowed_days"]))
132
- if(($min = $n) >= 0)
133
- break;
 
134
 
135
- return apply_filters("ws_plugin__s2member_min_level_4_downloads", ((is_int($min)) ? $min : false), get_defined_vars());
136
- }
137
- /**
138
- * Creates a File Download Key.
139
- *
140
- * Builds a hash of: ``date("Y-m-d") . $_SERVER["REMOTE_ADDR"] . $_SERVER["HTTP_USER_AGENT"] . $file``.
141
- *
142
- * @package s2Member\Files
143
- * @since 3.5
144
- *
145
- * @param string $file Location of your protected file, relative to the `/s2member-files/` directory.
146
- * In other words, just the name of the file *(i.e. `file.zip` )*.
147
- * @param string $directive Optional. One of `ip-forever|universal|cache-compatible`.
148
- * `ip-forever` = a Download Key that never expires, tied only to a specific file and IP address.
149
- * `universal` and/or `cache-compatible` = a Download Key which never expires, and is NOT tied to any specific User. Use at your own risk.
150
- * @return string A Download Key. MD5 hash, 32 characters, URL-safe.
151
- */
152
- public static function file_download_key($file = FALSE, $directive = FALSE)
153
- {
154
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
155
- do_action("ws_plugin__s2member_before_file_download_key", get_defined_vars());
156
- unset($__refs, $__v);
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 cacheable. */ $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
- }
173
- /**
174
- * Download details on a per-User basis.
175
- *
176
- * @package s2Member\Files
177
- * @since 3.5
178
- *
179
- * @param object $user Optional. A `WP_User` object. Defaults to the current User's object.
180
- * @param string $not_counting_this_particular_file Optional. If you want to exclude a particular file,
181
- * relative to the `/s2member-files/` directory, or relative to the root of your Amazon S3 Bucket *(when applicable)*.
182
- * @param array $user_log Optional. Prevents another database connection *(i.e. the User's log does not need to be pulled again)*.
183
- * @param array $user_arc Optional. Prevents another database connection *(i.e. the User's archive does not need to be pulled again)*.
184
- * @return array An array with the following elements... File Downloads allowed for this User: (int)`allowed`, Download Period for this User in days: (int)`allowed_days`, Files downloaded by this User in the current Period: (int)`currently`, log of all Files downloaded in the current Period, with file names/dates: (array)`log`, archive of all Files downloaded in prior Periods, with file names/dates: (array)`archive`.
185
- *
186
- * @note Calculations returned by this function do NOT include File Downloads that were accessed with an Advanced File Download Key.
187
- * @todo Make it possible for s2Member to keep a count of files downloaded with an Advanced Download Key.
188
- */
189
- public static function user_downloads($user = FALSE, $not_counting_this_particular_file = FALSE, $user_log = FALSE, $user_arc = FALSE)
190
- {
191
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
192
- do_action("ws_plugin__s2member_before_user_downloads", get_defined_vars());
193
- unset($__refs, $__v);
194
-
195
- $allowed = $allowed_days = $currently = /* Initialize these to zero. */ 0;
196
- $log = $arc = /* Initialize these to a default empty array value. */ array();
197
-
198
- if((is_object($user) || is_object($user = (is_user_logged_in()) ? wp_get_current_user() : false)) && !empty($user->ID) && ($user_id = $user->ID))
199
- {
200
- for($n = 0; $n <= $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n++)
201
- {
202
- if /* Do they have access? */($user->has_cap("access_s2member_level".$n))
203
- {
204
- if(!empty($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_file_downloads_allowed"]) && !empty($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_file_downloads_allowed_days"]))
205
- {
206
- $allowed = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_file_downloads_allowed"];
207
- $allowed_days = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level".$n."_file_downloads_allowed_days"];
208
- }
209
- if /* We can stop now, if this is their Role. */($user->has_cap("s2member_level".$n))
210
- break /* Break now. */;
211
- }
212
- }
213
- $log = (is_array($user_log)) ? $user_log : ((is_array($log = get_user_option("s2member_file_download_access_log", $user_id)) && $log !== array(false)) ? $log : array());
214
- $arc = (is_array($user_arc)) ? $user_arc : ((is_array($arc = get_user_option("s2member_file_download_access_arc", $user_id)) && $arc !== array(false)) ? $arc : array());
215
-
216
- foreach(($user_file_download_access_log = $log) as $user_file_download_access_log_entry_key => $user_file_download_access_log_entry)
217
- if(isset($user_file_download_access_log_entry["date"]) && strtotime($user_file_download_access_log_entry["date"]) >= strtotime("-".$allowed_days." days"))
218
- if(isset($user_file_download_access_log_entry["file"]) && $user_file_download_access_log_entry["file"] !== $not_counting_this_particular_file)
219
- $currently = $currently + 1;
220
- }
221
-
222
- return apply_filters("ws_plugin__s2member_user_downloads", array("allowed" => $allowed, "allowed_days" => $allowed_days, "currently" => $currently, "log" => $log, "archive" => $arc), get_defined_vars());
223
- }
224
- /**
225
- * Total downloads of a particular file; possibly by a particular User.
226
- *
227
- * @package s2Member\Files
228
- * @since 111026
229
- *
230
- * @param string $file Required. Location of the file, relative to the `/s2member-files/` directory, or relative to the root of your Amazon S3 Bucket *(when applicable)*.
231
- * @param string|int $user_id Optional. If specified, s2Member will return total downloads by a particular User/Member, instead of collectively *(i.e among all Users/Members)*.
232
- * @param bool $check_archives_too Optional. Defaults to true. When true, s2Member checks its File Download Archive too, instead of ONLY looking at Files downloaded in the current Period. Period is based on your Basic Download Restrictions setting of allowed days across various Levels of Membership, for each respective User/Member. Or, if ``$user_id`` is specified, based solely on a specific User's `allowed_days`, configured in your Basic Download Restrictions, at the User's current Membership Level.
233
- * @return int The total for this particular ``$file``, based on configuration of function arguments.
234
- *
235
- * @note Calculations returned by this function do NOT include File Downloads that were accessed with an Advanced File Download Key.
236
- * @todo Make it possible for s2Member to keep a count of files downloaded with an Advanced Download Key.
237
- */
238
- public static function total_downloads_of($file = FALSE, $user_id = FALSE, $check_archives_too = TRUE)
239
- {
240
- global /* Global database object reference. */ $wpdb;
241
-
242
- if /* Was ``$file`` passed in properly? */($file && is_string($file))
243
- {
244
- if(is_array($results = $wpdb->get_results("SELECT `meta_key`, `meta_value` FROM `".$wpdb->usermeta."` WHERE ".((is_numeric($user_id)) ? "`user_id` = '".esc_sql($user_id)."' AND " : "")."(`meta_key` = '".$wpdb->prefix."s2member_file_download_access_log'".(($check_archives_too) ? " OR `meta_key` = '".$wpdb->prefix."s2member_file_download_access_arc'" : "").") AND `meta_value` REGEXP '.*\"file\";s:[0-9]+:\"".esc_sql($file)."\".*'")))
245
- {
246
- foreach($results as $r /* Go through the entire array of results found in the `REGEXP` database query above. */)
247
- if(is_array($la_entries = /* Unserialize the array. */ maybe_unserialize($r->meta_value)) && !empty($la_entries))
248
-
249
- foreach($la_entries as $la_entry /* Go through all of the entries in each result ``$r``; collecting `counter` values. */)
250
- if(!empty($la_entry["file"]) && $la_entry["file"] === $file && /* Back compatibility. Is `counter` even set? */ (!empty($la_entry["counter"]) || ($la_entry["counter"] = 1)))
251
- {
252
- $total = (!empty($total)) ? $total + (int)$la_entry["counter"] : (int)$la_entry["counter"];
253
- break /* Break now. No need to continue looping; ``$file`` found in these entries. */;
254
- }
255
- }
256
- }
257
- return (!empty($total)) ? $total : /* Else return zero by default. */ 0;
258
- }
259
- /**
260
- * Total unique downloads of a particular file; possibly by a particular User.
261
- *
262
- * @package s2Member\Files
263
- * @since 111026
264
- *
265
- * @param string $file Required. Location of the file, relative to the `/s2member-files/` directory, or relative to the root of your Amazon S3 Bucket *(when applicable)*.
266
- * @param string|int $user_id Optional. If specified, s2Member will return total downloads by a particular User/Member, instead of collectively *(i.e among all Users/Members)*.
267
- * @param bool $check_archives_too Optional. Defaults to true. When true, s2Member checks its File Download Archive too, instead of ONLY looking at Files downloaded in the current Period. Period is based on your Basic Download Restrictions setting of allowed days across various Levels of Membership, for each respective User/Member. Or, if ``$user_id`` is specified, based solely on a specific User's `allowed_days`, configured in your Basic Download Restrictions, at the User's current Membership Level.
268
- * @return int The total for this particular ``$file``, based on configuration of function arguments.
269
- *
270
- * @note Calculations returned by this function do NOT include File Downloads that were accessed with an Advanced File Download Key.
271
- * @todo Make it possible for s2Member to keep a count of files downloaded with an Advanced Download Key.
272
- */
273
- public static function total_unique_downloads_of($file = FALSE, $user_id = FALSE, $check_archives_too = TRUE)
274
- {
275
- global /* Global database object reference. */ $wpdb;
276
-
277
- if /* Was ``$file`` passed in properly? */($file && is_string($file))
278
- {
279
- if(is_array($results = $wpdb->get_results("SELECT `meta_key`, `meta_value` FROM `".$wpdb->usermeta."` WHERE ".((is_numeric($user_id)) ? "`user_id` = '".esc_sql($user_id)."' AND " : "")."(`meta_key` = '".$wpdb->prefix."s2member_file_download_access_log'".(($check_archives_too) ? " OR `meta_key` = '".$wpdb->prefix."s2member_file_download_access_arc'" : "").") AND `meta_value` REGEXP '.*\"file\";s:[0-9]+:\"".esc_sql($file)."\".*'")))
280
- {
281
- foreach($results as $r /* Go through the entire array of results found in the `REGEXP` database query above. */)
282
- if(is_array($la_entries = /* Unserialize the array. */ maybe_unserialize($r->meta_value)) && !empty($la_entries))
283
-
284
- foreach($la_entries as $la_entry /* Go through all of the entries in each result ``$r``; collecting `counter` values. */)
285
- if(!empty($la_entry["file"]) && $la_entry["file"] === $file && /* Back compatibility. Is `counter` even set? */ (!empty($la_entry["counter"]) || ($la_entry["counter"] = 1)))
286
- {
287
- $total = (!empty($total)) ? /* Only count `1` here (i.e. unique downloads). */ $total + 1 : 1;
288
- break /* Break now. No need to continue looping; ``$file`` found in these entries. */;
289
- }
290
- }
291
- }
292
- return (!empty($total)) ? $total : /* Else return zero by default. */ 0;
293
- }
294
- /**
295
- * Checks for GZIP rules in root `.htaccess` file.
296
- *
297
- * @package s2Member\Files
298
- * @since 120212
299
- *
300
- * @return bool True if rules exist, else false.
301
- */
302
- public static function no_gzip_rules_in_root_htaccess()
303
- {
304
- $start_line = /* Beginning line for this entry. */ "# BEGIN s2Member GZIP exclusions";
305
- $end_line = /* Identifying end line for this entry. */ "# END s2Member GZIP exclusions";
306
- $htaccess = /* Location of this `.htaccess` file. */ ABSPATH.".htaccess";
307
 
308
- if(file_exists($htaccess) && is_readable($htaccess) && ($htaccess_contents = file_get_contents($htaccess)) !== false && is_string($htaccess_contents = trim($htaccess_contents)))
309
- return preg_match("/".preg_quote($start_line, "/")."[\r\n]+.*?[\r\n]+".preg_quote($end_line, "/")."[\r\n]{0,2}/is", $htaccess_contents);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
310
 
311
- return /* Default return `false`. */ false;
312
- }
313
- /**
314
- * Writes no GZIP rules into root `.htaccess` file.
315
- *
316
- * @package s2Member\Files
317
- * @since 120212
318
- *
319
- * @return bool True if successfull, else false on any type of failure.
320
- */
321
- public static function write_no_gzip_into_root_htaccess()
322
- {
323
- if(c_ws_plugin__s2member_files::remove_no_gzip_from_root_htaccess() /* Must first be able to remove any existing entry. */)
324
- {
325
- $start_line = /* Beginning line for this entry. */ "# BEGIN s2Member GZIP exclusions";
326
- $end_line = /* Identifying end line for this entry. */ "# END s2Member GZIP exclusions";
327
- $htaccess = /* Location of this `.htaccess` file we need to write in. */ ABSPATH.".htaccess";
328
- $ideally_position_before = /* Ideally, we can position before this entry. */ "# BEGIN WordPress";
329
-
330
- $no_gzip = $start_line."\n".trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_no_gzip_htaccess"])))."\n".$end_line;
331
-
332
- if(file_exists($htaccess) && is_readable($htaccess) && is_writable($htaccess) && ($htaccess_contents = file_get_contents($htaccess)) !== false && is_string($htaccess_contents = trim($htaccess_contents)))
333
- {
334
- if(stripos /* If we can position in the ideal location, that's awesome. Let's do that now. */($htaccess_contents, $ideally_position_before) !== false)
335
- $htaccess_contents = trim(str_ireplace($ideally_position_before, $no_gzip."\n\n".$ideally_position_before, $htaccess_contents));
336
-
337
- else // Else, let's put it at the very top of the file by default.
338
- $htaccess_contents = trim($no_gzip."\n\n".$htaccess_contents);
339
-
340
- return file_put_contents($htaccess, $htaccess_contents);
341
- }
342
- else if(!file_exists($htaccess) && is_writable(dirname($htaccess)))
343
- {
344
- return file_put_contents($htaccess, $no_gzip);
345
- }
346
- }
347
- return /* Default return `false`. */ false;
348
- }
349
- /**
350
- * Removes no GZIP rules in root `.htaccess` file.
351
- *
352
- * @package s2Member\Files
353
- * @since 120212
354
- *
355
- * @return bool True if successful, else false on any type of failure.
356
- */
357
- public static function remove_no_gzip_from_root_htaccess()
358
- {
359
- $start_line = /* Beginning line for this entry. */ "# BEGIN s2Member GZIP exclusions";
360
- $end_line = /* Identifying end line for this entry. */ "# END s2Member GZIP exclusions";
361
- $htaccess = /* Location of this `.htaccess` file we need to write in. */ ABSPATH.".htaccess";
362
-
363
- if(file_exists($htaccess) && is_readable($htaccess) && is_writable($htaccess) && ($htaccess_contents = file_get_contents($htaccess)) !== false && is_string($htaccess_contents = trim($htaccess_contents)))
364
- {
365
- $htaccess_contents = trim(preg_replace("/".preg_quote($start_line, "/")."[\r\n]+.*?[\r\n]+".preg_quote($end_line, "/")."[\r\n]{0,2}/is", "", $htaccess_contents));
366
-
367
- return /* Check for `false`, because this could return `0` if the file is now empty. */ (file_put_contents($htaccess, $htaccess_contents) !== false);
368
- }
369
- else if(!file_exists($htaccess) /* Return `true` here, we're OK. */)
370
- {
371
- return true;
372
- }
373
- return /* Default return `false`. */ false;
374
- }
375
  }
 
 
376
  }
377
- ?>
1
  <?php
2
  /**
3
+ * File Download routines for s2Member.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Files
15
+ * @since 3.5
16
+ */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
+ exit('Do not access this file directly.');
19
+
20
+ if(!class_exists('c_ws_plugin__s2member_files'))
21
+ {
22
+ /**
23
+ * File Download routines for s2Member.
24
+ *
25
+ * @package s2Member\Files
26
+ * @since 3.5
27
+ */
28
+ class c_ws_plugin__s2member_files
29
  {
30
  /**
31
+ * Handles Download Access permissions.
32
+ *
33
+ * @package s2Member\Files
34
+ * @since 110524RC
35
+ *
36
+ * @attaches-to ``add_action('init');``
37
+ * @also-called-by API Function {@link s2Member\API_Functions\s2member_file_download_url()}, w/ ``$create_file_download_url`` param.
38
+ *
39
+ * @param array $create_file_download_url Optional. If this function is called directly, we can pass arguments through this array.
40
+ * Possible array elements: `file_download` *(required)*, `file_download_key`, `file_stream`, `file_inline`, `file_storage`, `file_remote`, `file_ssl`, `file_rewrite`, `file_rewrite_base`, `skip_confirmation`, `url_to_storage_source`, `count_against_user`, `check_user`.
41
+ *
42
+ * @return null|string If called directly with ``$create_file_download_url``, returns a string with the URL, based on configuration.
43
+ * Else, this function may exit script execution after serving a File Download.
44
+ */
45
+ public static function check_file_download_access($create_file_download_url = NULL)
46
+ {
47
+ if(is_array($create_file_download_url) || !empty($_GET['s2member_file_download']))
48
+ return c_ws_plugin__s2member_files_in::check_file_download_access($create_file_download_url);
49
+ return NULL; // Default return value.
50
+ }
51
+
52
+ /**
53
+ * Generates a File Download URL for access to a file protected by s2Member.
54
+ *
55
+ * @package s2Member\Files
56
+ * @since 110926
57
+ *
58
+ * @param array $config Required. This is an array of configuration options associated with permissions being checked against the current User/Member; and also the actual URL generated by this routine.
59
+ * Possible ``$config`` array elements: `file_download` *(required)*, `file_download_key`, `file_stream`, `file_inline`, `file_storage`, `file_remote`, `file_ssl`, `file_rewrite`, `file_rewrite_base`, `skip_confirmation`, `url_to_storage_source`, `count_against_user`, `check_user`.
60
+ * @param bool $get_streamer_array Optional. Defaults to `false`. If `true`, this function will return an array with the following elements: `streamer`, `file`, `url`. For further details, please review this section in your Dashboard: `s2Member -› Download Options -› JW Player & RTMP Protocol Examples`.
61
+ *
62
+ * @return string A File Download URL string on success; or an array on success, with elements `streamer`, `file`, `url` when/if ``$get_streamer_array`` is true; else false on any type of failure.
63
+ *
64
+ * @see s2Member\API_Functions\s2member_file_download_url()
65
+ */
66
+ public static function create_file_download_url($config = NULL, $get_streamer_array = FALSE)
67
+ {
68
+ return c_ws_plugin__s2member_files_in::create_file_download_url($config, $get_streamer_array);
69
+ }
70
+
71
+ /**
72
+ * Auto-configures an Amazon S3 Bucket's ACLs.
73
+ *
74
+ * @package s2Member\Files
75
+ * @since 110926
76
+ *
77
+ * @return bool|array True on success, else array on failure.
78
+ * Failure array will contain a failure `code`, and a failure `message`.
79
+ */
80
+ public static function amazon_s3_auto_configure_acls()
81
+ {
82
+ return c_ws_plugin__s2member_files_in::amazon_s3_auto_configure_acls();
83
+ }
84
+
85
+ /**
86
+ * Auto-configures Amazon CloudFront distros.
87
+ *
88
+ * @package s2Member\Files
89
+ * @since 130209
90
+ *
91
+ * @return bool|array True on success, else array on failure.
92
+ * Failure array will contain a failure `code`, and a failure `message`.
93
+ */
94
+ public static function amazon_cf_auto_configure_distros()
95
+ {
96
+ return c_ws_plugin__s2member_files_in::amazon_cf_auto_configure_distros();
97
+ }
98
+
99
+ /**
100
+ * Determines the max period (in days), for Download Access.
101
+ *
102
+ * @package s2Member\Files
103
+ * @since 3.5
104
+ *
105
+ * @return int Number of days, where 0 means no access to files is allowed.
106
+ * Will not return a value > `365`, because this routine also controls the age of download logs to archives.
107
+ *
108
+ * @deprecated Deprecated in v111029. This function is no longer used by s2Member.
109
+ */
110
+ public static function max_download_period(/* No longer used by s2Member. */)
111
+ {
112
+ do_action('ws_plugin__s2member_before_max_download_period', get_defined_vars());
113
+
114
+ for($n = 0, $max = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
115
+ if(!empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_file_downloads_allowed']))
116
+ if(!empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_file_downloads_allowed_days']))
117
+ if(($days = $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_file_downloads_allowed_days']))
118
+ $max = ($max < $days) ? $days : $max;
119
+
120
+ return apply_filters('ws_plugin__s2member_max_download_period', (($max > 365) ? 365 : $max), get_defined_vars());
121
+ }
122
+
123
+ /**
124
+ * Determines the minimum Level required for File Download Access.
125
+ *
126
+ * @package s2Member\Files
127
+ * @since 3.5
128
+ *
129
+ * @return bool|int False if no access is allowed, else Level number (int) 0+.
130
+ */
131
+ public static function min_level_4_downloads()
132
+ {
133
+ do_action('ws_plugin__s2member_before_min_level_4_downloads', get_defined_vars());
134
+
135
+ for($n = 0, $min = FALSE; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
136
+ if(!empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_file_downloads_allowed']))
137
+ if(!empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_file_downloads_allowed_days']))
138
+ if(($min = $n) >= 0) break; // Break now.
139
+
140
+ return apply_filters('ws_plugin__s2member_min_level_4_downloads', ((is_int($min)) ? $min : FALSE), get_defined_vars());
141
+ }
142
+
143
+ /**
144
+ * Creates a File Download Key.
145
+ *
146
+ * Builds a hash of: ``date('Y-m-d') . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] . $file``.
147
+ *
148
+ * @package s2Member\Files
149
+ * @since 3.5
150
+ *
151
+ * @param string $file Location of your protected file, relative to the `/s2member-files/` directory.
152
+ * In other words, just the name of the file *(i.e. `file.zip` )*.
153
+ * @param string $directive Optional. One of `ip-forever|universal|cache-compatible`.
154
+ * `ip-forever` = a Download Key that never expires, tied only to a specific file and IP address.
155
+ * `universal` and/or `cache-compatible` = a Download Key which never expires, and is NOT tied to any specific User. Use at your own risk.
156
+ *
157
+ * @return string A Download Key. MD5 hash, 32 characters, URL-safe.
158
+ */
159
+ public static function file_download_key($file = NULL, $directive = NULL)
160
+ {
161
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
162
+ do_action('ws_plugin__s2member_before_file_download_key', get_defined_vars());
163
+ unset($__refs, $__v);
164
+
165
+ $file = ($file && is_string($file) && ($file = trim($file, '/'))) ? $file : '';
166
+
167
+ if($directive === 'ip-forever' && c_ws_plugin__s2member_no_cache::no_cache_constants(TRUE))
168
+ $salt = $file.$_SERVER['REMOTE_ADDR'];
169
+
170
+ else if($directive === 'universal' || $directive === 'cache-compatible' || $directive)
171
+ $salt = $file; // Just the file name. This IS cacheable.
172
+
173
+ else if(c_ws_plugin__s2member_no_cache::no_cache_constants(TRUE))
174
+ $salt = date('Y-m-d').$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$file;
175
+
176
+ $key = (!empty($salt)) ? md5(c_ws_plugin__s2member_utils_encryption::xencrypt($salt, FALSE, FALSE)) : '';
177
+
178
+ return apply_filters('ws_plugin__s2member_file_download_key', $key, get_defined_vars());
179
+ }
180
+
181
+ /**
182
+ * Download details on a per-User basis.
183
+ *
184
+ * @package s2Member\Files
185
+ * @since 3.5
186
+ *
187
+ * @param object $user Optional. A `WP_User` object. Defaults to the current User's object.
188
+ * @param string $not_counting_this_particular_file Optional. If you want to exclude a particular file,
189
+ * relative to the `/s2member-files/` directory, or relative to the root of your Amazon S3 Bucket *(when applicable)*.
190
+ * @param array $user_log Optional. Prevents another database connection *(i.e. the User's log does not need to be pulled again)*.
191
+ * @param array $user_arc Optional. Prevents another database connection *(i.e. the User's archive does not need to be pulled again)*.
192
+ *
193
+ * @return array An array with the following elements... File Downloads allowed for this User: (int)`allowed`, Download Period for this User in days: (int)`allowed_days`, Files downloaded by this User in the current Period: (int)`currently`, log of all Files downloaded in the current Period, with file names/dates: (array)`log`, archive of all Files downloaded in prior Periods, with file names/dates: (array)`archive`.
194
+ *
195
+ * @note Calculations returned by this function do NOT include File Downloads that were accessed with an Advanced File Download Key.
196
+ *
197
+ * @todo Make it possible for s2Member to keep a count of files downloaded with an Advanced Download Key.
198
+ */
199
+ public static function user_downloads($user = NULL, $not_counting_this_particular_file = NULL, $user_log = NULL, $user_arc = NULL)
200
+ {
201
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
202
+ do_action('ws_plugin__s2member_before_user_downloads', get_defined_vars());
203
+ unset($__refs, $__v);
204
+
205
+ $allowed = $allowed_days = $currently = 0; // Initialize these to zero.
206
+ $log = $arc = array(); // Initialize these to a default empty array value.
207
+
208
+ if((is_object($user) || is_object($user = (is_user_logged_in()) ? wp_get_current_user() : FALSE)) && !empty($user->ID) && ($user_id = $user->ID))
209
  {
210
+ for($n = 0; $n <= $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n++)
211
+ {
212
+ if($user->has_cap('access_s2member_level'.$n) /* Do they have access? */)
 
 
 
 
 
 
 
 
 
 
 
 
213
  {
214
+ if(!empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_file_downloads_allowed']) && !empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_file_downloads_allowed_days']))
215
+ {
216
+ $allowed = $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_file_downloads_allowed'];
217
+ $allowed_days = $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$n.'_file_downloads_allowed_days'];
218
+ }
219
+ if($user->has_cap('s2member_level'.$n) /* We can stop now, if this is their Role. */)
220
+ break; // Break now.
221
  }
222
+ }
223
+ $log = (is_array($user_log)) ? $user_log : ((is_array($log = get_user_option('s2member_file_download_access_log', $user_id)) && $log !== array(FALSE)) ? $log : array());
224
+ $arc = (is_array($user_arc)) ? $user_arc : ((is_array($arc = get_user_option('s2member_file_download_access_arc', $user_id)) && $arc !== array(FALSE)) ? $arc : array());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
225
 
226
+ foreach(($user_file_download_access_log = $log) as $user_file_download_access_log_entry_key => $user_file_download_access_log_entry)
227
+ if(isset($user_file_download_access_log_entry['date']) && strtotime($user_file_download_access_log_entry['date']) >= strtotime('-'.$allowed_days.' days'))
228
+ if(isset($user_file_download_access_log_entry['file']) && $user_file_download_access_log_entry['file'] !== $not_counting_this_particular_file)
229
+ $currently = $currently + 1;
230
+ }
231
+ return apply_filters('ws_plugin__s2member_user_downloads', array('allowed' => $allowed, 'allowed_days' => $allowed_days, 'currently' => $currently, 'log' => $log, 'archive' => $arc), get_defined_vars());
232
+ }
233
 
234
+ /**
235
+ * Total downloads of a particular file; possibly by a particular User.
236
+ *
237
+ * @package s2Member\Files
238
+ * @since 111026
239
+ *
240
+ * @param string $file Required. Location of the file, relative to the `/s2member-files/` directory, or relative to the root of your Amazon S3 Bucket *(when applicable)*.
241
+ * @param string|int $user_id Optional. If specified, s2Member will return total downloads by a particular User/Member, instead of collectively *(i.e among all Users/Members)*.
242
+ * @param bool $check_archives_too Optional. Defaults to true. When true, s2Member checks its File Download Archive too, instead of ONLY looking at Files downloaded in the current Period. Period is based on your Basic Download Restrictions setting of allowed days across various Levels of Membership, for each respective User/Member. Or, if ``$user_id`` is specified, based solely on a specific User's `allowed_days`, configured in your Basic Download Restrictions, at the User's current Membership Level.
243
+ *
244
+ * @return int The total for this particular ``$file``, based on configuration of function arguments.
245
+ *
246
+ * @note Calculations returned by this function do NOT include File Downloads that were accessed with an Advanced File Download Key.
247
+ *
248
+ * @todo Make it possible for s2Member to keep a count of files downloaded with an Advanced Download Key.
249
+ */
250
+ public static function total_downloads_of($file = NULL, $user_id = NULL, $check_archives_too = TRUE)
251
+ {
252
+ global $wpdb; // Global database object reference.
253
+ /** @var $wpdb \wpdb Reference for IDEs. */
254
 
255
+ if($file && is_string($file) /* Was ``$file`` passed in properly? */)
256
+ {
257
+ if(is_array($results = $wpdb->get_results("SELECT `meta_key`, `meta_value` FROM `".$wpdb->usermeta."` WHERE ".((is_numeric($user_id)) ? "`user_id` = '".esc_sql($user_id)."' AND " : '')."(`meta_key` = '".$wpdb->prefix."s2member_file_download_access_log'".(($check_archives_too) ? " OR `meta_key` = '".$wpdb->prefix."s2member_file_download_access_arc'" : '').") AND `meta_value` REGEXP '.*\"file\";s:[0-9]+:\"".esc_sql($file)."\".*'")))
258
+ {
259
+ foreach($results as $r /* Go through the entire array of results found in the `REGEXP` database query above. */)
260
+ if(is_array($la_entries = maybe_unserialize($r->meta_value)) && !empty($la_entries) /* Unserialize the array. */)
261
 
262
+ foreach($la_entries as $la_entry /* Go through all of the entries in each result ``$r``; collecting `counter` values. */)
263
+ if(!empty($la_entry['file']) && $la_entry['file'] === $file && (!empty($la_entry['counter']) || ($la_entry['counter'] = 1)))
264
+ {
265
+ $total = (!empty($total)) ? $total + (int)$la_entry['counter'] : (int)$la_entry['counter'];
266
+ break; // Break now. No need to continue looping; ``$file`` found in these entries.
267
+ }
268
+ }
269
+ }
270
+ return (!empty($total)) ? $total : 0; // Else return zero by default.
271
+ }
 
 
 
 
 
 
 
 
 
 
 
 
272
 
273
+ /**
274
+ * Total unique downloads of a particular file; possibly by a particular User.
275
+ *
276
+ * @package s2Member\Files
277
+ * @since 111026
278
+ *
279
+ * @param string $file Required. Location of the file, relative to the `/s2member-files/` directory, or relative to the root of your Amazon S3 Bucket *(when applicable)*.
280
+ * @param string|int $user_id Optional. If specified, s2Member will return total downloads by a particular User/Member, instead of collectively *(i.e among all Users/Members)*.
281
+ * @param bool $check_archives_too Optional. Defaults to true. When true, s2Member checks its File Download Archive too, instead of ONLY looking at Files downloaded in the current Period. Period is based on your Basic Download Restrictions setting of allowed days across various Levels of Membership, for each respective User/Member. Or, if ``$user_id`` is specified, based solely on a specific User's `allowed_days`, configured in your Basic Download Restrictions, at the User's current Membership Level.
282
+ *
283
+ * @return int The total for this particular ``$file``, based on configuration of function arguments.
284
+ *
285
+ * @note Calculations returned by this function do NOT include File Downloads that were accessed with an Advanced File Download Key.
286
+ *
287
+ * @todo Make it possible for s2Member to keep a count of files downloaded with an Advanced Download Key.
288
+ */
289
+ public static function total_unique_downloads_of($file = NULL, $user_id = NULL, $check_archives_too = TRUE)
290
+ {
291
+ global $wpdb; // Global database object reference.
292
+ /** @var $wpdb \wpdb Reference for IDEs. */
293
 
294
+ if($file && is_string($file) /* Was ``$file`` passed in properly? */)
295
+ {
296
+ if(is_array($results = $wpdb->get_results("SELECT `meta_key`, `meta_value` FROM `".$wpdb->usermeta."` WHERE ".((is_numeric($user_id)) ? "`user_id` = '".esc_sql($user_id)."' AND " : '')."(`meta_key` = '".$wpdb->prefix."s2member_file_download_access_log'".(($check_archives_too) ? " OR `meta_key` = '".$wpdb->prefix."s2member_file_download_access_arc'" : '').") AND `meta_value` REGEXP '.*\"file\";s:[0-9]+:\"".esc_sql($file)."\".*'")))
297
+ {
298
+ foreach($results as $r /* Go through the entire array of results found in the `REGEXP` database query above. */)
299
+ if(is_array($la_entries = maybe_unserialize($r->meta_value)) && !empty($la_entries) /* Unserialize the array. */)
300
 
301
+ foreach($la_entries as $la_entry /* Go through all of the entries in each result ``$r``; collecting `counter` values. */)
302
+ if(!empty($la_entry['file']) && $la_entry['file'] === $file && (!empty($la_entry['counter']) || ($la_entry['counter'] = 1)))
303
+ {
304
+ $total = (!empty($total)) ? $total + 1 : 1; // Only count `1` here (i.e. unique downloads).
305
+ break; // Break now. No need to continue looping; ``$file`` found in these entries.
306
+ }
307
+ }
308
+ }
309
+ return (!empty($total)) ? $total : 0; // Else return zero by default.
310
+ }
311
 
312
+ /**
313
+ * Checks for GZIP rules in root `.htaccess` file.
314
+ *
315
+ * @package s2Member\Files
316
+ * @since 120212
317
+ *
318
+ * @return bool True if rules exist, else false.
319
+ */
320
+ public static function no_gzip_rules_in_root_htaccess()
321
+ {
322
+ $start_line = '# BEGIN s2Member GZIP exclusions'; // Beginning line for this entry.
323
+ $end_line = '# END s2Member GZIP exclusions'; // Identifying end line for this entry.
324
+ $htaccess = ABSPATH.'.htaccess'; // Location of this `.htaccess` file.
325
 
326
+ if(file_exists($htaccess) && is_readable($htaccess) && ($htaccess_contents = file_get_contents($htaccess)) !== FALSE && is_string($htaccess_contents = trim($htaccess_contents)))
327
+ return preg_match('/'.preg_quote($start_line, '/').'['."\r\n".']+.*?['."\r\n".']+'.preg_quote($end_line, '/').'['."\r\n".']{0,2}/is', $htaccess_contents);
328
 
329
+ return FALSE; // Default return `FALSE`.
330
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
331
 
332
+ /**
333
+ * Writes no GZIP rules into root `.htaccess` file.
334
+ *
335
+ * @package s2Member\Files
336
+ * @since 120212
337
+ *
338
+ * @return bool True if successfull, else false on any type of failure.
339
+ */
340
+ public static function write_no_gzip_into_root_htaccess()
341
+ {
342
+ if(c_ws_plugin__s2member_files::remove_no_gzip_from_root_htaccess() /* Must first be able to remove any existing entry. */)
343
+ {
344
+ $start_line = '# BEGIN s2Member GZIP exclusions'; // Beginning line for this entry.
345
+ $end_line = '# END s2Member GZIP exclusions'; // Identifying end line for this entry.
346
+ $htaccess = ABSPATH.'.htaccess'; // Location of this `.htaccess` file we need to write in.
347
+ $ideally_position_before = '# BEGIN WordPress'; // Ideally, we can position before this entry.
348
 
349
+ $no_gzip = $start_line."\n".trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($GLOBALS['WS_PLUGIN__']['s2member']['c']['files_no_gzip_htaccess'])))."\n".$end_line;
350
+
351
+ if(file_exists($htaccess) && is_readable($htaccess) && is_writable($htaccess) && ($htaccess_contents = file_get_contents($htaccess)) !== FALSE && is_string($htaccess_contents = trim($htaccess_contents)))
352
+ {
353
+ if(stripos($htaccess_contents, $ideally_position_before) !== FALSE /* If we can position in the ideal location, that's awesome. Let's do that now. */)
354
+ $htaccess_contents = trim(str_ireplace($ideally_position_before, $no_gzip."\n\n".$ideally_position_before, $htaccess_contents));
355
+
356
+ else $htaccess_contents = trim($no_gzip."\n\n".$htaccess_contents); // Else, let's put it at the very top of the file by default.
357
+
358
+ return file_put_contents($htaccess, $htaccess_contents);
359
+ }
360
+ else if(!file_exists($htaccess) && is_writable(dirname($htaccess)))
361
+ {
362
+ return file_put_contents($htaccess, $no_gzip);
363
+ }
364
+ }
365
+ return FALSE; // Default return `FALSE`.
366
+ }
367
+
368
+ /**
369
+ * Removes no GZIP rules in root `.htaccess` file.
370
+ *
371
+ * @package s2Member\Files
372
+ * @since 120212
373
+ *
374
+ * @return bool True if successful, else false on any type of failure.
375
+ */
376
+ public static function remove_no_gzip_from_root_htaccess()
377
+ {
378
+ $start_line = '# BEGIN s2Member GZIP exclusions'; // Beginning line for this entry.
379
+ $end_line = '# END s2Member GZIP exclusions'; // Identifying end line for this entry.
380
+ $htaccess = ABSPATH.'.htaccess'; // Location of this `.htaccess` file we need to write in.
381
+
382
+ if(file_exists($htaccess) && is_readable($htaccess) && is_writable($htaccess) && ($htaccess_contents = file_get_contents($htaccess)) !== FALSE && is_string($htaccess_contents = trim($htaccess_contents)))
383
+ {
384
+ $htaccess_contents = trim(preg_replace('/'.preg_quote($start_line, '/').'['."\r\n".']+.*?['."\r\n".']+'.preg_quote($end_line, '/').'['."\r\n".']{0,2}/is', '', $htaccess_contents));
385
+
386
+ return (file_put_contents($htaccess, $htaccess_contents) !== FALSE); // Check for `FALSE`, because this could return `0` if the file is now empty.
387
+ }
388
+ else if(!file_exists($htaccess) /* Return `TRUE` here, we're OK. */)
389
+ {
390
+ return TRUE;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
391
  }
392
+ return FALSE; // Default return `FALSE`.
393
+ }
394
  }
395
+ }
includes/classes/getresponse.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @since 141004
15
  * @package s2Member\List_Servers
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_getresponse'))
14
  * @since 141004
15
  * @package s2Member\List_Servers
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_getresponse'))
includes/classes/installation.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Installation
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_installation'))
@@ -213,12 +213,18 @@ if(!class_exists('c_ws_plugin__s2member_installation'))
213
  if(is_multisite() && is_main_site() /* Site options? */)
214
  delete_site_option('ws_plugin__s2member_options');
215
 
216
- $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_'))."%'");
217
- $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_transient_s2m_'))."%'");
218
- $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_transient_timeout_s2m_'))."%'");
219
  $wpdb->query("DELETE FROM `".$wpdb->postmeta."` WHERE `meta_key` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_'))."%'");
 
 
 
220
  $wpdb->query("DELETE FROM `".$wpdb->usermeta."` WHERE `meta_key` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_'))."%'");
221
 
 
 
 
 
222
  do_action('ws_plugin__s2member_during_uninstall', get_defined_vars());
223
  }
224
  do_action('ws_plugin__s2member_after_uninstall', get_defined_vars());
14
  * @package s2Member\Installation
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_installation'))
213
  if(is_multisite() && is_main_site() /* Site options? */)
214
  delete_site_option('ws_plugin__s2member_options');
215
 
216
+ $wpdb->query("DELETE FROM `".$wpdb->postmeta."` WHERE `meta_key` LIKE '".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2m_'))."%'");
217
+ $wpdb->query("DELETE FROM `".$wpdb->postmeta."` WHERE `meta_key` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_s2m_'))."%'");
 
218
  $wpdb->query("DELETE FROM `".$wpdb->postmeta."` WHERE `meta_key` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_'))."%'");
219
+
220
+ $wpdb->query("DELETE FROM `".$wpdb->usermeta."` WHERE `meta_key` LIKE '".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2m_'))."%'");
221
+ $wpdb->query("DELETE FROM `".$wpdb->usermeta."` WHERE `meta_key` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_s2m_'))."%'");
222
  $wpdb->query("DELETE FROM `".$wpdb->usermeta."` WHERE `meta_key` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_'))."%'");
223
 
224
+ $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2m_'))."%'");
225
+ $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_s2m_'))."%'");
226
+ $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_'))."%'");
227
+
228
  do_action('ws_plugin__s2member_during_uninstall', get_defined_vars());
229
  }
230
  do_action('ws_plugin__s2member_after_uninstall', get_defined_vars());
includes/classes/ip-restrictions.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\IP_Restrictions
15
  * @since 3.5
16
  */
17
- if(realpath(__FILE__) === realpath($_SERVER["SCRIPT_FILENAME"]))
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_ip_restrictions"))
14
  * @package s2Member\IP_Restrictions
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_ip_restrictions"))
includes/classes/labels.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Roles_Caps
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_labels"))
14
  * @package s2Member\Roles_Caps
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_labels"))
includes/classes/list-server-base.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @since 141004
15
  * @package s2Member\List_Servers
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_list_server_base'))
14
  * @since 141004
15
  * @package s2Member\List_Servers
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_list_server_base'))
includes/classes/list-servers.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\List_Servers
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_list_servers'))
14
  * @package s2Member\List_Servers
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_list_servers'))
includes/classes/login-checks.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Login_Checks
15
  * @since 131025
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_login_checks'))
14
  * @package s2Member\Login_Checks
15
  * @since 131025
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_login_checks'))
includes/classes/login-customizations.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Login_Customizations
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_login_customizations'))
14
  * @package s2Member\Login_Customizations
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_login_customizations'))
includes/classes/login-redirects-r.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Login_Redirects
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_login_redirects_r"))
14
  * @package s2Member\Login_Redirects
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_login_redirects_r"))
includes/classes/login-redirects.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Login_Redirects
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_login_redirects'))
14
  * @package s2Member\Login_Redirects
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_login_redirects'))
includes/classes/mailchimp-o.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @since 141004
15
  * @package s2Member\List_Servers
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_mailchimp_o'))
14
  * @since 141004
15
  * @package s2Member\List_Servers
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_mailchimp_o'))
includes/classes/mailchimp.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @since 141004
15
  * @package s2Member\List_Servers
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_mailchimp'))
14
  * @since 141004
15
  * @package s2Member\List_Servers
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_mailchimp'))
includes/classes/menu-pages-rs.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
15
  * @since 110531
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_rs"))
14
  * @package s2Member\Menu_Pages
15
  * @since 110531
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_menu_pages_rs"))
includes/classes/menu-pages-tb.inc.php CHANGED
@@ -1,83 +1,84 @@
1
  <?php
2
  /**
3
- * Toolbox for Menu Pages.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\Menu_Pages
15
- * @since 131108
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_tb"))
 
 
 
 
 
 
 
 
21
  {
22
  /**
23
- * Toolbox for Menu Pages.
24
- *
25
- * @package s2Member\Menu_Pages
26
- * @since 131108
27
- */
28
- class c_ws_plugin__s2member_menu_pages_tb
29
- {
30
- /**
31
- * Toolbox for Menu Pages.
32
- *
33
- * @package s2Member\Menu_Pages
34
- * @since 131108
35
- *
36
- * @return null
37
- */
38
- public static function display ()
39
- {
40
- do_action("ws_plugin__s2member_during_menu_pages_before_toolbox_sections", get_defined_vars ());
41
-
42
- ob_start(); // output buffer these so we can display a toggler conditionally.
43
 
44
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["updates"])
45
- {
46
- echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Newsletter")) . '" target="_blank"><i class="fa fa-envelope"></i> s2 Updates (via Email)</a>';
47
- }
48
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["upsell-pro"])
49
- {
50
- echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Pro Module / Prices")) . '" target="_blank" style="font-size:120%; font-weight:bold;"><i class="fa fa-money"></i> s2Member® Pro (Upgrade)</a>' . "\n";
51
- }
52
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["installation"])
53
- {
54
- echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Professional Installation URI")) . '" target="_blank"><i class="fa fa-wrench"></i> Professional Installation Service</a>' . "\n";
55
- }
56
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["kb"])
57
- {
58
- echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Knowledge Base")) . '" target="_blank"><i class="fa fa-lightbulb-o"></i> Knowledge Base</a>' . "\n";
59
- }
60
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["videos"])
61
- {
62
- echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Video Tutorials")) . '" target="_blank"><i class="fa fa-film"></i> Video Tutorials</a>' . "\n";
63
- }
64
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["support"])
65
- {
66
- echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Forum URI")) . '" target="_blank"><i class="fa fa-comments-o"></i> Community</a>' . "\n";
67
- }
68
- if ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["menu_pages"]["donations"])
69
- {
70
- echo '<a href="' . esc_attr (c_ws_plugin__s2member_readmes::parse_readme_value ("Donate link")) . '" target="_blank"><i class="fa fa-heart-o"></i> Contribute</a>' . "\n";
71
- }
72
- if (($links = ob_get_clean()))
73
- {
74
- $links = '<div class="links">'.$links.'</div>';
75
- echo $links; // output content now; w/ possible toggler.
76
- }
77
- do_action("ws_plugin__s2member_during_menu_pages_after_toolbox_sections", get_defined_vars ());
78
 
79
- return /* return for uniformity. */;
80
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  }
 
 
82
  }
83
- ?>
1
  <?php
2
  /**
3
+ * Toolbox for Menu Pages.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Menu_Pages
15
+ * @since 131108
16
+ */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
+ exit('Do not access this file directly.');
19
 
20
+ if(!class_exists('c_ws_plugin__s2member_menu_pages_tb'))
21
+ {
22
+ /**
23
+ * Toolbox for Menu Pages.
24
+ *
25
+ * @package s2Member\Menu_Pages
26
+ * @since 131108
27
+ */
28
+ class c_ws_plugin__s2member_menu_pages_tb
29
  {
30
  /**
31
+ * Toolbox for Menu Pages.
32
+ *
33
+ * @package s2Member\Menu_Pages
34
+ * @since 131108
35
+ *
36
+ * @return null
37
+ */
38
+ public static function display()
39
+ {
40
+ do_action('ws_plugin__s2member_during_menu_pages_before_toolbox_sections', get_defined_vars());
 
 
 
 
 
 
 
 
 
 
41
 
42
+ ob_start(); // output buffer these so we can display a toggler conditionally.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
+ if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['updates'])
45
+ {
46
+ echo '<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value('Newsletter')).'" target="_blank"><i class="fa fa-envelope"></i> s2 Updates (via Email)</a>';
47
+ }
48
+ if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['upsell-pro'])
49
+ {
50
+ echo '<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value('Pro Module / Prices')).'" target="_blank" style="font-size:120%; font-weight:bold;"><i class="fa fa-money"></i> s2Member® Pro (Upgrade)</a>'."\n";
51
+ }
52
+ if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['installation'])
53
+ {
54
+ echo '<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value('Professional Installation URI')).'" target="_blank"><i class="fa fa-wrench"></i> Professional Installation Service</a>'."\n";
55
+ }
56
+ if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['kb'])
57
+ {
58
+ echo '<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value('Knowledge Base')).'" target="_blank"><i class="fa fa-lightbulb-o"></i> Knowledge Base</a>'."\n";
59
+ }
60
+ if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['videos'])
61
+ {
62
+ echo '<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value('Video Tutorials')).'" target="_blank"><i class="fa fa-film"></i> Video Tutorials</a>'."\n";
63
+ }
64
+ if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['support'])
65
+ {
66
+ echo '<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value('Forum URI')).'" target="_blank"><i class="fa fa-comments-o"></i> Community</a>'."\n";
67
+ }
68
+ if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['donations'])
69
+ {
70
+ echo '<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value('Donate link')).'" target="_blank"><i class="fa fa-heart-o"></i> Contribute</a>'."\n";
71
+ }
72
+ if($GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages']['beta'])
73
+ {
74
+ echo '<a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value('Beta link')).'" target="_blank"><i class="fa fa-flask"></i> Beta Testers</a>'."\n";
75
+ }
76
+ if(($links = ob_get_clean()))
77
+ {
78
+ $links = '<div class="links">'.$links.'</div>';
79
+ echo $links; // output content now; w/ possible toggler.
80
  }
81
+ do_action('ws_plugin__s2member_during_menu_pages_after_toolbox_sections', get_defined_vars());
82
+ }
83
  }
84
+ }
includes/classes/menu-pages.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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'))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_menu_pages'))
includes/classes/meta-box-saves.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Meta_Boxes
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_meta_box_saves"))
14
  * @package s2Member\Meta_Boxes
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_meta_box_saves"))
includes/classes/meta-box-security.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Meta_Boxes
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_meta_box_security"))
14
  * @package s2Member\Meta_Boxes
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_meta_box_security"))
includes/classes/meta-boxes.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Meta_Boxes
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_meta_boxes"))
14
  * @package s2Member\Meta_Boxes
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_meta_boxes"))
includes/classes/mms-patches.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Main_Multisite_Patches
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_mms_patches"))
14
  * @package s2Member\Main_Multisite_Patches
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_mms_patches"))
includes/classes/mo-page-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Membership_Options_Page
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_mo_page_in"))
14
  * @package s2Member\Membership_Options_Page
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_mo_page_in"))
includes/classes/mo-page.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Membership_Options_Page
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_mo_page"))
14
  * @package s2Member\Membership_Options_Page
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_mo_page"))
includes/classes/no-cache.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\No_Cache
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_no_cache'))
@@ -95,8 +95,8 @@ if(!class_exists('c_ws_plugin__s2member_no_cache'))
95
  if(!$once && (empty($_GET['qcAC']) || !filter_var($_GET['qcAC'], FILTER_VALIDATE_BOOLEAN))
96
  && (
97
  $no_cache === TRUE // Forces no-cache constants; if `TRUE` explicitly.
98
- || ($no_cache === 'restricted' && (!defined('QUICK_CACHE_WHEN_LOGGED_IN') || !QUICK_CACHE_WHEN_LOGGED_IN))
99
- || (is_user_logged_in() && (!defined('QUICK_CACHE_WHEN_LOGGED_IN') || !QUICK_CACHE_WHEN_LOGGED_IN))
100
  || c_ws_plugin__s2member_systematics::is_s2_systematic_use_page()
101
  )
102
  )
@@ -110,7 +110,7 @@ if(!class_exists('c_ws_plugin__s2member_no_cache'))
110
  * @var bool
111
  */
112
  if(!defined('DONOTCACHEDB'))
113
- define ('DONOTCACHEDB', TRUE);
114
 
115
  /**
116
  * No-cache Page for plugins.
@@ -121,7 +121,7 @@ if(!class_exists('c_ws_plugin__s2member_no_cache'))
121
  * @var bool
122
  */
123
  if(!defined('DONOTCACHEPAGE'))
124
- define ('DONOTCACHEPAGE', TRUE);
125
 
126
  /**
127
  * No-cache Objects for plugins.
@@ -132,7 +132,18 @@ if(!class_exists('c_ws_plugin__s2member_no_cache'))
132
  * @var bool
133
  */
134
  if(!defined('DONOTCACHEOBJECT'))
135
- define ('DONOTCACHEOBJECT', TRUE);
 
 
 
 
 
 
 
 
 
 
 
136
 
137
  /**
138
  * No-cache anything for Quick Cache plugin.
@@ -143,7 +154,7 @@ if(!class_exists('c_ws_plugin__s2member_no_cache'))
143
  * @var bool
144
  */
145
  if(!defined('QUICK_CACHE_ALLOWED'))
146
- define ('QUICK_CACHE_ALLOWED', FALSE);
147
 
148
  $once = TRUE; // Set these one time only.
149
 
@@ -185,7 +196,11 @@ if(!class_exists('c_ws_plugin__s2member_no_cache'))
185
 
186
  $using_selective_behavior = apply_filters('ws_plugin__s2member_no_cache_headers_selective', FALSE, get_defined_vars());
187
 
188
- if(!$once && !headers_sent() && (empty($_GET['qcABC']) || !filter_var($_GET['qcABC'], FILTER_VALIDATE_BOOLEAN)) && ($no_cache || !$using_selective_behavior || c_ws_plugin__s2member_no_cache::$headers))
 
 
 
 
189
  if(!apply_filters('ws_plugin__s2member_disable_no_cache_headers', FALSE, get_defined_vars()))
190
  {
191
  foreach(headers_list() as $header) // No-cache headers already sent? We need to check here.
14
  * @package s2Member\No_Cache
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_no_cache'))
95
  if(!$once && (empty($_GET['qcAC']) || !filter_var($_GET['qcAC'], FILTER_VALIDATE_BOOLEAN))
96
  && (
97
  $no_cache === TRUE // Forces no-cache constants; if `TRUE` explicitly.
98
+ || ($no_cache === 'restricted' && (!defined('ZENCACHE_WHEN_LOGGED_IN') || !ZENCACHE_WHEN_LOGGED_IN) && (!defined('QUICK_CACHE_WHEN_LOGGED_IN') || !QUICK_CACHE_WHEN_LOGGED_IN))
99
+ || (is_user_logged_in() && (!defined('ZENCACHE_WHEN_LOGGED_IN') || !ZENCACHE_WHEN_LOGGED_IN) && (!defined('QUICK_CACHE_WHEN_LOGGED_IN') || !QUICK_CACHE_WHEN_LOGGED_IN))
100
  || c_ws_plugin__s2member_systematics::is_s2_systematic_use_page()
101
  )
102
  )
110
  * @var bool
111
  */
112
  if(!defined('DONOTCACHEDB'))
113
+ define('DONOTCACHEDB', TRUE);
114
 
115
  /**
116
  * No-cache Page for plugins.
121
  * @var bool
122
  */
123
  if(!defined('DONOTCACHEPAGE'))
124
+ define('DONOTCACHEPAGE', TRUE);
125
 
126
  /**
127
  * No-cache Objects for plugins.
132
  * @var bool
133
  */
134
  if(!defined('DONOTCACHEOBJECT'))
135
+ define('DONOTCACHEOBJECT', TRUE);
136
+
137
+ /**
138
+ * No-cache anything for ZenCache plugin.
139
+ *
140
+ * @package s2Member\No_Cache
141
+ * @since 3.5
142
+ *
143
+ * @var bool
144
+ */
145
+ if(!defined('ZENCACHE_ALLOWED'))
146
+ define('ZENCACHE_ALLOWED', FALSE);
147
 
148
  /**
149
  * No-cache anything for Quick Cache plugin.
154
  * @var bool
155
  */
156
  if(!defined('QUICK_CACHE_ALLOWED'))
157
+ define('QUICK_CACHE_ALLOWED', FALSE);
158
 
159
  $once = TRUE; // Set these one time only.
160
 
196
 
197
  $using_selective_behavior = apply_filters('ws_plugin__s2member_no_cache_headers_selective', FALSE, get_defined_vars());
198
 
199
+ if(!$once && !headers_sent() // Only once, and only if possible.
200
+ && (empty($_GET['zcABC']) || !filter_var($_GET['zcABC'], FILTER_VALIDATE_BOOLEAN))
201
+ && (empty($_GET['qcABC']) || !filter_var($_GET['qcABC'], FILTER_VALIDATE_BOOLEAN))
202
+ && ($no_cache || !$using_selective_behavior || c_ws_plugin__s2member_no_cache::$headers)
203
+ )
204
  if(!apply_filters('ws_plugin__s2member_disable_no_cache_headers', FALSE, get_defined_vars()))
205
  {
206
  foreach(headers_list() as $header) // No-cache headers already sent? We need to check here.
includes/classes/op-notices.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Option_Notices
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_op_notices"))
14
  * @package s2Member\Option_Notices
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_op_notices"))
includes/classes/option-forces.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Option_Forces
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_option_forces"))
14
  * @package s2Member\Option_Forces
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_option_forces"))
includes/classes/pages-sp.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Pages
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_pages_sp'))
14
  * @package s2Member\Pages
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_pages_sp'))
includes/classes/pages.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Pages
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_pages'))
14
  * @package s2Member\Pages
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_pages'))
includes/classes/paypal-notify-in-billing-agreement-signup.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 140326
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_paypal_notify_in_billing_agreement_signup"))
14
  * @package s2Member\PayPal
15
  * @since 140326
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_billing_agreement_signup"))
includes/classes/paypal-notify-in-cart.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_cart"))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_cart"))
includes/classes/paypal-notify-in-express-checkout.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_express_checkout"))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_express_checkout"))
includes/classes/paypal-notify-in-rec-profile-creation-w-level.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_rec_profile_creation_w_level"))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_rec_profile_creation_w_level"))
includes/classes/paypal-notify-in-send-money.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_send_money"))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_send_money"))
includes/classes/paypal-notify-in-sp-refund-reversal.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_sp_refund_reversal'))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_sp_refund_reversal'))
includes/classes/paypal-notify-in-subscr-modify-w-level.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_subscr_modify_w_level'))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_modify_w_level'))
includes/classes/paypal-notify-in-subscr-or-rp-cancellation-w-level.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_subscr_or_rp_cancellation_w_level"))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_cancellation_w_level"))
includes/classes/paypal-notify-in-subscr-or-rp-eots-w-level.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_subscr_or_rp_eots_w_level'))
@@ -122,13 +122,12 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_lev
122
  if($existing_role !== $demotion_role) // Only if NOT the existing Role.
123
  $user->set_role($demotion_role); // Give User the demotion Role.
124
 
125
- if(apply_filters('ws_plugin__s2member_remove_ccaps_during_eot_events',
126
- ((bool)$GLOBALS['WS_PLUGIN__']['s2member']['o']['eots_remove_ccaps'] || $is_refund_or_reversal), get_defined_vars()))
127
  foreach($user->allcaps as $cap => $cap_enabled)
128
  if(preg_match('/^access_s2member_ccap_/', $cap))
129
  $user->remove_cap($ccap = $cap);
130
 
131
- delete_user_option($user_id, 's2member_custom');
132
  delete_user_option($user_id, 's2member_subscr_id');
133
  delete_user_option($user_id, 's2member_subscr_baid');
134
  delete_user_option($user_id, 's2member_subscr_cid');
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_eots_w_level'))
122
  if($existing_role !== $demotion_role) // Only if NOT the existing Role.
123
  $user->set_role($demotion_role); // Give User the demotion Role.
124
 
125
+ if(apply_filters('ws_plugin__s2member_remove_ccaps_during_eot_events', (bool)$GLOBALS['WS_PLUGIN__']['s2member']['o']['eots_remove_ccaps'] || $is_refund_or_reversal, get_defined_vars()))
 
126
  foreach($user->allcaps as $cap => $cap_enabled)
127
  if(preg_match('/^access_s2member_ccap_/', $cap))
128
  $user->remove_cap($ccap = $cap);
129
 
130
+ // delete_user_option($user_id, 's2member_custom');
131
  delete_user_option($user_id, 's2member_subscr_id');
132
  delete_user_option($user_id, 's2member_subscr_baid');
133
  delete_user_option($user_id, 's2member_subscr_cid');
includes/classes/paypal-notify-in-subscr-or-rp-payment-failed-w-level.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_subscr_or_rp_payment_failed_w_level"))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_failed_w_level"))
includes/classes/paypal-notify-in-subscr-or-rp-payment-w-level.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_subscr_or_rp_payment_w_level'))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_rp_payment_w_level'))
includes/classes/paypal-notify-in-subscr-or-wa-w-level.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_subscr_or_wa_w_level'))
@@ -81,6 +81,11 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_wa_w_level'))
81
  $paypal['currency'] = strtoupper($paypal['mc_currency']); // Normalize input currency.
82
  $paypal['currency_symbol'] = c_ws_plugin__s2member_utils_cur::symbol($paypal['currency']);
83
 
 
 
 
 
 
84
  $ipn_signup_vars = $paypal; // Create array of IPN signup vars w/o s2member_log.
85
  unset($ipn_signup_vars['s2member_log']);
86
  /*
@@ -156,6 +161,13 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_wa_w_level'))
156
  $pr_times['level'.$paypal['level']] = (!$pr_times['level'.$paypal['level']]) ? time() : $pr_times['level'.$paypal['level']];
157
  update_user_option($user_id, 's2member_paid_registration_times', $pr_times);
158
 
 
 
 
 
 
 
 
159
  c_ws_plugin__s2member_user_notes::clear_user_note_lines($user_id, '/^Demoted by s2Member\:/');
160
  c_ws_plugin__s2member_user_notes::clear_user_note_lines($user_id, '/^Paid Subscr\. ID @ time of demotion\:/');
161
 
@@ -644,6 +656,13 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_wa_w_level'))
644
  $fields = get_user_option('s2member_custom_fields', $user_id); // These will be needed in the routines below.
645
  $user_reg_ip = get_user_option('s2member_registration_ip', $user_id); // Original IP during Registration.
646
 
 
 
 
 
 
 
 
647
  if($GLOBALS['WS_PLUGIN__']['s2member']['o']['payment_notification_urls'] && is_array($cv = preg_split('/\|/', $paypal['custom'])))
648
  {
649
  foreach(preg_split('/['."\r\n\t".']+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['payment_notification_urls']) as $url)
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_subscr_or_wa_w_level'))
81
  $paypal['currency'] = strtoupper($paypal['mc_currency']); // Normalize input currency.
82
  $paypal['currency_symbol'] = c_ws_plugin__s2member_utils_cur::symbol($paypal['currency']);
83
 
84
+ if(!empty($coupon['coupon_code']) && c_ws_plugin__s2member_utils_conds::pro_is_installed())
85
+ {
86
+ $coupon_class = new c_ws_plugin__s2member_pro_coupons();
87
+ $coupon_class->update_uses($coupon['coupon_code']);
88
+ }
89
  $ipn_signup_vars = $paypal; // Create array of IPN signup vars w/o s2member_log.
90
  unset($ipn_signup_vars['s2member_log']);
91
  /*
161
  $pr_times['level'.$paypal['level']] = (!$pr_times['level'.$paypal['level']]) ? time() : $pr_times['level'.$paypal['level']];
162
  update_user_option($user_id, 's2member_paid_registration_times', $pr_times);
163
 
164
+ if(!empty($coupon['full_coupon_code']) && c_ws_plugin__s2member_utils_conds::pro_is_installed())
165
+ {
166
+ $user_coupons = is_array($user_coupons = get_user_option('s2member_coupon_codes', $user_id)) ? $user_coupons : array();
167
+ $user_coupons = array_unique(array_merge($user_coupons, (array)$coupon['full_coupon_code']));
168
+ update_user_option($user_id, 's2member_coupon_codes', $user_coupons);
169
+ $processed_coupons = TRUE; // Flag for routines below.
170
+ }
171
  c_ws_plugin__s2member_user_notes::clear_user_note_lines($user_id, '/^Demoted by s2Member\:/');
172
  c_ws_plugin__s2member_user_notes::clear_user_note_lines($user_id, '/^Paid Subscr\. ID @ time of demotion\:/');
173
 
656
  $fields = get_user_option('s2member_custom_fields', $user_id); // These will be needed in the routines below.
657
  $user_reg_ip = get_user_option('s2member_registration_ip', $user_id); // Original IP during Registration.
658
 
659
+ if(empty($processed_coupons) && !empty($coupon['full_coupon_code']) && c_ws_plugin__s2member_utils_conds::pro_is_installed())
660
+ {
661
+ $user_coupons = is_array($user_coupons = get_user_option('s2member_coupon_codes', $user_id)) ? $user_coupons : array();
662
+ $user_coupons = array_unique(array_merge($user_coupons, (array)$coupon['full_coupon_code']));
663
+ update_user_option($user_id, 's2member_coupon_codes', $user_coupons);
664
+ $processed_coupons = TRUE; // Flag for routines below.
665
+ }
666
  if($GLOBALS['WS_PLUGIN__']['s2member']['o']['payment_notification_urls'] && is_array($cv = preg_split('/\|/', $paypal['custom'])))
667
  {
668
  foreach(preg_split('/['."\r\n\t".']+/', $GLOBALS['WS_PLUGIN__']['s2member']['o']['payment_notification_urls']) as $url)
includes/classes/paypal-notify-in-virtual-terminal.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_virtual_terminal"))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_notify_in_virtual_terminal"))
includes/classes/paypal-notify-in-wa-ccaps-wo-level.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110815
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_paypal_notify_in_wa_ccaps_wo_level'))
@@ -65,6 +65,11 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_wa_ccaps_wo_level'))
65
  $paypal['currency'] = strtoupper($paypal['mc_currency']); // Normalize input currency.
66
  $paypal['currency_symbol'] = c_ws_plugin__s2member_utils_cur::symbol($paypal['currency']);
67
 
 
 
 
 
 
68
  if(preg_match('/(referenc|associat|updat|upgrad)/i', $paypal['option_name1']) && $paypal['option_selection1']) // Must have this information for Capability additions.
69
  {
70
  if(($user_id = c_ws_plugin__s2member_utils_users::get_user_id_with($paypal['txn_id'], $paypal['option_selection1'])) && is_object($user = new WP_User ($user_id)) && $user->ID)
@@ -99,6 +104,12 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_wa_ccaps_wo_level'))
99
  if(!get_user_option('s2member_registration_ip', $user_id))
100
  update_user_option($user_id, 's2member_registration_ip', $paypal['ip']);
101
 
 
 
 
 
 
 
102
  $paypal['s2member_log'][] = 's2Member Custom Capabilities updated w/ advanced update routines.';
103
 
104
  $sbj = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ccap_email_subject']; // The same for standard and w/ Pro Forms.
14
  * @package s2Member\PayPal
15
  * @since 110815
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_wa_ccaps_wo_level'))
65
  $paypal['currency'] = strtoupper($paypal['mc_currency']); // Normalize input currency.
66
  $paypal['currency_symbol'] = c_ws_plugin__s2member_utils_cur::symbol($paypal['currency']);
67
 
68
+ if(!empty($coupon['coupon_code']) && c_ws_plugin__s2member_utils_conds::pro_is_installed())
69
+ {
70
+ $coupon_class = new c_ws_plugin__s2member_pro_coupons();
71
+ $coupon_class->update_uses($coupon['coupon_code']);
72
+ }
73
  if(preg_match('/(referenc|associat|updat|upgrad)/i', $paypal['option_name1']) && $paypal['option_selection1']) // Must have this information for Capability additions.
74
  {
75
  if(($user_id = c_ws_plugin__s2member_utils_users::get_user_id_with($paypal['txn_id'], $paypal['option_selection1'])) && is_object($user = new WP_User ($user_id)) && $user->ID)
104
  if(!get_user_option('s2member_registration_ip', $user_id))
105
  update_user_option($user_id, 's2member_registration_ip', $paypal['ip']);
106
 
107
+ if(!empty($coupon['full_coupon_code']) && c_ws_plugin__s2member_utils_conds::pro_is_installed())
108
+ {
109
+ $user_coupons = is_array($user_coupons = get_user_option('s2member_coupon_codes', $user_id)) ? $user_coupons : array();
110
+ $user_coupons = array_unique(array_merge($user_coupons, (array)$coupon['full_coupon_code']));
111
+ update_user_option($user_id, 's2member_coupon_codes', $user_coupons);
112
+ }
113
  $paypal['s2member_log'][] = 's2Member Custom Capabilities updated w/ advanced update routines.';
114
 
115
  $sbj = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ccap_email_subject']; // The same for standard and w/ Pro Forms.
includes/classes/paypal-notify-in-web-accept-sp.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_notify_in_web_accept_sp'))
@@ -64,6 +64,11 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_web_accept_sp'))
64
  $paypal['currency'] = strtoupper($paypal['mc_currency']); // Normalize input currency.
65
  $paypal['currency_symbol'] = c_ws_plugin__s2member_utils_cur::symbol($paypal['currency']);
66
 
 
 
 
 
 
67
  if(($sp_access_url = c_ws_plugin__s2member_sp_access::sp_access_link_gen($paypal['sp_ids'], $paypal['hours'])) && is_array($cv = preg_split('/\|/', $paypal['custom'])))
68
  {
69
  $processing = $during = TRUE; // Yes, we ARE processing this.
@@ -76,6 +81,12 @@ if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_web_accept_sp'))
76
  $sp_references = c_ws_plugin__s2member_utils_arrays::array_unique(array_merge($sp_references, $_sp_reference));
77
  update_user_option($user_id, 's2member_sp_references', $sp_references);
78
 
 
 
 
 
 
 
79
  $paypal['s2member_log'][] = 'Specific Post/Page ~ Sale associated with User ID: '.$user_id.'.';
80
  }
81
  $sbj = preg_replace('/%%sp_access_url%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($sp_access_url), $GLOBALS['WS_PLUGIN__']['s2member']['o'][(($_REQUEST['s2member_paypal_proxy'] && preg_match('/pro-emails/', $_REQUEST['s2member_paypal_proxy_use'])) ? 'pro_' : '').'sp_email_subject']);
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_notify_in_web_accept_sp'))
64
  $paypal['currency'] = strtoupper($paypal['mc_currency']); // Normalize input currency.
65
  $paypal['currency_symbol'] = c_ws_plugin__s2member_utils_cur::symbol($paypal['currency']);
66
 
67
+ if(!empty($coupon['coupon_code']) && c_ws_plugin__s2member_utils_conds::pro_is_installed())
68
+ {
69
+ $coupon_class = new c_ws_plugin__s2member_pro_coupons();
70
+ $coupon_class->update_uses($coupon['coupon_code']);
71
+ }
72
  if(($sp_access_url = c_ws_plugin__s2member_sp_access::sp_access_link_gen($paypal['sp_ids'], $paypal['hours'])) && is_array($cv = preg_split('/\|/', $paypal['custom'])))
73
  {
74
  $processing = $during = TRUE; // Yes, we ARE processing this.
81
  $sp_references = c_ws_plugin__s2member_utils_arrays::array_unique(array_merge($sp_references, $_sp_reference));
82
  update_user_option($user_id, 's2member_sp_references', $sp_references);
83
 
84
+ if(!empty($coupon['full_coupon_code']) && c_ws_plugin__s2member_utils_conds::pro_is_installed())
85
+ {
86
+ $user_coupons = is_array($user_coupons = get_user_option('s2member_coupon_codes', $user_id)) ? $user_coupons : array();
87
+ $user_coupons = array_unique(array_merge($user_coupons, (array)$coupon['full_coupon_code']));
88
+ update_user_option($user_id, 's2member_coupon_codes', $user_coupons);
89
+ }
90
  $paypal['s2member_log'][] = 'Specific Post/Page ~ Sale associated with User ID: '.$user_id.'.';
91
  }
92
  $sbj = preg_replace('/%%sp_access_url%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($sp_access_url), $GLOBALS['WS_PLUGIN__']['s2member']['o'][(($_REQUEST['s2member_paypal_proxy'] && preg_match('/pro-emails/', $_REQUEST['s2member_paypal_proxy_use'])) ? 'pro_' : '').'sp_email_subject']);
includes/classes/paypal-notify-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
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_paypal_notify_in'))
14
  * @package s2Member\PayPal
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_notify_in'))
includes/classes/paypal-notify.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
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_paypal_notify'))
14
  * @package s2Member\PayPal
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_notify'))
includes/classes/paypal-return-in-no-tx-data.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_return_in_no_tx_data"))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_return_in_no_tx_data"))
includes/classes/paypal-return-in-proxy-ty-email.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_return_in_proxy_ty_email"))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_return_in_proxy_ty_email"))
includes/classes/paypal-return-in-proxy-x-preview.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_return_in_proxy_x_preview"))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_return_in_proxy_x_preview"))
includes/classes/paypal-return-in-subscr-modify-w-level.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_return_in_subscr_modify_w_level'))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_return_in_subscr_modify_w_level'))
includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_return_in_subscr_or_wa_w_level'))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_return_in_subscr_or_wa_w_level'))
includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_return_in_wa_ccaps_wo_level'))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_return_in_wa_ccaps_wo_level'))
includes/classes/paypal-return-in-web-accept-sp.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
15
  * @since 110720
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_paypal_return_in_web_accept_sp'))
14
  * @package s2Member\PayPal
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_return_in_web_accept_sp'))
includes/classes/paypal-return-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
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_paypal_return_in"))
14
  * @package s2Member\PayPal
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_paypal_return_in"))
includes/classes/paypal-return.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
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_paypal_return'))
14
  * @package s2Member\PayPal
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_paypal_return'))
includes/classes/paypal-utilities.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
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_paypal_utilities"))
14
  * @package s2Member\PayPal
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_paypal_utilities"))
includes/classes/posts-sp.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Posts
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_posts_sp'))
14
  * @package s2Member\Posts
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_posts_sp'))
includes/classes/posts.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Posts
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_posts'))
14
  * @package s2Member\Posts
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_posts'))
includes/classes/profile-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Profiles
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_profile_in'))
14
  * @package s2Member\Profiles
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_profile_in'))
includes/classes/profile-mods-4bp-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Profiles
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_profile_mods_4bp_in'))
14
  * @package s2Member\Profiles
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_profile_mods_4bp_in'))
includes/classes/profile-mods-4bp.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Profiles
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_profile_mods_4bp'))
14
  * @package s2Member\Profiles
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_profile_mods_4bp'))
includes/classes/profile-mods-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Profiles
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_profile_mods_in'))
@@ -73,7 +73,7 @@ if(!class_exists('c_ws_plugin__s2member_profile_mods_in'))
73
  if(!empty($_p['ws_plugin__s2member_profile_last_name']))
74
  $userdata['last_name'] = $_p['ws_plugin__s2member_profile_last_name'];
75
 
76
- wp_update_user($userdata); // OK. Now send this array for an update.
77
 
78
  if($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_fields'])
79
  if($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level('auto-detection', 'profile'))
14
  * @package s2Member\Profiles
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_profile_mods_in'))
73
  if(!empty($_p['ws_plugin__s2member_profile_last_name']))
74
  $userdata['last_name'] = $_p['ws_plugin__s2member_profile_last_name'];
75
 
76
+ wp_update_user(wp_slash($userdata)); // OK. Now send this array for an update.
77
 
78
  if($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_fields'])
79
  if($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level('auto-detection', 'profile'))
includes/classes/profile-mods.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Profiles
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_profile_mods'))
14
  * @package s2Member\Profiles
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_profile_mods'))
includes/classes/profile.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Profiles
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_profile'))
14
  * @package s2Member\Profiles
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_profile'))
includes/classes/ptags-sp.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Tags
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_ptags_sp'))
14
  * @package s2Member\Tags
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_ptags_sp'))
includes/classes/ptags.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Tags
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_ptags'))
14
  * @package s2Member\Tags
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_ptags'))
includes/classes/querys.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Queries
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_querys'))
14
  * @package s2Member\Queries
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_querys'))
includes/classes/readmes.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Readmes
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_readmes"))
14
  * @package s2Member\Readmes
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_readmes"))
includes/classes/register-access.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Registrations
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_register_access'))
14
  * @package s2Member\Registrations
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_register_access'))
includes/classes/register-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Registrations
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_register_in"))
14
  * @package s2Member\Registrations
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_register_in"))
includes/classes/register.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Registrations
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_register"))
14
  * @package s2Member\Registrations
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_register"))
includes/classes/registration-times.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Registrations
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_registration_times"))
14
  * @package s2Member\Registrations
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_registration_times"))
includes/classes/registrations.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Registrations
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_registrations'))
@@ -300,7 +300,7 @@ if(!class_exists('c_ws_plugin__s2member_registrations'))
300
  if(!empty($user_already_exists) && c_ws_plugin__s2member_utils_users::ms_user_login_email_exists_but_not_on_blog($user_login, $user_email, $meta['add_to_blog']))
301
  {
302
  add_user_to_blog($meta['add_to_blog'], $user_id, $meta['new_role']); // Add this User to the specified Blog.
303
- wp_update_user(array('ID' => $user_id, 'user_pass' => $password)); // Update Password so it's the same as in the following msg.
304
  wpmu_welcome_user_notification($user_id, $password, $meta); // Send welcome letter via email just like ``wpmu_activate_signup()`` does.
305
 
306
  do_action('wpmu_activate_user', $user_id, $password, $meta); // Process Hook that would have been fired inside ``wpmu_activate_signup()``.
@@ -503,7 +503,7 @@ if(!class_exists('c_ws_plugin__s2member_registrations'))
503
  {
504
  $role = get_option('default_role'); // Use default Role.
505
  add_existing_user_to_blog(array('user_id' => $user_id, 'role' => $role)); // Add User.
506
- wp_update_user(array('ID' => $user_id, 'user_pass' => $user_pass)); // Update to ``$user_pass``.
507
 
508
  do_action('ws_plugin__s2member_during_ms_create_existing_user', get_defined_vars());
509
  do_action('user_register', $user_id); // So s2Member knows a User is registering.
@@ -669,13 +669,13 @@ if(!class_exists('c_ws_plugin__s2member_registrations'))
669
  if(!$user->display_name || $user->display_name === $user->user_login)
670
  {
671
  if($custom_reg_display_name === 'full' && $name)
672
- wp_update_user(array('ID' => $user_id, 'display_name' => $name));
673
  else if($custom_reg_display_name === 'first' && $fname)
674
- wp_update_user(array('ID' => $user_id, 'display_name' => $fname));
675
  else if($custom_reg_display_name === 'last' && $lname)
676
- wp_update_user(array('ID' => $user_id, 'display_name' => $lname));
677
  else if($custom_reg_display_name === 'login' && $login)
678
- wp_update_user(array('ID' => $user_id, 'display_name' => $login));
679
  }
680
  if(is_multisite()) // Should we handle Main Site permissions and Originating Blog ID#?
681
  {
@@ -844,13 +844,13 @@ if(!class_exists('c_ws_plugin__s2member_registrations'))
844
  if(!$user->display_name || $user->display_name === $user->user_login)
845
  {
846
  if($custom_reg_display_name === 'full' && $name)
847
- wp_update_user(array('ID' => $user_id, 'display_name' => $name));
848
  else if($custom_reg_display_name === 'first' && $fname)
849
- wp_update_user(array('ID' => $user_id, 'display_name' => $fname));
850
  else if($custom_reg_display_name === 'last' && $lname)
851
- wp_update_user(array('ID' => $user_id, 'display_name' => $lname));
852
  else if($custom_reg_display_name === 'login' && $login)
853
- wp_update_user(array('ID' => $user_id, 'display_name' => $login));
854
  }
855
  if(is_multisite( /* Should we handle Main Site permissions and Originating Blog ID#? */))
856
  {
@@ -985,13 +985,13 @@ if(!class_exists('c_ws_plugin__s2member_registrations'))
985
  if(!$user->display_name || $user->display_name === $user->user_login)
986
  {
987
  if($custom_reg_display_name === 'full' && $name)
988
- wp_update_user(array('ID' => $user_id, 'display_name' => $name));
989
  else if($custom_reg_display_name === 'first' && $fname)
990
- wp_update_user(array('ID' => $user_id, 'display_name' => $fname));
991
  else if($custom_reg_display_name === 'last' && $lname)
992
- wp_update_user(array('ID' => $user_id, 'display_name' => $lname));
993
  else if($custom_reg_display_name === 'login' && $login)
994
- wp_update_user(array('ID' => $user_id, 'display_name' => $login));
995
  }
996
  if(is_multisite()) // Should we handle Main Site permissions and Originating Blog ID#?
997
  {
@@ -1190,6 +1190,7 @@ if(!class_exists('c_ws_plugin__s2member_registrations'))
1190
  Logging now supports Multisite Networking as well. */
1191
 
1192
  $reg_vars = get_defined_vars(); // All defined vars.
 
1193
  // No need to include these in the logs. Unset before log entry.
1194
  unset($reg_vars['wpdb'], $reg_vars['current_site'], $reg_vars['current_blog']);
1195
  c_ws_plugin__s2member_utils_logs::log_entry('reg-handler', $reg_vars);
14
  * @package s2Member\Registrations
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_registrations'))
300
  if(!empty($user_already_exists) && c_ws_plugin__s2member_utils_users::ms_user_login_email_exists_but_not_on_blog($user_login, $user_email, $meta['add_to_blog']))
301
  {
302
  add_user_to_blog($meta['add_to_blog'], $user_id, $meta['new_role']); // Add this User to the specified Blog.
303
+ wp_update_user(wp_slash(array('ID' => $user_id, 'user_pass' => $password))); // Update Password so it's the same as in the following msg.
304
  wpmu_welcome_user_notification($user_id, $password, $meta); // Send welcome letter via email just like ``wpmu_activate_signup()`` does.
305
 
306
  do_action('wpmu_activate_user', $user_id, $password, $meta); // Process Hook that would have been fired inside ``wpmu_activate_signup()``.
503
  {
504
  $role = get_option('default_role'); // Use default Role.
505
  add_existing_user_to_blog(array('user_id' => $user_id, 'role' => $role)); // Add User.
506
+ wp_update_user(wp_slash(array('ID' => $user_id, 'user_pass' => $user_pass))); // Update to ``$user_pass``.
507
 
508
  do_action('ws_plugin__s2member_during_ms_create_existing_user', get_defined_vars());
509
  do_action('user_register', $user_id); // So s2Member knows a User is registering.
669
  if(!$user->display_name || $user->display_name === $user->user_login)
670
  {
671
  if($custom_reg_display_name === 'full' && $name)
672
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $name)));
673
  else if($custom_reg_display_name === 'first' && $fname)
674
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $fname)));
675
  else if($custom_reg_display_name === 'last' && $lname)
676
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $lname)));
677
  else if($custom_reg_display_name === 'login' && $login)
678
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $login)));
679
  }
680
  if(is_multisite()) // Should we handle Main Site permissions and Originating Blog ID#?
681
  {
844
  if(!$user->display_name || $user->display_name === $user->user_login)
845
  {
846
  if($custom_reg_display_name === 'full' && $name)
847
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $name)));
848
  else if($custom_reg_display_name === 'first' && $fname)
849
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $fname)));
850
  else if($custom_reg_display_name === 'last' && $lname)
851
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $lname)));
852
  else if($custom_reg_display_name === 'login' && $login)
853
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $login)));
854
  }
855
  if(is_multisite( /* Should we handle Main Site permissions and Originating Blog ID#? */))
856
  {
985
  if(!$user->display_name || $user->display_name === $user->user_login)
986
  {
987
  if($custom_reg_display_name === 'full' && $name)
988
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $name)));
989
  else if($custom_reg_display_name === 'first' && $fname)
990
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $fname)));
991
  else if($custom_reg_display_name === 'last' && $lname)
992
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $lname)));
993
  else if($custom_reg_display_name === 'login' && $login)
994
+ wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $login)));
995
  }
996
  if(is_multisite()) // Should we handle Main Site permissions and Originating Blog ID#?
997
  {
1190
  Logging now supports Multisite Networking as well. */
1191
 
1192
  $reg_vars = get_defined_vars(); // All defined vars.
1193
+ $reg_vars['_COOKIE'] = $_COOKIE; // Record cookies also.
1194
  // No need to include these in the logs. Unset before log entry.
1195
  unset($reg_vars['wpdb'], $reg_vars['current_site'], $reg_vars['current_blog']);
1196
  c_ws_plugin__s2member_utils_logs::log_entry('reg-handler', $reg_vars);
includes/classes/return-templates.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Return_Templates
15
  * @since 110720
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_return_templates'))
14
  * @package s2Member\Return_Templates
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_return_templates'))
includes/classes/roles-caps.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Roles_Caps
15
  * @since 110524RC
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_roles_caps'))
14
  * @package s2Member\Roles_Caps
15
  * @since 110524RC
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_roles_caps'))
includes/classes/ruris-sp.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\URIs
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_ruris_sp'))
14
  * @package s2Member\URIs
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_ruris_sp'))
includes/classes/ruris.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\URIs
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_ruris'))
14
  * @package s2Member\URIs
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_ruris'))
includes/classes/s-badge-status-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Security_Badges
15
  * @since 110524RC
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_s_badge_status_in"))
14
  * @package s2Member\Security_Badges
15
  * @since 110524RC
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_s_badge_status_in"))
includes/classes/s-badge-status.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Security_Badges
15
  * @since 110524RC
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_s_badge_status"))
14
  * @package s2Member\Security_Badges
15
  * @since 110524RC
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_s_badge_status"))
includes/classes/sc-files-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\s2File
15
  * @since 110926
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_sc_files_in'))
14
  * @package s2Member\s2File
15
  * @since 110926
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_sc_files_in'))
includes/classes/sc-files.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\s2File
15
  * @since 110926
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_sc_files"))
14
  * @package s2Member\s2File
15
  * @since 110926
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_sc_files"))
includes/classes/sc-gets-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\s2Get
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_sc_gets_in'))
14
  * @package s2Member\s2Get
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_sc_gets_in'))
includes/classes/sc-gets.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\s2Get
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_sc_gets'))
14
  * @package s2Member\s2Get
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_sc_gets'))
includes/classes/sc-if-conds-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\s2If
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_sc_if_conds_in'))
14
  * @package s2Member\s2If
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_sc_if_conds_in'))
includes/classes/sc-if-conds.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\s2If
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_sc_if_conds'))
14
  * @package s2Member\s2If
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_sc_if_conds'))
includes/classes/sc-keys-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\s2Key
15
  * @since 110912
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_sc_keys_in'))
14
  * @package s2Member\s2Key
15
  * @since 110912
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_sc_keys_in'))
includes/classes/sc-keys.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\s2Key
15
  * @since 110912
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_sc_keys'))
14
  * @package s2Member\s2Key
15
  * @since 110912
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_sc_keys'))
includes/classes/sc-paypal-button-e.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
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_sc_paypal_button_e"))
14
  * @package s2Member\PayPal
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_e"))
includes/classes/sc-paypal-button-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
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_sc_paypal_button_in"))
14
  * @package s2Member\PayPal
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button_in"))
includes/classes/sc-paypal-button.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\PayPal
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_sc_paypal_button"))
14
  * @package s2Member\PayPal
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_sc_paypal_button"))
includes/classes/sc-profile-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Profiles
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_sc_profile_in'))
14
  * @package s2Member\Profiles
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_sc_profile_in'))
includes/classes/sc-profile.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Profiles
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_sc_profile"))
14
  * @package s2Member\Profiles
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_sc_profile"))
includes/classes/sc-s-badge-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Security_Badges
15
  * @since 110524RC
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_sc_s_badge_in"))
14
  * @package s2Member\Security_Badges
15
  * @since 110524RC
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_sc_s_badge_in"))
includes/classes/sc-s-badge.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Security_Badges
15
  * @since 110524RC
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_sc_s_badge"))
14
  * @package s2Member\Security_Badges
15
  * @since 110524RC
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_sc_s_badge"))
includes/classes/security.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Security
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_security'))
14
  * @package s2Member\Security
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_security'))
includes/classes/sp-access.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\SP_Access
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_sp_access"))
@@ -92,7 +92,7 @@ if (!class_exists ("c_ws_plugin__s2member_sp_access"))
92
  * @param bool $read_only Optional. Defaults to false. If ``$read_only = true``,
93
  * no session cookies are set, no IP Restrictions are checked, and script execution is not exited on Link failure.
94
  * In other words, with ``$read_only = true``, this function will simply return true or false.
95
- * @return null|bool Always returns `true` if access is indeed allowed in one way or another.
96
  * If access is denied with ``$read_only = true`` simply return false. If access is denied with ``$read_only = false``, return false; but if a Specific Post/Page Access Link is currently being used, we exit with a warning about Access Link expiration here.
97
  */
98
  public static function sp_access ($sp_id = FALSE, $read_only = FALSE)
@@ -118,7 +118,7 @@ if (!class_exists ("c_ws_plugin__s2member_sp_access"))
118
  c_ws_plugin__s2member_sp_access::sp_access_session ($_g["s2member_sp_access"]);
119
 
120
  if ($read_only || c_ws_plugin__s2member_ip_restrictions::ip_restrictions_ok ($_SERVER["REMOTE_ADDR"], $sp_access_value))
121
- return apply_filters("ws_plugin__s2member_sp_access", true, get_defined_vars (), "auth-via-link-session");
122
  }
123
  }
124
  }
14
  * @package s2Member\SP_Access
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_sp_access"))
92
  * @param bool $read_only Optional. Defaults to false. If ``$read_only = true``,
93
  * no session cookies are set, no IP Restrictions are checked, and script execution is not exited on Link failure.
94
  * In other words, with ``$read_only = true``, this function will simply return true or false.
95
+ * @return null|bool|string Returns `true` (or the SP access string), if access is indeed allowed in one way or another.
96
  * If access is denied with ``$read_only = true`` simply return false. If access is denied with ``$read_only = false``, return false; but if a Specific Post/Page Access Link is currently being used, we exit with a warning about Access Link expiration here.
97
  */
98
  public static function sp_access ($sp_id = FALSE, $read_only = FALSE)
118
  c_ws_plugin__s2member_sp_access::sp_access_session ($_g["s2member_sp_access"]);
119
 
120
  if ($read_only || c_ws_plugin__s2member_ip_restrictions::ip_restrictions_ok ($_SERVER["REMOTE_ADDR"], $sp_access_value))
121
+ return apply_filters("ws_plugin__s2member_sp_access", $sp_access_value, get_defined_vars (), "auth-via-link-session");
122
  }
123
  }
124
  }
includes/classes/ssl-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\SSL
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_ssl_in'))
14
  * @package s2Member\SSL
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_ssl_in'))
includes/classes/ssl.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\SSL
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_ssl'))
14
  * @package s2Member\SSL
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_ssl'))
includes/classes/systematics-sp.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Systematics
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_systematics_sp'))
14
  * @package s2Member\Systematics
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_systematics_sp'))
includes/classes/systematics.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Systematics
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_systematics'))
14
  * @package s2Member\Systematics
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_systematics'))
includes/classes/tracking-codes.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Tracking
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_tracking_codes"))
14
  * @package s2Member\Tracking
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_tracking_codes"))
includes/classes/tracking-cookies-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Tracking
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_tracking_cookies_in"))
14
  * @package s2Member\Tracking
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_tracking_cookies_in"))
includes/classes/tracking-cookies.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Tracking
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_tracking_cookies"))
14
  * @package s2Member\Tracking
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_tracking_cookies"))
includes/classes/translations.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Translations
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_translations"))
14
  * @package s2Member\Translations
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_translations"))
includes/classes/user-access.inc.php CHANGED
@@ -1,173 +1,170 @@
1
  <?php
2
  /**
3
- * User access routines.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\User_Access
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_user_access"))
 
 
 
 
 
 
 
 
21
  {
22
  /**
23
- * User access routines.
24
- *
25
- * @package s2Member\User_Access
26
- * @since 3.5
27
- */
28
- class c_ws_plugin__s2member_user_access
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  {
30
- /**
31
- * Determines the Access Role of a User/Member.
32
- *
33
- * If ``$user`` is NOT passed in, check the current User/Member.
34
- * If ``$user`` IS passed in, this function will check a specific ``$user``.
35
- * Returns their Role ID/Name value.
36
- *
37
- * @package s2Member\User_Access
38
- * @since 3.5
39
- *
40
- * @param \WP_User $user Optional. A `WP_User` object. Defaults to the current User.
41
- * In order to check the current User, you must call this function with no arguments/parameters.
42
- * @return string Role ID/Name, or an empty string if they have no Role, or if ``$user`` does not exist, or if no User is currently logged-in.
43
- */
44
- public static function user_access_role ($user = NULL)
45
- {
46
- if ((func_num_args () && (!is_object ($user) || empty($user->ID))) || (!func_num_args () && !$user && (!is_object ($user = (is_user_logged_in ()) ? wp_get_current_user () : false) || empty($user->ID))))
47
- {
48
- return apply_filters("ws_plugin__s2member_user_access_role", "", get_defined_vars ());
49
- }
50
- else // Else we return the first Role in their array of assigned WordPress Roles.
51
- return apply_filters("ws_plugin__s2member_user_access_role", reset ($user->roles), get_defined_vars ());
52
- }
53
- /**
54
- * Determines Custom Capabilities of a User/Member.
55
- *
56
- * If ``$user`` is NOT passed in, check the current User/Member.
57
- * If ``$user`` IS passed in, this function will check a specific ``$user``.
58
- * Returns an array of Custom Capabilities.
59
- *
60
- * @package s2Member\User_Access
61
- * @since 3.5
62
- *
63
- * @param \WP_User $user Optional. A `WP_User` object. Defaults to the current User.
64
- * In order to check the current User, you must call this function with no arguments/parameters.
65
- * @return array Array of Custom Capabilities, or an empty array if they have no Custom Capabilities, or if ``$user`` does not exist, or if no User is currently logged-in.
66
- */
67
- public static function user_access_ccaps ($user = NULL)
68
- {
69
- if ((func_num_args () && (!is_object ($user) || empty($user->ID))) || (!func_num_args () && !$user && (!is_object ($user = (is_user_logged_in ()) ? wp_get_current_user () : false) || empty($user->ID))))
70
- {
71
- return apply_filters("ws_plugin__s2member_user_access_ccaps", array(), get_defined_vars ());
72
- }
73
- else // Otherwise, we DO have the $user object available.
74
- {
75
- $ccaps = array(); // Initializes $ccaps array.
76
 
77
- foreach ($user->allcaps as $cap => $cap_enabled)
78
- if (preg_match ("/^access_s2member_ccap_/", $cap) && $cap_enabled)
79
- $ccaps[] = preg_replace ("/^access_s2member_ccap_/", "", $cap);
 
 
 
 
80
 
81
- return apply_filters("ws_plugin__s2member_user_access_ccaps", $ccaps, get_defined_vars ());
82
- }
83
- }
84
- /**
85
- * Determines Access Level of a User/Member.
86
- *
87
- * If ``$user`` is NOT passed in, check the current User/Member.
88
- * If ``$user`` IS passed in, this function will check a specific ``$user``.
89
- * Returns `-1` thru number of configured Levels, according to the Access Level#.
90
- *
91
- * @package s2Member\User_Access
92
- * @since 3.5
93
- *
94
- * @param object $user Optional. A `WP_User` object. Defaults to the current User.
95
- * In order to check the current User, you must call this function with no arguments/parameters.
96
- * @return int Access Level#, `-1` if ``$user`` does not exist, or if no User is currently logged-in.
97
- */
98
- public static function user_access_level ($user = FALSE)
99
- {
100
- if ((func_num_args () && (!is_object ($user) || empty($user->ID))) || (!func_num_args () && !$user && (!is_object ($user = (is_user_logged_in ()) ? wp_get_current_user () : false) || empty($user->ID))))
101
- {
102
- return apply_filters("ws_plugin__s2member_user_access_level", -1, get_defined_vars ()); // No $user, or NOT logged in.
103
- }
 
 
 
 
104
 
105
- for ($n = $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"]; $n >= 0; $n--)
106
- {
107
- if ($user->has_cap ("access_s2member_level" . $n)) // Testing for Membership Level Access.
108
- {
109
- return apply_filters("ws_plugin__s2member_user_access_level", $n, get_defined_vars ());
110
- }
111
- }
112
- // Else we assume this is a "User" ( a Free Subscriber with an Access Level of 0. ).
113
- return apply_filters("ws_plugin__s2member_user_access_level", 0, get_defined_vars ());
114
- }
115
- /**
116
- * Determines Access Level of a specific Role.
117
- *
118
- * @package s2Member\User_Access
119
- * @since 3.5
120
- *
121
- * @param string $role A WordPress Role ID/Name.
122
- * @return int Access Level#, `-1` if ``$role`` is empty.
123
- */
124
- public static function user_access_role_to_level ($role = FALSE)
125
- {
126
- if (!($role = strtolower ($role))) // No ``$role`` provided. Default value of -1.
127
- {
128
- return apply_filters("ws_plugin__s2member_user_access_role_to_level", -1, get_defined_vars ());
129
- }
130
- else if (in_array($role, array("administrator", "editor", "author", "contributor", "bbp_moderator")))
131
- {
132
- return apply_filters("ws_plugin__s2member_user_access_role_to_level", $GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["levels"], get_defined_vars ());
133
- }
134
- else if (preg_match ("/^s2member_level([0-9]+)$/i", $role, $m) && $m[1] >= 1) // Test for s2Member Roles.
135
- {
136
- return apply_filters("ws_plugin__s2member_user_access_role_to_level", (int)$m[1], get_defined_vars ());
137
- }
138
- else if ($role === "subscriber") // Testing for Free Subscriber Role.
139
- {
140
- return apply_filters("ws_plugin__s2member_user_access_role_to_level", 0, get_defined_vars ());
141
- }
142
- else // Else we assume this is a "User" ( a Free Subscriber with an Access Level of 0. ).
143
- return apply_filters("ws_plugin__s2member_user_access_role_to_level", 0, get_defined_vars ());
144
- }
145
- /**
146
- * Determines Access Label for a User/Member.
147
- *
148
- * If ``$user`` is NOT passed in, check the current User/Member.
149
- * If ``$user`` IS passed in, this function will check a specific ``$user``.
150
- *
151
- * @package s2Member\User_Access
152
- * @since 3.5
153
- *
154
- * @param object $user Optional. A `WP_User` object. Defaults to the current User.
155
- * In order to check the current User, you must call this function with no arguments/parameters.
156
- * @return string Access Level Label, empty string if ``$user`` does not exist, or if no User is currently logged-in.
157
- */
158
- public static function user_access_label ($user = FALSE)
159
- {
160
- if ((func_num_args () && (!is_object ($user) || empty($user->ID))) || (!func_num_args () && !$user && (!is_object ($user = (is_user_logged_in ()) ? wp_get_current_user () : false) || empty($user->ID))))
161
- {
162
- return apply_filters("ws_plugin__s2member_user_access_label", "", get_defined_vars ()); // No $user, or NOT logged in.
163
- }
164
- else if (($level = c_ws_plugin__s2member_user_access::user_access_level ($user)) >= 0 && !empty($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_label"]))
165
- {
166
- return apply_filters("ws_plugin__s2member_user_access_label", $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["level" . $level . "_label"], get_defined_vars ());
167
- }
168
- else // Else there is no Label configured for this User/Member. Return empty string.
169
- return apply_filters("ws_plugin__s2member_user_access_label", "", get_defined_vars ());
170
- }
171
  }
 
 
 
172
  }
173
- ?>
1
  <?php
2
  /**
3
+ * User access routines.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\User_Access
15
+ * @since 3.5
16
+ */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
+ exit ('Do not access this file directly.');
19
 
20
+ if(!class_exists('c_ws_plugin__s2member_user_access'))
21
+ {
22
+ /**
23
+ * User access routines.
24
+ *
25
+ * @package s2Member\User_Access
26
+ * @since 3.5
27
+ */
28
+ class c_ws_plugin__s2member_user_access
29
  {
30
  /**
31
+ * Determines the Access Role of a User/Member.
32
+ *
33
+ * If ``$user`` is NOT passed in, check the current User/Member.
34
+ * If ``$user`` IS passed in, this function will check a specific ``$user``.
35
+ * Returns their Role ID/Name value.
36
+ *
37
+ * @package s2Member\User_Access
38
+ * @since 3.5
39
+ *
40
+ * @param \WP_User $user Optional. A `WP_User` object. Defaults to the current User.
41
+ * In order to check the current User, you must call this function with no arguments/parameters.
42
+ *
43
+ * @return string Role ID/Name, or an empty string if they have no Role, or if ``$user`` does not exist, or if no User is currently logged-in.
44
+ */
45
+ public static function user_access_role($user = NULL)
46
+ {
47
+ if((func_num_args() && (!is_object($user) || empty($user->ID))) || (!func_num_args() && !$user && (!is_object($user = (is_user_logged_in()) ? wp_get_current_user() : FALSE) || empty($user->ID))))
48
+ return apply_filters('ws_plugin__s2member_user_access_role', '', get_defined_vars());
49
+
50
+ else // Else we return the first Role in their array of assigned WordPress Roles.
51
+ return apply_filters('ws_plugin__s2member_user_access_role', reset($user->roles), get_defined_vars());
52
+ }
53
+
54
+ /**
55
+ * Determines Custom Capabilities of a User/Member.
56
+ *
57
+ * If ``$user`` is NOT passed in, check the current User/Member.
58
+ * If ``$user`` IS passed in, this function will check a specific ``$user``.
59
+ * Returns an array of Custom Capabilities.
60
+ *
61
+ * @package s2Member\User_Access
62
+ * @since 3.5
63
+ *
64
+ * @param \WP_User $user Optional. A `WP_User` object. Defaults to the current User.
65
+ * In order to check the current User, you must call this function with no arguments/parameters.
66
+ *
67
+ * @return array Array of Custom Capabilities, or an empty array if they have no Custom Capabilities, or if ``$user`` does not exist, or if no User is currently logged-in.
68
+ */
69
+ public static function user_access_ccaps($user = NULL)
70
+ {
71
+ if((func_num_args() && (!is_object($user) || empty($user->ID))) || (!func_num_args() && !$user && (!is_object($user = (is_user_logged_in()) ? wp_get_current_user() : FALSE) || empty($user->ID))))
72
+ return apply_filters('ws_plugin__s2member_user_access_ccaps', array(), get_defined_vars());
73
+
74
+ else // Otherwise, we DO have the $user object available.
75
  {
76
+ $ccaps = array(); // Initializes $ccaps array.
77
+
78
+ foreach($user->allcaps as $cap => $cap_enabled)
79
+ if(preg_match('/^access_s2member_ccap_/', $cap) && $cap_enabled)
80
+ $ccaps[] = preg_replace('/^access_s2member_ccap_/', '', $cap);
81
+
82
+ return apply_filters('ws_plugin__s2member_user_access_ccaps', $ccaps, get_defined_vars());
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Determines Access Level of a User/Member.
88
+ *
89
+ * If ``$user`` is NOT passed in, check the current User/Member.
90
+ * If ``$user`` IS passed in, this function will check a specific ``$user``.
91
+ * Returns `-1` thru number of configured Levels, according to the Access Level#.
92
+ *
93
+ * @package s2Member\User_Access
94
+ * @since 3.5
95
+ *
96
+ * @param object $user Optional. A `WP_User` object. Defaults to the current User.
97
+ * In order to check the current User, you must call this function with no arguments/parameters.
98
+ *
99
+ * @return int Access Level#, `-1` if ``$user`` does not exist, or if no User is currently logged-in.
100
+ */
101
+ public static function user_access_level($user = NULL)
102
+ {
103
+ if((func_num_args() && (!is_object($user) || empty($user->ID))) || (!func_num_args() && !$user && (!is_object($user = (is_user_logged_in()) ? wp_get_current_user() : FALSE) || empty($user->ID))))
104
+ return apply_filters('ws_plugin__s2member_user_access_level', -1, get_defined_vars()); // No $user, or NOT logged in.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
 
106
+ for($n = $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']; $n >= 0; $n--)
107
+ if($user->has_cap('access_s2member_level'.$n)) // Membership Level access.
108
+ {
109
+ return apply_filters('ws_plugin__s2member_user_access_level', $n, get_defined_vars());
110
+ }
111
+ return apply_filters('ws_plugin__s2member_user_access_level', 0, get_defined_vars());
112
+ }
113
 
114
+ /**
115
+ * Determines Access Level of a specific Role.
116
+ *
117
+ * @package s2Member\User_Access
118
+ * @since 3.5
119
+ *
120
+ * @param string $role A WordPress Role ID/Name.
121
+ *
122
+ * @return int Access Level#, `-1` if ``$role`` is empty.
123
+ */
124
+ public static function user_access_role_to_level($role = '')
125
+ {
126
+ if(!($role = strtolower($role))) // No ``$role`` provided. Default value of -1.
127
+ return apply_filters('ws_plugin__s2member_user_access_role_to_level', -1, get_defined_vars());
128
+
129
+ else if(in_array($role, array('administrator', 'editor', 'author', 'contributor', 'bbp_moderator')))
130
+ return apply_filters('ws_plugin__s2member_user_access_role_to_level', $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels'], get_defined_vars());
131
+
132
+ else if(preg_match('/^s2member_level([0-9]+)$/i', $role, $m) && $m[1] >= 1) // Test for s2Member Roles.
133
+ return apply_filters('ws_plugin__s2member_user_access_role_to_level', (int)$m[1], get_defined_vars());
134
+
135
+ else if($role === 'subscriber') // Testing for Free Subscriber Role.
136
+ return apply_filters('ws_plugin__s2member_user_access_role_to_level', 0, get_defined_vars());
137
+
138
+ else // Else we assume this is a 'User' ( a Free Subscriber with an Access Level of 0. ).
139
+ return apply_filters('ws_plugin__s2member_user_access_role_to_level', 0, get_defined_vars());
140
+ }
141
 
142
+ /**
143
+ * Determines Access Label for a User/Member.
144
+ *
145
+ * If ``$user`` is NOT passed in, check the current User/Member.
146
+ * If ``$user`` IS passed in, this function will check a specific ``$user``.
147
+ *
148
+ * @package s2Member\User_Access
149
+ * @since 3.5
150
+ *
151
+ * @param object $user Optional. A `WP_User` object. Defaults to the current User.
152
+ * In order to check the current User, you must call this function with no arguments/parameters.
153
+ *
154
+ * @return string Access Level Label, empty string if ``$user`` does not exist, or if no User is currently logged-in.
155
+ */
156
+ public static function user_access_label($user = NULL)
157
+ {
158
+ if((func_num_args() && (!is_object($user) || empty($user->ID))) || (!func_num_args() && !$user && (!is_object($user = (is_user_logged_in()) ? wp_get_current_user() : FALSE) || empty($user->ID))))
159
+ {
160
+ return apply_filters('ws_plugin__s2member_user_access_label', '', get_defined_vars()); // No $user, or NOT logged in.
161
+ }
162
+ else if(($level = c_ws_plugin__s2member_user_access::user_access_level($user)) >= 0 && !empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$level.'_label']))
163
+ {
164
+ return apply_filters('ws_plugin__s2member_user_access_label', $GLOBALS['WS_PLUGIN__']['s2member']['o']['level'.$level.'_label'], get_defined_vars());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  }
166
+ else // Else there is no Label configured for this User/Member. Return empty string.
167
+ return apply_filters('ws_plugin__s2member_user_access_label', '', get_defined_vars());
168
+ }
169
  }
170
+ }
includes/classes/user-deletions.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\User_Deletions
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_user_deletions'))
@@ -117,6 +117,7 @@ if(!class_exists('c_ws_plugin__s2member_user_deletions'))
117
  delete_user_option($user_id, 's2member_ipn_signup_vars');
118
  delete_user_option($user_id, 's2member_paid_registration_times');
119
  delete_user_option($user_id, 's2member_access_cap_times');
 
120
  delete_user_option($user_id, 's2member_sp_references');
121
 
122
  delete_user_option($user_id, 's2member_last_status_scan');
14
  * @package s2Member\User_Deletions
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_user_deletions'))
117
  delete_user_option($user_id, 's2member_ipn_signup_vars');
118
  delete_user_option($user_id, 's2member_paid_registration_times');
119
  delete_user_option($user_id, 's2member_access_cap_times');
120
+ delete_user_option($user_id, 's2member_coupon_codes');
121
  delete_user_option($user_id, 's2member_sp_references');
122
 
123
  delete_user_option($user_id, 's2member_last_status_scan');
includes/classes/user-new-in.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\New_Users
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_user_new_in"))
14
  * @package s2Member\New_Users
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_user_new_in"))
includes/classes/user-new.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\New_Users
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_user_new"))
14
  * @package s2Member\New_Users
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_user_new"))
includes/classes/user-notes.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Admin_Notes
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_user_notes"))
14
  * @package s2Member\Admin_Notes
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_user_notes"))
includes/classes/user-securities.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\User_Securities
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_user_securities'))
14
  * @package s2Member\User_Securities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_user_securities'))
includes/classes/users-list-in.inc.php CHANGED
@@ -1,588 +1,586 @@
1
  <?php
2
  /**
3
- * Users list (inner processing routines).
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\Users_List
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_users_list_in"))
 
 
 
 
 
 
 
 
21
  {
22
  /**
23
- * Users list (inner processing routines).
24
- *
25
- * @package s2Member\Users_List
26
- * @since 3.5
27
- */
28
- class c_ws_plugin__s2member_users_list_in
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  {
30
- /**
31
- * Adds Custom Fields to the admin Profile editing page.
32
- *
33
- * @package s2Member\Users_List
34
- * @since 3.5
35
- *
36
- * @attaches-to ``add_action("edit_user_profile");``
37
- * @attaches-to ``add_action("show_user_profile");``
38
- *
39
- * @param object $user Expects a `WP_User` object passed in by the Action Hook.
40
- * @return null
41
- */
42
- public static function users_list_edit_cols($user = FALSE)
 
 
 
43
  {
44
- global /* Multisite Networking. */ $current_site, $current_blog;
 
 
 
 
 
 
 
45
 
46
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
47
- do_action("ws_plugin__s2member_before_users_list_edit_cols", get_defined_vars());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  unset($__refs, $__v);
49
 
50
- $current_user = (is_user_logged_in()) ? wp_get_current_user() : false; // Current User.
 
 
 
51
 
52
- if(is_object($user) && !empty($user->ID) && ($user_id = $user->ID) && is_object($current_user) && !empty($current_user->ID))
53
- {
54
- $role = c_ws_plugin__s2member_user_access::user_access_role($user); // This User's current WordPress Role.
55
- $level = c_ws_plugin__s2member_user_access::user_access_level($user); // User's Access Level for s2Member.
 
 
 
56
 
57
- if(current_user_can("edit_users") && (!is_multisite() || is_super_admin() || is_user_member_of_blog($user_id)))
58
- {
59
- echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
 
60
 
61
- echo '<h3 style="position:relative;"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/large-icon.png" title="s2Member (a Membership management system for WordPress)" alt="" style="position:absolute; top:-15px; right:0; border:0;" />s2Member Configuration &amp; Profile Fields'.((is_multisite()) ? ' (for this Blog)' : '').'</h3>'."\n";
 
 
62
 
63
- echo '<table class="form-table">'."\n";
 
 
 
 
64
 
65
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
66
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before", get_defined_vars());
67
- unset($__refs, $__v);
68
 
69
- if(is_multisite() && is_super_admin()) // MUST be a Super Admin.
70
- // On a Multisite Network, the Super Administrator can ALWAYS edit this.
71
- {
72
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
73
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_originating_blog", get_defined_vars());
74
- unset($__refs, $__v);
75
 
76
- echo '<tr>'."\n";
77
- echo '<th><label for="ws-plugin--s2member-profile-s2member-originating-blog">Originating Blog ID#:</label> <a href="#" onclick="alert(\'On a Multisite Network, this is how s2Member keeps track of which Blog each User/Member originated from. So this ID#, is automatically associated with a Blog in your Network, matching the User\\\'s point of origin. ~ ONLY a Super Admin can modify this.\\n\\nOn a Multisite Blog Farm, the Originating Blog ID# for your own Customers, will ALWAYS be associated with your (Main Site). It is NOT likely that you\\\'ll need to modify this manually, but s2Member makes it available; just in case.\\n\\n*Tip* - If you add Users (and/or Blogs) with the `Super Admin` Network Administration panel inside WordPress, then you WILL need to set everything manually. s2Member does NOT tamper with automation routines whenever YOU (as a Super Administrator) are working in that area.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
78
- echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_originating_blog" id="ws-plugin--s2member-profile-s2member-originating-blog" value="'.format_to_edit(get_user_meta($user_id, "s2member_originating_blog", true)).'" class="regular-text" /></td>'."\n";
79
- echo '</tr>'."\n";
 
 
 
 
 
80
 
81
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
82
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_originating_blog", get_defined_vars());
83
- unset($__refs, $__v);
84
- }
 
 
85
 
86
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
87
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_subscr_gateway", get_defined_vars());
88
- unset($__refs, $__v);
89
 
90
- echo '<tr>'."\n";
91
- echo '<th><label for="ws-plugin--s2member-profile-s2member-subscr-gateway">Paid Subscr. Gateway:</label> <a href="#" onclick="alert(\'A Payment Gateway Code is associated with the Paid Subscr. ID below. A Paid Subscription ID (or a Buy Now Transaction ID) is only valid for paid Members. Also known as a Recurring Profile ID, a ClickBank Receipt #, a Google Order ID, an AliPay Trade No.\\n\\nThis will be filled automatically by s2Member. This field will be empty for Free Subscribers, and/or anyone who is NOT paying you. This field is only editable for Customer Service purposes; just in case you ever need to update the Paid Subscr. Gateway/ID manually.\\n\\nThe value of Paid Subscr. ID can be a PayPal Standard Subscription ID, or a PayPal Pro Recurring Profile ID, or a PayPal Transaction ID; depending on the type of sale. Your PayPal account will supply this information.\\n\\nIf you are using Stripe, please use the customer\\\'s Subscription ID (if applicable); else a Charge ID or an Invoice ID.\\n\\nIf you\\\'re using Google Wallet, use the Google Order ID. ClickBank provides a Receipt #, ccBill provides a Subscription ID, Authorize.Net provides a Subscription ID, and AliPay provides a Transaction ID.\\n\\nThe general rule is... IF there\\\'s a Subscription ID, use that! If there\\\'s NOT, use the Transaction ID.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
92
- echo '<td><select name="ws_plugin__s2member_profile_s2member_subscr_gateway" id="ws-plugin--s2member-profile-s2member-subscr-gateway" style="width:25em;"><option value=""></option>'."\n";
93
- foreach(apply_filters("ws_plugin__s2member_profile_s2member_subscr_gateways", array("paypal" => "PayPal (code: paypal)"), get_defined_vars()) as $gateway => $gateway_name)
94
- echo '<option value="'.esc_attr($gateway).'"'.(($gateway === get_user_option("s2member_subscr_gateway", $user_id)) ? ' selected="selected"' : '').'>'.esc_html($gateway_name).'</option>'."\n";
95
- echo '</select>'."\n";
96
- echo '</td>'."\n";
97
- echo '</tr>'."\n";
 
 
 
 
 
 
 
 
 
 
 
 
 
98
 
99
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
100
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_subscr_gateway", get_defined_vars());
101
- unset($__refs, $__v);
 
102
 
103
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
104
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_subscr_id", get_defined_vars());
105
- unset($__refs, $__v);
106
 
107
- echo '<tr>'."\n";
108
- echo '<th><label for="ws-plugin--s2member-profile-s2member-subscr-id">Paid Subscr. ID:</label> <a href="#" onclick="alert(\'A Paid Subscription ID (or a Buy Now Transaction ID) is only valid for paid Members. Also known as a Recurring Profile ID, a ClickBank Receipt #, a Google Order ID, an AliPay Trade No.\\n\\nThis will be filled automatically by s2Member. This field will be empty for Free Subscribers, and/or anyone who is NOT paying you. This field is only editable for Customer Service purposes; just in case you ever need to update the Paid Subscr. Gateway/ID manually.\\n\\nThe value of Paid Subscr. ID can be a PayPal Standard Subscription ID, or a PayPal Pro Recurring Profile ID, or a PayPal Transaction ID; depending on the type of sale. Your PayPal account will supply this information.\\n\\nIf you are using Stripe, please use the customer\\\'s Subscription ID (if applicable); else a Charge ID or an Invoice ID.\\n\\nIf you\\\'re using Google Wallet, use the Google Order ID. ClickBank provides a Receipt #, ccBill provides a Subscription ID, Authorize.Net provides a Subscription ID, and AliPay provides a Transaction ID.\\n\\nThe general rule is... IF there\\\'s a Subscription ID, use that! If there\\\'s NOT, use the Transaction ID.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
109
- echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_subscr_id" id="ws-plugin--s2member-profile-s2member-subscr-id" value="'.format_to_edit(get_user_option("s2member_subscr_id", $user_id)).'" class="regular-text" /></td>'."\n";
110
- echo '</tr>'."\n";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
113
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_subscr_id", get_defined_vars());
114
- unset($__refs, $__v);
115
-
116
- if(c_ws_plugin__s2member_utils_conds::pro_is_installed())
117
- if(in_array('stripe', $GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_gateways_enabled']))
118
- {
119
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
120
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_subscr_cid", get_defined_vars());
121
- unset($__refs, $__v);
122
-
123
- echo '<tr>'."\n";
124
- echo '<th><label for="ws-plugin--s2member-profile-s2member-subscr-cid">Paid Subscr. CID:</label> <a href="#" onclick="alert(\'A Paid Subscription CID; i.e. a Customer\\\'s ID. Applicable only with Stripe integration. s2Member fills this in automatically. This is the Customer\\\'s ID in Stripe, which remains constant throughout any & all future payments. Each Stripe Customer has this Customer ID; and also a Subscription and/or Transaction ID.\\n\\nIn all other cases, the Paid Subscr. CID is simply set to the Paid Subscr. ID value; i.e. it is a duplicate of Paid Subscr. ID when running anything other than Stripe.\\n\\nThis field will be empty for Free Subscribers, and/or anyone who is NOT paying you. This field is only editable for Customer Service purposes; just in case you ever need to update the Paid Subscr. Gateway/ID/CID manually.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
125
- echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_subscr_cid" id="ws-plugin--s2member-profile-s2member-subscr-cid" value="'.format_to_edit(get_user_option("s2member_subscr_cid", $user_id)).'" class="regular-text" /></td>'."\n";
126
- echo '</tr>'."\n";
127
-
128
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
129
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_subscr_cid", get_defined_vars());
130
- unset($__refs, $__v);
131
- }
132
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
133
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_custom", get_defined_vars());
134
- unset($__refs, $__v);
135
 
136
  echo '<tr>'."\n";
137
- echo '<th><label for="ws-plugin--s2member-profile-s2member-custom">Custom Value:</label> <a href="#" onclick="alert(\'A Paid Subscription is always associated with a Custom String that is passed through the custom=\\\'\\\''.c_ws_plugin__s2member_utils_strings::esc_js_sq(esc_attr($_SERVER["HTTP_HOST"]), 3).'\\\'\\\' attribute of your Shortcode. This Custom Value, MUST always start with your domain name. However, you can also pipe delimit additional values after your domain, if you need to.\\n\\nFor example:\n'.c_ws_plugin__s2member_utils_strings::esc_js_sq(esc_attr($_SERVER["HTTP_HOST"]), 3).'|cv1|cv2|cv3\'); return false;" tabindex="-1">[?]</a></th>'."\n";
138
- echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_custom" id="ws-plugin--s2member-profile-s2member-custom" value="'.format_to_edit(get_user_option("s2member_custom", $user_id)).'" class="regular-text" /></td>'."\n";
139
  echo '</tr>'."\n";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
 
141
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
142
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_custom", get_defined_vars());
143
- unset($__refs, $__v);
 
144
 
145
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
146
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_registration_ip", get_defined_vars());
147
- unset($__refs, $__v);
 
 
148
 
149
  echo '<tr>'."\n";
150
- echo '<th><label for="ws-plugin--s2member-profile-s2member-registration-ip">Registration IP:</label> <a href="#" onclick="alert(\'This is the IP Address the User had at the time of registration. If you don\\\'t know the User\\\'s IP Address, just leave this blank. If this is left empty, s2Member will make attempts in the future to grab the User\\\'s IP Address.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
151
- echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_registration_ip" id="ws-plugin--s2member-profile-s2member-registration-ip" value="'.format_to_edit(get_user_option("s2member_registration_ip", $user_id)).'" class="regular-text" /></td>'."\n";
152
  echo '</tr>'."\n";
 
 
 
 
 
 
 
 
 
 
153
 
154
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
155
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_registration_ip", get_defined_vars());
156
- unset($__refs, $__v);
157
-
158
- if(!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site())
159
- // ^ Will change once Custom Capabilities are compatible with a Blog Farm.
160
- {
161
- foreach($user->allcaps as $cap => $cap_enabled)
162
- if(preg_match("/^access_s2member_ccap_/", $cap))
163
- $ccaps[] = preg_replace("/^access_s2member_ccap_/", "", $cap);
164
-
165
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
166
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_ccaps", get_defined_vars());
167
- unset($__refs, $__v);
168
-
169
- echo '<tr>'."\n";
170
- echo '<th><label for="ws-plugin--s2member-profile-s2member-ccaps">Custom Capabilities:</label> <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member -› API Scripting -› Custom Capabilities.'.((is_multisite()) ? '\\n\\nCustom Capabilities are assigned on a per-Blog basis. So having a set of Custom Capabilities for one Blog, and having NO Custom Capabilities on another Blog - is very common. This is how permissions are designed to work.' : '').'\'); return false;" tabindex="-1">[?]</a>'.((is_multisite()) ? '<br /><small>(for this Blog)</small>' : '').'</th>'."\n";
171
- echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_ccaps" id="ws-plugin--s2member-profile-s2member-ccaps" value="'.format_to_edit(((!empty($ccaps)) ? implode(",", $ccaps) : "")).'" class="regular-text" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" /></td>'."\n";
172
- echo '</tr>'."\n";
173
-
174
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
175
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_ccaps", get_defined_vars());
176
- unset($__refs, $__v);
177
- }
178
-
179
- if(!$user->has_cap("administrator")) // Do NOT present these details for Administrator accounts.
180
- {
181
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
182
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_auto_eot_time", get_defined_vars());
183
- unset($__refs, $__v);
184
-
185
- echo '<tr>'."\n";
186
- $auto_eot_time = get_user_option("s2member_auto_eot_time", $user_id);
187
- $auto_eot_time = ($auto_eot_time) ? date("D M j, Y g:i a T", $auto_eot_time) : "";
188
- echo '<th><label for="ws-plugin--s2member-profile-s2member-auto-eot-time">Automatic EOT Time:</label> <a href="#" onclick="alert(\'EOT = End Of Term. ( i.e. Account Expiration / Termination. ).\\n\\nIf you leave this empty, s2Member will configure an EOT Time automatically, based on the paid Subscription associated with this account. In other words, if a paid Subscription expires, is cancelled, terminated, refunded, reversed, or charged back to you; s2Member will deal with the EOT automatically.\\n\\nThat being said, if you would rather take control over this, you can. If you type in a date manually, s2Member will obey the Auto-EOT Time that you\\\'ve given, no matter what. In other words, you can force certain Members to expire automatically, at a time that you specify. s2Member will obey.\\n\\nValid formats for Automatic EOT Time:\\n\\nmm/dd/yyyy\\nyyyy-mm-dd\\n+1 year\\n+2 weeks\\n+2 months\\n+10 minutes\\nnext thursday\\ntomorrow\\ntoday\\n\\n* anything compatible with PHP\\\'s strtotime() function.\'); return false;" tabindex="-1">[?]</a>'.(($auto_eot_time) ? '<br /><small>(<a href="http://en.wikipedia.org/wiki/Coordinated_Universal_Time" target="_blank" rel="external">Universal Time / GMT</a>)</small>' : '').'</th>'."\n";
189
- echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_auto_eot_time" id="ws-plugin--s2member-profile-s2member-auto-eot-time" value="'.format_to_edit($auto_eot_time).'" class="regular-text" /></td>'."\n";
190
- echo '</tr>'."\n";
191
-
192
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
193
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_auto_eot_time", get_defined_vars());
194
- unset($__refs, $__v);
195
-
196
- if(c_ws_plugin__s2member_utils_conds::pro_is_installed())
197
- {
198
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
199
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_reset_pass_resend", get_defined_vars());
200
- unset($__refs, $__v);
201
-
202
- echo '<tr>'."\n";
203
- echo '<th><label for="ws-plugin--s2member-profile-reset-pass-resend">Reset Password &amp; Resend Welcome Email Message:</label> <a href="#" onclick="alert(\'Checking this box will tell s2Member to reset this User\\\'s password and then reprocess the New User Email Notification message against this User\\\'s account. This way they\\\'ll get an email message with their Username/Password.\\n\\nThis can be helpful in cases where a User/Member missed the original email message for some reason.\\n\\nThe User\\\'s password is reset to a new auto-generated password by default. However, you can provide a custom password by entering a new password of your choosing in the field above — provided by WordPress itself.\\n\\nIt is also possible to customize the New User Email Notification message with s2Member. Please see: `Dashboard -› s2Member -› General Options -› Email Configuration -› New User Notifications`.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
204
- echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_reset_pass_resend" id="ws-plugin--s2member-profile-reset-pass-resend" value="1" /> Yes, reset password &amp; resend welcome email message to this User.</label></td>'."\n";
205
- echo '</tr>'."\n";
206
-
207
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
208
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_reset_pass_resend", get_defined_vars());
209
- unset($__refs, $__v);
210
- }
211
- }
212
-
213
- if(c_ws_plugin__s2member_list_servers::list_servers_integrated()) // Only if integrated with s2Member.
214
- {
215
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
216
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_opt_in", get_defined_vars());
217
- unset($__refs, $__v);
218
-
219
- echo '<tr>'."\n";
220
- echo '<th><label for="ws-plugin--s2member-profile-opt-in">Re-process List Servers:</label> <a href="#" onclick="alert(\'You have at least one List Server integrated with s2Member. Would you like to re-process a confirmation request for this User? If not, just leave the box un-checked.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
221
- echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_opt_in" id="ws-plugin--s2member-profile-opt-in" value="1" /> Yes, send a mailing list confirmation email to this User.</label></td>'."\n";
222
- echo '</tr>'."\n";
223
-
224
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
225
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_opt_in", get_defined_vars());
226
- unset($__refs, $__v);
227
-
228
- if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_out_transitions"])
229
- if(($custom_reg_auto_op_outs = c_ws_plugin__s2member_utils_strings::wrap_deep($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_outs"], "/^", "$/i")))
230
- if(c_ws_plugin__s2member_utils_arrays::in_regex_array("user-role-change", $custom_reg_auto_op_outs) || c_ws_plugin__s2member_utils_arrays::in_regex_array("modification", $custom_reg_auto_op_outs))
231
- {
232
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
233
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_auto_opt_out_transitions", get_defined_vars());
234
- unset($__refs, $__v);
235
-
236
- echo '<tr>'."\n";
237
- echo '<th><label for="ws-plugin--s2member-custom-reg-auto-opt-out-transitions">Allow List Transitioning:</label> <a href="#" onclick="alert(\'You\\\'ve configured s2Member with List Transitions enabled. By leaving this box checked, s2Member will Transition the User\\\'s mailing list subscription(s) automatically. For example, if a Member is demoted from Level #2, down to Level #1; s2Member will add them to the Level #1 List(s) after it removes them from the Level #2 List(s).\\n\\nDepending on your configuration of s2Member, a transition may ONLY occur if s2Member IS able to successfully remove them from an existing List. In other words, if they are currently NOT subscribed to any List(s), s2Member may NOT transition them to any new Lists (depending on your configuration).\'); return false;" tabindex="-1">[?]</a></th>'."\n";
238
- echo '<td><label><input type="checkbox" name="ws_plugin__s2member_custom_reg_auto_opt_out_transitions" id="ws-plugin--s2member-custom-reg-auto-opt-out-transitions" value="1" checked="checked" /> Yes, automatically transition this User\'s mailing list subscription(s) when/if I change their Role.</label></td>'."\n";
239
- echo '</tr>'."\n";
240
-
241
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
242
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_auto_opt_out_transitions", get_defined_vars());
243
- unset($__refs, $__v);
244
- }
245
- }
246
-
247
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
248
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_ip_restrictions", get_defined_vars());
249
- unset($__refs, $__v);
250
 
251
- echo '<tr>'."\n";
252
- echo '<th><label for="ws-plugin--s2member-profile-ip-restrictions">Reset IP Restrictions:</label> <a href="#" onclick="alert(\'A single Username is only valid for a certain number of unique IP addresses (as configured in your s2Member -› General Options). Once that limit is reached, s2Member assumes there has been a security breach. At that time, s2Member will place a temporary ban (preventing access).\\n\\nIf you have spoken to a legitimate Customer that is receiving an error upon logging in (ex: 503 / too many IP addresses), you can remove this temporary ban by checking the box below. If the abusive behavior continues, s2Member will automatically re-instate IP Restrictions in the future. If you would like to gain further control over IP Restrictions, please check your General Options panel for s2Member.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
253
- echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_ip_restrictions" id="ws-plugin--s2member-profile-ip-restrictions" value="1" /> Yes, delete/reset IP Restrictions associated with this Username.</label>'.((c_ws_plugin__s2member_ip_restrictions::specific_ip_restriction_at_or_above_max(strtolower($user->user_login)) || c_ws_plugin__s2member_ip_restrictions::specific_ip_restriction_breached_security(strtolower($user->user_login))) ? '<br /><em>*WARNING* this User is at (or above) max allowable IP addresses (based on your IP Restrictions).</em>' : '<br /><em>*Note* this User is NOT currently banned by any of your IP Restrictions.</em>').'</td>'."\n";
254
- echo '</tr>'."\n";
255
 
256
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
257
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_ip_restrictions", get_defined_vars());
258
- unset($__refs, $__v);
259
-
260
- if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"]) // Only if configured.
261
- if($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level($level, "administrative"))
262
- {
263
- echo '<tr>'."\n";
264
- echo '<td colspan="2">'."\n";
265
- echo '<div style="height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
266
- echo '</td>'."\n";
267
- echo '</tr>'."\n";
268
-
269
- $fields = get_user_option("s2member_custom_fields", $user_id); // Existing fields.
270
-
271
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
272
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_custom_fields", get_defined_vars());
273
- unset($__refs, $__v);
274
-
275
- foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
276
- {
277
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
278
- do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_before", get_defined_vars());
279
- unset($__refs, $__v);
280
-
281
- if(in_array($field["id"], $fields_applicable)) // Field applicable?
282
- {
283
- $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
284
- $field_id_class = preg_replace("/_/", "-", $field_var);
285
-
286
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
287
- if(apply_filters("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_display", true, get_defined_vars()))
288
- {
289
- if(!empty($field["section"]) && $field["section"] === "yes") // Starts a new section?
290
- echo '<tr><td colspan="2"><div class="ws-plugin--s2member-profile-divider-section'.((!empty($field["sectitle"])) ? '-title' : '').'">'.((!empty($field["sectitle"])) ? $field["sectitle"] : '').'</div></td></tr>';
291
-
292
- echo '<tr>'."\n";
293
- echo '<th><label for="ws-plugin--s2member-profile-'.esc_attr($field_id_class).'">'.((preg_match("/^(checkbox|pre_checkbox)$/", $field["type"])) ? ucwords(preg_replace("/_/", " ", $field_var)) : $field["label"]).':</label></th>'."\n";
294
- echo '<td>'.c_ws_plugin__s2member_custom_reg_fields::custom_field_gen(__FUNCTION__, $field, "ws_plugin__s2member_profile_", "ws-plugin--s2member-profile-", "", ((preg_match("/^(text|textarea|select|selects)$/", $field["type"])) ? "width:99%;" : ""), "", "", $fields, @$fields[$field_var], "administrative").'</td>'."\n";
295
- echo '</tr>'."\n";
296
- }
297
- unset($__refs, $__v);
298
- }
299
-
300
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
301
- do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_after", get_defined_vars());
302
- unset($__refs, $__v);
303
- }
304
-
305
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
306
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_custom_fields", get_defined_vars());
307
- unset($__refs, $__v);
308
-
309
- echo '<tr>'."\n";
310
- echo '<td colspan="2">'."\n";
311
- echo '<div style="height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
312
- echo '</td>'."\n";
313
- echo '</tr>'."\n";
314
- }
315
-
316
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
317
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_notes", get_defined_vars());
318
- unset($__refs, $__v);
319
 
320
- echo '<tr>'."\n";
321
- echo '<th><label for="ws-plugin--s2member-profile-s2member-notes">Administrative Notes:</label> <a href="#" onclick="alert(\'This is for Administrative purposes. You can keep a list of Notations about this account. These Notations are private; Users/Members will never see these.\\n\\n*Note* The s2Member software may `append` Notes to this field occasionally, under special circumstances. For example, when/if s2Member demotes a paid Member to a Free Subscriber, s2Member will leave a Note in this field.\'); return false;" tabindex="-1">[?]</a><br /><br /><small>These Notations are private; Users/Members will never see any of these notes.</small></th>'."\n";
322
- echo '<td><textarea name="ws_plugin__s2member_profile_s2member_notes" id="ws-plugin--s2member-profile-s2member-notes" rows="5" wrap="off" spellcheck="false" style="width:99%;">'.format_to_edit(get_user_option("s2member_notes", $user_id)).'</textarea></td>'."\n";
323
- echo '</tr>'."\n";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
324
 
325
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
326
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_notes", get_defined_vars());
327
- unset($__refs, $__v);
328
 
329
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
330
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after", get_defined_vars());
331
- unset($__refs, $__v);
 
332
 
333
- echo '</table>'."\n";
334
 
335
- echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
336
- }
337
 
338
- else if($current_user->ID === $user->ID) // Otherwise, a User can always edit their own Profile.
339
- {
340
- if /* Only if configured. */($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
341
- if($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level($level, "profile"))
342
- {
343
- echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
344
-
345
- echo '<h3>'._x("Additional Profile Fields", "s2member-front", "s2member").((is_multisite()) ? ' '._x("(for this site)", "s2member-front", "s2member") : "").'</h3>'."\n";
346
-
347
- echo '<table class="form-table">'."\n";
348
-
349
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
350
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before", get_defined_vars());
351
- unset($__refs, $__v);
352
-
353
- $fields = get_user_option("s2member_custom_fields", $user_id); // Existing fields.
354
-
355
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
356
- do_action("ws_plugin__s2member_during_users_list_edit_cols_before_custom_fields", get_defined_vars());
357
- unset($__refs, $__v);
358
-
359
- foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
360
- {
361
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
362
- do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_before", get_defined_vars());
363
- unset($__refs, $__v);
364
-
365
- if(in_array($field["id"], $fields_applicable)) // Field applicable?
366
- {
367
- $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
368
- $field_id_class = preg_replace("/_/", "-", $field_var);
369
-
370
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
371
- if(apply_filters("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_display", true, get_defined_vars()))
372
- {
373
- if(!empty($field["section"]) && $field["section"] === "yes") // Starts a new section?
374
- echo '<tr><td colspan="2"><div class="ws-plugin--s2member-profile-divider-section'.((!empty($field["sectitle"])) ? '-title' : '').'">'.((!empty($field["sectitle"])) ? $field["sectitle"] : '').'</div></td></tr>';
375
-
376
- echo '<tr>'."\n";
377
- echo '<th><label for="ws-plugin--s2member-profile-'.esc_attr($field_id_class).'">'.((preg_match("/^(checkbox|pre_checkbox)$/", $field["type"])) ? ucwords(preg_replace("/_/", " ", $field_var)) : $field["label"]).':</label></th>'."\n";
378
- echo '<td>'.c_ws_plugin__s2member_custom_reg_fields::custom_field_gen(__FUNCTION__, $field, "ws_plugin__s2member_profile_", "ws-plugin--s2member-profile-", "", ((preg_match("/^(text|textarea|select|selects)$/", $field["type"])) ? "width:99%;" : ""), "", "", $fields, $fields[$field_var], "profile").'</td>'."\n";
379
- echo '</tr>'."\n";
380
- }
381
- unset($__refs, $__v);
382
- }
383
-
384
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
385
- do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_after", get_defined_vars());
386
- unset($__refs, $__v);
387
- }
388
-
389
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
390
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after_custom_fields", get_defined_vars());
391
- unset($__refs, $__v);
392
-
393
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
394
- do_action("ws_plugin__s2member_during_users_list_edit_cols_after", get_defined_vars());
395
- unset($__refs, $__v);
396
-
397
- echo '</table>'."\n";
398
-
399
- echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
400
- }
401
- }
402
- }
403
 
404
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
405
- do_action("ws_plugin__s2member_after_users_list_edit_cols", get_defined_vars());
406
- unset($__refs, $__v);
407
 
408
- return /* Return for uniformity. */;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
409
  }
410
- /**
411
- * Saves Custom Fields after an admin updates Profile.
412
- *
413
- * @package s2Member\Users_List
414
- * @since 3.5
415
- *
416
- * @attaches-to ``add_action("edit_user_profile_update");``
417
- * @attaches-to ``add_action("personal_options_update");``
418
- *
419
- * @param int|string $user_id Expects a numeric WordPress User ID passed in by the Action Hook.
420
- * @return null
421
- */
422
- public static function users_list_update_cols($user_id = FALSE)
423
  {
424
- global /* Multisite Networking. */ $current_site, $current_blog;
 
425
 
426
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
427
- do_action("ws_plugin__s2member_before_users_list_update_cols", get_defined_vars());
428
- unset($__refs, $__v);
 
 
429
 
430
- $user = /* We need both of these objects. $user and $current_user. */ new WP_User($user_id);
431
- $current_user = /* Current User. */ (is_user_logged_in()) ? wp_get_current_user() : false;
 
 
432
 
433
- if(is_object($user) && !empty($user->ID) && ($user_id = $user->ID) && is_object($current_user) && !empty($current_user->ID))
434
- {
435
- if(current_user_can("edit_users") && (!is_multisite() || is_super_admin() || is_user_member_of_blog($user_id)))
 
 
 
 
436
  {
437
- if(!empty($_POST) && is_array($_p = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST))))
438
- {
439
- $old_user = /* Copy existing User obj. */ unserialize(serialize($user));
440
- $old_role = c_ws_plugin__s2member_user_access::user_access_role($old_user);
441
-
442
- $role = /* Might be empty! */ (isset($_p["role"]) && $_p["role"] !== $old_role) ? $_p["role"] : $old_role;
443
- $level = /* Might be `-1`. */ c_ws_plugin__s2member_user_access::user_access_role_to_level($role);
444
-
445
- $user->roles = (isset($_p["role"]) && $_p["role"] !== $old_role) ? /* Might be empty! */ array($_p["role"]): $old_user->roles;
446
- $user->user_email = (isset($_p["email"]) && is_email($_p["email"]) && $_p["email"] !== $old_user->user_email && !email_exists($_p["email"])) ? $_p["email"] : $old_user->user_email;
447
- $user->first_name = (isset($_p["first_name"]) && $_p["first_name"] !== $old_user->first_name) ? $_p["first_name"] : $old_user->first_name;
448
- $user->last_name = (isset($_p["last_name"]) && $_p["last_name"] !== $old_user->last_name) ? $_p["last_name"] : $old_user->last_name;
449
-
450
- $auto_eot_time = (!empty($_p["ws_plugin__s2member_profile_s2member_auto_eot_time"])) ? strtotime($_p["ws_plugin__s2member_profile_s2member_auto_eot_time"]) : "";
451
-
452
- if($role !== $old_role) // In this case, we need to fire Hook: `ws_plugin__s2member_during_collective_mods`.
453
- do_action("ws_plugin__s2member_during_collective_mods", $user_id, get_defined_vars(), "user-role-change", "modification", $role, $user, $old_user);
454
-
455
- if(isset($_p["ws_plugin__s2member_profile_s2member_originating_blog"]) && is_multisite() && is_super_admin())
456
- update_user_meta($user_id, "s2member_originating_blog", $_p["ws_plugin__s2member_profile_s2member_originating_blog"]);
457
-
458
- if(isset($_p["ws_plugin__s2member_profile_s2member_subscr_gateway"]))
459
- update_user_option($user_id, "s2member_subscr_gateway", $_p["ws_plugin__s2member_profile_s2member_subscr_gateway"]);
460
-
461
- if(isset($_p["ws_plugin__s2member_profile_s2member_subscr_id"]))
462
- update_user_option($user_id, "s2member_subscr_id", $_p["ws_plugin__s2member_profile_s2member_subscr_id"]);
463
-
464
- if(isset($_p["ws_plugin__s2member_profile_s2member_subscr_cid"]))
465
- update_user_option($user_id, "s2member_subscr_cid", $_p["ws_plugin__s2member_profile_s2member_subscr_cid"]);
466
-
467
- if(isset($_p["ws_plugin__s2member_profile_s2member_custom"]))
468
- update_user_option($user_id, "s2member_custom", $_p["ws_plugin__s2member_profile_s2member_custom"]);
469
-
470
- if(isset($_p["ws_plugin__s2member_profile_s2member_registration_ip"]))
471
- update_user_option($user_id, "s2member_registration_ip", $_p["ws_plugin__s2member_profile_s2member_registration_ip"]);
472
-
473
- if(isset($_p["ws_plugin__s2member_profile_s2member_notes"]))
474
- update_user_option($user_id, "s2member_notes", $_p["ws_plugin__s2member_profile_s2member_notes"]);
475
-
476
- if(isset($_p["ws_plugin__s2member_profile_s2member_auto_eot_time"]) && isset($auto_eot_time))
477
- update_user_option($user_id, "s2member_auto_eot_time", $auto_eot_time);
478
-
479
- if(isset($_p["ws_plugin__s2member_profile_s2member_ccaps"]))
480
- {
481
- foreach($user->allcaps as $cap => $cap_enabled)
482
- if(preg_match("/^access_s2member_ccap_/", $cap))
483
- $user->remove_cap($ccap = $cap);
484
-
485
- if(!empty($_p["ws_plugin__s2member_profile_s2member_ccaps"]))
486
- foreach(preg_split("/[\r\n\t\s;,]+/", $_p["ws_plugin__s2member_profile_s2member_ccaps"]) as $ccap)
487
- if(strlen($ccap = trim(strtolower(preg_replace("/[^a-z_0-9]/i", "", $ccap)))))
488
- $user->add_cap("access_s2member_ccap_".$ccap);
489
- }
490
- if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
491
- {
492
- foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
493
- {
494
- $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
495
- $field_id_class = preg_replace("/_/", "-", $field_var);
496
-
497
- if /* Field being set? */(isset($_p["ws_plugin__s2member_profile_".$field_var]))
498
- {
499
- if((is_array($_p["ws_plugin__s2member_profile_".$field_var]) && !empty($_p["ws_plugin__s2member_profile_".$field_var])) || (is_string($_p["ws_plugin__s2member_profile_".$field_var]) && strlen($_p["ws_plugin__s2member_profile_".$field_var])))
500
- $fields[$field_var] = $_p["ws_plugin__s2member_profile_".$field_var];
501
- else if(isset($fields)) unset($fields[$field_var]);
502
- }
503
- else if(isset($fields)) unset($fields[$field_var]);
504
- }
505
- }
506
- if(!empty($fields))
507
- update_user_option($user_id, "s2member_custom_fields", $fields);
508
- else delete_user_option($user_id, "s2member_custom_fields");
509
-
510
- if /* We ONLY process this if they are higher than Level #0. */($level > 0)
511
- {
512
- $pr_times = get_user_option("s2member_paid_registration_times", $user_id);
513
- $pr_times["level"] = (empty($pr_times["level"])) ? time() : $pr_times["level"];
514
- $pr_times["level".$level] = (empty($pr_times["level".$level])) ? time() : $pr_times["level".$level];
515
- update_user_option($user_id, "s2member_paid_registration_times", $pr_times); // Update now.
516
- }
517
- if /* Should we process List Servers? */(!empty($_p["ws_plugin__s2member_profile_opt_in"]) && !empty($role) && $level >= 0)
518
- c_ws_plugin__s2member_list_servers::process_list_servers($role, $level, $user->user_login, ((!empty($_p["pass1"])) ? $_p["pass1"] : ""), $user->user_email, $user->first_name, $user->last_name, false, true, true, $user_id);
519
-
520
- if /* Delete/reset IP Restrictions? */(!empty($_p["ws_plugin__s2member_profile_ip_restrictions"]))
521
- c_ws_plugin__s2member_ip_restrictions::delete_reset_specific_ip_restrictions(strtolower($user->user_login));
522
-
523
- if /* Reset password & resend email notification? */ (!empty($_p["ws_plugin__s2member_profile_reset_pass_resend"]) && c_ws_plugin__s2member_utils_conds::pro_is_installed())
524
- c_ws_plugin__s2member_email_configs::reset_pass_resend_new_user_notification($user_id, ((!empty($_p["pass1"])) ? $_p["pass1"] : ""), array("user"), $user->user_email);
525
-
526
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
527
- do_action("ws_plugin__s2member_during_users_list_update_cols", get_defined_vars());
528
- unset($__refs, $__v);
529
- }
530
  }
531
- else if /* Otherwise, a User can always edit their own Profile. */($current_user->ID === $user->ID)
532
  {
533
- if(!empty($_POST) && is_array($_p = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST))))
534
- {
535
- $role = /* Role is NOT changing here. */ c_ws_plugin__s2member_user_access::user_access_role($user);
536
- $level = c_ws_plugin__s2member_user_access::user_access_role_to_level($role);
537
-
538
- if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
539
- if($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level($level, "profile"))
540
- {
541
- $_existing_fields = get_user_option("s2member_custom_fields", $user_id);
542
-
543
- foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], true) as $field)
544
- {
545
- $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
546
- $field_id_class = preg_replace("/_/", "-", $field_var);
547
-
548
- if(!in_array($field["id"], $fields_applicable) || strpos($field["editable"], "no") === 0)
549
- {
550
- if(isset($_existing_fields[$field_var]) && ((is_array($_existing_fields[$field_var]) && !empty($_existing_fields[$field_var])) || (is_string($_existing_fields[$field_var]) && strlen($_existing_fields[$field_var]))))
551
- $fields[$field_var] = $_existing_fields[$field_var];
552
- else // Else ``unset()``.
553
- unset($fields[$field_var]);
554
- }
555
- else if($field["required"] === "yes" && (!isset($_p["ws_plugin__s2member_profile_".$field_var]) || (!is_array($_p["ws_plugin__s2member_profile_".$field_var]) && !is_string($_p["ws_plugin__s2member_profile_".$field_var])) || (is_array($_p["ws_plugin__s2member_profile_".$field_var]) && empty($_p["ws_plugin__s2member_profile_".$field_var])) || (is_string($_p["ws_plugin__s2member_profile_".$field_var]) && !strlen($_p["ws_plugin__s2member_profile_".$field_var]))))
556
- {
557
- if(isset($_existing_fields[$field_var]) && ((is_array($_existing_fields[$field_var]) && !empty($_existing_fields[$field_var])) || (is_string($_existing_fields[$field_var]) && strlen($_existing_fields[$field_var]))))
558
- $fields[$field_var] = $_existing_fields[$field_var];
559
- else // Else ``unset()``.
560
- unset($fields[$field_var]);
561
- }
562
- else if(isset($_p["ws_plugin__s2member_profile_".$field_var]))
563
- {
564
- if((is_array($_p["ws_plugin__s2member_profile_".$field_var]) && !empty($_p["ws_plugin__s2member_profile_".$field_var])) || (is_string($_p["ws_plugin__s2member_profile_".$field_var]) && strlen($_p["ws_plugin__s2member_profile_".$field_var])))
565
- $fields[$field_var] = $_p["ws_plugin__s2member_profile_".$field_var];
566
- else unset($fields[$field_var]);
567
- }
568
- else unset($fields[$field_var]);
569
- }
570
- if(!empty($fields))
571
- update_user_option($user_id, "s2member_custom_fields", $fields);
572
- else delete_user_option($user_id, "s2member_custom_fields");
573
- }
574
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
575
- do_action("ws_plugin__s2member_during_users_list_update_cols", get_defined_vars());
576
- unset($__refs, $__v);
577
- }
578
  }
 
 
 
 
 
579
  }
580
- foreach(array_keys(get_defined_vars())as$__v)$__refs[$__v]=&$$__v;
581
- do_action("ws_plugin__s2member_after_users_list_update_cols", get_defined_vars());
582
  unset($__refs, $__v);
583
-
584
- return /* Return for uniformity. */;
585
  }
 
586
  }
 
 
 
 
587
  }
588
- ?>
1
  <?php
2
  /**
3
+ * Users list (inner processing routines).
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Users_List
15
+ * @since 3.5
16
+ */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_users_list_in"))
21
+ {
22
+ /**
23
+ * Users list (inner processing routines).
24
+ *
25
+ * @package s2Member\Users_List
26
+ * @since 3.5
27
+ */
28
+ class c_ws_plugin__s2member_users_list_in
29
  {
30
  /**
31
+ * Adds Custom Fields to the admin Profile editing page.
32
+ *
33
+ * @package s2Member\Users_List
34
+ * @since 3.5
35
+ *
36
+ * @attaches-to ``add_action("edit_user_profile");``
37
+ * @attaches-to ``add_action("show_user_profile");``
38
+ *
39
+ * @param $user \WP_User Expects a `WP_User` object passed in by the Action Hook.
40
+ */
41
+ public static function users_list_edit_cols($user = NULL)
42
+ {
43
+ global $current_site, $current_blog; // Multisite networks.
44
+
45
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
46
+ do_action("ws_plugin__s2member_before_users_list_edit_cols", get_defined_vars());
47
+ unset($__refs, $__v);
48
+
49
+ $current_user = is_user_logged_in() ? wp_get_current_user() : FALSE; // Current User.
50
+
51
+ if(is_object($user) && !empty($user->ID) && ($user_id = $user->ID) && is_object($current_user) && !empty($current_user->ID))
52
  {
53
+ $role = c_ws_plugin__s2member_user_access::user_access_role($user); // This User's current WordPress Role.
54
+ $level = c_ws_plugin__s2member_user_access::user_access_level($user); // User's Access Level for s2Member.
55
+
56
+ if(current_user_can("edit_users") && (!is_multisite() || is_super_admin() || is_user_member_of_blog($user_id)))
57
+ {
58
+ echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
59
+
60
+ echo '<h3 style="position:relative;"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/large-icon.png" title="s2Member (a Membership management system for WordPress)" alt="" style="position:absolute; top:-15px; right:0; border:0;" />s2Member Configuration &amp; Profile Fields'.((is_multisite()) ? ' (for this Blog)' : '').'</h3>'."\n";
61
+
62
+ echo '<table class="form-table">'."\n";
63
+
64
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
65
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before", get_defined_vars());
66
+ unset($__refs, $__v);
67
+
68
+ if(is_multisite() && is_super_admin()) // Super Admins can edit this.
69
  {
70
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
71
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_originating_blog", get_defined_vars());
72
+ unset($__refs, $__v);
73
+
74
+ echo '<tr>'."\n";
75
+ echo '<th><label for="ws-plugin--s2member-profile-s2member-originating-blog">Originating Blog ID#:</label> <a href="#" onclick="alert(\'On a Multisite Network, this is how s2Member keeps track of which Blog each User/Member originated from. So this ID#, is automatically associated with a Blog in your Network, matching the User\\\'s point of origin. ~ ONLY a Super Admin can modify this.\\n\\nOn a Multisite Blog Farm, the Originating Blog ID# for your own Customers, will ALWAYS be associated with your (Main Site). It is NOT likely that you\\\'ll need to modify this manually, but s2Member makes it available; just in case.\\n\\n*Tip* - If you add Users (and/or Blogs) with the `Super Admin` Network Administration panel inside WordPress, then you WILL need to set everything manually. s2Member does NOT tamper with automation routines whenever YOU (as a Super Administrator) are working in that area.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
76
+ echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_originating_blog" id="ws-plugin--s2member-profile-s2member-originating-blog" value="'.format_to_edit(get_user_meta($user_id, "s2member_originating_blog", TRUE)).'" class="regular-text" /></td>'."\n";
77
+ echo '</tr>'."\n";
78
 
79
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
80
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_originating_blog", get_defined_vars());
81
+ unset($__refs, $__v);
82
+ }
83
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
84
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_subscr_gateway", get_defined_vars());
85
+ unset($__refs, $__v);
86
+
87
+ echo '<tr>'."\n";
88
+ echo '<th><label for="ws-plugin--s2member-profile-s2member-subscr-gateway">Paid Subscr. Gateway:</label> <a href="#" onclick="alert(\'A Payment Gateway Code is associated with the Paid Subscr. ID below. A Paid Subscription ID (or a Buy Now Transaction ID) is only valid for paid Members. Also known as a Recurring Profile ID, a ClickBank Receipt #, a Google Order ID, an AliPay Trade No.\\n\\nThis will be filled automatically by s2Member. This field will be empty for Free Subscribers, and/or anyone who is NOT paying you. This field is only editable for Customer Service purposes; just in case you ever need to update the Paid Subscr. Gateway/ID manually.\\n\\nThe value of Paid Subscr. ID can be a PayPal Standard Subscription ID, or a PayPal Pro Recurring Profile ID, or a PayPal Transaction ID; depending on the type of sale. Your PayPal account will supply this information.\\n\\nIf you are using Stripe, please use the customer\\\'s Subscription ID (if applicable); else a Charge ID or an Invoice ID.\\n\\nIf you\\\'re using Google Wallet, use the Google Order ID. ClickBank provides a Receipt #, ccBill provides a Subscription ID, Authorize.Net provides a Subscription ID, and AliPay provides a Transaction ID.\\n\\nThe general rule is... IF there\\\'s a Subscription ID, use that! If there\\\'s NOT, use the Transaction ID.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
89
+ echo '<td><select name="ws_plugin__s2member_profile_s2member_subscr_gateway" id="ws-plugin--s2member-profile-s2member-subscr-gateway" style="width:25em;"><option value=""></option>'."\n";
90
+ foreach(apply_filters("ws_plugin__s2member_profile_s2member_subscr_gateways", array("paypal" => "PayPal (code: paypal)"), get_defined_vars()) as $gateway => $gateway_name)
91
+ echo '<option value="'.esc_attr($gateway).'"'.(($gateway === get_user_option("s2member_subscr_gateway", $user_id)) ? ' selected="selected"' : '').'>'.esc_html($gateway_name).'</option>'."\n";
92
+ echo '</select>'."\n";
93
+ echo '</td>'."\n";
94
+ echo '</tr>'."\n";
95
+
96
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
97
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_subscr_gateway", get_defined_vars());
98
+ unset($__refs, $__v);
99
+
100
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
101
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_subscr_id", get_defined_vars());
102
+ unset($__refs, $__v);
103
+
104
+ echo '<tr>'."\n";
105
+ echo '<th><label for="ws-plugin--s2member-profile-s2member-subscr-id">Paid Subscr. ID:</label> <a href="#" onclick="alert(\'A Paid Subscription ID (or a Buy Now Transaction ID) is only valid for paid Members. Also known as a Recurring Profile ID, a ClickBank Receipt #, a Google Order ID, an AliPay Trade No.\\n\\nThis will be filled automatically by s2Member. This field will be empty for Free Subscribers, and/or anyone who is NOT paying you. This field is only editable for Customer Service purposes; just in case you ever need to update the Paid Subscr. Gateway/ID manually.\\n\\nThe value of Paid Subscr. ID can be a PayPal Standard Subscription ID, or a PayPal Pro Recurring Profile ID, or a PayPal Transaction ID; depending on the type of sale. Your PayPal account will supply this information.\\n\\nIf you are using Stripe, please use the customer\\\'s Subscription ID (if applicable); else a Charge ID or an Invoice ID.\\n\\nIf you\\\'re using Google Wallet, use the Google Order ID. ClickBank provides a Receipt #, ccBill provides a Subscription ID, Authorize.Net provides a Subscription ID, and AliPay provides a Transaction ID.\\n\\nThe general rule is... IF there\\\'s a Subscription ID, use that! If there\\\'s NOT, use the Transaction ID.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
106
+ echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_subscr_id" id="ws-plugin--s2member-profile-s2member-subscr-id" value="'.format_to_edit(get_user_option("s2member_subscr_id", $user_id)).'" class="regular-text" /></td>'."\n";
107
+ echo '</tr>'."\n";
108
+
109
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
110
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_subscr_id", get_defined_vars());
111
+ unset($__refs, $__v);
112
+
113
+ if(c_ws_plugin__s2member_utils_conds::pro_is_installed())
114
+ if(in_array('stripe', $GLOBALS['WS_PLUGIN__']['s2member']['o']['pro_gateways_enabled']))
115
+ {
116
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
117
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_subscr_cid", get_defined_vars());
118
+ unset($__refs, $__v);
119
+
120
+ echo '<tr>'."\n";
121
+ echo '<th><label for="ws-plugin--s2member-profile-s2member-subscr-cid">Paid Subscr. CID:</label> <a href="#" onclick="alert(\'A Paid Subscription CID; i.e. a Customer\\\'s ID. Applicable only with Stripe integration. s2Member fills this in automatically. This is the Customer\\\'s ID in Stripe, which remains constant throughout any & all future payments. Each Stripe Customer has this Customer ID; and also a Subscription and/or Transaction ID.\\n\\nIn all other cases, the Paid Subscr. CID is simply set to the Paid Subscr. ID value; i.e. it is a duplicate of Paid Subscr. ID when running anything other than Stripe.\\n\\nThis field will be empty for Free Subscribers, and/or anyone who is NOT paying you. This field is only editable for Customer Service purposes; just in case you ever need to update the Paid Subscr. Gateway/ID/CID manually.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
122
+ echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_subscr_cid" id="ws-plugin--s2member-profile-s2member-subscr-cid" value="'.format_to_edit(get_user_option("s2member_subscr_cid", $user_id)).'" class="regular-text" /></td>'."\n";
123
+ echo '</tr>'."\n";
124
+
125
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
126
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_subscr_cid", get_defined_vars());
127
+ unset($__refs, $__v);
128
+ }
129
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
130
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_custom", get_defined_vars());
131
+ unset($__refs, $__v);
132
+
133
+ echo '<tr>'."\n";
134
+ echo '<th><label for="ws-plugin--s2member-profile-s2member-custom">Custom Value:</label> <a href="#" onclick="alert(\'A Paid Subscription is always associated with a Custom String that is passed through the custom=\\\'\\\''.c_ws_plugin__s2member_utils_strings::esc_js_sq(esc_attr($_SERVER["HTTP_HOST"]), 3).'\\\'\\\' attribute of your Shortcode. This Custom Value, MUST always start with your domain name. However, you can also pipe delimit additional values after your domain, if you need to.\\n\\nFor example:\n'.c_ws_plugin__s2member_utils_strings::esc_js_sq(esc_attr($_SERVER["HTTP_HOST"]), 3).'|cv1|cv2|cv3\'); return false;" tabindex="-1">[?]</a></th>'."\n";
135
+ echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_custom" id="ws-plugin--s2member-profile-s2member-custom" value="'.format_to_edit(get_user_option("s2member_custom", $user_id)).'" class="regular-text" /></td>'."\n";
136
+ echo '</tr>'."\n";
137
+
138
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
139
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_custom", get_defined_vars());
140
+ unset($__refs, $__v);
141
+
142
+ if(c_ws_plugin__s2member_utils_conds::pro_is_installed())
143
+ {
144
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
145
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_coupon_codes", get_defined_vars());
146
  unset($__refs, $__v);
147
 
148
+ echo '<tr>'."\n";
149
+ echo '<th><label for="ws-plugin--s2member-profile-s2member-coupon-codes">Coupon Code(s):</label> <a href="#" onclick="alert(\'This is a comma-delimited list of the Coupon Codes associated with this user; i.e. the Coupon Code(s) that have been used to complete checkout. s2Member updates this list automatically. This field is only editable for Customer Service purposes; i.e. just in case you ever need to update the list manually.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
150
+ echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_coupon_codes" id="ws-plugin--s2member-profile-s2member-coupon-codes" value="'.format_to_edit(implode(',', is_array($_user_coupon_codes = get_user_option("s2member_coupon_codes", $user_id)) ? $_user_coupon_codes : array())).'" class="regular-text" /></td>'."\n";
151
+ echo '</tr>'."\n";
152
 
153
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
154
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_coupon_codes", get_defined_vars());
155
+ unset($__refs, $__v);
156
+ }
157
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
158
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_registration_ip", get_defined_vars());
159
+ unset($__refs, $__v);
160
 
161
+ echo '<tr>'."\n";
162
+ echo '<th><label for="ws-plugin--s2member-profile-s2member-registration-ip">Registration IP:</label> <a href="#" onclick="alert(\'This is the IP Address the User had at the time of registration. If you don\\\'t know the User\\\'s IP Address, just leave this blank. If this is left empty, s2Member will make attempts in the future to grab the User\\\'s IP Address.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
163
+ echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_registration_ip" id="ws-plugin--s2member-profile-s2member-registration-ip" value="'.format_to_edit(get_user_option("s2member_registration_ip", $user_id)).'" class="regular-text" /></td>'."\n";
164
+ echo '</tr>'."\n";
165
 
166
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
167
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_registration_ip", get_defined_vars());
168
+ unset($__refs, $__v);
169
 
170
+ if(!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) // Will change once Custom Capabilities are compatible with a Blog Farm.
171
+ {
172
+ foreach($user->allcaps as $cap => $cap_enabled)
173
+ if(preg_match("/^access_s2member_ccap_/", $cap))
174
+ $ccaps[] = preg_replace("/^access_s2member_ccap_/", "", $cap);
175
 
176
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
177
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_ccaps", get_defined_vars());
178
+ unset($__refs, $__v);
179
 
180
+ echo '<tr>'."\n";
181
+ echo '<th><label for="ws-plugin--s2member-profile-s2member-ccaps">Custom Capabilities:</label> <a href="#" onclick="alert(\'Optional. This is VERY advanced.\\nSee: s2Member -› API Scripting -› Custom Capabilities.'.((is_multisite()) ? '\\n\\nCustom Capabilities are assigned on a per-Blog basis. So having a set of Custom Capabilities for one Blog, and having NO Custom Capabilities on another Blog - is very common. This is how permissions are designed to work.' : '').'\'); return false;" tabindex="-1">[?]</a>'.((is_multisite()) ? '<br /><small>(for this Blog)</small>' : '').'</th>'."\n";
182
+ echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_ccaps" id="ws-plugin--s2member-profile-s2member-ccaps" value="'.format_to_edit(((!empty($ccaps)) ? implode(",", $ccaps) : "")).'" class="regular-text" onkeyup="if(this.value.match(/[^a-z_0-9,]/)) this.value = jQuery.trim (jQuery.trim (this.value).replace (/[ \-]/g, \'_\').replace (/[^a-z_0-9,]/gi, \'\').toLowerCase ());" /></td>'."\n";
183
+ echo '</tr>'."\n";
 
 
184
 
185
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
186
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_ccaps", get_defined_vars());
187
+ unset($__refs, $__v);
188
+ }
189
+ if(!$user->has_cap("administrator")) // Do NOT present these details for Administrator accounts.
190
+ {
191
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
192
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_auto_eot_time", get_defined_vars());
193
+ unset($__refs, $__v);
194
 
195
+ echo '<tr>'."\n";
196
+ $auto_eot_time = get_user_option("s2member_auto_eot_time", $user_id);
197
+ $auto_eot_time = ($auto_eot_time) ? date("D M j, Y g:i a T", $auto_eot_time) : "";
198
+ echo '<th><label for="ws-plugin--s2member-profile-s2member-auto-eot-time">Automatic EOT Time:</label> <a href="#" onclick="alert(\'EOT = End Of Term. ( i.e. Account Expiration / Termination. ).\\n\\nIf you leave this empty, s2Member will configure an EOT Time automatically, based on the paid Subscription associated with this account. In other words, if a paid Subscription expires, is cancelled, terminated, refunded, reversed, or charged back to you; s2Member will deal with the EOT automatically.\\n\\nThat being said, if you would rather take control over this, you can. If you type in a date manually, s2Member will obey the Auto-EOT Time that you\\\'ve given, no matter what. In other words, you can force certain Members to expire automatically, at a time that you specify. s2Member will obey.\\n\\nValid formats for Automatic EOT Time:\\n\\nmm/dd/yyyy\\nyyyy-mm-dd\\n+1 year\\n+2 weeks\\n+2 months\\n+10 minutes\\nnext thursday\\ntomorrow\\ntoday\\n\\n* anything compatible with PHP\\\'s strtotime() function.\'); return false;" tabindex="-1">[?]</a>'.(($auto_eot_time) ? '<br /><small>(<a href="http://en.wikipedia.org/wiki/Coordinated_Universal_Time" target="_blank" rel="external">Universal Time / GMT</a>)</small>' : '').'</th>'."\n";
199
+ echo '<td><input type="text" autocomplete="off" name="ws_plugin__s2member_profile_s2member_auto_eot_time" id="ws-plugin--s2member-profile-s2member-auto-eot-time" value="'.format_to_edit($auto_eot_time).'" class="regular-text" /></td>'."\n";
200
+ echo '</tr>'."\n";
201
 
202
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
203
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_auto_eot_time", get_defined_vars());
204
+ unset($__refs, $__v);
205
 
206
+ if(c_ws_plugin__s2member_utils_conds::pro_is_installed())
207
+ {
208
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
209
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_reset_pass_resend", get_defined_vars());
210
+ unset($__refs, $__v);
211
+
212
+ echo '<tr>'."\n";
213
+ echo '<th><label for="ws-plugin--s2member-profile-reset-pass-resend">Reset Password &amp; Resend Welcome Email Message:</label> <a href="#" onclick="alert(\'Checking this box will tell s2Member to reset this User\\\'s password and then reprocess the New User Email Notification message against this User\\\'s account. This way they\\\'ll get an email message with their Username/Password.\\n\\nThis can be helpful in cases where a User/Member missed the original email message for some reason.\\n\\nThe User\\\'s password is reset to a new auto-generated password by default. However, you can provide a custom password by entering a new password of your choosing in the field above — provided by WordPress itself.\\n\\nIt is also possible to customize the New User Email Notification message with s2Member. Please see: `Dashboard -› s2Member -› General Options -› Email Configuration -› New User Notifications`.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
214
+ echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_reset_pass_resend" id="ws-plugin--s2member-profile-reset-pass-resend" value="1" /> Yes, reset password &amp; resend welcome email message to this User.</label></td>'."\n";
215
+ echo '</tr>'."\n";
216
+
217
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
218
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_reset_pass_resend", get_defined_vars());
219
+ unset($__refs, $__v);
220
+ }
221
+ }
222
+ if(c_ws_plugin__s2member_list_servers::list_servers_integrated()) // Only if integrated with s2Member.
223
+ {
224
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
225
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_opt_in", get_defined_vars());
226
+ unset($__refs, $__v);
227
 
228
+ echo '<tr>'."\n";
229
+ echo '<th><label for="ws-plugin--s2member-profile-opt-in">Re-process List Servers:</label> <a href="#" onclick="alert(\'You have at least one List Server integrated with s2Member. Would you like to re-process a confirmation request for this User? If not, just leave the box un-checked.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
230
+ echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_opt_in" id="ws-plugin--s2member-profile-opt-in" value="1" /> Yes, send a mailing list confirmation email to this User.</label></td>'."\n";
231
+ echo '</tr>'."\n";
232
 
233
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
234
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_opt_in", get_defined_vars());
235
+ unset($__refs, $__v);
236
 
237
+ if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_out_transitions"])
238
+ if(($custom_reg_auto_op_outs = c_ws_plugin__s2member_utils_strings::wrap_deep($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_auto_opt_outs"], "/^", "$/i")))
239
+ if(c_ws_plugin__s2member_utils_arrays::in_regex_array("user-role-change", $custom_reg_auto_op_outs) || c_ws_plugin__s2member_utils_arrays::in_regex_array("modification", $custom_reg_auto_op_outs))
240
+ {
241
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
242
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_auto_opt_out_transitions", get_defined_vars());
243
+ unset($__refs, $__v);
244
+
245
+ echo '<tr>'."\n";
246
+ echo '<th><label for="ws-plugin--s2member-custom-reg-auto-opt-out-transitions">Allow List Transitioning:</label> <a href="#" onclick="alert(\'You\\\'ve configured s2Member with List Transitions enabled. By leaving this box checked, s2Member will Transition the User\\\'s mailing list subscription(s) automatically. For example, if a Member is demoted from Level #2, down to Level #1; s2Member will add them to the Level #1 List(s) after it removes them from the Level #2 List(s).\\n\\nDepending on your configuration of s2Member, a transition may ONLY occur if s2Member IS able to successfully remove them from an existing List. In other words, if they are currently NOT subscribed to any List(s), s2Member may NOT transition them to any new Lists (depending on your configuration).\'); return false;" tabindex="-1">[?]</a></th>'."\n";
247
+ echo '<td><label><input type="checkbox" name="ws_plugin__s2member_custom_reg_auto_opt_out_transitions" id="ws-plugin--s2member-custom-reg-auto-opt-out-transitions" value="1" checked="checked" /> Yes, automatically transition this User\'s mailing list subscription(s) when/if I change their Role.</label></td>'."\n";
248
+ echo '</tr>'."\n";
249
+
250
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
251
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_auto_opt_out_transitions", get_defined_vars());
252
+ unset($__refs, $__v);
253
+ }
254
+ }
255
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
256
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_ip_restrictions", get_defined_vars());
257
+ unset($__refs, $__v);
258
+
259
+ echo '<tr>'."\n";
260
+ echo '<th><label for="ws-plugin--s2member-profile-ip-restrictions">Reset IP Restrictions:</label> <a href="#" onclick="alert(\'A single Username is only valid for a certain number of unique IP addresses (as configured in your s2Member -› General Options). Once that limit is reached, s2Member assumes there has been a security breach. At that time, s2Member will place a temporary ban (preventing access).\\n\\nIf you have spoken to a legitimate Customer that is receiving an error upon logging in (ex: 503 / too many IP addresses), you can remove this temporary ban by checking the box below. If the abusive behavior continues, s2Member will automatically re-instate IP Restrictions in the future. If you would like to gain further control over IP Restrictions, please check your General Options panel for s2Member.\'); return false;" tabindex="-1">[?]</a></th>'."\n";
261
+ echo '<td><label><input type="checkbox" name="ws_plugin__s2member_profile_ip_restrictions" id="ws-plugin--s2member-profile-ip-restrictions" value="1" /> Yes, delete/reset IP Restrictions associated with this Username.</label>'.((c_ws_plugin__s2member_ip_restrictions::specific_ip_restriction_at_or_above_max(strtolower($user->user_login)) || c_ws_plugin__s2member_ip_restrictions::specific_ip_restriction_breached_security(strtolower($user->user_login))) ? '<br /><em>*WARNING* this User is at (or above) max allowable IP addresses (based on your IP Restrictions).</em>' : '<br /><em>*Note* this User is NOT currently banned by any of your IP Restrictions.</em>').'</td>'."\n";
262
+ echo '</tr>'."\n";
263
+
264
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
265
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_ip_restrictions", get_defined_vars());
266
+ unset($__refs, $__v);
267
+
268
+ if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"]) // Only if configured.
269
+ if($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level($level, "administrative"))
270
+ {
271
+ echo '<tr>'."\n";
272
+ echo '<td colspan="2">'."\n";
273
+ echo '<div style="height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
274
+ echo '</td>'."\n";
275
+ echo '</tr>'."\n";
276
+
277
+ $fields = get_user_option("s2member_custom_fields", $user_id); // Existing fields.
278
+
279
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
280
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_custom_fields", get_defined_vars());
281
+ unset($__refs, $__v);
282
+
283
+ foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], TRUE) as $field)
284
+ {
285
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
286
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_before", get_defined_vars());
287
+ unset($__refs, $__v);
288
 
289
+ if(in_array($field["id"], $fields_applicable)) // Field applicable?
290
+ {
291
+ $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
292
+ $field_id_class = preg_replace("/_/", "-", $field_var);
293
+
294
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
295
+ if(apply_filters("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_display", TRUE, get_defined_vars()))
296
+ {
297
+ if(!empty($field["section"]) && $field["section"] === "yes") // Starts a new section?
298
+ echo '<tr><td colspan="2"><div class="ws-plugin--s2member-profile-divider-section'.((!empty($field["sectitle"])) ? '-title' : '').'">'.((!empty($field["sectitle"])) ? $field["sectitle"] : '').'</div></td></tr>';
 
 
 
 
 
 
 
 
 
 
 
 
 
299
 
300
  echo '<tr>'."\n";
301
+ echo '<th><label for="ws-plugin--s2member-profile-'.esc_attr($field_id_class).'">'.((preg_match("/^(checkbox|pre_checkbox)$/", $field["type"])) ? ucwords(preg_replace("/_/", " ", $field_var)) : $field["label"]).':</label></th>'."\n";
302
+ echo '<td>'.c_ws_plugin__s2member_custom_reg_fields::custom_field_gen(__FUNCTION__, $field, "ws_plugin__s2member_profile_", "ws-plugin--s2member-profile-", "", ((preg_match("/^(text|textarea|select|selects)$/", $field["type"])) ? "width:99%;" : ""), "", "", $fields, @$fields[$field_var], "administrative").'</td>'."\n";
303
  echo '</tr>'."\n";
304
+ }
305
+ unset($__refs, $__v);
306
+ }
307
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
308
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_after", get_defined_vars());
309
+ unset($__refs, $__v);
310
+ }
311
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
312
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_custom_fields", get_defined_vars());
313
+ unset($__refs, $__v);
314
+
315
+ echo '<tr>'."\n";
316
+ echo '<td colspan="2">'."\n";
317
+ echo '<div style="height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
318
+ echo '</td>'."\n";
319
+ echo '</tr>'."\n";
320
+ }
321
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
322
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_notes", get_defined_vars());
323
+ unset($__refs, $__v);
324
+
325
+ echo '<tr>'."\n";
326
+ echo '<th><label for="ws-plugin--s2member-profile-s2member-notes">Administrative Notes:</label> <a href="#" onclick="alert(\'This is for Administrative purposes. You can keep a list of Notations about this account. These Notations are private; Users/Members will never see these.\\n\\n*Note* The s2Member software may `append` Notes to this field occasionally, under special circumstances. For example, when/if s2Member demotes a paid Member to a Free Subscriber, s2Member will leave a Note in this field.\'); return false;" tabindex="-1">[?]</a><br /><br /><small>These Notations are private; Users/Members will never see any of these notes.</small></th>'."\n";
327
+ echo '<td><textarea name="ws_plugin__s2member_profile_s2member_notes" id="ws-plugin--s2member-profile-s2member-notes" rows="5" wrap="off" spellcheck="false" style="width:99%;">'.format_to_edit(get_user_option("s2member_notes", $user_id)).'</textarea></td>'."\n";
328
+ echo '</tr>'."\n";
329
+
330
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
331
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_notes", get_defined_vars());
332
+ unset($__refs, $__v);
333
+
334
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
335
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after", get_defined_vars());
336
+ unset($__refs, $__v);
337
+
338
+ echo '</table>'."\n";
339
+
340
+ echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
341
+ }
342
+ else if($current_user->ID === $user->ID) // Otherwise, a User can always edit their own Profile.
343
+ {
344
+ if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"] /* Only if configured. */)
345
+ if($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level($level, "profile"))
346
+ {
347
+ echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
348
+
349
+ echo '<h3>'._x("Additional Profile Fields", "s2member-front", "s2member").((is_multisite()) ? ' '._x("(for this site)", "s2member-front", "s2member") : "").'</h3>'."\n";
350
+
351
+ echo '<table class="form-table">'."\n";
352
+
353
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
354
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before", get_defined_vars());
355
+ unset($__refs, $__v);
356
+
357
+ $fields = get_user_option("s2member_custom_fields", $user_id); // Existing fields.
358
+
359
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
360
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_before_custom_fields", get_defined_vars());
361
+ unset($__refs, $__v);
362
+
363
+ foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], TRUE) as $field)
364
+ {
365
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
366
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_before", get_defined_vars());
367
+ unset($__refs, $__v);
368
 
369
+ if(in_array($field["id"], $fields_applicable)) // Field applicable?
370
+ {
371
+ $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
372
+ $field_id_class = preg_replace("/_/", "-", $field_var);
373
 
374
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
375
+ if(apply_filters("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_display", TRUE, get_defined_vars()))
376
+ {
377
+ if(!empty($field["section"]) && $field["section"] === "yes") // Starts a new section?
378
+ echo '<tr><td colspan="2"><div class="ws-plugin--s2member-profile-divider-section'.((!empty($field["sectitle"])) ? '-title' : '').'">'.((!empty($field["sectitle"])) ? $field["sectitle"] : '').'</div></td></tr>';
379
 
380
  echo '<tr>'."\n";
381
+ echo '<th><label for="ws-plugin--s2member-profile-'.esc_attr($field_id_class).'">'.((preg_match("/^(checkbox|pre_checkbox)$/", $field["type"])) ? ucwords(preg_replace("/_/", " ", $field_var)) : $field["label"]).':</label></th>'."\n";
382
+ echo '<td>'.c_ws_plugin__s2member_custom_reg_fields::custom_field_gen(__FUNCTION__, $field, "ws_plugin__s2member_profile_", "ws-plugin--s2member-profile-", "", ((preg_match("/^(text|textarea|select|selects)$/", $field["type"])) ? "width:99%;" : ""), "", "", $fields, $fields[$field_var], "profile").'</td>'."\n";
383
  echo '</tr>'."\n";
384
+ }
385
+ unset($__refs, $__v);
386
+ }
387
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
388
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_during_custom_fields_after", get_defined_vars());
389
+ unset($__refs, $__v);
390
+ }
391
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
392
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after_custom_fields", get_defined_vars());
393
+ unset($__refs, $__v);
394
 
395
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
396
+ do_action("ws_plugin__s2member_during_users_list_edit_cols_after", get_defined_vars());
397
+ unset($__refs, $__v);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
398
 
399
+ echo '</table>'."\n";
 
 
 
400
 
401
+ echo '<div style="margin:25px 0 25px 0; height:1px; line-height:1px; background:#CCCCCC;"></div>'."\n";
402
+ }
403
+ }
404
+ }
405
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
406
+ do_action("ws_plugin__s2member_after_users_list_edit_cols", get_defined_vars());
407
+ unset($__refs, $__v);
408
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
409
 
410
+ /**
411
+ * Saves Custom Fields after an admin updates Profile.
412
+ *
413
+ * @package s2Member\Users_List
414
+ * @since 3.5
415
+ *
416
+ * @attaches-to ``add_action("edit_user_profile_update");``
417
+ * @attaches-to ``add_action("personal_options_update");``
418
+ *
419
+ * @param int|string $user_id Expects a numeric WordPress User ID passed in by the Action Hook.
420
+ */
421
+ public static function users_list_update_cols($user_id = '')
422
+ {
423
+ global $current_site, $current_blog; // Multisite networks.
424
+
425
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
426
+ do_action("ws_plugin__s2member_before_users_list_update_cols", get_defined_vars());
427
+ unset($__refs, $__v);
428
+
429
+ $user = new WP_User($user_id); // We need both of these objects. `$user` and `$current_user`.
430
+ $current_user = (is_user_logged_in()) ? wp_get_current_user() : FALSE; // Current user.
431
+
432
+ if(is_object($user) && !empty($user->ID) && ($user_id = $user->ID) && is_object($current_user) && !empty($current_user->ID))
433
+ {
434
+ if(current_user_can("edit_users") && (!is_multisite() || is_super_admin() || is_user_member_of_blog($user_id)))
435
+ {
436
+ if(!empty($_POST) && is_array($_p = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST))))
437
+ {
438
+ $old_user = unserialize(serialize($user)); // Copy existing User obj.
439
+ $old_role = c_ws_plugin__s2member_user_access::user_access_role($old_user);
440
 
441
+ $role = isset($_p["role"]) && $_p["role"] !== $old_role ? $_p["role"] : $old_role;
442
+ $level = c_ws_plugin__s2member_user_access::user_access_role_to_level($role);
 
443
 
444
+ $user->roles = isset($_p["role"]) && $_p["role"] !== $old_role ? array($_p["role"]) : $old_user->roles;
445
+ $user->user_email = isset($_p["email"]) && is_email($_p["email"]) && $_p["email"] !== $old_user->user_email && !email_exists($_p["email"]) ? $_p["email"] : $old_user->user_email;
446
+ $user->first_name = isset($_p["first_name"]) && $_p["first_name"] !== $old_user->first_name ? $_p["first_name"] : $old_user->first_name;
447
+ $user->last_name = isset($_p["last_name"]) && $_p["last_name"] !== $old_user->last_name ? $_p["last_name"] : $old_user->last_name;
448
 
449
+ $auto_eot_time = !empty($_p["ws_plugin__s2member_profile_s2member_auto_eot_time"]) ? strtotime($_p["ws_plugin__s2member_profile_s2member_auto_eot_time"]) : "";
450
 
451
+ if($role !== $old_role) // In this case, we need to fire Hook: `ws_plugin__s2member_during_collective_mods`.
452
+ do_action("ws_plugin__s2member_during_collective_mods", $user_id, get_defined_vars(), "user-role-change", "modification", $role, $user, $old_user);
453
 
454
+ if(isset($_p["ws_plugin__s2member_profile_s2member_originating_blog"]) && is_multisite() && is_super_admin())
455
+ update_user_meta($user_id, "s2member_originating_blog", $_p["ws_plugin__s2member_profile_s2member_originating_blog"]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
456
 
457
+ if(isset($_p["ws_plugin__s2member_profile_s2member_subscr_gateway"]))
458
+ update_user_option($user_id, "s2member_subscr_gateway", $_p["ws_plugin__s2member_profile_s2member_subscr_gateway"]);
 
459
 
460
+ if(isset($_p["ws_plugin__s2member_profile_s2member_subscr_id"]))
461
+ update_user_option($user_id, "s2member_subscr_id", $_p["ws_plugin__s2member_profile_s2member_subscr_id"]);
462
+
463
+ if(isset($_p["ws_plugin__s2member_profile_s2member_subscr_cid"]))
464
+ update_user_option($user_id, "s2member_subscr_cid", $_p["ws_plugin__s2member_profile_s2member_subscr_cid"]);
465
+
466
+ if(isset($_p["ws_plugin__s2member_profile_s2member_custom"]))
467
+ update_user_option($user_id, "s2member_custom", $_p["ws_plugin__s2member_profile_s2member_custom"]);
468
+
469
+ if(isset($_p["ws_plugin__s2member_profile_s2member_coupon_codes"]))
470
+ update_user_option($user_id, "s2member_coupon_codes", array_map('trim', preg_split('/,+/', $_p["ws_plugin__s2member_profile_s2member_coupon_codes"], NULL, PREG_SPLIT_NO_EMPTY)));
471
+
472
+ if(isset($_p["ws_plugin__s2member_profile_s2member_registration_ip"]))
473
+ update_user_option($user_id, "s2member_registration_ip", $_p["ws_plugin__s2member_profile_s2member_registration_ip"]);
474
+
475
+ if(isset($_p["ws_plugin__s2member_profile_s2member_notes"]))
476
+ update_user_option($user_id, "s2member_notes", $_p["ws_plugin__s2member_profile_s2member_notes"]);
477
+
478
+ if(isset($_p["ws_plugin__s2member_profile_s2member_auto_eot_time"]) && isset($auto_eot_time))
479
+ update_user_option($user_id, "s2member_auto_eot_time", $auto_eot_time);
480
+
481
+ if(isset($_p["ws_plugin__s2member_profile_s2member_ccaps"]))
482
+ {
483
+ foreach($user->allcaps as $cap => $cap_enabled)
484
+ if(preg_match("/^access_s2member_ccap_/", $cap))
485
+ $user->remove_cap($ccap = $cap);
486
+
487
+ if(!empty($_p["ws_plugin__s2member_profile_s2member_ccaps"]))
488
+ foreach(preg_split("/[\r\n\t\s;,]+/", $_p["ws_plugin__s2member_profile_s2member_ccaps"]) as $ccap)
489
+ if(strlen($ccap = trim(strtolower(preg_replace("/[^a-z_0-9]/i", "", $ccap)))))
490
+ $user->add_cap("access_s2member_ccap_".$ccap);
491
+ }
492
+ if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
493
+ {
494
+ foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], TRUE) as $field)
495
+ {
496
+ $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
497
+ $field_id_class = preg_replace("/_/", "-", $field_var);
498
+
499
+ if(isset($_p["ws_plugin__s2member_profile_".$field_var]) /* Field being set? */)
500
+ {
501
+ if((is_array($_p["ws_plugin__s2member_profile_".$field_var]) && !empty($_p["ws_plugin__s2member_profile_".$field_var])) || (is_string($_p["ws_plugin__s2member_profile_".$field_var]) && strlen($_p["ws_plugin__s2member_profile_".$field_var])))
502
+ $fields[$field_var] = $_p["ws_plugin__s2member_profile_".$field_var];
503
+ else if(isset($fields)) unset($fields[$field_var]);
504
+ }
505
+ else if(isset($fields)) unset($fields[$field_var]);
506
+ }
507
+ }
508
+ if(!empty($fields))
509
+ update_user_option($user_id, "s2member_custom_fields", $fields);
510
+ else delete_user_option($user_id, "s2member_custom_fields");
511
+
512
+ if($level > 0 /* We only process this if they are higher than Level #0. */)
513
+ {
514
+ $pr_times = get_user_option("s2member_paid_registration_times", $user_id);
515
+ $pr_times["level"] = (empty($pr_times["level"])) ? time() : $pr_times["level"];
516
+ $pr_times["level".$level] = (empty($pr_times["level".$level])) ? time() : $pr_times["level".$level];
517
+ update_user_option($user_id, "s2member_paid_registration_times", $pr_times); // Update now.
518
+ }
519
+ if(!empty($_p["ws_plugin__s2member_profile_opt_in"]) && !empty($role) && $level >= 0 /* Should we process List Servers? */)
520
+ c_ws_plugin__s2member_list_servers::process_list_servers($role, $level, $user->user_login, ((!empty($_p["pass1"])) ? $_p["pass1"] : ""), $user->user_email, $user->first_name, $user->last_name, FALSE, TRUE, TRUE, $user_id);
521
+
522
+ if(!empty($_p["ws_plugin__s2member_profile_ip_restrictions"]) /* Delete/reset IP Restrictions? */)
523
+ c_ws_plugin__s2member_ip_restrictions::delete_reset_specific_ip_restrictions(strtolower($user->user_login));
524
+
525
+ if(!empty($_p["ws_plugin__s2member_profile_reset_pass_resend"]) && c_ws_plugin__s2member_utils_conds::pro_is_installed() /* Reset password & resend email notification? */)
526
+ c_ws_plugin__s2member_email_configs::reset_pass_resend_new_user_notification($user_id, ((!empty($_p["pass1"])) ? $_p["pass1"] : ""), array("user"), $user->user_email);
527
+
528
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
529
+ do_action("ws_plugin__s2member_during_users_list_update_cols", get_defined_vars());
530
+ unset($__refs, $__v);
531
  }
532
+ }
533
+ else if($current_user->ID === $user->ID /* Otherwise, a User can always edit their own Profile. */)
534
+ {
535
+ if(!empty($_POST) && is_array($_p = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST))))
 
 
 
 
 
 
 
 
 
536
  {
537
+ $role = c_ws_plugin__s2member_user_access::user_access_role($user /* Role is not changing here. */);
538
+ $level = c_ws_plugin__s2member_user_access::user_access_role_to_level($role);
539
 
540
+ if($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"])
541
+ if($fields_applicable = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level($level, "profile"))
542
+ {
543
+ $fields = array(); // Initialize.
544
+ $_existing_fields = get_user_option("s2member_custom_fields", $user_id);
545
 
546
+ foreach(json_decode($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["custom_reg_fields"], TRUE) as $field)
547
+ {
548
+ $field_var = preg_replace("/[^a-z0-9]/i", "_", strtolower($field["id"]));
549
+ $field_id_class = preg_replace("/_/", "-", $field_var);
550
 
551
+ if(!in_array($field["id"], $fields_applicable) || strpos($field["editable"], "no") === 0)
552
+ {
553
+ if(isset($_existing_fields[$field_var]) && ((is_array($_existing_fields[$field_var]) && !empty($_existing_fields[$field_var])) || (is_string($_existing_fields[$field_var]) && strlen($_existing_fields[$field_var]))))
554
+ $fields[$field_var] = $_existing_fields[$field_var];
555
+ else unset($fields[$field_var]);
556
+ }
557
+ else if($field["required"] === "yes" && (!isset($_p["ws_plugin__s2member_profile_".$field_var]) || (!is_array($_p["ws_plugin__s2member_profile_".$field_var]) && !is_string($_p["ws_plugin__s2member_profile_".$field_var])) || (is_array($_p["ws_plugin__s2member_profile_".$field_var]) && empty($_p["ws_plugin__s2member_profile_".$field_var])) || (is_string($_p["ws_plugin__s2member_profile_".$field_var]) && !strlen($_p["ws_plugin__s2member_profile_".$field_var]))))
558
  {
559
+ if(isset($_existing_fields[$field_var]) && ((is_array($_existing_fields[$field_var]) && !empty($_existing_fields[$field_var])) || (is_string($_existing_fields[$field_var]) && strlen($_existing_fields[$field_var]))))
560
+ $fields[$field_var] = $_existing_fields[$field_var];
561
+ else unset($fields[$field_var]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
562
  }
563
+ else if(isset($_p["ws_plugin__s2member_profile_".$field_var]))
564
  {
565
+ if((is_array($_p["ws_plugin__s2member_profile_".$field_var]) && !empty($_p["ws_plugin__s2member_profile_".$field_var])) || (is_string($_p["ws_plugin__s2member_profile_".$field_var]) && strlen($_p["ws_plugin__s2member_profile_".$field_var])))
566
+ $fields[$field_var] = $_p["ws_plugin__s2member_profile_".$field_var];
567
+ else unset($fields[$field_var]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
568
  }
569
+ else unset($fields[$field_var]);
570
+ }
571
+ if(!empty($fields))
572
+ update_user_option($user_id, "s2member_custom_fields", $fields);
573
+ else delete_user_option($user_id, "s2member_custom_fields");
574
  }
575
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
576
+ do_action("ws_plugin__s2member_during_users_list_update_cols", get_defined_vars());
577
  unset($__refs, $__v);
 
 
578
  }
579
+ }
580
  }
581
+ foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
582
+ do_action("ws_plugin__s2member_after_users_list_update_cols", get_defined_vars());
583
+ unset($__refs, $__v);
584
+ }
585
  }
586
+ }
includes/classes/users-list.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Users_List
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_users_list"))
14
  * @package s2Member\Users_List
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_users_list"))
includes/classes/utilities.inc.php CHANGED
@@ -1,208 +1,215 @@
1
  <?php
2
  /**
3
- * General utilities.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\Utilities
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_utilities"))
 
 
 
 
 
 
 
 
21
  {
22
  /**
23
- * General utilities.
24
- *
25
- * @package s2Member\Utilities
26
- * @since 3.5
27
- */
28
- class c_ws_plugin__s2member_utilities
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  {
30
- /**
31
- * Evaluates PHP code, and "returns" output.
32
- *
33
- * @package s2Member\Utilities
34
- * @since 3.5
35
- *
36
- * @param string $code A string of data, possibly with embedded PHP code.
37
- * @return string Output after PHP evaluation.
38
- */
39
- public static function evl ($code = FALSE, $vars = array())
40
- {
41
- if(is_array($vars) && !empty($vars))
42
- extract($vars, EXTR_PREFIX_SAME, '_extract_');
43
-
44
- ob_start (); // Output buffer.
45
-
46
- eval ("?>" . trim ($code));
47
-
48
- return ob_get_clean ();
49
- }
50
- /**
51
- * Buffers (gets) function output.
52
- *
53
- * A variable length of additional arguments are possible.
54
- * Additional parameters get passed into the ``$function``.
55
- *
56
- * @package s2Member\Utilities
57
- * @since 3.5
58
- *
59
- * @param string $function Name of a function to call upon.
60
- * @return string Output after call to function.
61
- * Any output is buffered and returned.
62
- */
63
- public static function get ($function = FALSE)
64
- {
65
- $args = func_get_args ();
66
- $function = array_shift ($args);
67
-
68
- if (is_string ($function) && $function)
69
- {
70
- ob_start ();
71
-
72
- if (is_array($args) && !empty($args))
73
- {
74
- $return = call_user_func_array($function, $args);
75
- }
76
- else // There are no additional arguments to pass.
77
- {
78
- $return = call_user_func ($function);
79
- }
80
-
81
- $echo = ob_get_clean ();
82
-
83
- return (!strlen ($echo) && strlen ($return)) ? $return : $echo;
84
- }
85
- else // Else return null.
86
- return;
87
- }
88
- /**
89
- * Builds a version checksum for this installation.
90
- *
91
- * @package s2Member\Utilities
92
- * @since 3.5
93
- *
94
- * @return string String with `[version]-[pro version]-[consolidated checksum]`.
95
- */
96
- public static function ver_checksum ()
97
- {
98
- $checksum = WS_PLUGIN__S2MEMBER_VERSION; // Software version string.
99
- $checksum .= (c_ws_plugin__s2member_utils_conds::pro_is_installed ()) ? "-" . WS_PLUGIN__S2MEMBER_PRO_VERSION : ""; // Pro version string?
100
- $checksum .= "-" . abs (crc32 ($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["checksum"] . $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["options_checksum"] . $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["options_version"]));
101
-
102
- return $checksum; // (i.e. version-pro version-checksum)
103
- }
104
- /**
105
- * String with current time details.
106
- *
107
- * @package s2Member\Utilities
108
- * @since 130210
109
- *
110
- * @return string String with time representation (in UTC time).
111
- */
112
- public static function time_details ()
113
- {
114
- $time = time(); // The time at this very moment.
115
- $details = date ("D M jS, Y", $time)." @ precisely " . date ("g:i a e", $time);
116
-
117
- return $details; // Return all details.
118
- }
119
- /**
120
- * String with all version details *(for PHP, WordPress, s2Member, and Pro)*.
121
- *
122
- * @package s2Member\Utilities
123
- * @since 3.5
124
- *
125
- * @return string String with `PHP vX.XX :: WordPress vX.XX :: s2Member vX.XX :: s2Member Pro vX.XX`.
126
- */
127
- public static function ver_details ()
128
- {
129
- $details = "PHP v" . PHP_VERSION . " :: WordPress v" . get_bloginfo ("version") . " :: s2Member v" . WS_PLUGIN__S2MEMBER_VERSION;
130
- $details .= (c_ws_plugin__s2member_utils_conds::pro_is_installed ()) ? " :: s2Member Pro v" . WS_PLUGIN__S2MEMBER_PRO_VERSION : "";
131
-
132
- return $details; // Return all details.
133
- }
134
- /**
135
- * Generates s2Member Security Badge.
136
- *
137
- * @package s2Member\Utilities
138
- * @since 3.5
139
- *
140
- * @param string $v A variation number to display. Defaults to `1`.
141
- * @param bool $no_cache Defaults to false. If true, the HTML markup will contain query string params that prevent caching.
142
- * @param bool $display_on_failure. Defaults to false. True if we need to display the "NOT yet verified" version inside admin panels.
143
- * @return string HTML markup for display of s2Member Security Badge.
144
- */
145
- public static function s_badge_gen ($v = "1", $no_cache = FALSE, $display_on_failure = FALSE)
146
- {
147
- if ($v && file_exists (($template = dirname (dirname (__FILE__)) . "/templates/badges/s-badge.php")))
148
- {
149
- $badge = trim (c_ws_plugin__s2member_utilities::evl (file_get_contents ($template)));
150
- $badge = preg_replace ("/%%site_url%%/i", urlencode (home_url ()), preg_replace ("/%%v%%/i", (string)$v, $badge));
151
- $badge = preg_replace ("/%%no_cache%%/i", (($no_cache) ? "&amp;no_cache=" . urlencode (mt_rand (0, PHP_INT_MAX)) : ""), $badge);
152
- $badge = preg_replace ("/%%display_on_failure%%/i", (($display_on_failure) ? "&amp;display_on_failure=1" : ""), $badge);
153
- }
154
-
155
- return (!empty($badge)) ? $badge : ""; // Return Security Badge.
156
- }
157
- /**
158
- * Acquires information about memory usage.
159
- *
160
- * @package s2Member\Utilities
161
- * @since 110815
162
- *
163
- * @return string String with `Memory x MB :: Real Memory x MB :: Peak Memory x MB :: Real Peak Memory x MB`.
164
- */
165
- public static function mem_details ()
166
- {
167
- $memory = number_format (memory_get_usage () / 1048576, 2, ".", "");
168
- $real_memory = number_format (memory_get_usage (true) / 1048576, 2, ".", "");
169
- $peak_memory = number_format (memory_get_peak_usage () / 1048576, 2, ".", "");
170
- $real_peak_memory = number_format (memory_get_peak_usage (true) / 1048576, 2, ".", "");
171
-
172
- $details = "Memory " . $memory . " MB :: Real Memory " . $real_memory . " MB :: Peak Memory " . $peak_memory . " MB :: Real Peak Memory " . $real_peak_memory . " MB";
173
-
174
- return $details; // Return all details.
175
- }
176
- /**
177
- * Acquires s2Member options for the Main Site of a Multisite Network.
178
- *
179
- * @package s2Member\Utilities
180
- * @since 110912
181
- *
182
- * @return array Array of s2Member options for the Main Site.
183
- */
184
- public static function mms_options ()
185
- {
186
- return (is_multisite ()) ? (array)get_site_option ("ws_plugin__s2member_options") : array();
187
- }
188
- /**
189
- * Builds an array of backtrace callers.
190
- *
191
- * @package s2Member\Utilities
192
- * @since 110912
193
- *
194
- * @param array $debug_backtrace Optional. Defaults to ``debug_backtrace()``.
195
- * @return array Array of backtrace callers (lowercase).
196
- */
197
- public static function callers ($debug_backtrace = FALSE)
198
- {
199
- $callers = array(); // Initialize array.
200
- foreach (($debug_backtrace = (is_array($debug_backtrace)) ? $debug_backtrace : debug_backtrace ()) as $caller)
201
- if (isset ($caller["class"], $caller["function"]) || (!isset ($caller["class"]) && isset ($caller["function"])))
202
- $callers[] = (isset ($caller["class"])) ? $caller["class"] . "::" . $caller["function"] : $caller["function"];
203
-
204
- return array_map ("strtolower", array_unique ($callers));
205
- }
206
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
207
  }
208
- ?>
1
  <?php
2
  /**
3
+ * General utilities.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Utilities
15
+ * @since 3.5
16
+ */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
+ exit ('Do not access this file directly.');
19
+
20
+ if(!class_exists('c_ws_plugin__s2member_utilities'))
21
+ {
22
+ /**
23
+ * General utilities.
24
+ *
25
+ * @package s2Member\Utilities
26
+ * @since 3.5
27
+ */
28
+ class c_ws_plugin__s2member_utilities
29
  {
30
  /**
31
+ * Evaluates PHP code, and 'returns' output.
32
+ *
33
+ * @package s2Member\Utilities
34
+ * @since 3.5
35
+ *
36
+ * @param string $code A string of data, possibly with embedded PHP code.
37
+ * @param array $vars Variables to put into the scope of `eval()`.
38
+ *
39
+ * @return string Output after PHP evaluation.
40
+ */
41
+ public static function evl($code = '', $vars = array())
42
+ {
43
+ if(is_array($vars) && !empty($vars))
44
+ extract($vars, EXTR_PREFIX_SAME, '_extract_');
45
+
46
+ ob_start(); // Output buffer.
47
+
48
+ eval ('?>'.trim($code));
49
+
50
+ return ob_get_clean();
51
+ }
52
+
53
+ /**
54
+ * Buffers (gets) function output.
55
+ *
56
+ * A variable length of additional arguments are possible.
57
+ * Additional parameters get passed into the ``$function``.
58
+ *
59
+ * @package s2Member\Utilities
60
+ * @since 3.5
61
+ *
62
+ * @param string $function Name of a function to call upon.
63
+ *
64
+ * @return string Output after call to function.
65
+ * Any output is buffered and returned.
66
+ */
67
+ public static function get($function = '')
68
+ {
69
+ $args = func_get_args();
70
+ $function = array_shift($args);
71
+
72
+ if(is_string($function) && $function)
73
  {
74
+ ob_start(); // Open output buffer.
75
+
76
+ if(is_array($args) && !empty($args))
77
+ $return = call_user_func_array($function, $args);
78
+
79
+ else // There are no additional arguments to pass.
80
+ $return = call_user_func($function);
81
+
82
+ $echo = ob_get_clean(); // Close buffer.
83
+
84
+ return !strlen($echo) && strlen($return) ? $return : $echo;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  }
86
+ return NULL;
87
+ }
88
+
89
+ /**
90
+ * Builds a version checksum for this installation.
91
+ *
92
+ * @package s2Member\Utilities
93
+ * @since 3.5
94
+ *
95
+ * @return string String with `[version]-[pro version]-[consolidated checksum]`.
96
+ */
97
+ public static function ver_checksum()
98
+ {
99
+ $checksum = WS_PLUGIN__S2MEMBER_VERSION; // Software version string.
100
+ $checksum .= (c_ws_plugin__s2member_utils_conds::pro_is_installed()) ? '-'.WS_PLUGIN__S2MEMBER_PRO_VERSION : ''; // Pro version string?
101
+ $checksum .= '-'.abs(crc32($GLOBALS['WS_PLUGIN__']['s2member']['c']['checksum'].$GLOBALS['WS_PLUGIN__']['s2member']['o']['options_checksum'].$GLOBALS['WS_PLUGIN__']['s2member']['o']['options_version']));
102
+
103
+ return $checksum; // (i.e. version-pro version-checksum)
104
+ }
105
+
106
+ /**
107
+ * String with current time details.
108
+ *
109
+ * @package s2Member\Utilities
110
+ * @since 130210
111
+ *
112
+ * @return string String with time representation (in UTC time).
113
+ */
114
+ public static function time_details()
115
+ {
116
+ $time = time(); // The time at this very moment.
117
+ $details = date('D M jS, Y', $time).' @ precisely '.date('g:i a e', $time);
118
+
119
+ return $details; // Return all details.
120
+ }
121
+
122
+ /**
123
+ * String with all version details *(for PHP, WordPress, s2Member, and Pro)*.
124
+ *
125
+ * @package s2Member\Utilities
126
+ * @since 3.5
127
+ *
128
+ * @return string String with `PHP vX.XX :: WordPress vX.XX :: s2Member vX.XX :: s2Member Pro vX.XX`.
129
+ */
130
+ public static function ver_details()
131
+ {
132
+ $details = 'PHP v'.PHP_VERSION.' :: WordPress v'.get_bloginfo('version').' :: s2Member v'.WS_PLUGIN__S2MEMBER_VERSION;
133
+ $details .= (c_ws_plugin__s2member_utils_conds::pro_is_installed()) ? ' :: s2Member Pro v'.WS_PLUGIN__S2MEMBER_PRO_VERSION : '';
134
+
135
+ return $details; // Return all details.
136
+ }
137
+
138
+ /**
139
+ * Generates s2Member Security Badge.
140
+ *
141
+ * @package s2Member\Utilities
142
+ * @since 3.5
143
+ *
144
+ * @param string $v A variation number to display. Defaults to `1`.
145
+ * @param bool $no_cache Defaults to false. If true, the HTML markup will contain query string params that prevent caching.
146
+ * @param bool $display_on_failure . Defaults to false. True if we need to display the 'NOT yet verified' version inside admin panels.
147
+ *
148
+ * @return string HTML markup for display of s2Member Security Badge.
149
+ */
150
+ public static function s_badge_gen($v = '1', $no_cache = FALSE, $display_on_failure = FALSE)
151
+ {
152
+ if($v && file_exists(($template = dirname(dirname(__FILE__)).'/templates/badges/s-badge.php')))
153
+ {
154
+ $badge = trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($template)));
155
+ $badge = preg_replace('/%%site_url%%/i', urlencode(home_url()), preg_replace('/%%v%%/i', (string)$v, $badge));
156
+ $badge = preg_replace('/%%no_cache%%/i', (($no_cache) ? '&amp;no_cache='.urlencode(mt_rand(0, PHP_INT_MAX)) : ''), $badge);
157
+ $badge = preg_replace('/%%display_on_failure%%/i', (($display_on_failure) ? '&amp;display_on_failure=1' : ''), $badge);
158
+ }
159
+ return (!empty($badge)) ? $badge : ''; // Return Security Badge.
160
+ }
161
+
162
+ /**
163
+ * Acquires information about memory usage.
164
+ *
165
+ * @package s2Member\Utilities
166
+ * @since 110815
167
+ *
168
+ * @return string String with `Memory x MB :: Real Memory x MB :: Peak Memory x MB :: Real Peak Memory x MB`.
169
+ */
170
+ public static function mem_details()
171
+ {
172
+ $memory = number_format(memory_get_usage() / 1048576, 2, '.', '');
173
+ $real_memory = number_format(memory_get_usage(TRUE) / 1048576, 2, '.', '');
174
+ $peak_memory = number_format(memory_get_peak_usage() / 1048576, 2, '.', '');
175
+ $real_peak_memory = number_format(memory_get_peak_usage(TRUE) / 1048576, 2, '.', '');
176
+
177
+ $details = 'Memory '.$memory.' MB :: Real Memory '.$real_memory.' MB :: Peak Memory '.$peak_memory.' MB :: Real Peak Memory '.$real_peak_memory.' MB';
178
+
179
+ return $details; // Return all details.
180
+ }
181
+
182
+ /**
183
+ * Acquires s2Member options for the Main Site of a Multisite Network.
184
+ *
185
+ * @package s2Member\Utilities
186
+ * @since 110912
187
+ *
188
+ * @return array Array of s2Member options for the Main Site.
189
+ */
190
+ public static function mms_options()
191
+ {
192
+ return (is_multisite()) ? (array)get_site_option('ws_plugin__s2member_options') : array();
193
+ }
194
+
195
+ /**
196
+ * Builds an array of backtrace callers.
197
+ *
198
+ * @package s2Member\Utilities
199
+ * @since 110912
200
+ *
201
+ * @param array $debug_backtrace Optional. Defaults to ``debug_backtrace()``.
202
+ *
203
+ * @return array Array of backtrace callers (lowercase).
204
+ */
205
+ public static function callers($debug_backtrace = array())
206
+ {
207
+ $callers = array(); // Initialize array.
208
+ foreach(($debug_backtrace = (is_array($debug_backtrace)) ? $debug_backtrace : debug_backtrace()) as $caller)
209
+ if(isset ($caller['class'], $caller['function']) || (!isset ($caller['class']) && isset ($caller['function'])))
210
+ $callers[] = (isset ($caller['class'])) ? $caller['class'].'::'.$caller['function'] : $caller['function'];
211
+
212
+ return array_map('strtolower', array_unique($callers));
213
+ }
214
  }
215
+ }
includes/classes/utils-arrays.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
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"))
14
  * @package s2Member\Utilities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_utils_arrays"))
includes/classes/utils-captchas.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
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_captchas"))
14
  * @package s2Member\Utilities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_utils_captchas"))
includes/classes/utils-conds.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
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_conds'))
14
  * @package s2Member\Utilities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_utils_conds'))
includes/classes/utils-css.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
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_css"))
14
  * @package s2Member\Utilities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_utils_css"))
includes/classes/utils-cur.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
15
  * @since 110531
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_cur'))
14
  * @package s2Member\Utilities
15
  * @since 110531
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_utils_cur'))
includes/classes/utils-dirs.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
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_dirs"))
14
  * @package s2Member\Utilities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_utils_dirs"))
includes/classes/utils-encryption.inc.php CHANGED
@@ -1,186 +1,234 @@
1
  <?php
2
  /**
3
- * Encryption utilities.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\Utilities
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_encryption"))
 
 
 
 
 
 
 
 
21
  {
22
  /**
23
- * Encryption utilities.
24
- *
25
- * @package s2Member\Utilities
26
- * @since 3.5
27
- */
28
- class c_ws_plugin__s2member_utils_encryption
29
- {
30
- /**
31
- * Determines the proper encryption/decryption Key to use.
32
- *
33
- * @package s2Member\Utilities
34
- * @since 111106
35
- *
36
- * @param string $key Optional. Attempt to force a specific Key. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``.
37
- * @return string Proper encryption/decryption Key. If ``$key`` is passed in, and it validates, we'll return that. Otherwise use a default Key.
38
- */
39
- public static function key ($key = FALSE)
40
- {
41
- $key = (!is_string ($key) || !strlen ($key)) ? $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["sec_encryption_key"] : $key;
42
- $key = (!is_string ($key) || !strlen ($key)) ? /* Use the installed WordPress salt. */ wp_salt () : $key;
43
- $key = (!is_string ($key) || !strlen ($key)) ? /* Default/backup. */ md5 ($_SERVER["HTTP_HOST"]) : $key;
44
- return /* Proper encryption/decryption key. */ $key;
45
- }
46
- /**
47
- * RIJNDAEL 256: two-way encryption/decryption, with a URL-safe base64 wrapper.
48
- *
49
- * Falls back on XOR encryption/decryption when/if mcrypt is not possible.
50
- *
51
- * @package s2Member\Utilities
52
- * @since 3.5
53
- *
54
- * @param string $string A string of data to encrypt.
55
- * @param string $key Optional. Key used for encryption. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``.
56
- * @param bool $w_md5_cs Optional. Defaults to true. When true, an MD5 checksum is used in the encrypted string *(recommended)*.
57
- * @return string Encrypted string.
58
- */
59
- public static function encrypt ($string = FALSE, $key = FALSE, $w_md5_cs = TRUE)
60
- {
61
- if (function_exists ("mcrypt_encrypt") && in_array("rijndael-256", mcrypt_list_algorithms ()) && in_array("cbc", mcrypt_list_modes ()))
62
- {
63
- $string = /* Force a valid string value here. */ (is_string ($string)) ? $string : "";
64
- $string = /* Indicating this is an RIJNDAEL 256 encrypted string. */ (strlen ($string)) ? "~r2|" . $string : "";
65
-
66
- $key = /* Obtain encryption/decryption key. */ c_ws_plugin__s2member_utils_encryption::key ($key);
67
- $key = /* Proper key length. */ substr ($key, 0, mcrypt_get_key_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC));
68
 
69
- $iv = c_ws_plugin__s2member_utils_strings::random_str_gen (mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), false);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
 
71
- if (strlen ($string) && is_string ($e = mcrypt_encrypt /* Encrypt the string. */ (MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_CBC, $iv)) && strlen ($e))
72
- $e = /* RIJNDAEL 256 encrypted string with IV and checksum built into itself. */ "~r2:" . $iv . (($w_md5_cs) ? ":" . md5 ($e) : "") . "|" . $e;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
 
74
- return (isset ($e) && is_string ($e) && strlen ($e)) ? ($base64 = c_ws_plugin__s2member_utils_strings::base64_url_safe_encode ($e)) : "";
75
- }
76
- else // Fallback on XOR encryption.
77
- return c_ws_plugin__s2member_utils_encryption::xencrypt ($string, $key, $w_md5_cs);
78
- }
79
- /**
80
- * RIJNDAEL 256: two-way encryption/decryption, with a URL-safe base64 wrapper.
81
- *
82
- * Falls back on XOR encryption/decryption when mcrypt is not available.
83
- *
84
- * @package s2Member\Utilities
85
- * @since 3.5
86
- *
87
- * @param string $base64 A string of data to decrypt. Should still be base64 encoded.
88
- * @param string $key Optional. Key used originally for encryption. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``.
89
- * @return string Decrypted string.
90
- */
91
- public static function decrypt ($base64 = FALSE, $key = FALSE)
92
- {
93
- $base64 = /* Force a valid string value here. */ (is_string ($base64)) ? $base64 : "";
94
- $e = (strlen ($base64)) ? c_ws_plugin__s2member_utils_strings::base64_url_safe_decode ($base64) : "";
95
 
96
- if (function_exists ("mcrypt_decrypt") && in_array("rijndael-256", mcrypt_list_algorithms ()) && in_array("cbc", mcrypt_list_modes ()) #
97
- && strlen ($e) /* And, is this an RIJNDAEL 256 encrypted string? */ && preg_match ("/^~r2\:([a-zA-Z0-9]+)(?:\:([a-zA-Z0-9]+))?\|(.*?)$/s", $e, $iv_md5_e))
98
- {
99
- $key = /* Obtain encryption/decryption key. */ c_ws_plugin__s2member_utils_encryption::key ($key);
100
- $key = /* Proper key length. */ substr ($key, 0, mcrypt_get_key_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC));
101
 
102
- if (strlen ($iv_md5_e[3]) && ( /* No checksum? */!$iv_md5_e[2] || /* Or, a matching checksum? */ $iv_md5_e[2] === md5 ($iv_md5_e[3])))
103
- $d = /* Decrypt the string. */ mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $key, $iv_md5_e[3], MCRYPT_MODE_CBC, $iv_md5_e[1]);
104
 
105
- if (isset ($d) && /* Was ``$iv_md5_e[3]`` decrypted successfully? */ is_string ($d) && strlen ($d))
 
 
 
 
 
106
 
107
- if (strlen ($d = preg_replace ("/^~r2\|/", "", $d, 1, $r2)) && $r2)
108
- $d = rtrim /* Right-trim NULLS and EOTs. */ ($d, "\0\4");
109
- else // Else we need to empty this out.
110
- $d = /* Empty string. Invalid. */ "";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
- return (isset ($d) && is_string ($d) && strlen ($d)) ? ($string = $d) : "";
113
- }
114
- else // Fallback on XOR decryption.
115
- return c_ws_plugin__s2member_utils_encryption::xdecrypt ($base64, $key);
116
- }
117
- /**
118
- * XOR two-way encryption/decryption, with a base64 wrapper.
119
- *
120
- * @package s2Member\Utilities
121
- * @since 3.5
122
- *
123
- * @param string $string A string of data to encrypt.
124
- * @param string $key Optional. Key used for encryption. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``.
125
- * @param bool $w_md5_cs Optional. Defaults to true. When true, an MD5 checksum is used in the encrypted string *(recommended)*.
126
- * @return string Encrypted string.
127
- */
128
- public static function xencrypt ($string = FALSE, $key = FALSE, $w_md5_cs = TRUE)
129
- {
130
- $string = /* Force a valid string value here. */ (is_string ($string)) ? $string : "";
131
- $string = /* Indicating this is an XOR encrypted string. */ (strlen ($string)) ? "~xe|" . $string : "";
 
 
 
 
 
 
132
 
133
- $key = /* Obtain encryption/decryption key. */ c_ws_plugin__s2member_utils_encryption::key ($key);
 
 
 
134
 
135
- for ($i = 1, $e = ""; $i <= /* Will NOT run if ``$string`` has no length. */ strlen ($string); $i++)
136
- {
137
- $char = substr ($string, $i - 1, 1);
138
- $keychar = substr ($key, ($i % strlen ($key)) - 1, 1);
139
- $e .= chr (ord ($char) + ord ($keychar));
140
- }
141
- $e = /* XOR encrypted? */ (strlen ($e)) ? "~xe" . (($w_md5_cs) ? ":" . md5 ($e) : "") . "|" . $e : "";
 
 
 
 
 
 
 
 
 
 
 
 
142
 
143
- return (strlen ($e)) ? ($base64 = c_ws_plugin__s2member_utils_strings::base64_url_safe_encode ($e)) : "";
144
- }
145
- /**
146
- * XOR two-way encryption/decryption, with a base64 wrapper.
147
- *
148
- * @package s2Member\Utilities
149
- * @since 3.5
150
- *
151
- * @param string $base64 A string of data to decrypt. Should still be base64 encoded.
152
- * @param string $key Optional. Key used originally for encryption. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``.
153
- * @return string Decrypted string.
154
- */
155
- public static function xdecrypt ($base64 = FALSE, $key = FALSE)
156
  {
157
- $base64 = /* Force a valid string value here. */ (is_string ($base64)) ? $base64 : "";
158
- $e = (strlen ($base64)) ? c_ws_plugin__s2member_utils_strings::base64_url_safe_decode ($base64) : "";
159
-
160
- if (strlen ($e) /* And, is this an XOR encrypted string? */ && preg_match ("/^~xe(?:\:([a-zA-Z0-9]+))?\|(.*?)$/s", $e, $md5_e))
161
- {
162
- $key = /* Obtain encryption/decryption key. */ c_ws_plugin__s2member_utils_encryption::key ($key);
163
-
164
- if (strlen ($md5_e[2]) && ( /* No checksum? */!$md5_e[1] || /* Or a matching checksum? */ $md5_e[1] === md5 ($md5_e[2])))
165
-
166
- for ($i = 1, $d = ""; $i <= /* Will NOT run if ``$md5_e[2]`` has no length. */ strlen ($md5_e[2]); $i++)
167
- {
168
- $char = substr ($md5_e[2], $i - 1, 1);
169
- $keychar = substr ($key, ($i % strlen ($key)) - 1, 1);
170
- $d .= chr (ord ($char) - ord ($keychar));
171
- }
172
- if (isset ($d) && /* Was ``$md5_e[2]`` decrypted successfully? */ is_string ($d) && strlen ($d))
173
-
174
- if (strlen ($d = preg_replace ("/^~xe\|/", "", $d, 1, $xe)) && $xe)
175
- $d = /* Just re-assign this here. Nothing more to do. */ $d;
176
- else // Else we need to empty this out.
177
- $d = /* Empty string. Invalid. */ "";
178
-
179
- return (isset ($d) && is_string ($d) && strlen ($d)) ? ($string = $d) : "";
180
- }
181
- else // Otherwise we must fail here with an empty string value.
182
- return /* Just return an empty string in this case. */ "";
183
  }
 
 
 
 
 
 
 
184
  }
 
 
185
  }
186
- ?>
1
  <?php
2
  /**
3
+ * Encryption utilities.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Utilities
15
+ * @since 3.5
16
+ */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
+ exit ('Do not access this file directly.');
19
+
20
+ if(!class_exists('c_ws_plugin__s2member_utils_encryption'))
21
+ {
22
+ /**
23
+ * Encryption utilities.
24
+ *
25
+ * @package s2Member\Utilities
26
+ * @since 3.5
27
+ */
28
+ class c_ws_plugin__s2member_utils_encryption
29
  {
30
  /**
31
+ * Determines the proper encryption/decryption Key to use.
32
+ *
33
+ * @package s2Member\Utilities
34
+ * @since 111106
35
+ *
36
+ * @param string $key Optional. Attempt to force a specific Key. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``.
37
+ *
38
+ * @return string Proper encryption/decryption Key. If ``$key`` is passed in, and it validates, we'll return that. Otherwise use a default Key.
39
+ */
40
+ public static function key($key = '')
41
+ {
42
+ if(($key = trim((string)$key)))
43
+ return $key;
44
+
45
+ if(($key = trim($GLOBALS['WS_PLUGIN__']['s2member']['o']['sec_encryption_key'])))
46
+ return $key;
47
+
48
+ if(($key = trim(wp_salt())))
49
+ return $key;
50
+
51
+ return ($key = md5($_SERVER['HTTP_HOST']));
52
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
 
54
+ /**
55
+ * A unique, unguessable, non-numeric, caSe-insensitive key (20 chars max).
56
+ *
57
+ * @since 150124 Adding gift code generation.
58
+ *
59
+ * @note 32-bit systems usually have `PHP_INT_MAX` = `2147483647`.
60
+ * We limit `mt_rand()` to a max of `999999999`.
61
+ *
62
+ * @note A max possible length of 20 chars assumes this function
63
+ * will not be called after `Sat, 20 Nov 2286 17:46:39 GMT`.
64
+ * At which point a UNIX timestamp will grow in size.
65
+ *
66
+ * @note Key always begins with a `k` to prevent PHP's `is_numeric()`
67
+ * function from ever thinking it's a number in a different representation.
68
+ * See: <http://php.net/manual/en/function.is-numeric.php> for further details.
69
+ *
70
+ * @return string A unique, unguessable, non-numeric, caSe-insensitive key (20 chars max).
71
+ */
72
+ public static function uunnci_key_20_max()
73
+ {
74
+ $microtime_19_max = number_format(microtime(TRUE), 9, '.', '');
75
+ // e.g. `9999999999`.`999999999` (max decimals: `9`, max overall precision: `19`).
76
+ // Assuming timestamp is never > 10 digits; i.e. before `Sat, 20 Nov 2286 17:46:39 GMT`.
77
+
78
+ list($seconds_10_max, $microseconds_9_max) = explode('.', $microtime_19_max, 2);
79
+ // e.g. `array(`9999999999`, `999999999`)`. Max total digits combined: `19`.
80
+
81
+ $seconds_base36 = base_convert($seconds_10_max, '10', '36'); // e.g. max `9999999999`, to base 36.
82
+ $microseconds_base36 = base_convert($microseconds_9_max, '10', '36'); // e.g. max `999999999`, to base 36.
83
+ $mt_rand_base36 = base_convert(mt_rand(1, 999999999), '10', '36'); // e.g. max `999999999`, to base 36.
84
+ $key = 'k'.$mt_rand_base36.$seconds_base36.$microseconds_base36; // e.g. `kgjdgxr4ldqpdrgjdgxr`.
85
+
86
+ return $key; // Max possible value: `kgjdgxr4ldqpdrgjdgxr` (20 chars).
87
+ }
88
 
89
+ /**
90
+ * RIJNDAEL 256: two-way encryption/decryption, with a URL-safe base64 wrapper.
91
+ *
92
+ * Falls back on XOR encryption/decryption when/if mcrypt is not possible.
93
+ *
94
+ * @package s2Member\Utilities
95
+ * @since 3.5
96
+ *
97
+ * @param string $string A string of data to encrypt.
98
+ * @param string $key Optional. Key used for encryption. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``.
99
+ * @param bool $w_md5_cs Optional. Defaults to true. When true, an MD5 checksum is used in the encrypted string *(recommended)*.
100
+ *
101
+ * @return string Encrypted string.
102
+ */
103
+ public static function encrypt($string = '', $key = '', $w_md5_cs = TRUE)
104
+ {
105
+ if(function_exists('mcrypt_encrypt') && in_array('rijndael-256', mcrypt_list_algorithms()) && in_array('cbc', mcrypt_list_modes()))
106
+ {
107
+ $string = is_string($string) ? $string : '';
108
+ $string = isset($string[0]) ? '~r2|'.$string : '';
109
 
110
+ $key = c_ws_plugin__s2member_utils_encryption::key($key);
111
+ $key = substr($key, 0, mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
 
113
+ $iv = c_ws_plugin__s2member_utils_strings::random_str_gen(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), FALSE);
 
 
 
 
114
 
115
+ if(isset($string[0]) && is_string($e = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_CBC, $iv)) && isset($e[0]))
116
+ $e = '~r2:'.$iv.($w_md5_cs ? ':'.md5($e) : '').'|'.$e;
117
 
118
+ return isset($e) && is_string($e) && isset($e[0])
119
+ ? ($base64 = c_ws_plugin__s2member_utils_strings::base64_url_safe_encode($e))
120
+ : ''; // Default to empty string.
121
+ }
122
+ return c_ws_plugin__s2member_utils_encryption::xencrypt($string, $key, $w_md5_cs);
123
+ }
124
 
125
+ /**
126
+ * RIJNDAEL 256: two-way encryption/decryption, with a URL-safe base64 wrapper.
127
+ *
128
+ * Falls back on XOR encryption/decryption when mcrypt is not available.
129
+ *
130
+ * @package s2Member\Utilities
131
+ * @since 3.5
132
+ *
133
+ * @param string $base64 A string of data to decrypt. Should still be base64 encoded.
134
+ * @param string $key Optional. Key used originally for encryption. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``.
135
+ *
136
+ * @return string Decrypted string.
137
+ */
138
+ public static function decrypt($base64 = '', $key = '')
139
+ {
140
+ $base64 = is_string($base64) ? $base64 : '';
141
+ $e = isset($base64[0]) ? c_ws_plugin__s2member_utils_strings::base64_url_safe_decode($base64) : '';
142
+
143
+ if(function_exists('mcrypt_decrypt') && in_array('rijndael-256', mcrypt_list_algorithms()) && in_array('cbc', mcrypt_list_modes()))
144
+ if(isset($e[0]) && preg_match('/^~r2\:([a-zA-Z0-9]+)(?:\:([a-zA-Z0-9]+))?\|(.*?)$/s', $e, $iv_md5_e))
145
+ {
146
+ $key = c_ws_plugin__s2member_utils_encryption::key($key);
147
+ $key = substr($key, 0, mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC));
148
+
149
+ if(isset($iv_md5_e[3][0]) && (empty($iv_md5_e[2]) || $iv_md5_e[2] === md5($iv_md5_e[3])))
150
+ $d = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $iv_md5_e[3], MCRYPT_MODE_CBC, $iv_md5_e[1]);
151
+
152
+ if(isset($d) && is_string($d) && isset($d[0]))
153
+ if(strlen($d = preg_replace('/^~r2\|/', '', $d, 1, $r2)) && $r2)
154
+ $d = rtrim($d, "\0\4"); // See: <http://www.asciitable.com/>.
155
+ else $d = ''; // Force empty string; bad decryption.
156
+
157
+ return isset($d) && is_string($d) && isset($d[0])
158
+ ? ($string = $d) // Decrypted string.
159
+ : ''; // Default to empty string.
160
+ }
161
+ return c_ws_plugin__s2member_utils_encryption::xdecrypt($base64, $key);
162
+ }
163
 
164
+ /**
165
+ * XOR two-way encryption/decryption, with a base64 wrapper.
166
+ *
167
+ * @package s2Member\Utilities
168
+ * @since 3.5
169
+ *
170
+ * @param string $string A string of data to encrypt.
171
+ * @param string $key Optional. Key used for encryption. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``.
172
+ * @param bool $w_md5_cs Optional. Defaults to true. When true, an MD5 checksum is used in the encrypted string *(recommended)*.
173
+ *
174
+ * @return string Encrypted string.
175
+ */
176
+ public static function xencrypt($string = '', $key = '', $w_md5_cs = TRUE)
177
+ {
178
+ $string = is_string($string) ? $string : '';
179
+ $string = isset($string[0]) ? '~xe|'.$string : '';
180
+
181
+ $key = c_ws_plugin__s2member_utils_encryption::key($key);
182
+
183
+ for($i = 1, $e = ''; $i <= strlen($string); $i++)
184
+ {
185
+ $char = substr($string, $i - 1, 1);
186
+ $keychar = substr($key, ($i % strlen($key)) - 1, 1);
187
+ $e .= chr(ord($char) + ord($keychar));
188
+ }
189
+ $e = isset($e[0]) ? '~xe'.($w_md5_cs ? ':'.md5($e) : '').'|'.$e : '';
190
 
191
+ return isset($e) && is_string($e) && isset($e[0])
192
+ ? ($base64 = c_ws_plugin__s2member_utils_strings::base64_url_safe_encode($e))
193
+ : ''; // Default to empty string.
194
+ }
195
 
196
+ /**
197
+ * XOR two-way encryption/decryption, with a base64 wrapper.
198
+ *
199
+ * @package s2Member\Utilities
200
+ * @since 3.5
201
+ *
202
+ * @param string $base64 A string of data to decrypt. Should still be base64 encoded.
203
+ * @param string $key Optional. Key used originally for encryption. Defaults to the one configured for s2Member. Short of that, defaults to: ``wp_salt()``.
204
+ *
205
+ * @return string Decrypted string.
206
+ */
207
+ public static function xdecrypt($base64 = '', $key = '')
208
+ {
209
+ $base64 = is_string($base64) ? $base64 : '';
210
+ $e = isset($base64[0]) ? c_ws_plugin__s2member_utils_strings::base64_url_safe_decode($base64) : '';
211
+
212
+ if(isset($e[0]) && preg_match('/^~xe(?:\:([a-zA-Z0-9]+))?\|(.*?)$/s', $e, $md5_e))
213
+ {
214
+ $key = c_ws_plugin__s2member_utils_encryption::key($key);
215
 
216
+ if(isset($md5_e[2][0]) && (empty($md5_e[1]) || $md5_e[1] === md5($md5_e[2])))
217
+ for($i = 1, $d = ''; $i <= strlen($md5_e[2]); $i++)
 
 
 
 
 
 
 
 
 
 
 
218
  {
219
+ $char = substr($md5_e[2], $i - 1, 1);
220
+ $keychar = substr($key, ($i % strlen($key)) - 1, 1);
221
+ $d .= chr(ord($char) - ord($keychar));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
222
  }
223
+ if(isset($d) && is_string($d) && isset($d[0]))
224
+ if(!strlen($d = preg_replace('/^~xe\|/', '', $d, 1, $xe)) || !$xe)
225
+ $d = ''; // Force empty string; bad decryption.
226
+
227
+ return isset($d) && is_string($d) && isset($d[0])
228
+ ? ($string = $d) // Decrypted string.
229
+ : ''; // Default to empty string.
230
  }
231
+ return ''; // Default to empty string.
232
+ }
233
  }
234
+ }
includes/classes/utils-forms.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
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_forms"))
14
  * @package s2Member\Utilities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_utils_forms"))
includes/classes/utils-gets.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
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_gets'))
14
  * @package s2Member\Utilities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_utils_gets'))
includes/classes/utils-html.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
15
  * @since 110720
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_html"))
14
  * @package s2Member\Utilities
15
  * @since 110720
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_utils_html"))
includes/classes/utils-logs.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
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_logs'))
14
  * @package s2Member\Utilities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_utils_logs'))
includes/classes/utils-s2o.inc.php CHANGED
@@ -1,136 +1,142 @@
1
  <?php
2
  /**
3
- * s2Member-only utilities.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\Utilities
15
- * @since 110912
16
- */
17
- if (!class_exists ("c_ws_plugin__s2member_utils_s2o"))
 
 
 
 
 
 
 
 
18
  {
19
  /**
20
- * s2Member-only utilities.
21
- *
22
- * @package s2Member\Utilities
23
- * @since 110912
24
- */
25
- class c_ws_plugin__s2member_utils_s2o
26
- {
27
- /*
28
- * WordPress directory.
29
- *
30
- * @package s2Member\Utilities
31
- * @since 110912
32
- *
33
- * @param string $starting_dir A directory to start searching from.
34
- * @param string $alt_starting_dir An alternate directory to search from.
35
- * @return string|null WordPress directory, else exits script execution on failure.
36
- */
37
- public static function wp_dir ($starting_dir = FALSE, $alt_starting_dir = FALSE)
38
- {
39
- if(!empty($_SERVER['WP_DIR']))
40
- return (string)$_SERVER['WP_DIR'];
41
 
42
- foreach(array($starting_dir, $alt_starting_dir) as $directory)
43
- if($directory && is_string($directory) && is_dir($directory))
44
- for($i = 0, $dir = $directory; $i <= 20; $i++, $dir = dirname($dir))
45
- if(file_exists($dir."/wp-settings.php"))
46
- return ($wp_dir = $dir);
47
 
48
- header ("HTTP/1.0 500 Error");
49
- header ("Content-Type: text/plain; charset=UTF-8");
50
- while (@ob_end_clean ()); // Clean any existing output buffers.
51
- exit ("ERROR: s2Member unable to locate WordPress directory.");
52
- }
53
- /*
54
- * WordPress settings, after ``SHORTINIT`` section.
55
- *
56
- * @package s2Member\Utilities
57
- * @since 110912
58
- *
59
- * @param string $wp_dir WordPress directory path.
60
- * @param string $o_file Location of calling `*-o.php` file.
61
- * @return str|bool WordPress settings, else false on failure.
62
- */
63
- public static function wp_settings_as ($wp_dir = '', $o_file = '')
 
 
 
 
 
 
 
 
 
64
  {
65
- if ($wp_dir && is_dir ($wp_dir) && is_readable (($wp_settings = $wp_dir . "/wp-settings.php")) && $o_file && file_exists ($o_file) && ($_wp_settings = trim (file_get_contents ($wp_settings))))
 
 
 
 
 
 
66
  {
67
- $wp_shortinit_section /* Run ``preg_match()`` to confirm existence. */ = "/if *\( *SHORTINIT *\)[\r\n\t\s ]*\{?[\r\n\t\s ]*return false;[\r\n\t\s ]*\}?[\r\n\t\s ]*/";
68
- if (preg_match ($wp_shortinit_section, $_wp_settings) && ($_wp_settings_parts = preg_split ($wp_shortinit_section, $_wp_settings, 2)) && ($_wp_settings = trim ($_wp_settings_parts[1])) && ($_wp_settings = "<?php\n" . $_wp_settings))
 
 
 
 
 
69
  {
70
- if (($_wp_settings = str_replace ("__FILE__", "'" . str_replace ("'", "\'", $wp_settings) . "'", $_wp_settings))) // Eval compatible. Hard-code the ``__FILE__`` location here.
71
- {
72
- $mu_plugins_section = "/[\r\n\t\s ]+foreach *\( *wp_get_mu_plugins *\( *\) *as *\\\$mu_plugin *\)[\r\n\t\s ]*\{?[\r\n\t\s ]*include_once *\( *\\\$mu_plugin *\);[\r\n\t\s ]*\}?[\r\n\t\s ]*unset *\( *\\\$mu_plugin *\);/";
73
- $mu_plugins_replace = "\n\n" . c_ws_plugin__s2member_utils_s2o::esc_ds (trim (c_ws_plugin__s2member_utils_s2o::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/cfg-files/s2o-mu-plugins.php")))) . "\n";
74
- if (($_wp_settings = preg_replace ($mu_plugins_section, $mu_plugins_replace, $_wp_settings, 1, $mu_plugins_replaced)) && $mu_plugins_replaced)
75
- {
76
- $nw_plugins_section = "/[\r\n\t\s ]+foreach *\( *wp_get_active_network_plugins *\( *\) *as *\\\$network_plugin *\)[\r\n\t\s ]*\{?[\r\n\t\s ]*include_once *\( *\\\$network_plugin *\);[\r\n\t\s ]*\}?[\r\n\t\s ]*unset *\( *\\\$network_plugin *\);/";
77
- $nw_plugins_replace = "\n\n" . c_ws_plugin__s2member_utils_s2o::esc_ds (trim (c_ws_plugin__s2member_utils_s2o::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/cfg-files/s2o-nw-plugins.php")))) . "\n";
78
- if (($_wp_settings = preg_replace ($nw_plugins_section, $nw_plugins_replace, $_wp_settings, 1, $nw_plugins_replaced)) && $nw_plugins_replaced)
79
- {
80
- $st_plugins_section = "/[\r\n\t\s ]+foreach *\( *wp_get_active_and_valid_plugins *\( *\) *as *\\\$plugin *\)[\r\n\t\s ]*\{?[\r\n\t\s ]*include_once *\( *\\\$plugin *\);[\r\n\t\s ]*\}?[\r\n\t\s ]*unset *\( *\\\$plugin *\);/";
81
- $st_plugins_replace = "\n\n" . c_ws_plugin__s2member_utils_s2o::esc_ds (trim (c_ws_plugin__s2member_utils_s2o::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/cfg-files/s2o-st-plugins.php")))) . "\n";
82
- if (($_wp_settings = preg_replace ($st_plugins_section, $st_plugins_replace, $_wp_settings, 1, $st_plugins_replaced)) && $st_plugins_replaced)
83
- {
84
- $th_funcs_section = "/[\r\n\t\s ]+if *\( *\! *defined *\( *['\"]WP_INSTALLING['\"] *\) *\|\| *['\"]wp-activate.php['\"] *\=\=\= *\\\$pagenow *\)[\r\n\t\s ]*\{[\r\n\t\s ]*if *\( *TEMPLATEPATH *\!\=\= *STYLESHEETPATH *&& *file_exists *\( *STYLESHEETPATH *\. *['\"]\/functions\.php['\"] *\) *\)[\r\n\t\s ]*\{?[\r\n\t\s ]*include *\( *STYLESHEETPATH *\. *['\"]\/functions\.php['\"] *\);[\r\n\t\s ]*\}?[\r\n\t\s ]*if *\( *file_exists *\( *TEMPLATEPATH *\. *['\"]\/functions\.php['\"] *\) *\)[\r\n\t\s ]*\{?[\r\n\t\s ]*include *\( *TEMPLATEPATH *\. *['\"]\/functions\.php['\"] *\);[\r\n\t\s ]*\}?[\r\n\t\s ]*\}/";
85
- $th_funcs_replace = "\n\n" . c_ws_plugin__s2member_utils_s2o::esc_ds (trim (c_ws_plugin__s2member_utils_s2o::evl (file_get_contents (dirname (dirname (__FILE__)) . "/templates/cfg-files/s2o-th-funcs.php")))) . "\n";
86
- if (($_wp_settings = preg_replace ($th_funcs_section, $th_funcs_replace, $_wp_settings, 1, $th_funcs_replaced)) && $th_funcs_replaced)
87
- {
88
- if (($_wp_settings = str_replace ("__FILE__", '"' . str_replace ('"', '\"', $o_file) . '"', $_wp_settings))) // Eval compatible.
89
- {
90
- if (($_wp_settings = trim ($_wp_settings))) // WordPress, with s2Member only.
91
- return ($wp_settings_as = $_wp_settings); // After ``SHORTINIT``.
92
- }
93
- }
94
- }
95
- }
96
- }
97
- }
98
  }
 
99
  }
100
- return false;
101
- }
102
- /**
103
- * Escapes dollars signs (for regex patterns).
104
- *
105
- * @package s2Member\Utilities
106
- * @since 110917
107
- *
108
- * @param string $string Input string.
109
- * @param int $times Mumber of escapes. Defaults to 1.
110
- * @return string Output string after dollar signs are escaped.
111
- */
112
- public static function esc_ds ($string = FALSE, $times = FALSE)
113
- {
114
- $times = (is_numeric ($times) && $times >= 0) ? (int)$times : 1;
115
- return str_replace ('$', str_repeat ("\\", $times) . '$', (string)$string);
116
  }
117
- /**
118
- * Evaluates PHP code, and "returns" output.
119
- *
120
- * @package s2Member\Utilities
121
- * @since 110917
122
- *
123
- * @param string $code A string of data, possibly with embedded PHP code.
124
- * @return string Output after PHP evaluation.
125
- */
126
- public static function evl ($code = FALSE)
127
- {
128
- ob_start (); // Output buffer.
129
 
130
- eval ("?>" . trim ($code));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
 
132
- return ob_get_clean ();
133
- }
134
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  }
136
- ?>
1
  <?php
2
  /**
3
+ * s2Member-only utilities.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Utilities
15
+ * @since 110912
16
+ */
17
+ if(!class_exists('c_ws_plugin__s2member_utils_s2o'))
18
+ {
19
+ /**
20
+ * s2Member-only utilities.
21
+ *
22
+ * @package s2Member\Utilities
23
+ * @since 110912
24
+ */
25
+ class c_ws_plugin__s2member_utils_s2o
26
  {
27
  /**
28
+ * WordPress directory.
29
+ *
30
+ * @package s2Member\Utilities
31
+ * @since 110912
32
+ *
33
+ * @param string $starting_dir A directory to start searching from.
34
+ * @param string $alt_starting_dir An alternate directory to search from.
35
+ *
36
+ * @return string|null WordPress directory, else exits script execution on failure.
37
+ */
38
+ public static function wp_dir($starting_dir = '', $alt_starting_dir = '')
39
+ {
40
+ if(!empty($_SERVER['WP_DIR']))
41
+ return (string)$_SERVER['WP_DIR'];
 
 
 
 
 
 
 
42
 
43
+ foreach(array($starting_dir, $alt_starting_dir) as $_directory)
44
+ if($_directory && is_string($_directory) && is_dir($_directory))
45
+ for($_i = 0, $_dir = $_directory; $_i <= 20; $_i++, $_dir = dirname($_dir))
46
+ if(file_exists($_dir.'/wp-settings.php'))
47
+ return ($wp_dir = $_dir);
48
 
49
+ header('HTTP/1.0 500 Error');
50
+ header('Content-Type: text/plain; charset=UTF-8');
51
+ while(@ob_end_clean()) ; // Clean any existing output buffers.
52
+ exit ('ERROR: s2Member unable to locate WordPress directory.');
53
+ }
54
+
55
+ /**
56
+ * WordPress settings, after ``SHORTINIT`` section.
57
+ *
58
+ * @package s2Member\Utilities
59
+ * @since 110912
60
+ *
61
+ * @param string $wp_dir WordPress directory path.
62
+ * @param string $o_file Location of calling `*-o.php` file.
63
+ *
64
+ * @return string|bool WordPress settings, else false on failure.
65
+ */
66
+ public static function wp_settings_as($wp_dir = '', $o_file = '')
67
+ {
68
+ if($wp_dir && is_dir($wp_dir) && is_readable($wp_settings = $wp_dir.'/wp-settings.php') && $o_file && is_file($o_file) && ($_wp_settings = trim(file_get_contents($wp_settings))))
69
+ {
70
+ $wp_shortinit_section = '/if\s*\(\s*SHORTINIT\s*\)['."\r\n\t".'\s]*\{?['."\r\n\t".'\s]*return\s+false;['."\r\n\t".'\s]*\}?['."\r\n\t".'\s]*/'; // Run ``preg_match()`` to confirm existence.
71
+ if(preg_match($wp_shortinit_section, $_wp_settings) && ($_wp_settings_parts = preg_split($wp_shortinit_section, $_wp_settings, 2)) && ($_wp_settings = trim($_wp_settings_parts[1])) && ($_wp_settings = '<?php'."\n".$_wp_settings))
72
+ {
73
+ if(($_wp_settings = str_replace('__FILE__', "'".str_replace("'", "'", $wp_settings)."'", $_wp_settings))) // Eval compatible. Hard-code the ``__FILE__`` location here.
74
  {
75
+ $mu_plugins_section = '/['."\r\n\t".'\s]+foreach\s*\(\s*wp_get_mu_plugins\s*\(\s*\)\s*as\s*\$mu_plugin\s*\)['."\r\n\t".'\s]*\{?['."\r\n\t".'\s]*include_once\s*\(\s*\$mu_plugin\s*\)\s*;['."\r\n\t".'\s]*\}?['."\r\n\t".'\s]*unset\s*\(\s*\$mu_plugin\s*\)\s*;/';
76
+ $mu_plugins_replace = "\n\n".c_ws_plugin__s2member_utils_s2o::esc_ds(trim(c_ws_plugin__s2member_utils_s2o::evl(file_get_contents(dirname(dirname(__FILE__)).'/templates/cfg-files/s2o-mu-plugins.php'))))."\n";
77
+ if(($_wp_settings = preg_replace($mu_plugins_section, $mu_plugins_replace, $_wp_settings, 1, $mu_plugins_replaced)) && $mu_plugins_replaced)
78
+ {
79
+ $nw_plugins_section = '/['."\r\n\t".'\s]+foreach\s*\(\s*wp_get_active_network_plugins\s*\(\s*\)\s*as\s*\$network_plugin\s*\)['."\r\n\t".'\s]*\{?['."\r\n\t".'\s]*wp_register_plugin_realpath\s*\(\s*\$network_plugin\s*\)\s*;['."\r\n\t".'\s]*include_once\s*\(\s*\$network_plugin\s*\)\s*;['."\r\n\t".'\s]*\}?['."\r\n\t".'\s]*unset\s*\(\s*\$network_plugin\s*\)\s*;/';
80
+ $nw_plugins_replace = "\n\n".c_ws_plugin__s2member_utils_s2o::esc_ds(trim(c_ws_plugin__s2member_utils_s2o::evl(file_get_contents(dirname(dirname(__FILE__)).'/templates/cfg-files/s2o-nw-plugins.php'))))."\n";
81
+ if(($_wp_settings = preg_replace($nw_plugins_section, $nw_plugins_replace, $_wp_settings, 1, $nw_plugins_replaced)) && $nw_plugins_replaced)
82
  {
83
+ $st_plugins_section = '/['."\r\n\t".'\s]+foreach\s*\(\s*wp_get_active_and_valid_plugins\s*\(\s*\)\s*as\s*\$plugin\s*\)['."\r\n\t".'\s]*\{?['."\r\n\t".'\s]*wp_register_plugin_realpath\s*\(\s*\$plugin\s*\)\s*;['."\r\n\t".'\s]*include_once\s*\(\s*\$plugin\s*\)\s*;['."\r\n\t".'\s]*\}?['."\r\n\t".'\s ]*unset\s*\(\s*\$plugin\s*\)\s*;/';
84
+ $st_plugins_replace = "\n\n".c_ws_plugin__s2member_utils_s2o::esc_ds(trim(c_ws_plugin__s2member_utils_s2o::evl(file_get_contents(dirname(dirname(__FILE__)).'/templates/cfg-files/s2o-st-plugins.php'))))."\n";
85
+ if(($_wp_settings = preg_replace($st_plugins_section, $st_plugins_replace, $_wp_settings, 1, $st_plugins_replaced)) && $st_plugins_replaced)
86
+ {
87
+ $th_funcs_section = '/['."\r\n\t".'\s]+if\s*\(\s*\!\s*defined\s*\(\s*[\'"]WP_INSTALLING[\'"]\s*\)\s*\|\|\s*[\'"]wp\-activate\.php[\'"]\s*\=\=\=\s*\$pagenow\s*\)['."\r\n\t".'\s]*\{['."\r\n\t".'\s]*if\s*\(\s*TEMPLATEPATH\s*\!\=\=\s*STYLESHEETPATH\s*&&\s*file_exists\s*\(\s*STYLESHEETPATH\s*\.\s*[\'"]\/functions\.php[\'"]\s*\)\s*\)['."\r\n\t".'\s]*\{?['."\r\n\t".'\s]*include\s*\(\s*STYLESHEETPATH\s*\.\s*[\'"]\/functions\.php[\'"]\s*\);['."\r\n\t".'\s]*\}?['."\r\n\t".'\s]*if\s*\(\s*file_exists\s*\(\s*TEMPLATEPATH\s*\.\s*[\'"]\/functions\.php[\'"]\s*\)\s*\)['."\r\n\t".'\s]*\{?['."\r\n\t".'\s]*include\s*\(\s*TEMPLATEPATH\s*\.\s*[\'"]\/functions\.php[\'"]\s*\);['."\r\n\t".'\s]*\}?['."\r\n\t".'\s]*\}/';
88
+ $th_funcs_replace = "\n\n".c_ws_plugin__s2member_utils_s2o::esc_ds(trim(c_ws_plugin__s2member_utils_s2o::evl(file_get_contents(dirname(dirname(__FILE__)).'/templates/cfg-files/s2o-th-funcs.php'))))."\n";
89
+ if(($_wp_settings = preg_replace($th_funcs_section, $th_funcs_replace, $_wp_settings, 1, $th_funcs_replaced)) && $th_funcs_replaced)
90
  {
91
+ if(($_wp_settings = str_replace('__FILE__', '"'.str_replace('"', '\"', $o_file).'"', $_wp_settings))) // Eval compatible.
92
+ {
93
+ if(($_wp_settings = trim($_wp_settings))) // WordPress, with s2Member only.
94
+ return ($wp_settings_as = $_wp_settings); // After ``SHORTINIT``.
95
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  }
97
+ }
98
  }
99
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
  }
101
+ }
102
+ }
103
+ return FALSE;
104
+ }
 
 
 
 
 
 
 
 
105
 
106
+ /**
107
+ * Escapes dollars signs (for regex patterns).
108
+ *
109
+ * @package s2Member\Utilities
110
+ * @since 110917
111
+ *
112
+ * @param string $string Input string.
113
+ * @param int $times Mumber of escapes. Defaults to 1.
114
+ *
115
+ * @return string Output string after dollar signs are escaped.
116
+ */
117
+ public static function esc_ds($string = '', $times = 0)
118
+ {
119
+ $times = is_numeric($times) && $times >= 0 ? (int)$times : 1;
120
+ return str_replace('$', str_repeat('\\', $times).'$', (string)$string);
121
+ }
122
 
123
+ /**
124
+ * Evaluates PHP code, and 'returns' output.
125
+ *
126
+ * @package s2Member\Utilities
127
+ * @since 110917
128
+ *
129
+ * @param string $code A string of data, possibly with embedded PHP code.
130
+ *
131
+ * @return string Output after PHP evaluation.
132
+ */
133
+ public static function evl($code = '')
134
+ {
135
+ ob_start(); // Output buffer.
136
+
137
+ eval ('?>'.trim($code));
138
+
139
+ return ob_get_clean();
140
+ }
141
  }
142
+ }
includes/classes/utils-strings.inc.php CHANGED
@@ -1,574 +1,664 @@
1
  <?php
2
  /**
3
- * String utilities.
4
- *
5
- * Copyright: © 2009-2011
6
- * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
- * (coded in the USA)
8
- *
9
- * Released under the terms of the GNU General Public License.
10
- * You should have received a copy of the GNU General Public License,
11
- * along with this software. In the main directory, see: /licensing/
12
- * If not, see: {@link http://www.gnu.org/licenses/}.
13
- *
14
- * @package s2Member\Utilities
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_strings"))
 
 
 
 
 
 
 
 
21
  {
22
  /**
23
- * String utilities.
24
- *
25
- * @package s2Member\Utilities
26
- * @since 3.5
27
- */
28
- class c_ws_plugin__s2member_utils_strings
29
- {
30
- /**
31
- * Array of all ampersand entities.
32
- *
33
- * Array keys are actually regex patterns *(very useful)*.
34
- *
35
- * @package s2Member\Utilities
36
- * @since 111106
37
- *
38
- * @var array
39
- */
40
- public static $ampersand_entities = array("&amp;" => "&amp;", "&#0*38;" => "&#38;", "&#[xX]0*26;" => "&#x26;");
41
- /**
42
- * Array of all quote entities *(and entities for quote variations)*.
43
- *
44
- * Array keys are actually regex patterns *(very useful)*.
45
- *
46
- * @package s2Member\Utilities
47
- * @since 111106
48
- *
49
- * @var array
50
- */
51
- public static $quote_entities_w_variations = array("&apos;" => "&apos;", "&#0*39;" => "&#39;", "&#[xX]0*27;" => "&#x27;", "&lsquo;" => "&lsquo;", "&#0*8216;" => "&#8216;", "&#[xX]0*2018;" => "&#x2018;", "&rsquo;" => "&rsquo;", "&#0*8217;" => "&#8217;", "&#[xX]0*2019;" => "&#x2019;", "&quot;" => "&quot;", "&#0*34;" => "&#34;", "&#[xX]0*22;" => "&#x22;", "&ldquo;" => "&ldquo;", "&#0*8220;" => "&#8220;", "&#[xX]0*201[cC];" => "&#x201C;", "&rdquo;" => "&rdquo;", "&#0*8221;" => "&#8221;", "&#[xX]0*201[dD];" => "&#x201D;");
52
- /**
53
- * Escapes double quotes.
54
- *
55
- * @package s2Member\Utilities
56
- * @since 3.5
57
- *
58
- * @param string $string Input string.
59
- * @param int $times Number of escapes. Defaults to 1.
60
- * @param string $escape_char The character to be used in escapes.
61
- * @return string Output string after double quotes are escaped.
62
- */
63
- public static function esc_dq($string = FALSE, $times = FALSE, $escape_char = "\\")
64
- {
65
- $times = (is_numeric($times) && $times >= 0) ? (int)$times : 1;
66
 
67
- return str_replace('"', str_repeat($escape_char, $times).'"', (string)$string);
68
- }
69
- /**
70
- * Escapes single quotes.
71
- *
72
- * @package s2Member\Utilities
73
- * @since 3.5
74
- *
75
- * @param string $string Input string.
76
- * @param int $times Number of escapes. Defaults to 1.
77
- * @return string Output string after single quotes are escaped.
78
- */
79
- public static function esc_sq($string = FALSE, $times = FALSE)
80
- {
81
- $times = (is_numeric($times) && $times >= 0) ? (int)$times : 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
 
83
- return str_replace("'", str_repeat("\\", $times)."'", (string)$string);
84
- }
85
- /**
86
- * Escapes JavaScript and single quotes.
87
- *
88
- * @package s2Member\Utilities
89
- * @since 110901
90
- *
91
- * @param string $string Input string.
92
- * @param int $times Number of escapes. Defaults to 1.
93
- * @return string Output string after JavaScript and single quotes are escaped.
94
- */
95
- public static function esc_js_sq($string = FALSE, $times = FALSE)
96
- {
97
- $times = (is_numeric($times) && $times >= 0) ? (int)$times : 1;
98
 
99
- return str_replace("'", str_repeat("\\", $times)."'", str_replace(array("\r", "\n"), array("", '\\n'), str_replace("\'", "'", (string)$string)));
100
- }
101
- /**
102
- * Escapes dollars signs (for regex patterns).
103
- *
104
- * @package s2Member\Utilities
105
- * @since 3.5
106
- *
107
- * @param string $string Input string.
108
- * @param int $times Number of escapes. Defaults to 1.
109
- * @return string Output string after dollar signs are escaped.
110
- *
111
- * @deprecated Starting with s2Member v120103, please use:
112
- * ``c_ws_plugin__s2member_utils_strings::esc_refs()``.
113
- */
114
- public static function esc_ds($string = FALSE, $times = FALSE)
115
- {
116
- $times = (is_numeric($times) && $times >= 0) ? (int)$times : 1;
117
 
118
- return str_replace('$', str_repeat("\\", $times).'$', (string)$string);
119
- }
120
- /**
121
- * Escapes backreferences (for regex patterns).
122
- *
123
- * @package s2Member\Utilities
124
- * @since 120103
125
- *
126
- * @param string $string Input string.
127
- * @param int $times Number of escapes. Defaults to 1.
128
- * @return string Output string after backreferences are escaped.
129
- */
130
- public static function esc_refs($string = NULL, $times = NULL)
131
- {
132
- $times = (is_numeric($times) && $times >= 0) ? (int)$times : 1;
133
 
134
- return str_replace(array("\\", '$'), array(str_repeat("\\", $times)."\\", str_repeat("\\", $times).'$'), (string)$string);
135
- }
136
- /**
137
- * Sanitizes a string; by stripping characters NOT on a standard U.S. keyboard.
138
- *
139
- * @package s2Member\Utilities
140
- * @since 111106
141
- *
142
- * @param string $string Input string.
143
- * @return string Output string, after characters NOT on a standard U.S. keyboard have been stripped.
144
- */
145
- public static function strip_2_kb_chars($string = '')
146
- {
147
- return preg_replace("/[^0-9A-Z\r\n\t\s`\=\[\]\\\;',\.\/~\!@#\$%\^&\*\(\)_\+\|\}\{\:\"\?\>\<\-]/i", "", remove_accents((string)$string));
148
- }
149
- /**
150
- * Trims deeply; alias of ``trim_deep``.
151
- *
152
- * @package s2Member\Utilities
153
- * @since 111106
154
- *
155
- * @see s2Member\Utilities\c_ws_plugin__s2member_utils_strings::trim_deep()
156
- * @see http://php.net/manual/en/function.trim.php
157
- *
158
- * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
159
- * @param str|bool $chars Optional. Defaults to false, indicating the default trim chars ` \t\n\r\0\x0B`. Or, set to a specific string of chars.
160
- * @param str|bool $extra_chars Optional. This is NOT possible with PHP alone, but here you can specify extra chars; in addition to ``$chars``.
161
- * @return str|array Either the input string, or the input array; after all data is trimmed up according to arguments passed in.
162
- */
163
- public static function trim($value = FALSE, $chars = FALSE, $extra_chars = FALSE)
164
- {
165
- return c_ws_plugin__s2member_utils_strings::trim_deep($value, $chars, $extra_chars);
166
- }
167
- /**
168
- * Trims deeply; or use {@link s2Member\Utilities\c_ws_plugin__s2member_utils_strings::trim()}.
169
- *
170
- * @package s2Member\Utilities
171
- * @since 3.5
172
- *
173
- * @see s2Member\Utilities\c_ws_plugin__s2member_utils_strings::trim()
174
- * @see http://php.net/manual/en/function.trim.php
175
- *
176
- * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
177
- * @param str|bool $chars Optional. Defaults to false, indicating the default trim chars ` \t\n\r\0\x0B`. Or, set to a specific string of chars.
178
- * @param str|bool $extra_chars Optional. This is NOT possible with PHP alone, but here you can specify extra chars; in addition to ``$chars``.
179
- * @return str|array Either the input string, or the input array; after all data is trimmed up according to arguments passed in.
180
- */
181
- public static function trim_deep($value = FALSE, $chars = FALSE, $extra_chars = FALSE)
182
- {
183
- $chars = /* List of chars to be trimmed by this routine. */ (is_string($chars)) ? $chars : " \t\n\r\0\x0B";
184
- $chars = (is_string($extra_chars) /* Adding additional chars? */) ? $chars.$extra_chars : $chars;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
 
186
- if(is_array($value)) /* Handles all types of arrays.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  Note, we do NOT use ``array_map()`` here, because multiple args to ``array_map()`` causes a loss of string keys.
188
  For further details, see: <http://php.net/manual/en/function.array-map.php>. */
189
- {
190
- foreach($value as &$r) // Reference.
191
- $r = c_ws_plugin__s2member_utils_strings::trim_deep($r, $chars);
192
- return $value; // Return modified array.
193
- }
194
- return trim((string)$value, $chars);
195
- }
196
- /**
197
- * Trims double quotes deeply.
198
- *
199
- * @package s2Member\Utilities
200
- * @since 3.5
201
- *
202
- * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
203
- * @return str|array Either the input string, or the input array; after all data is trimmed up.
204
- */
205
- public static function trim_dq_deep($value = FALSE)
206
- {
207
- return c_ws_plugin__s2member_utils_strings::trim_deep($value, false, '"');
208
- }
209
- /**
210
- * Trims single quotes deeply.
211
- *
212
- * @package s2Member\Utilities
213
- * @since 111106
214
- *
215
- * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
216
- * @return str|array Either the input string, or the input array; after all data is trimmed up.
217
- */
218
- public static function trim_sq_deep($value = FALSE)
219
- {
220
- return c_ws_plugin__s2member_utils_strings::trim_deep($value, false, "'");
221
- }
222
- /**
223
- * Trims double and single quotes deeply.
224
- *
225
- * @package s2Member\Utilities
226
- * @since 111106
227
- *
228
- * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
229
- * @return str|array Either the input string, or the input array; after all data is trimmed up.
230
- */
231
- public static function trim_dsq_deep($value = FALSE)
232
- {
233
- return c_ws_plugin__s2member_utils_strings::trim_deep($value, false, "'".'"');
234
- }
235
- /**
236
- * Trims all single/double quote entity variations deeply.
237
- *
238
- * This is useful on Shortcode attributes mangled by a Visual Editor.
239
- *
240
- * @package s2Member\Utilities
241
- * @since 111011
242
- *
243
- * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
244
- * @return str|array Either the input string, or the input array; after all data is trimmed up.
245
- */
246
- public static function trim_qts_deep($value = FALSE)
247
- {
248
- $qts = implode("|", array_keys /* Keys are regex patterns. */(c_ws_plugin__s2member_utils_strings::$quote_entities_w_variations));
249
 
250
- return is_array($value) ? array_map("c_ws_plugin__s2member_utils_strings::trim_qts_deep", $value) : preg_replace("/^(?:".$qts.")+|(?:".$qts.")+$/", "", (string)$value);
251
- }
252
- /**
253
- * Trims HTML whitespace.
254
- *
255
- * This is useful on Shortcode content.
256
- *
257
- * @package s2Member\Utilities
258
- * @since 140124
259
- *
260
- * @param string $string Input string to trim.
261
- * @return string Output string with all HTML whitespace trimmed away.
262
- */
263
- public static function trim_html($string = FALSE)
264
- {
265
- $whitespace = '&nbsp;|\<br\>|\<br\s*\/\>|\<p\>(?:&nbsp;)*\<\/p\>';
266
- return preg_replace('/^(?:'.$whitespace.')+|(?:'.$whitespace.')+$/', '', (string)$string);
267
- }
268
- /**
269
- * Wraps a string with the characters provided.
270
- *
271
- * This is useful when preparing an input array for ``c_ws_plugin__s2member_utils_arrays::in_regex_array()``.
272
- *
273
- * @package s2Member\Utilities
274
- * @since 3.5
275
- *
276
- * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
277
- * @param string $beg Optional. A string value to wrap at the beginning of each value.
278
- * @param string $end Optional. A string value to wrap at the ending of each value.
279
- * @param bool $wrap_e Optional. Defaults to false. Should empty strings be wrapped too?
280
- * @return str|array Either the input string, or the input array; after all data is wrapped up.
281
- */
282
- public static function wrap_deep($value = FALSE, $beg = FALSE, $end = FALSE, $wrap_e = FALSE)
283
- {
284
- if(is_array($value)) /* Handles all types of arrays.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
285
  Note, we do NOT use ``array_map()`` here, because multiple args to ``array_map()`` causes a loss of string keys.
286
  For further details, see: <http://php.net/manual/en/function.array-map.php>. */
287
- {
288
- foreach($value as &$r) // Reference.
289
- $r = c_ws_plugin__s2member_utils_strings::wrap_deep($r, $beg, $end, $wrap_e);
290
- return $value; // Return modified array.
291
- }
292
- return (strlen((string)$value) || $wrap_e) ? (string)$beg.(string)$value.(string)$end : (string)$value;
293
- }
294
- /**
295
- * Escapes meta characters with ``preg_quote()`` deeply.
296
- *
297
- * @package s2Member\Utilities
298
- * @since 110926
299
- *
300
- * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
301
- * @param string $delimiter Optional. If a delimiting character is specified, it will also be escaped via ``preg_quote()``.
302
- * @return str|array Either the input string, or the input array; after all data is escaped with ``preg_quote()``.
303
- */
304
- public static function preg_quote_deep($value = FALSE, $delimiter = FALSE)
305
- {
306
- if(is_array($value)) /* Handles all types of arrays.
 
 
307
  Note, we do NOT use ``array_map()`` here, because multiple args to ``array_map()`` causes a loss of string keys.
308
  For further details, see: <http://php.net/manual/en/function.array-map.php>. */
309
- {
310
- foreach($value as &$r) // Reference.
311
- $r = c_ws_plugin__s2member_utils_strings::preg_quote_deep($r, $delimiter);
312
- return $value; // Return modified array.
313
- }
314
- return preg_quote((string)$value, (string)$delimiter);
315
- }
316
- /**
317
- * Generates a random string with letters/numbers/symbols.
318
- *
319
- * @package s2Member\Utilities
320
- * @since 3.5
321
- *
322
- * @param int $length Optional. Defaults to `12`. Length of the random string.
323
- * @param bool $special_chars Defaults to true. If false, special chars are NOT included.
324
- * @param bool $extra_special_chars Defaults to false. If true, extra special chars are included.
325
- * @return string A randomly generated string, based on parameter configuration.
326
- */
327
- public static function random_str_gen($length = FALSE, $special_chars = TRUE, $extra_special_chars = FALSE)
328
- {
329
- $length = (is_numeric($length) && $length >= 0) ? (int)$length : 12;
330
 
331
- $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
332
- $chars .= ($extra_special_chars) ? "-_ []{}<>~`+=,.;:/?|" : "";
333
- $chars .= ($special_chars) ? "!@#$%^&*()" : "";
 
 
 
 
 
 
 
 
 
 
 
 
334
 
335
- for($i = 0, $random_str = ""; $i < $length; $i++)
336
- $random_str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
 
337
 
338
- return /* Randomly generated string of chars. */ $random_str;
339
- }
340
- /**
341
- * Highlights PHP, and also Shortcodes.
342
- *
343
- * @package s2Member\Utilities
344
- * @since 3.5
345
- *
346
- * @param string $str Input string to be highlighted.
347
- * @return string The highlighted string.
348
- */
349
- public static function highlight_php($string = FALSE)
350
- {
351
- $string = highlight_string(trim((string)$string), true); // Start with PHP syntax, then Shortcodes.
352
- $string = preg_replace("/\[\/?_*s2[a-z0-9_\-]+.*?\]/i", '<span style="color:#164A61;">$0</span>', $string);
353
- return str_replace('<code>', '<code class="highlight-php">', $string);
354
- }
355
- /**
356
- * Parses email addresses from a string or array.
357
- *
358
- * @package s2Member\Utilities
359
- * @since 111009
360
- *
361
- * @param string|array $value Input string or an array is also fine.
362
- * @return array Array of parsed email addresses.
363
- */
364
- public static function parse_emails($value = FALSE)
365
- {
366
- if(is_array($value)) /* Handles all types of arrays.
 
 
 
 
 
 
 
367
  Note, we do NOT use ``array_map()`` here, because multiple args to ``array_map()`` causes a loss of string keys.
368
  For further details, see: <http://php.net/manual/en/function.array-map.php>. */
369
- {
370
- $emails = array(); // Initialize array.
371
- foreach /* Loop through array. */($value as $v)
372
- $emails = array_merge($emails, c_ws_plugin__s2member_utils_strings::parse_emails($v));
373
- return $emails; // Return array.
374
- }
375
- $delimiter = /* Supports semicolons or commas. */ (strpos((string)$value, ";") !== false) ? ";" : ",";
376
- foreach(c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/".preg_quote($delimiter, "/")."+/", (string)$value)) as $section)
377
- {
378
- if(preg_match("/\<(.+?)\>/", $section, $m) && strpos($m[1], "@") !== false)
379
- $emails[] = $m[1]; // Email inside <brackets>.
380
-
381
- else if(strpos($section, "@") !== false)
382
- $emails[] = $section;
383
- }
384
- return /* Array. */ (!empty($emails)) ? $emails : array();
385
- }
386
- /**
387
- * Base64 URL-safe encoding.
388
- *
389
- * @package s2Member\Utilities
390
- * @since 110913
391
- *
392
- * @param string $string Input string to be base64 encoded.
393
- * @param array $url_unsafe_chars Optional. An array of un-safe characters. Defaults to: ``array("+", "/")``.
394
- * @param array $url_safe_chars Optional. An array of safe character replacements. Defaults to: ``array("-", "_")``.
395
- * @param string $trim_padding_chars Optional. A string of padding chars to rtrim. Defaults to: `=~.`.
396
- * @return string The base64 URL-safe encoded string.
397
- */
398
- public static function base64_url_safe_encode($string = FALSE, $url_unsafe_chars = array("+", "/"), $url_safe_chars = array("-", "_"), $trim_padding_chars = "=~.")
399
- {
400
- $string = (string)$string; // Force string values here. String MUST be a string.
401
- $trim_padding_chars = (string)$trim_padding_chars; // And force this one too.
402
 
403
- $base64_url_safe = str_replace((array)$url_unsafe_chars, (array)$url_safe_chars, (string)base64_encode($string));
404
- $base64_url_safe = (strlen($trim_padding_chars)) ? rtrim($base64_url_safe, $trim_padding_chars) : $base64_url_safe;
 
 
 
405
 
406
- return $base64_url_safe; // Base64 encoded, with URL-safe replacements.
407
- }
408
- /**
409
- * Base64 URL-safe decoding.
410
- *
411
- * Note, this function is backward compatible with routines supplied by s2Member in the past;
412
- * where padding characters were replaced with `~` or `.`, instead of being stripped completely.
413
- *
414
- * @package s2Member\Utilities
415
- * @since 110913
416
- *
417
- * @param string $base64_url_safe Input string to be base64 decoded.
418
- * @param array $url_unsafe_chars Optional. An array of un-safe character replacements. Defaults to: ``array("+", "/")``.
419
- * @param array $url_safe_chars Optional. An array of safe characters. Defaults to: ``array("-", "_")``.
420
- * @param string $trim_padding_chars Optional. A string of padding chars to rtrim. Defaults to: `=~.`.
421
- * @return string The decoded string.
422
- */
423
- public static function base64_url_safe_decode($base64_url_safe = FALSE, $url_unsafe_chars = array("+", "/"), $url_safe_chars = array("-", "_"), $trim_padding_chars = "=~.")
424
- {
425
- $base64_url_safe = (string)$base64_url_safe; // Force string values here. This MUST be a string.
426
- $trim_padding_chars = (string)$trim_padding_chars; // And force this one too.
427
 
428
- $string = (strlen($trim_padding_chars)) ? rtrim($base64_url_safe, $trim_padding_chars) : $base64_url_safe;
429
- $string = (strlen($trim_padding_chars)) ? str_pad($string, strlen($string) % 4, "=", STR_PAD_RIGHT) : $string;
430
- $string = (string)base64_decode(str_replace((array)$url_safe_chars, (array)$url_unsafe_chars, $string));
431
 
432
- return $string; // Base64 decoded, with URL-safe replacements.
433
- }
434
- /**
435
- * Generates an RSA-SHA1 signature.
436
- *
437
- * @package s2Member\Utilities
438
- * @since 111017
439
- *
440
- * @param string $string Input string/data, to be signed by this routine.
441
- * @param string $key The secret key that will be used in this signature.
442
- * @return str|bool An RSA-SHA1 signature string, or false on failure.
443
- */
444
- public static function rsa_sha1_sign($string = FALSE, $key = FALSE)
445
- {
446
- $key = /* Fixes key wrappers. */ c_ws_plugin__s2member_utils_strings::_rsa_sha1_key_fix_wrappers((string)$key);
447
 
448
- $signature = /* Command line. */ c_ws_plugin__s2member_utils_strings::_rsa_sha1_shell_sign((string)$string, (string)$key);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
449
 
450
- if(empty($signature) && stripos(PHP_OS, "win") === 0 && file_exists(($openssl = "c:\openssl-win32\bin\openssl.exe")))
451
- $signature = c_ws_plugin__s2member_utils_strings::_rsa_sha1_shell_sign((string)$string, (string)$key, /* Specific location. */ $openssl);
 
452
 
453
- if(empty($signature) && stripos(PHP_OS, "win") === 0 && file_exists(($openssl = "c:\openssl-win64\bin\openssl.exe")))
454
- $signature = c_ws_plugin__s2member_utils_strings::_rsa_sha1_shell_sign((string)$string, (string)$key, /* Specific location. */ $openssl);
455
 
456
- if(empty($signature) && function_exists("openssl_get_privatekey") && function_exists("openssl_sign") && is_resource($private_key = openssl_get_privatekey((string)$key)))
457
- openssl_sign((string)$string, $signature, $private_key, OPENSSL_ALGO_SHA1).openssl_free_key($private_key);
 
 
 
 
 
 
 
 
 
 
 
 
458
 
459
- if(empty($signature)) // Now, if we're still empty, trigger an error here.
460
- trigger_error("s2Member was unable to generate an RSA-SHA1 signature.".
461
- " Please make sure your installation of PHP is compiled with OpenSSL: `openssl_sign()`.".
462
- " See: http://php.net/manual/en/function.openssl-sign.php", E_USER_ERROR);
463
 
464
- return (!empty($signature)) ? $signature : false;
465
- }
466
- /**
467
- * Generates an RSA-SHA1 signature from the command line.
468
- *
469
- * Used by {@link s2Member\Utilities\c_ws_plugin__s2member_utils_strings::rsa_sha1_sign()}.
470
- *
471
- * @package s2Member\Utilities
472
- * @since 111017
473
- *
474
- * @param string $string Input string/data, to be signed by this routine.
475
- * @param string $key The secret key that will be used in this signature.
476
- * @param string $openssl Optional. Defaults to `openssl`. Path to OpenSSL executable.
477
- * @return str|bool An RSA-SHA1 signature string, or false on failure.
478
- */
479
- public static function _rsa_sha1_shell_sign($string = FALSE, $key = FALSE, $openssl = FALSE)
480
- {
481
- if(function_exists("shell_exec") && ($esa = "escapeshellarg") && ($openssl = (($openssl && is_string($openssl)) ? $openssl : "openssl")) && ($temp_dir = c_ws_plugin__s2member_utils_dirs::get_temp_dir()))
482
- {
483
- file_put_contents(($string_file = $temp_dir."/".md5(uniqid("", true)."rsa-sha1-string").".tmp"), (string)$string);
484
- file_put_contents(($private_key_file = $temp_dir."/".md5(uniqid("", true)."rsa-sha1-private-key").".tmp"), (string)$key);
485
- file_put_contents(($rsa_sha1_sig_file = $temp_dir."/".md5(uniqid("", true)."rsa-sha1-sig").".tmp"), "");
486
-
487
- @shell_exec($esa($openssl)." sha1 -sign ".$esa($private_key_file)." -out ".$esa($rsa_sha1_sig_file)." ".$esa($string_file));
488
- $signature = /* Do NOT trim here. */ file_get_contents($rsa_sha1_sig_file); // Was the signature was written?
489
- unlink($rsa_sha1_sig_file).unlink($private_key_file).unlink($string_file); // Cleanup.
490
- }
491
- return (!empty($signature)) ? $signature : false;
492
- }
493
- /**
494
- * Fixes incomplete private key wrappers for RSA-SHA1 signing.
495
- *
496
- * Used by {@link s2Member\Utilities\c_ws_plugin__s2member_utils_strings::rsa_sha1_sign()}.
497
- *
498
- * @package s2Member\Utilities
499
- * @since 111017
500
- *
501
- * @param string $key The secret key to be used in an RSA-SHA1 signature.
502
- * @return string Key with incomplete wrappers corrected, when/if possible.
503
- *
504
- * @see http://www.faqs.org/qa/qa-14736.html
505
- */
506
- public static function _rsa_sha1_key_fix_wrappers($key = FALSE)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
  {
508
- if(($key = trim((string)$key)) && (strpos($key, "-----BEGIN RSA PRIVATE KEY-----") === false || strpos($key, "-----END RSA PRIVATE KEY-----") === false))
509
- {
510
- foreach(($lines = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split("/[\r\n]+/", $key))) as $line => $value)
511
- if(strpos($value, "-") === 0) // Begins with a boundary identifying character ( a hyphen `-` )?
512
- {
513
- $boundaries = (empty($boundaries)) ? 1 : $boundaries + 1; // Counter.
514
- unset($lines[$line]); // Remove this boundary line. We'll fix these below.
515
- }
516
- if(empty($boundaries) || $boundaries <= 2) // Do NOT modify keys with more than 2 boundaries.
517
- $key = "-----BEGIN RSA PRIVATE KEY-----\n".implode("\n", $lines)."\n-----END RSA PRIVATE KEY-----";
518
- }
519
- return $key; // Always a trimmed string here.
520
  }
521
- /**
522
- * Generates an HMAC-SHA1 signature.
523
- *
524
- * @package s2Member\Utilities
525
- * @since 111017
526
- *
527
- * @param string $string Input string/data, to be signed by this routine.
528
- * @param string $key The secret key that will be used in this signature.
529
- * @return string An HMAC-SHA1 signature string.
530
- */
531
- public static function hmac_sha1_sign($string = FALSE, $key = FALSE)
532
- {
533
- $key_64 = str_pad(((strlen((string)$key) > 64) ? pack('H*', sha1((string)$key)) : (string)$key), 64, chr(0x00));
534
 
535
- return pack('H*', sha1(($key_64 ^ str_repeat(chr(0x5c), 64)).pack('H*', sha1(($key_64 ^ str_repeat(chr(0x36), 64)).(string)$string))));
536
- }
537
- /**
538
- * Decodes unreserved chars encoded by PHP's ``urlencode()``, deeply.
539
- *
540
- * For further details regarding unreserved chars, see: {@link http://www.faqs.org/rfcs/rfc3986.html}.
541
- *
542
- * @package s2Member\Utilities
543
- * @since 111017
544
- *
545
- * @see http://www.faqs.org/rfcs/rfc3986.html
546
- *
547
- * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
548
- * @return str|array Either the input string, or the input array; after all unreserved chars are decoded properly.
549
- */
550
- public static function urldecode_ur_chars_deep($value = array())
551
- {
552
- if(is_array($value)) /* Handles all types of arrays.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
553
  Note, we do NOT use ``array_map()`` here, because multiple args to ``array_map()`` causes a loss of string keys.
554
  For further details, see: <http://php.net/manual/en/function.array-map.php>. */
555
- {
556
- foreach($value as &$r) // Reference.
557
- $r = c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep($r);
558
- return $value; // Return modified array.
559
- }
560
- return str_replace(array("%2D", "%2E", "%5F", "%7E"), array("-", ".", "_", "~"), (string)$value);
561
- }
562
 
563
- public static function like_escape($string)
564
- {
565
- global $wpdb; // Global DB object reference.
566
 
567
- if(method_exists($wpdb, 'esc_like'))
568
- return $wpdb->esc_like($string);
569
 
570
- return like_escape($string); // Deprecated in WP v4.0.
571
- }
572
- }
573
  }
574
- ?>
1
  <?php
2
  /**
3
+ * String utilities.
4
+ *
5
+ * Copyright: © 2009-2011
6
+ * {@link http://www.websharks-inc.com/ WebSharks, Inc.}
7
+ * (coded in the USA)
8
+ *
9
+ * Released under the terms of the GNU General Public License.
10
+ * You should have received a copy of the GNU General Public License,
11
+ * along with this software. In the main directory, see: /licensing/
12
+ * If not, see: {@link http://www.gnu.org/licenses/}.
13
+ *
14
+ * @package s2Member\Utilities
15
+ * @since 3.5
16
+ */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
+ exit('Do not access this file directly.');
19
+
20
+ if(!class_exists('c_ws_plugin__s2member_utils_strings'))
21
+ {
22
+ /**
23
+ * String utilities.
24
+ *
25
+ * @package s2Member\Utilities
26
+ * @since 3.5
27
+ */
28
+ class c_ws_plugin__s2member_utils_strings
29
  {
30
  /**
31
+ * Array of all ampersand entities.
32
+ *
33
+ * Array keys are actually regex patterns *(very useful)*.
34
+ *
35
+ * @package s2Member\Utilities
36
+ * @since 111106
37
+ *
38
+ * @var array
39
+ */
40
+ public static $ampersand_entities = array(
41
+ '&amp;' => '&amp;',
42
+ '&#0*38;' => '&#38;',
43
+ '&#[xX]0*26;' => '&#x26;'
44
+ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
 
46
+ /**
47
+ * Array of all quote entities *(and entities for quote variations)*.
48
+ *
49
+ * Array keys are actually regex patterns *(very useful)*.
50
+ *
51
+ * @package s2Member\Utilities
52
+ * @since 111106
53
+ *
54
+ * @var array
55
+ */
56
+ public static $quote_entities_w_variations = array(
57
+ '&apos;' => '&apos;',
58
+ '&#0*39;' => '&#39;',
59
+ '&#[xX]0*27;' => '&#x27;',
60
+ '&lsquo;' => '&lsquo;',
61
+ '&#0*8216;' => '&#8216;',
62
+ '&#[xX]0*2018;' => '&#x2018;',
63
+ '&rsquo;' => '&rsquo;',
64
+ '&#0*8217;' => '&#8217;',
65
+ '&#[xX]0*2019;' => '&#x2019;',
66
+ '&quot;' => '&quot;',
67
+ '&#0*34;' => '&#34;',
68
+ '&#[xX]0*22;' => '&#x22;',
69
+ '&ldquo;' => '&ldquo;',
70
+ '&#0*8220;' => '&#8220;',
71
+ '&#[xX]0*201[cC];' => '&#x201C;',
72
+ '&rdquo;' => '&rdquo;',
73
+ '&#0*8221;' => '&#8221;',
74
+ '&#[xX]0*201[dD];' => '&#x201D;'
75
+ );
76
 
77
+ /**
78
+ * Escapes double quotes.
79
+ *
80
+ * @package s2Member\Utilities
81
+ * @since 3.5
82
+ *
83
+ * @param string $string Input string.
84
+ * @param int $times Number of escapes. Defaults to 1.
85
+ * @param string $escape_char The character to be used in escapes.
86
+ *
87
+ * @return string Output string after double quotes are escaped.
88
+ */
89
+ public static function esc_dq($string = '', $times = NULL, $escape_char = '\\')
90
+ {
91
+ $times = (is_numeric($times) && $times >= 0) ? (int)$times : 1;
92
 
93
+ return str_replace('"', str_repeat($escape_char, $times).'"', (string)$string);
94
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
 
96
+ /**
97
+ * Escapes single quotes.
98
+ *
99
+ * @package s2Member\Utilities
100
+ * @since 3.5
101
+ *
102
+ * @param string $string Input string.
103
+ * @param int $times Number of escapes. Defaults to 1.
104
+ *
105
+ * @return string Output string after single quotes are escaped.
106
+ */
107
+ public static function esc_sq($string = '', $times = NULL)
108
+ {
109
+ $times = (is_numeric($times) && $times >= 0) ? (int)$times : 1;
 
110
 
111
+ return str_replace("'", str_repeat('\\', $times)."'", (string)$string);
112
+ }
113
+
114
+ /**
115
+ * Escapes JavaScript and single quotes.
116
+ *
117
+ * @package s2Member\Utilities
118
+ * @since 110901
119
+ *
120
+ * @param string $string Input string.
121
+ * @param int $times Number of escapes. Defaults to 1.
122
+ *
123
+ * @return string Output string after JavaScript and single quotes are escaped.
124
+ */
125
+ public static function esc_js_sq($string = '', $times = NULL)
126
+ {
127
+ $times = (is_numeric($times) && $times >= 0) ? (int)$times : 1;
128
+
129
+ return str_replace("'", str_repeat('\\', $times)."'", str_replace(array("\r", "\n"), array('', '\\n'), str_replace("\\'", "'", (string)$string)));
130
+ }
131
+
132
+ /**
133
+ * Escapes dollars signs (for regex patterns).
134
+ *
135
+ * @package s2Member\Utilities
136
+ * @since 3.5
137
+ *
138
+ * @param string $string Input string.
139
+ * @param int $times Number of escapes. Defaults to 1.
140
+ *
141
+ * @return string Output string after dollar signs are escaped.
142
+ *
143
+ * @deprecated Starting with s2Member v120103, please use:
144
+ * ``c_ws_plugin__s2member_utils_strings::esc_refs()``.
145
+ */
146
+ public static function esc_ds($string = '', $times = NULL)
147
+ {
148
+ $times = (is_numeric($times) && $times >= 0) ? (int)$times : 1;
149
+
150
+ return str_replace('$', str_repeat('\\', $times).'$', (string)$string);
151
+ }
152
+
153
+ /**
154
+ * Escapes backreferences (for regex patterns).
155
+ *
156
+ * @package s2Member\Utilities
157
+ * @since 120103
158
+ *
159
+ * @param string $string Input string.
160
+ * @param int $times Number of escapes. Defaults to 1.
161
+ *
162
+ * @return string Output string after backreferences are escaped.
163
+ */
164
+ public static function esc_refs($string = NULL, $times = NULL)
165
+ {
166
+ $times = (is_numeric($times) && $times >= 0) ? (int)$times : 1;
167
+
168
+ return str_replace(array('\\', '$'), array(str_repeat('\\', $times).'\\', str_repeat('\\', $times).'$'), (string)$string);
169
+ }
170
+
171
+ /**
172
+ * Sanitizes a string; by stripping characters NOT on a standard U.S. keyboard.
173
+ *
174
+ * @package s2Member\Utilities
175
+ * @since 111106
176
+ *
177
+ * @param string $string Input string.
178
+ *
179
+ * @return string Output string, after characters NOT on a standard U.S. keyboard have been stripped.
180
+ */
181
+ public static function strip_2_kb_chars($string = '')
182
+ {
183
+ return preg_replace('/[^0-9A-Z'."\r\n\t".'\s`\=\[\]\\\;\',\.\/~\!@#\$%\^&\*\(\)_\+\|\}\{\:"\?\>\<\-]/i', '', remove_accents((string)$string));
184
+ }
185
 
186
+ /**
187
+ * Trims deeply; alias of ``trim_deep``.
188
+ *
189
+ * @package s2Member\Utilities
190
+ * @since 111106
191
+ *
192
+ * @see s2Member\Utilities\c_ws_plugin__s2member_utils_strings::trim_deep()
193
+ * @see http://php.net/manual/en/function.trim.php
194
+ *
195
+ * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
196
+ * @param string|bool $chars Optional. Defaults to false, indicating the default trim chars ` \t\n\r\0\x0B`. Or, set to a specific string of chars.
197
+ * @param string|bool $extra_chars Optional. This is NOT possible with PHP alone, but here you can specify extra chars; in addition to ``$chars``.
198
+ *
199
+ * @return string|array Either the input string, or the input array; after all data is trimmed up according to arguments passed in.
200
+ */
201
+ public static function trim($value = '', $chars = FALSE, $extra_chars = FALSE)
202
+ {
203
+ return c_ws_plugin__s2member_utils_strings::trim_deep($value, $chars, $extra_chars);
204
+ }
205
+
206
+ /**
207
+ * Trims deeply; or use {@link s2Member\Utilities\c_ws_plugin__s2member_utils_strings::trim()}.
208
+ *
209
+ * @package s2Member\Utilities
210
+ * @since 3.5
211
+ *
212
+ * @see s2Member\Utilities\c_ws_plugin__s2member_utils_strings::trim()
213
+ * @see http://php.net/manual/en/function.trim.php
214
+ *
215
+ * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
216
+ * @param string|bool $chars Optional. Defaults to false, indicating the default trim chars ` \t\n\r\0\x0B`. Or, set to a specific string of chars.
217
+ * @param string|bool $extra_chars Optional. This is NOT possible with PHP alone, but here you can specify extra chars; in addition to ``$chars``.
218
+ *
219
+ * @return string|array Either the input string, or the input array; after all data is trimmed up according to arguments passed in.
220
+ */
221
+ public static function trim_deep($value = '', $chars = FALSE, $extra_chars = FALSE)
222
+ {
223
+ $chars = (is_string($chars)) ? $chars : " \t\n\r\0\x0B";
224
+ $chars = (is_string($extra_chars)) ? $chars.$extra_chars : $chars;
225
+
226
+ if(is_array($value)) /* Handles all types of arrays.
227
  Note, we do NOT use ``array_map()`` here, because multiple args to ``array_map()`` causes a loss of string keys.
228
  For further details, see: <http://php.net/manual/en/function.array-map.php>. */
229
+ {
230
+ foreach($value as &$r) // Reference.
231
+ $r = c_ws_plugin__s2member_utils_strings::trim_deep($r, $chars);
232
+ return $value; // Return modified array.
233
+ }
234
+ return trim((string)$value, $chars);
235
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
236
 
237
+ /**
238
+ * Trims double quotes deeply.
239
+ *
240
+ * @package s2Member\Utilities
241
+ * @since 3.5
242
+ *
243
+ * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
244
+ *
245
+ * @return string|array Either the input string, or the input array; after all data is trimmed up.
246
+ */
247
+ public static function trim_dq_deep($value = '')
248
+ {
249
+ return c_ws_plugin__s2member_utils_strings::trim_deep($value, FALSE, '"');
250
+ }
251
+
252
+ /**
253
+ * Trims single quotes deeply.
254
+ *
255
+ * @package s2Member\Utilities
256
+ * @since 111106
257
+ *
258
+ * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
259
+ *
260
+ * @return string|array Either the input string, or the input array; after all data is trimmed up.
261
+ */
262
+ public static function trim_sq_deep($value = '')
263
+ {
264
+ return c_ws_plugin__s2member_utils_strings::trim_deep($value, FALSE, "'");
265
+ }
266
+
267
+ /**
268
+ * Trims double and single quotes deeply.
269
+ *
270
+ * @package s2Member\Utilities
271
+ * @since 111106
272
+ *
273
+ * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
274
+ *
275
+ * @return string|array Either the input string, or the input array; after all data is trimmed up.
276
+ */
277
+ public static function trim_dsq_deep($value = '')
278
+ {
279
+ return c_ws_plugin__s2member_utils_strings::trim_deep($value, FALSE, "'".'"');
280
+ }
281
+
282
+ /**
283
+ * Trims all single/double quote entity variations deeply.
284
+ *
285
+ * This is useful on Shortcode attributes mangled by a Visual Editor.
286
+ *
287
+ * @package s2Member\Utilities
288
+ * @since 111011
289
+ *
290
+ * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
291
+ *
292
+ * @return string|array Either the input string, or the input array; after all data is trimmed up.
293
+ */
294
+ public static function trim_qts_deep($value = '')
295
+ {
296
+ $qts = implode('|', array_keys(c_ws_plugin__s2member_utils_strings::$quote_entities_w_variations));
297
+
298
+ return is_array($value) ? array_map('c_ws_plugin__s2member_utils_strings::trim_qts_deep', $value) : preg_replace('/^(?:'.$qts.')+|(?:'.$qts.')+$/', '', (string)$value);
299
+ }
300
+
301
+ /**
302
+ * Trims HTML whitespace.
303
+ *
304
+ * This is useful on Shortcode content.
305
+ *
306
+ * @package s2Member\Utilities
307
+ * @since 140124
308
+ *
309
+ * @param string $string Input string to trim.
310
+ *
311
+ * @return string Output string with all HTML whitespace trimmed away.
312
+ */
313
+ public static function trim_html($string = '')
314
+ {
315
+ $whitespace = '&nbsp;|\<br\>|\<br\s*\/\>|\<p\>(?:&nbsp;)*\<\/p\>';
316
+ return preg_replace('/^(?:'.$whitespace.')+|(?:'.$whitespace.')+$/', '', (string)$string);
317
+ }
318
+
319
+ /**
320
+ * Wraps a string with the characters provided.
321
+ *
322
+ * This is useful when preparing an input array for ``c_ws_plugin__s2member_utils_arrays::in_regex_array()``.
323
+ *
324
+ * @package s2Member\Utilities
325
+ * @since 3.5
326
+ *
327
+ * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
328
+ * @param string $beg Optional. A string value to wrap at the beginning of each value.
329
+ * @param string $end Optional. A string value to wrap at the ending of each value.
330
+ * @param bool $wrap_e Optional. Defaults to false. Should empty strings be wrapped too?
331
+ *
332
+ * @return string|array Either the input string, or the input array; after all data is wrapped up.
333
+ */
334
+ public static function wrap_deep($value = '', $beg = '', $end = '', $wrap_e = FALSE)
335
+ {
336
+ if(is_array($value)) /* Handles all types of arrays.
337
  Note, we do NOT use ``array_map()`` here, because multiple args to ``array_map()`` causes a loss of string keys.
338
  For further details, see: <http://php.net/manual/en/function.array-map.php>. */
339
+ {
340
+ foreach($value as &$r) // Reference.
341
+ $r = c_ws_plugin__s2member_utils_strings::wrap_deep($r, $beg, $end, $wrap_e);
342
+ return $value; // Return modified array.
343
+ }
344
+ return (strlen((string)$value) || $wrap_e) ? (string)$beg.(string)$value.(string)$end : (string)$value;
345
+ }
346
+
347
+ /**
348
+ * Escapes meta characters with ``preg_quote()`` deeply.
349
+ *
350
+ * @package s2Member\Utilities
351
+ * @since 110926
352
+ *
353
+ * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
354
+ * @param string $delimiter Optional. If a delimiting character is specified, it will also be escaped via ``preg_quote()``.
355
+ *
356
+ * @return string|array Either the input string, or the input array; after all data is escaped with ``preg_quote()``.
357
+ */
358
+ public static function preg_quote_deep($value = '', $delimiter = '')
359
+ {
360
+ if(is_array($value)) /* Handles all types of arrays.
361
  Note, we do NOT use ``array_map()`` here, because multiple args to ``array_map()`` causes a loss of string keys.
362
  For further details, see: <http://php.net/manual/en/function.array-map.php>. */
363
+ {
364
+ foreach($value as &$r) // Reference.
365
+ $r = c_ws_plugin__s2member_utils_strings::preg_quote_deep($r, $delimiter);
366
+ return $value; // Return modified array.
367
+ }
368
+ return preg_quote((string)$value, (string)$delimiter);
369
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
370
 
371
+ /**
372
+ * Generates a random string with letters/numbers/symbols.
373
+ *
374
+ * @package s2Member\Utilities
375
+ * @since 3.5
376
+ *
377
+ * @param int $length Optional. Defaults to `12`. Length of the random string.
378
+ * @param bool $special_chars Defaults to true. If false, special chars are NOT included.
379
+ * @param bool $extra_special_chars Defaults to false. If true, extra special chars are included.
380
+ *
381
+ * @return string A randomly generated string, based on parameter configuration.
382
+ */
383
+ public static function random_str_gen($length = 0, $special_chars = TRUE, $extra_special_chars = FALSE)
384
+ {
385
+ $length = (is_numeric($length) && $length >= 0) ? (int)$length : 12;
386
 
387
+ $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
388
+ $chars .= ($extra_special_chars) ? '-_ []{}<>~`+=,.;:/?|' : '';
389
+ $chars .= ($special_chars) ? '!@#$%^&*()' : '';
390
 
391
+ for($i = 0, $random_str = ''; $i < $length; $i++)
392
+ $random_str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
393
+
394
+ return $random_str;
395
+ }
396
+
397
+ /**
398
+ * Highlights PHP, and also Shortcodes.
399
+ *
400
+ * @package s2Member\Utilities
401
+ * @since 3.5
402
+ *
403
+ * @param string $string Input string to be highlighted.
404
+ *
405
+ * @return string The highlighted string.
406
+ */
407
+ public static function highlight_php($string = '')
408
+ {
409
+ $string = highlight_string(trim((string)$string), TRUE); // Start with PHP syntax, then Shortcodes.
410
+ $string = preg_replace('/\[\/?_*s2[a-z0-9_\-]+.*?\]/i', '<span style="color:#164A61;">$0</span>', $string);
411
+ return str_replace('<code>', '<code class="highlight-php">', $string);
412
+ }
413
+
414
+ /**
415
+ * Parses email addresses from a string or array.
416
+ *
417
+ * @package s2Member\Utilities
418
+ * @since 111009
419
+ *
420
+ * @param string|array $value Input string or an array is also fine.
421
+ *
422
+ * @return array Array of parsed email addresses.
423
+ */
424
+ public static function parse_emails($value = '')
425
+ {
426
+ if(is_array($value)) /* Handles all types of arrays.
427
  Note, we do NOT use ``array_map()`` here, because multiple args to ``array_map()`` causes a loss of string keys.
428
  For further details, see: <http://php.net/manual/en/function.array-map.php>. */
429
+ {
430
+ $emails = array(); // Initialize array.
431
+ foreach($value as $v) // Loop through array.
432
+ $emails = array_merge($emails, c_ws_plugin__s2member_utils_strings::parse_emails($v));
433
+ return $emails; // Return array.
434
+ }
435
+ $delimiter = (strpos((string)$value, ';') !== FALSE) ? ';' : ',';
436
+ foreach(c_ws_plugin__s2member_utils_strings::trim_deep(preg_split('/'.preg_quote($delimiter, '/').'+/', (string)$value)) as $section)
437
+ {
438
+ if(preg_match('/\<(.+?)\>/', $section, $m) && strpos($m[1], '@') !== FALSE)
439
+ $emails[] = $m[1]; // Email inside <brackets>.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
440
 
441
+ else if(strpos($section, '@') !== FALSE)
442
+ $emails[] = $section;
443
+ }
444
+ return (!empty($emails)) ? $emails : array();
445
+ }
446
 
447
+ /**
448
+ * Base64 URL-safe encoding.
449
+ *
450
+ * @package s2Member\Utilities
451
+ * @since 110913
452
+ *
453
+ * @param string $string Input string to be base64 encoded.
454
+ * @param array $url_unsafe_chars Optional. An array of un-safe characters. Defaults to: ``array('+', '/')``.
455
+ * @param array $url_safe_chars Optional. An array of safe character replacements. Defaults to: ``array('-', '_')``.
456
+ * @param string $trim_padding_chars Optional. A string of padding chars to rtrim. Defaults to: `=~.`.
457
+ *
458
+ * @return string The base64 URL-safe encoded string.
459
+ */
460
+ public static function base64_url_safe_encode($string = '', $url_unsafe_chars = array('+', '/'), $url_safe_chars = array('-', '_'), $trim_padding_chars = '=~.')
461
+ {
462
+ $string = (string)$string; // Force string values here. String MUST be a string.
463
+ $trim_padding_chars = (string)$trim_padding_chars; // And force this one too.
 
 
 
 
464
 
465
+ $base64_url_safe = str_replace((array)$url_unsafe_chars, (array)$url_safe_chars, (string)base64_encode($string));
466
+ $base64_url_safe = (strlen($trim_padding_chars)) ? rtrim($base64_url_safe, $trim_padding_chars) : $base64_url_safe;
 
467
 
468
+ return $base64_url_safe; // Base64 encoded, with URL-safe replacements.
469
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
470
 
471
+ /**
472
+ * Base64 URL-safe decoding.
473
+ *
474
+ * Note, this function is backward compatible with routines supplied by s2Member in the past;
475
+ * where padding characters were replaced with `~` or `.`, instead of being stripped completely.
476
+ *
477
+ * @package s2Member\Utilities
478
+ * @since 110913
479
+ *
480
+ * @param string $base64_url_safe Input string to be base64 decoded.
481
+ * @param array $url_unsafe_chars Optional. An array of un-safe character replacements. Defaults to: ``array('+', '/')``.
482
+ * @param array $url_safe_chars Optional. An array of safe characters. Defaults to: ``array('-', '_')``.
483
+ * @param string $trim_padding_chars Optional. A string of padding chars to rtrim. Defaults to: `=~.`.
484
+ *
485
+ * @return string The decoded string.
486
+ */
487
+ public static function base64_url_safe_decode($base64_url_safe = '', $url_unsafe_chars = array('+', '/'), $url_safe_chars = array('-', '_'), $trim_padding_chars = '=~.')
488
+ {
489
+ $base64_url_safe = (string)$base64_url_safe; // Force string values here. This MUST be a string.
490
+ $trim_padding_chars = (string)$trim_padding_chars; // And force this one too.
491
 
492
+ $string = (strlen($trim_padding_chars)) ? rtrim($base64_url_safe, $trim_padding_chars) : $base64_url_safe;
493
+ $string = (strlen($trim_padding_chars)) ? str_pad($string, strlen($string) % 4, '=', STR_PAD_RIGHT) : $string;
494
+ $string = (string)base64_decode(str_replace((array)$url_safe_chars, (array)$url_unsafe_chars, $string));
495
 
496
+ return $string; // Base64 decoded, with URL-safe replacements.
497
+ }
498
 
499
+ /**
500
+ * Generates an RSA-SHA1 signature.
501
+ *
502
+ * @package s2Member\Utilities
503
+ * @since 111017
504
+ *
505
+ * @param string $string Input string/data, to be signed by this routine.
506
+ * @param string $key The secret key that will be used in this signature.
507
+ *
508
+ * @return string|bool An RSA-SHA1 signature string, or false on failure.
509
+ */
510
+ public static function rsa_sha1_sign($string = '', $key = '')
511
+ {
512
+ $key = c_ws_plugin__s2member_utils_strings::_rsa_sha1_key_fix_wrappers((string)$key);
513
 
514
+ $signature = c_ws_plugin__s2member_utils_strings::_rsa_sha1_shell_sign((string)$string, (string)$key);
 
 
 
515
 
516
+ if(empty($signature) && stripos(PHP_OS, 'win') === 0 && file_exists(($openssl = 'c:\\openssl-win32\\bin\\openssl.exe')))
517
+ $signature = c_ws_plugin__s2member_utils_strings::_rsa_sha1_shell_sign((string)$string, (string)$key, $openssl);
518
+
519
+ if(empty($signature) && stripos(PHP_OS, 'win') === 0 && file_exists(($openssl = 'c:\\openssl-win64\\bin\\openssl.exe')))
520
+ $signature = c_ws_plugin__s2member_utils_strings::_rsa_sha1_shell_sign((string)$string, (string)$key, $openssl);
521
+
522
+ if(empty($signature) && function_exists('openssl_get_privatekey') && function_exists('openssl_sign') && is_resource($private_key = openssl_get_privatekey((string)$key)))
523
+ openssl_sign((string)$string, $signature, $private_key, OPENSSL_ALGO_SHA1).openssl_free_key($private_key);
524
+
525
+ if(empty($signature)) // Now, if we're still empty, trigger an error here.
526
+ trigger_error('s2Member was unable to generate an RSA-SHA1 signature.'.
527
+ ' Please make sure your installation of PHP is compiled with OpenSSL: `openssl_sign()`.'.
528
+ ' See: http://php.net/manual/en/function.openssl-sign.php', E_USER_ERROR);
529
+
530
+ return (!empty($signature)) ? $signature : FALSE;
531
+ }
532
+
533
+ /**
534
+ * Generates an RSA-SHA1 signature from the command line.
535
+ *
536
+ * Used by {@link s2Member\Utilities\c_ws_plugin__s2member_utils_strings::rsa_sha1_sign()}.
537
+ *
538
+ * @package s2Member\Utilities
539
+ * @since 111017
540
+ *
541
+ * @param string $string Input string/data, to be signed by this routine.
542
+ * @param string $key The secret key that will be used in this signature.
543
+ * @param string $openssl Optional. Defaults to `openssl`. Path to OpenSSL executable.
544
+ *
545
+ * @return string|bool An RSA-SHA1 signature string, or false on failure.
546
+ */
547
+ public static function _rsa_sha1_shell_sign($string = '', $key = '', $openssl = '')
548
+ {
549
+ if(function_exists('shell_exec') && ($esa = 'escapeshellarg') && ($openssl = (($openssl && is_string($openssl)) ? $openssl : 'openssl')) && ($temp_dir = c_ws_plugin__s2member_utils_dirs::get_temp_dir()))
550
+ {
551
+ file_put_contents(($string_file = $temp_dir.'/'.md5(uniqid('', TRUE).'rsa-sha1-string').'.tmp'), (string)$string);
552
+ file_put_contents(($private_key_file = $temp_dir.'/'.md5(uniqid('', TRUE).'rsa-sha1-private-key').'.tmp'), (string)$key);
553
+ file_put_contents(($rsa_sha1_sig_file = $temp_dir.'/'.md5(uniqid('', TRUE).'rsa-sha1-sig').'.tmp'), '');
554
+
555
+ @shell_exec($esa($openssl).' sha1 -sign '.$esa($private_key_file).' -out '.$esa($rsa_sha1_sig_file).' '.$esa($string_file));
556
+ $signature = file_get_contents($rsa_sha1_sig_file); // Do NOT trim here. Was the signature was written?
557
+ unlink($rsa_sha1_sig_file).unlink($private_key_file).unlink($string_file); // Cleanup.
558
+ }
559
+ return (!empty($signature)) ? $signature : FALSE;
560
+ }
561
+
562
+ /**
563
+ * Fixes incomplete private key wrappers for RSA-SHA1 signing.
564
+ *
565
+ * Used by {@link s2Member\Utilities\c_ws_plugin__s2member_utils_strings::rsa_sha1_sign()}.
566
+ *
567
+ * @package s2Member\Utilities
568
+ * @since 111017
569
+ *
570
+ * @param string $key The secret key to be used in an RSA-SHA1 signature.
571
+ *
572
+ * @return string Key with incomplete wrappers corrected, when/if possible.
573
+ *
574
+ * @see http://www.faqs.org/qa/qa-14736.html
575
+ */
576
+ public static function _rsa_sha1_key_fix_wrappers($key = '')
577
+ {
578
+ if(($key = trim((string)$key)) && (strpos($key, '-----BEGIN RSA PRIVATE KEY-----') === FALSE || strpos($key, '-----END RSA PRIVATE KEY-----') === FALSE))
579
+ {
580
+ foreach(($lines = c_ws_plugin__s2member_utils_strings::trim_deep(preg_split('/['."\r\n".']+/', $key))) as $line => $value)
581
+ if(strpos($value, '-') === 0) // Begins with a boundary identifying character ( a hyphen `-` )?
582
  {
583
+ $boundaries = (empty($boundaries)) ? 1 : $boundaries + 1; // Counter.
584
+ unset($lines[$line]); // Remove this boundary line. We'll fix these below.
 
 
 
 
 
 
 
 
 
 
585
  }
586
+ if(empty($boundaries) || $boundaries <= 2) // Do NOT modify keys with more than 2 boundaries.
587
+ $key = '-----BEGIN RSA PRIVATE KEY-----'."\n".implode("\n", $lines)."\n".'-----END RSA PRIVATE KEY-----';
588
+ }
589
+ return $key; // Always a trimmed string here.
590
+ }
 
 
 
 
 
 
 
 
591
 
592
+ /**
593
+ * Generates an HMAC-SHA1 signature.
594
+ *
595
+ * @package s2Member\Utilities
596
+ * @since 111017
597
+ *
598
+ * @param string $string Input string/data, to be signed by this routine.
599
+ * @param string $key The secret key that will be used in this signature.
600
+ *
601
+ * @return string An HMAC-SHA1 signature string.
602
+ */
603
+ public static function hmac_sha1_sign($string = '', $key = '')
604
+ {
605
+ $key_64 = str_pad(((strlen((string)$key) > 64) ? pack('H*', sha1((string)$key)) : (string)$key), 64, chr(0x00));
606
+
607
+ return pack('H*', sha1(($key_64 ^ str_repeat(chr(0x5c), 64)).pack('H*', sha1(($key_64 ^ str_repeat(chr(0x36), 64)).(string)$string))));
608
+ }
609
+
610
+ /**
611
+ * Generates an HMAC-SHA256 signature.
612
+ *
613
+ * @package s2Member\Utilities
614
+ * @since 111017
615
+ *
616
+ * @param string $string Input string/data, to be signed by this routine.
617
+ * @param string $key The secret key that will be used in this signature.
618
+ * @param boolean $binary Return binary format?
619
+ *
620
+ * @return string An HMAC-SHA256 signature string.
621
+ */
622
+ public static function hmac_sha256_sign($string = '', $key = '', $binary = FALSE)
623
+ {
624
+ return hash_hmac('sha256', $string, $key, $binary);
625
+ }
626
+
627
+ /**
628
+ * Decodes unreserved chars encoded by PHP's ``urlencode()``, deeply.
629
+ *
630
+ * For further details regarding unreserved chars, see: {@link http://www.faqs.org/rfcs/rfc3986.html}.
631
+ *
632
+ * @package s2Member\Utilities
633
+ * @since 111017
634
+ *
635
+ * @see http://www.faqs.org/rfcs/rfc3986.html
636
+ *
637
+ * @param string|array $value Either a string, an array, or a multi-dimensional array, filled with integer and/or string values.
638
+ *
639
+ * @return string|array Either the input string, or the input array; after all unreserved chars are decoded properly.
640
+ */
641
+ public static function urldecode_ur_chars_deep($value = array())
642
+ {
643
+ if(is_array($value)) /* Handles all types of arrays.
644
  Note, we do NOT use ``array_map()`` here, because multiple args to ``array_map()`` causes a loss of string keys.
645
  For further details, see: <http://php.net/manual/en/function.array-map.php>. */
646
+ {
647
+ foreach($value as &$r) // Reference.
648
+ $r = c_ws_plugin__s2member_utils_strings::urldecode_ur_chars_deep($r);
649
+ return $value; // Return modified array.
650
+ }
651
+ return str_replace(array('%2D', '%2E', '%5F', '%7E'), array('-', '.', '_', '~'), (string)$value);
652
+ }
653
 
654
+ public static function like_escape($string)
655
+ {
656
+ global $wpdb; // Global DB object reference.
657
 
658
+ if(method_exists($wpdb, 'esc_like'))
659
+ return $wpdb->esc_like($string);
660
 
661
+ return like_escape($string); // Deprecated in WP v4.0.
662
+ }
 
663
  }
664
+ }
includes/classes/utils-time.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
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_time'))
14
  * @package s2Member\Utilities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_utils_time'))
includes/classes/utils-urls.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
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_urls"))
@@ -196,8 +196,6 @@ if(!class_exists("c_ws_plugin__s2member_utils_urls"))
196
 
197
  $args["s2member"] = WS_PLUGIN__S2MEMBER_VERSION; // Indicates this is an s2Member connection.
198
 
199
- $args["sslverify"] = (!isset($args["sslverify"])) ? /* Off. */ false : $args["sslverify"];
200
-
201
  $args["httpversion"] = (!isset($args["httpversion"])) ? "1.1" : $args["httpversion"];
202
 
203
  if((is_array($post_vars) || is_string($post_vars)) && !empty($post_vars))
14
  * @package s2Member\Utilities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_utils_urls"))
196
 
197
  $args["s2member"] = WS_PLUGIN__S2MEMBER_VERSION; // Indicates this is an s2Member connection.
198
 
 
 
199
  $args["httpversion"] = (!isset($args["httpversion"])) ? "1.1" : $args["httpversion"];
200
 
201
  if((is_array($post_vars) || is_string($post_vars)) && !empty($post_vars))
includes/classes/utils-users.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Utilities
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_users'))
14
  * @package s2Member\Utilities
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
 
20
  if(!class_exists('c_ws_plugin__s2member_utils_users'))
includes/classes/wp-footer.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\WP_Footer
15
  * @since 110524RC
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_wp_footer"))
14
  * @package s2Member\WP_Footer
15
  * @since 110524RC
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_wp_footer"))
includes/codes.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member
15
  * @since 3.0
16
  */
17
- if(realpath(__FILE__) === realpath($_SERVER['SCRIPT_FILENAME']))
18
  exit ('Do not access this file directly.');
19
  /*
20
  Add WordPress Editor Shortcodes.
14
  * @package s2Member
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
  /*
20
  Add WordPress Editor Shortcodes.
includes/funcs.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member
15
  * @since 3.0
16
  */
17
- if(realpath(__FILE__) === realpath($_SERVER['SCRIPT_FILENAME']))
18
  exit ('Do not access this file directly.');
19
  /*
20
  Include all of the functions that came with this plugin.
14
  * @package s2Member
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ('Do not access this file directly.');
19
  /*
20
  Include all of the functions that came with this plugin.
includes/functions/api-functions.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\API_Functions
15
  * @since 3.5
16
  */
17
- if(realpath(__FILE__) === realpath($_SERVER["SCRIPT_FILENAME"]))
18
  exit("Do not access this file directly.");
19
  /**
20
  * Conditional to determine if the current User is NOT logged in.
14
  * @package s2Member\API_Functions
15
  * @since 3.5
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
  /**
20
  * Conditional to determine if the current User is NOT logged in.
includes/functions/class-autoloader.inc.php CHANGED
@@ -18,7 +18,7 @@
18
  * @package s2Member
19
  * @since 3.5
20
  */
21
- if(realpath(__FILE__) === realpath($_SERVER['SCRIPT_FILENAME']))
22
  exit ('Do not access this file directly.');
23
 
24
  if(!function_exists('ws_plugin__s2member_classes'))
18
  * @package s2Member
19
  * @since 3.5
20
  */
21
+ if(!defined('WPINC')) // MUST have WordPress.
22
  exit ('Do not access this file directly.');
23
 
24
  if(!function_exists('ws_plugin__s2member_classes'))
includes/functions/deprecated.inc.php CHANGED
@@ -16,7 +16,7 @@
16
  * @package s2Member
17
  * @since 3.5
18
  */
19
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
20
  exit ("Do not access this file directly.");
21
  /**
22
  * Deprecated in s2Member v3.5+.
16
  * @package s2Member
17
  * @since 3.5
18
  */
19
+ if(!defined('WPINC')) // MUST have WordPress.
20
  exit ("Do not access this file directly.");
21
  /**
22
  * Deprecated in s2Member v3.5+.
includes/functions/pluggables.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member
15
  * @since 110707
16
  */
17
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
18
  exit("Do not access this file directly.");
19
 
20
  if (!function_exists ("wp_new_user_notification"))
14
  * @package s2Member
15
  * @since 110707
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if (!function_exists ("wp_new_user_notification"))
includes/hooks.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member
15
  * @since 3.0
16
  */
17
- if(realpath(__FILE__) === realpath($_SERVER['SCRIPT_FILENAME']))
18
  exit('Do not access this file directly.');
19
  /*
20
  Add the plugin Actions/Filters here.
14
  * @package s2Member
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit('Do not access this file directly.');
19
  /*
20
  Add the plugin Actions/Filters here.
includes/menu-pages/api-ops.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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_api_ops"))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_menu_page_api_ops"))
includes/menu-pages/down-ops.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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"))
@@ -270,6 +270,33 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
270
  echo '<tbody>'."\n";
271
  echo '<tr>'."\n";
272
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
273
  echo '<th style="padding-top:0;">'."\n";
274
  echo '<label for="ws-plugin--s2member-amazon-s3-files-bucket">'."\n";
275
  echo 'Amazon S3 File Bucket Name (where protected files are):'."\n";
@@ -493,97 +520,97 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
493
 
494
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_after_amazon_cf", get_defined_vars());
495
  }
496
- /* if(apply_filters("ws_plugin__s2member_during_down_ops_page_during_left_sections_display_amazon_s3_comp", TRUE, get_defined_vars()))
497
- {
498
- do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_amazon_s3_comp", get_defined_vars());
499
 
500
- echo '<div class="ws-menu-page-group" title="S3-Compatible Content Delivery (e.g. DreamObjects, etc.)">'."\n";
501
 
502
- echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-s3-comp-section">'."\n";
503
- echo '<h3>S3-Compatible Content Delivery (optional)</h3>'."\n";
504
- echo '<p>[Documentation goes here.]</p>'."\n";
505
 
506
- echo '<div class="ws-menu-page-hr"></div>'."\n";
507
 
508
- echo '<table class="form-table" style="margin-top:0;">'."\n";
509
- echo '<tbody>'."\n";
510
- echo '<tr>'."\n";
511
 
512
- echo '<th style="padding-top:0;">'."\n";
513
- echo '<label for="ws-plugin--s2member-amazon-s3-comp-files-bucket">'."\n";
514
- echo 'API Endpoint URL:'."\n";
515
- echo '</label>'."\n";
516
- echo '</th>'."\n";
517
 
518
- echo '</tr>'."\n";
519
- echo '<tr>'."\n";
520
 
521
- echo '<td>'."\n";
522
- echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_amazon_s3_comp_api_endpoint" id="ws-plugin--s2member-amazon-s3-comp-api-endpoint" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_comp_api_endpoint"]).'" /><br />'."\n";
523
- echo 'Please type the S3-Compatible API Endpoint URL'."\n";
524
- echo '</td>'."\n";
525
 
526
- echo '</tr>'."\n";
527
- echo '<tr>'."\n";
528
 
529
- echo '<th style="padding-top:0;">'."\n";
530
- echo '<label for="ws-plugin--s2member-amazon-s3-comp-files-bucket">'."\n";
531
- echo 'S3-Compatible Bucket Name (where protected files are):'."\n";
532
- echo '</label>'."\n";
533
- echo '</th>'."\n";
534
 
535
- echo '</tr>'."\n";
536
- echo '<tr>'."\n";
537
 
538
- echo '<td>'."\n";
539
- echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_amazon_s3_comp_files_bucket" id="ws-plugin--s2member-amazon-s3-comp-files-bucket" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_comp_files_bucket"]).'" /><br />'."\n";
540
- echo 'Your S3-Compatible Bucket will be used, instead of the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory.<br />'."\n";
541
- echo 'Please type the name of your Bucket. Ex: <code>mys3compbucket</code>'."\n";
542
- echo '</td>'."\n";
543
 
544
- echo '</tr>'."\n";
545
- echo '<tr>'."\n";
546
 
547
- echo '<th>'."\n";
548
- echo '<label for="ws-plugin--s2member-amazon-s3-comp-files-access-key">'."\n";
549
- echo 'Access Key (Access Key ID):'."\n";
550
- echo '</label>'."\n";
551
- echo '</th>'."\n";
552
 
553
- echo '</tr>'."\n";
554
- echo '<tr>'."\n";
555
 
556
- echo '<td>'."\n";
557
- echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_comp_files_access_key" id="ws-plugin--s2member-amazon-s3-comp-files-access-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_comp_files_access_key"]).'" /><br />'."\n";
558
- echo 'Please type the Access Key.'."\n";
559
- echo '</td>'."\n";
560
 
561
- echo '</tr>'."\n";
562
- echo '<tr>'."\n";
563
 
564
- echo '<th>'."\n";
565
- echo '<label for="ws-plugin--s2member-amazon-s3-comp-files-secret-key">'."\n";
566
- echo 'Secret Key (Secret Access Key):'."\n";
567
- echo '</label>'."\n";
568
- echo '</th>'."\n";
569
 
570
- echo '</tr>'."\n";
571
- echo '<tr>'."\n";
572
 
573
- echo '<td>'."\n";
574
- echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_comp_files_secret_key" id="ws-plugin--s2member-amazon-s3-comp-files-secret-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_comp_files_secret_key"]).'" /><br />'."\n";
575
- echo 'Please type the Secret Key.'."\n";
576
- echo '</td>'."\n";
577
 
578
- echo '</tr>'."\n";
579
- echo '</tbody>'."\n";
580
- echo '</table>'."\n";
581
- echo '</div>'."\n";
582
 
583
- echo '</div>'."\n";
584
 
585
- do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_after_amazon_s3_comp", get_defined_vars());
586
- }*/
587
  if(apply_filters("ws_plugin__s2member_during_down_ops_page_during_left_sections_display_rtmp_streaming", TRUE, get_defined_vars()))
588
  {
589
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_rtmp_streaming", get_defined_vars());
@@ -592,7 +619,7 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
592
 
593
  echo '<div class="ws-menu-page-section ws-plugin--s2member-rtmp-streaming-section">'."\n";
594
  echo '<h3>JW Player v6 &amp; RTMP Protocol Examples</h3>'."\n";
595
- echo '<a href="http://www.longtailvideo.com/players/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/jwplayer-logo.png" class="ws-menu-page-right" style="width:179px; height:58px; border:0; border-radius:3px; background:#FFFFFF; padding:15px;" alt="." /></a>'."\n";
596
  echo '<p>While it is possible to serve audio/video files protected by s2Member, without needing to integrate Amazon S3 or CloudFront; we DO highly recommend that you integrate both Amazon S3 and Amazon CloudFront in order to maximize speed and compatibility across various viewing platforms. That being said, there are code samples below that will serve audio/video files both with and without Amazon S3/CloudFront. You can also check the <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Forum URI")).'" target="_blank" rel="external">s2Member Support Forums</a> for tips/tricks if you like.</p>'."\n";
597
  echo '<p><strong>One of the great things about Amazon CloudFront</strong>, is its ability to <strong>stream/seek media files</strong> in the truest sense of the word. For sites delivering protected <em>FLV/MP4/OGG/WEBM</em> and other streaming audio/video file types over the <em>RTMP</em> protocol, Amazon CloudFront is our recommendation. Once you\'ve successfully configured s2Member to use both Amazon S3 and Amazon CloudFront together, please review the code samples below. s2Member can automatically serve your protected files over the <em>RTMP</em> protocol using an Amazon CloudFront Streaming Distribution.</p>'."\n";
598
  echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/" target="_blank" rel="external">JW Player w/ <code>[s2Stream /]</code> Shortcodes</a>.</p>'."\n";
@@ -605,42 +632,42 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
605
  echo '<h3><code>[s2Stream /]</code> Video Shortcode Examples (recommended — it\'s the easiest way)</h3>'."\n";
606
 
607
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (MP4 file, via Rewrite URLs. Amazon S3/CloudFront NOT required)</a></p>'."\n";
608
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Works with any audio/video file. This does NOT require s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp4.x-php")).'</p>'."\n";
609
 
610
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4-rtmp\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
611
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4-rtmp" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Streams with the RTMP protocol, plus there is a full download fallback of the MP4 source file if streaming is not possible on a particular device.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp4-rtmp.x-php")).'</p>'."\n";
612
 
613
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4-rtmp-only\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4 only, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
614
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4-rtmp-only" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Streams with the RTMP protocol only, with no access to the source file, only to the RTMP stream.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp4-rtmp-only.x-php")).'</p>'."\n";
615
 
616
  echo '<div class="ws-menu-page-hr"></div>'."\n";
617
 
618
  echo '<h3><code>[s2Stream /]</code> Audio Shortcode Examples (recommended — it\'s the easiest way)</h3>'."\n";
619
 
620
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3\').toggle(); return false;" class="ws-dotted-link">JW Player (MP3 file, via Rewrite URLs. Amazon S3/CloudFront NOT required)</a></p>'."\n";
621
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Works with any audio/video file. This does NOT require s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp3.x-php")).'</p>'."\n";
622
 
623
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3-rtmp\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP3, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
624
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3-rtmp" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Streams with the RTMP protocol, plus there is a full download fallback of the MP3 source file if streaming is not possible on a particular device.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp3-rtmp.x-php")).'</p>'."\n";
625
 
626
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3-rtmp-only\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP3 only, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
627
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3-rtmp-only" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Streams with the RTMP protocol only, with no access to the source file, only to the RTMP stream.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp3-rtmp-only.x-php")).'</p>'."\n";
628
 
629
  echo '<div class="ws-menu-page-hr"></div>'."\n";
630
 
631
  echo '<h3>PHP Code Examples (for more advanced integrations via PHP — in WordPress themes)</h3>'."\n";
632
 
633
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (MP4 file, via Rewrite URLs. Amazon S3/CloudFront NOT required)</a></p>'."\n";
634
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This does NOT require s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <code>s2Member -› Download Options -› Advanced Mod Rewrite Linkage</code>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-standard-mp4.x-php")).'</p>'."\n";
635
 
636
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
637
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -› API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4.x-php")).'</p>'."\n";
638
 
639
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s JSON/Shortcode alternative)</a></p>'."\n";
640
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -› API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-sca.x-php")).'</p>'."\n";
641
 
642
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, advanced w/ multiple fallbacks)</a></p>'."\n";
643
- echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm" style="display:none;">Download <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -› API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-webm.x-php")).'</p>'."\n";
644
 
645
  echo '</div>'."\n";
646
 
@@ -729,10 +756,10 @@ if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
729
  echo '<li><code>file_download="video.mp4"</code> Location of the audio/video file, relative to the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory; or, relative to the root of your Amazon S3 Bucket, when applicable.</li>'."\n";
730
  echo '<li><code>player="jwplayer-v6-rtmp"</code> Required. Current supported players in this Shortcode include: <code>jwplayer-v6</code> (works with any audio/video file, and you do NOT need to have Amazon S3 or CloudFront integrated for this to work), <code>jwplayer-v6-rtmp</code> (streams with the RTMP protocol, plus there is a full download fallback of the source file if streaming is not possible on a particular device; this requires both Amazon S3 and CloudFront integration), <code>jwplayer-v6-rtmp-only</code> (streams with the RTMP protocol only, with no access to the source file, only to the RTMP stream; this requires both Amazon S3 and CloudFront integration).</li>'."\n";
731
  echo '<li><code>player_id=""</code> Optional. HTML div ID for the audio/video player. Defaults to a unique ID generated by s2Member for each instance of your Shortcode.</li>'."\n";
732
- echo '<li><code>player_path="/jwplayer/jwplayer.js"</code> Required. Path to the player\'s JavaScript file (ex: <code>/jwplayer/jwplayer.js</code> — you should upload the <a href="http://www.longtailvideo.com/players/" target="_blank" rel="external">/jwplayer</a> folder to the root of your web directory).</li>'."\n";
733
  echo '<li><code>player_resolutions=""</code> Optional (requires s2Member Pro). This is a comma-delimited list of all available resolution options (should you decide to offer more than just one file download at a single resolution). Please review the full list of Shortcode Attributes (i.e. click the "Shortcode Attributes (Explained)" tab) in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details, requirements, and an example of use.</li>'."\n";
734
- echo '<li><code>player_{setting}=""</code> Optional. Any additional configuration attributes supported by your audio/video player, prefixed with <code>player_</code>. For JW Player v6, see <a href="http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player" target="_blank" rel="external">this article please</a>. Examples: <code>player_width="480"</code>, <code>player_height="270"</code>, <code>player_title="My Video"</code>, <code>player_description="A video about something."</code>, <code>player_image="http://www.example.com/wp-content/uploads/video-preview.jpg"</code>, <code>player_mediaid="video_ei0wsx23"</code>, <code>player_autostart="true"</code>, <code>player_skin="/jwplayer/my-skin.xml"</code>, <code>player_key="my-license-key"</code>, <code>player_captions="{file:\'/assets/captions-en.vtt\',label:\'English\'}"</code> (<em>With <a href="http://www.longtailvideo.com/support/jw-player/28845/adding-video-captions" target="_blank" rel="external">Captions</a>, you can exclude the square array brackets to avoid Shortcode parsing issues. s2Member will automatically wrap your Caption objects with square array brackets.</em>). Please note that "Advanced Options Blocks" listed on <a href="http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player" target="_blank" rel="external">this page</a> are NOT supported here. For those, please use: <code>player_option_blocks=""</code> (see below).</li>'."\n";
735
- echo '<li><code>player_option_blocks=""</code> Optional. Any "Advanced Option Blocks" supported by your audio/video player. For JW Player v6, see <a href="http://www.longtailvideo.com/support/jw-player/28839/embedding-the-player" target="_blank" rel="external">this article please</a>. Here are some examples: <code>player_option_blocks="sharing:{}"</code>, <code>player_option_blocks="sharing:{}, logo: {file: \'/logo.png\', link: \'http://example.com\'}"</code>. Or: <code>player_option_blocks="c2hhcmluZzoge30="</code> (base64 encoded version of <code>sharing:{}</code>). Please note that "Advanced Options Blocks" can be defined in plain text or with a <a href="http://www.base64encode.org/" target="_blank" rel="external">base64 encoded string</a>. Advanced Option Blocks are JavaScript objects with properties. If you have trouble defining JavaScript object properties inside a Shortcode Attribute, please use <a href="http://www.base64encode.org/" target="_blank" rel="external">this tool</a> to base64 encode your Advanced Option Blocks, so that you end up with a string that\'s compatible with Shortcode Attributes.</li>'."\n";
736
  echo '<li>Please check the <strong>Shortcode Attributes</strong> Tab in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details on everything here.</li>'."\n";
737
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_shortcode_attrs_s2stream_lis", get_defined_vars());
738
  echo '</ul>'."\n";
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_menu_page_down_ops"))
270
  echo '<tbody>'."\n";
271
  echo '<tr>'."\n";
272
 
273
+ echo '<th style="padding-top:0;">'."\n";
274
+ echo '<label for="ws-plugin--s2member-amazon-s3-files-bucket-region">'."\n";
275
+ echo 'Amazon S3 File Bucket Region (please choose):'."\n";
276
+ echo '</label>'."\n";
277
+ echo '</th>'."\n";
278
+
279
+ echo '</tr>'."\n";
280
+ echo '<tr>'."\n";
281
+
282
+ echo '<td>'."\n";
283
+ echo '<select name="ws_plugin__s2member_amazon_s3_files_bucket_region" id="ws-plugin--s2member-amazon-s3-files-bucket-region">'."\n";
284
+ echo '<option value="us-east-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-east-1') ? ' selected="selected"' : '').'>us-east-1</option>'."\n";
285
+ echo '<option value="us-west-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-west-1') ? ' selected="selected"' : '').'>us-west-1</option>'."\n";
286
+ echo '<option value="us-west-2"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-west-2') ? ' selected="selected"' : '').'>us-west-2</option>'."\n";
287
+ echo '<option value="eu-west-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'eu-west-1') ? ' selected="selected"' : '').'>eu-west-1</option>'."\n";
288
+ echo '<option value="eu-central-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'eu-central-1') ? ' selected="selected"' : '').'>eu-central-1</option>'."\n";
289
+ echo '<option value="ap-southeast-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'ap-southeast-1') ? ' selected="selected"' : '').'>ap-southeast-1</option>'."\n";
290
+ echo '<option value="ap-southeast-2"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'ap-southeast-2') ? ' selected="selected"' : '').'>ap-southeast-2</option>'."\n";
291
+ echo '<option value="ap-northeast-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'ap-northeast-1') ? ' selected="selected"' : '').'>ap-northeast-1</option>'."\n";
292
+ echo '<option value="sa-east-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'sa-east-1') ? ' selected="selected"' : '').'>sa-east-1</option>'."\n";
293
+ echo '<option value="us-gov-west-1"'.(($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_files_bucket_region"] === 'us-gov-west-1') ? ' selected="selected"' : '').'>us-gov-west-1</option>'."\n";
294
+ echo '</select><br />'."\n";
295
+ echo 'See: <a href="http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region" target="_blank">http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region</a>'."\n";
296
+ echo '</td>'."\n";
297
+ echo '</tr>'."\n";
298
+ echo '<tr>'."\n";
299
+
300
  echo '<th style="padding-top:0;">'."\n";
301
  echo '<label for="ws-plugin--s2member-amazon-s3-files-bucket">'."\n";
302
  echo 'Amazon S3 File Bucket Name (where protected files are):'."\n";
520
 
521
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_after_amazon_cf", get_defined_vars());
522
  }
523
+ /* if(apply_filters("ws_plugin__s2member_during_down_ops_page_during_left_sections_display_amazon_s3_comp", TRUE, get_defined_vars()))
524
+ {
525
+ do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_amazon_s3_comp", get_defined_vars());
526
 
527
+ echo '<div class="ws-menu-page-group" title="S3-Compatible Content Delivery (e.g. DreamObjects, etc.)">'."\n";
528
 
529
+ echo '<div class="ws-menu-page-section ws-plugin--s2member-amazon-s3-comp-section">'."\n";
530
+ echo '<h3>S3-Compatible Content Delivery (optional)</h3>'."\n";
531
+ echo '<p>[Documentation goes here.]</p>'."\n";
532
 
533
+ echo '<div class="ws-menu-page-hr"></div>'."\n";
534
 
535
+ echo '<table class="form-table" style="margin-top:0;">'."\n";
536
+ echo '<tbody>'."\n";
537
+ echo '<tr>'."\n";
538
 
539
+ echo '<th style="padding-top:0;">'."\n";
540
+ echo '<label for="ws-plugin--s2member-amazon-s3-comp-files-bucket">'."\n";
541
+ echo 'API Endpoint URL:'."\n";
542
+ echo '</label>'."\n";
543
+ echo '</th>'."\n";
544
 
545
+ echo '</tr>'."\n";
546
+ echo '<tr>'."\n";
547
 
548
+ echo '<td>'."\n";
549
+ echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_amazon_s3_comp_api_endpoint" id="ws-plugin--s2member-amazon-s3-comp-api-endpoint" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_comp_api_endpoint"]).'" /><br />'."\n";
550
+ echo 'Please type the S3-Compatible API Endpoint URL'."\n";
551
+ echo '</td>'."\n";
552
 
553
+ echo '</tr>'."\n";
554
+ echo '<tr>'."\n";
555
 
556
+ echo '<th style="padding-top:0;">'."\n";
557
+ echo '<label for="ws-plugin--s2member-amazon-s3-comp-files-bucket">'."\n";
558
+ echo 'S3-Compatible Bucket Name (where protected files are):'."\n";
559
+ echo '</label>'."\n";
560
+ echo '</th>'."\n";
561
 
562
+ echo '</tr>'."\n";
563
+ echo '<tr>'."\n";
564
 
565
+ echo '<td>'."\n";
566
+ echo '<input type="text" autocomplete="off" name="ws_plugin__s2member_amazon_s3_comp_files_bucket" id="ws-plugin--s2member-amazon-s3-comp-files-bucket" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_comp_files_bucket"]).'" /><br />'."\n";
567
+ echo 'Your S3-Compatible Bucket will be used, instead of the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory.<br />'."\n";
568
+ echo 'Please type the name of your Bucket. Ex: <code>mys3compbucket</code>'."\n";
569
+ echo '</td>'."\n";
570
 
571
+ echo '</tr>'."\n";
572
+ echo '<tr>'."\n";
573
 
574
+ echo '<th>'."\n";
575
+ echo '<label for="ws-plugin--s2member-amazon-s3-comp-files-access-key">'."\n";
576
+ echo 'Access Key (Access Key ID):'."\n";
577
+ echo '</label>'."\n";
578
+ echo '</th>'."\n";
579
 
580
+ echo '</tr>'."\n";
581
+ echo '<tr>'."\n";
582
 
583
+ echo '<td>'."\n";
584
+ echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_comp_files_access_key" id="ws-plugin--s2member-amazon-s3-comp-files-access-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_comp_files_access_key"]).'" /><br />'."\n";
585
+ echo 'Please type the Access Key.'."\n";
586
+ echo '</td>'."\n";
587
 
588
+ echo '</tr>'."\n";
589
+ echo '<tr>'."\n";
590
 
591
+ echo '<th>'."\n";
592
+ echo '<label for="ws-plugin--s2member-amazon-s3-comp-files-secret-key">'."\n";
593
+ echo 'Secret Key (Secret Access Key):'."\n";
594
+ echo '</label>'."\n";
595
+ echo '</th>'."\n";
596
 
597
+ echo '</tr>'."\n";
598
+ echo '<tr>'."\n";
599
 
600
+ echo '<td>'."\n";
601
+ echo '<input type="password" autocomplete="off" name="ws_plugin__s2member_amazon_s3_comp_files_secret_key" id="ws-plugin--s2member-amazon-s3-comp-files-secret-key" value="'.format_to_edit($GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["amazon_s3_comp_files_secret_key"]).'" /><br />'."\n";
602
+ echo 'Please type the Secret Key.'."\n";
603
+ echo '</td>'."\n";
604
 
605
+ echo '</tr>'."\n";
606
+ echo '</tbody>'."\n";
607
+ echo '</table>'."\n";
608
+ echo '</div>'."\n";
609
 
610
+ echo '</div>'."\n";
611
 
612
+ do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_after_amazon_s3_comp", get_defined_vars());
613
+ }*/
614
  if(apply_filters("ws_plugin__s2member_during_down_ops_page_during_left_sections_display_rtmp_streaming", TRUE, get_defined_vars()))
615
  {
616
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_before_rtmp_streaming", get_defined_vars());
619
 
620
  echo '<div class="ws-menu-page-section ws-plugin--s2member-rtmp-streaming-section">'."\n";
621
  echo '<h3>JW Player v6 &amp; RTMP Protocol Examples</h3>'."\n";
622
+ echo '<a href="http://www.s2member.com/r/jw-player-download/" target="_blank"><img src="'.esc_attr($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["dir_url"]).'/images/jwplayer-logo.png" class="ws-menu-page-right" style="width:179px; height:58px; border:0; border-radius:3px; background:#FFFFFF; padding:15px;" alt="." /></a>'."\n";
623
  echo '<p>While it is possible to serve audio/video files protected by s2Member, without needing to integrate Amazon S3 or CloudFront; we DO highly recommend that you integrate both Amazon S3 and Amazon CloudFront in order to maximize speed and compatibility across various viewing platforms. That being said, there are code samples below that will serve audio/video files both with and without Amazon S3/CloudFront. You can also check the <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value("Forum URI")).'" target="_blank" rel="external">s2Member Support Forums</a> for tips/tricks if you like.</p>'."\n";
624
  echo '<p><strong>One of the great things about Amazon CloudFront</strong>, is its ability to <strong>stream/seek media files</strong> in the truest sense of the word. For sites delivering protected <em>FLV/MP4/OGG/WEBM</em> and other streaming audio/video file types over the <em>RTMP</em> protocol, Amazon CloudFront is our recommendation. Once you\'ve successfully configured s2Member to use both Amazon S3 and Amazon CloudFront together, please review the code samples below. s2Member can automatically serve your protected files over the <em>RTMP</em> protocol using an Amazon CloudFront Streaming Distribution.</p>'."\n";
625
  echo '<p><strong>See also:</strong> This KB article: <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/" target="_blank" rel="external">JW Player w/ <code>[s2Stream /]</code> Shortcodes</a>.</p>'."\n";
632
  echo '<h3><code>[s2Stream /]</code> Video Shortcode Examples (recommended — it\'s the easiest way)</h3>'."\n";
633
 
634
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (MP4 file, via Rewrite URLs. Amazon S3/CloudFront NOT required)</a></p>'."\n";
635
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Works with any audio/video file. This does NOT require s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp4.x-php")).'</p>'."\n";
636
 
637
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4-rtmp\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
638
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4-rtmp" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Streams with the RTMP protocol, plus there is a full download fallback of the MP4 source file if streaming is not possible on a particular device.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp4-rtmp.x-php")).'</p>'."\n";
639
 
640
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4-rtmp-only\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4 only, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
641
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp4-rtmp-only" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Streams with the RTMP protocol only, with no access to the source file, only to the RTMP stream.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp4-rtmp-only.x-php")).'</p>'."\n";
642
 
643
  echo '<div class="ws-menu-page-hr"></div>'."\n";
644
 
645
  echo '<h3><code>[s2Stream /]</code> Audio Shortcode Examples (recommended — it\'s the easiest way)</h3>'."\n";
646
 
647
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3\').toggle(); return false;" class="ws-dotted-link">JW Player (MP3 file, via Rewrite URLs. Amazon S3/CloudFront NOT required)</a></p>'."\n";
648
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Works with any audio/video file. This does NOT require s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp3.x-php")).'</p>'."\n";
649
 
650
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3-rtmp\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP3, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
651
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3-rtmp" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Streams with the RTMP protocol, plus there is a full download fallback of the MP3 source file if streaming is not possible on a particular device.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp3-rtmp.x-php")).'</p>'."\n";
652
 
653
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3-rtmp-only\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP3 only, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
654
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-s2stream-mp3-rtmp-only" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />Streams with the RTMP protocol only, with no access to the source file, only to the RTMP stream.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-s2stream-mp3-rtmp-only.x-php")).'</p>'."\n";
655
 
656
  echo '<div class="ws-menu-page-hr"></div>'."\n";
657
 
658
  echo '<h3>PHP Code Examples (for more advanced integrations via PHP — in WordPress themes)</h3>'."\n";
659
 
660
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (MP4 file, via Rewrite URLs. Amazon S3/CloudFront NOT required)</a></p>'."\n";
661
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-standard-mp4" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This does NOT require s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <code>s2Member -› Download Options -› Advanced Mod Rewrite Linkage</code>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-standard-mp4.x-php")).'</p>'."\n";
662
 
663
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s Amazon S3/CloudFront integration)</a></p>'."\n";
664
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -› API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4.x-php")).'</p>'."\n";
665
 
666
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, via s2Member\'s JSON/Shortcode alternative)</a></p>'."\n";
667
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-sca" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -› API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-sca.x-php")).'</p>'."\n";
668
 
669
  echo '<p style="font-size:110%;"><a href="#" onclick="jQuery(\'p#ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm\').toggle(); return false;" class="ws-dotted-link">JW Player (RTMP streaming MP4, advanced w/ multiple fallbacks)</a></p>'."\n";
670
+ echo '<p id="ws-plugin--s2member-rtmp-streaming-details-jwplayer-streaming-mp4-webm" style="display:none;">Download <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">JW Player here</a>, and upload <code>/jwplayer/</code> to your website\'s root directory.<br />This requires s2Member to be integrated with Amazon S3/CloudFront.<br />Also see: <a href="http://www.s2member.com/codex/stable/s2member/api_functions/package-summary/" target="_blank" rel="external">s2Member Codex -› API Functions</a>.<br /><br />'.c_ws_plugin__s2member_utils_strings::highlight_php(file_get_contents(dirname(__FILE__)."/code-samples/jwplayer-streaming-mp4-webm.x-php")).'</p>'."\n";
671
 
672
  echo '</div>'."\n";
673
 
756
  echo '<li><code>file_download="video.mp4"</code> Location of the audio/video file, relative to the <code>/'.esc_html(c_ws_plugin__s2member_utils_dirs::basename_dir_app_data($GLOBALS["WS_PLUGIN__"]["s2member"]["c"]["files_dir"])).'/</code> directory; or, relative to the root of your Amazon S3 Bucket, when applicable.</li>'."\n";
757
  echo '<li><code>player="jwplayer-v6-rtmp"</code> Required. Current supported players in this Shortcode include: <code>jwplayer-v6</code> (works with any audio/video file, and you do NOT need to have Amazon S3 or CloudFront integrated for this to work), <code>jwplayer-v6-rtmp</code> (streams with the RTMP protocol, plus there is a full download fallback of the source file if streaming is not possible on a particular device; this requires both Amazon S3 and CloudFront integration), <code>jwplayer-v6-rtmp-only</code> (streams with the RTMP protocol only, with no access to the source file, only to the RTMP stream; this requires both Amazon S3 and CloudFront integration).</li>'."\n";
758
  echo '<li><code>player_id=""</code> Optional. HTML div ID for the audio/video player. Defaults to a unique ID generated by s2Member for each instance of your Shortcode.</li>'."\n";
759
+ echo '<li><code>player_path="/jwplayer/jwplayer.js"</code> Required. Path to the player\'s JavaScript file (ex: <code>/jwplayer/jwplayer.js</code> — you should upload the <a href="http://www.s2member.com/r/jw-player-download/" target="_blank" rel="external">/jwplayer</a> folder to the root of your web directory).</li>'."\n";
760
  echo '<li><code>player_resolutions=""</code> Optional (requires s2Member Pro). This is a comma-delimited list of all available resolution options (should you decide to offer more than just one file download at a single resolution). Please review the full list of Shortcode Attributes (i.e. click the "Shortcode Attributes (Explained)" tab) in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details, requirements, and an example of use.</li>'."\n";
761
+ echo '<li><code>player_{setting}=""</code> Optional. Any additional configuration attributes supported by your audio/video player, prefixed with <code>player_</code>. For JW Player v6, see <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this article please</a>. Examples: <code>player_width="480"</code>, <code>player_height="270"</code>, <code>player_title="My Video"</code>, <code>player_description="A video about something."</code>, <code>player_image="http://www.example.com/wp-content/uploads/video-preview.jpg"</code>, <code>player_mediaid="video_ei0wsx23"</code>, <code>player_autostart="true"</code>, <code>player_skin="/jwplayer/my-skin.xml"</code>, <code>player_key="my-license-key"</code>, <code>player_captions="{file:\'/assets/captions-en.vtt\',label:\'English\'}"</code> (<em>With <a href="http://www.s2member.com/r/jw-player-video-captions/" target="_blank" rel="external">Captions</a>, you can exclude the square array brackets to avoid Shortcode parsing issues. s2Member will automatically wrap your Caption objects with square array brackets.</em>). Please note that "Advanced Options Blocks" listed on <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this page</a> are NOT supported here. For those, please use: <code>player_option_blocks=""</code> (see below).</li>'."\n";
762
+ echo '<li><code>player_option_blocks=""</code> Optional. Any "Advanced Option Blocks" supported by your audio/video player. For JW Player v6, see <a href="http://www.s2member.com/r/jw-player-config-options/" target="_blank" rel="external">this article please</a>. Here are some examples: <code>player_option_blocks="sharing:{}"</code>, <code>player_option_blocks="sharing:{}, logo: {file: \'/logo.png\', link: \'http://example.com\'}"</code>. Or: <code>player_option_blocks="c2hhcmluZzoge30="</code> (base64 encoded version of <code>sharing:{}</code>). Please note that "Advanced Options Blocks" can be defined in plain text or with a <a href="http://www.base64encode.org/" target="_blank" rel="external">base64 encoded string</a>. Advanced Option Blocks are JavaScript objects with properties. If you have trouble defining JavaScript object properties inside a Shortcode Attribute, please use <a href="http://www.base64encode.org/" target="_blank" rel="external">this tool</a> to base64 encode your Advanced Option Blocks, so that you end up with a string that\'s compatible with Shortcode Attributes.</li>'."\n";
763
  echo '<li>Please check the <strong>Shortcode Attributes</strong> Tab in <a href="http://www.s2member.com/kb/jwplayer-s2stream-shortcodes/#using-s2stream-shortcodes" target="_blank" rel="external">this KB article</a> for further details on everything here.</li>'."\n";
764
  do_action("ws_plugin__s2member_during_down_ops_page_during_left_sections_during_shortcode_attrs_s2stream_lis", get_defined_vars());
765
  echo '</ul>'."\n";
includes/menu-pages/els-ops.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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_els_ops"))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_menu_page_els_ops"))
includes/menu-pages/gen-ops.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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_gen_ops"))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_menu_page_gen_ops"))
includes/menu-pages/info.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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_info"))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_menu_page_info"))
includes/menu-pages/integrations.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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_integrations"))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_menu_page_integrations"))
includes/menu-pages/logs.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
15
  * @since 130210
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_logs"))
14
  * @package s2Member\Menu_Pages
15
  * @since 130210
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_menu_page_logs"))
includes/menu-pages/menu-pages.css CHANGED
@@ -15,7 +15,7 @@
15
  * @package WebSharks\Menu Pages
16
  * @since x.xx
17
  */
18
- @import url('//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css');
19
  /*
20
  Alter WordPress wrap on s2Member menu pages.
21
  */
@@ -147,10 +147,11 @@ div.ws-menu-page pre.code > code
147
  display : block;
148
  box-shadow : 0 0 5px 1px #000000 inset, 0 0 1px 1px rgba(223, 245, 165, 0.5);
149
  }
150
- div.ws-menu-page code.highlight-php
 
151
  {
152
  font-size : 90%;
153
- color : #EEEEEE;
154
  background : #FFFFFF;
155
  overflow : auto;
156
  max-width : 100%;
@@ -233,6 +234,14 @@ div.ws-menu-page .ws-menu-page-bright-hilite
233
  border-radius : 3px;
234
  padding : 0 0.2em;
235
  }
 
 
 
 
 
 
 
 
236
  div.ws-menu-page .ws-menu-page-error-hilite
237
  {
238
  color : #FFFFFF;
@@ -500,7 +509,7 @@ div.ws-menu-page div.ws-menu-page-groups-hide:active
500
  div.ws-menu-page div.ws-menu-page-toolbox
501
  {
502
  float : right;
503
- max-width : 300px;
504
 
505
  z-index : 1;
506
  position : relative;
@@ -822,6 +831,80 @@ table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr >
822
  box-shadow : 0 0 1px 0 rgba(0, 0, 0, 0.5) inset, 0 0 1px 1px rgba(223, 245, 165, 0.5);
823
  }
824
  /*
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
825
  Specifically for info pages with readme files.
826
  These CSS selectors address common layout styles.
827
  */
15
  * @package WebSharks\Menu Pages
16
  * @since x.xx
17
  */
18
+ @import url('//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css');
19
  /*
20
  Alter WordPress wrap on s2Member menu pages.
21
  */
147
  display : block;
148
  box-shadow : 0 0 5px 1px #000000 inset, 0 0 1px 1px rgba(223, 245, 165, 0.5);
149
  }
150
+ div.ws-menu-page code.highlight-php,
151
+ div.ws-menu-page code.highlight-shortcodes
152
  {
153
  font-size : 90%;
154
+ color : #000000;
155
  background : #FFFFFF;
156
  overflow : auto;
157
  max-width : 100%;
234
  border-radius : 3px;
235
  padding : 0 0.2em;
236
  }
237
+ div.ws-menu-page .ws-menu-page-warning-hilite
238
+ {
239
+ color : #FFFFFF;
240
+ background : #AC3204;
241
+
242
+ border-radius : 3px;
243
+ padding : 0 0.2em;
244
+ }
245
  div.ws-menu-page .ws-menu-page-error-hilite
246
  {
247
  color : #FFFFFF;
509
  div.ws-menu-page div.ws-menu-page-toolbox
510
  {
511
  float : right;
512
+ max-width : 320px;
513
 
514
  z-index : 1;
515
  position : relative;
831
  box-shadow : 0 0 1px 0 rgba(0, 0, 0, 0.5) inset, 0 0 1px 1px rgba(223, 245, 165, 0.5);
832
  }
833
  /*
834
+ Coupons table.
835
+ */
836
+ table.ws-menu-page-table table.coupons-table
837
+ {
838
+ margin : 0;
839
+ padding : 0;
840
+ width : 100%;
841
+ box-sizing : border-box;
842
+ table-layout : auto;
843
+ }
844
+ table.ws-menu-page-table table.coupons-table thead::after
845
+ {
846
+ content : ' ';
847
+ display : block;
848
+ margin : 0 0 15px 0;
849
+ }
850
+ table.ws-menu-page-table table.coupons-table thead th:not(:last-child)
851
+ {
852
+ background : rgba(255, 255, 255, 0.25);
853
+ border-radius : .25em;
854
+ }
855
+ table.ws-menu-page-table table.coupons-table th,
856
+ table.ws-menu-page-table table.coupons-table td
857
+ {
858
+ margin : 0;
859
+ padding : .1em;
860
+ text-align : center;
861
+ vertical-align : middle;
862
+ width : 10%;
863
+ }
864
+ table.ws-menu-page-table table.coupons-table th
865
+ {
866
+ padding : .2em;
867
+ }
868
+ table.ws-menu-page-table table.coupons-table th:first-child,
869
+ table.ws-menu-page-table table.coupons-table td:first-child
870
+ {
871
+ width : 20%;
872
+ }
873
+ table.ws-menu-page-table table.coupons-table th i.fa
874
+ {
875
+ display : block;
876
+ }
877
+ table.ws-menu-page-table table.coupons-table td:last-child
878
+ {
879
+ width : 5%;
880
+ font-size : 110%;
881
+ white-space : nowrap;
882
+ }
883
+ table.ws-menu-page-table table.coupons-table td:last-child a
884
+ {
885
+ width : 40%;
886
+ display : inline-block;
887
+ }
888
+ table.ws-menu-page-table table.coupons-table td:last-child a.-delete:hover
889
+ {
890
+ color : #AC0000;
891
+ }
892
+ table.ws-menu-page-table div.ws-menu-page-group table.form-table > tbody > tr > td > table.coupons-table input[type='text']
893
+ {
894
+ box-sizing : border-box;
895
+ width : 100% !important;
896
+ }
897
+ table.ws-menu-page-table div.coupon-add
898
+ {
899
+ margin : .5em 0 1em 5px;
900
+ }
901
+ table.ws-menu-page-table div.coupon-add > a
902
+ {
903
+ font-size : 120%;
904
+ font-weight : bold;
905
+ text-decoration : none;
906
+ }
907
+ /*
908
  Specifically for info pages with readme files.
909
  These CSS selectors address common layout styles.
910
  */
includes/menu-pages/mms-ops.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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_mms_ops"))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_menu_page_mms_ops"))
includes/menu-pages/paypal-buttons.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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_paypal_buttons"))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_menu_page_paypal_buttons"))
includes/menu-pages/paypal-ops.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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_paypal_ops"))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_menu_page_paypal_ops"))
includes/menu-pages/res-ops.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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_res_ops"))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_menu_page_res_ops"))
includes/menu-pages/scripting.inc.php CHANGED
@@ -16,7 +16,7 @@
16
  *
17
  * @TODO Shortcode equivalents using [else] syntax.
18
  */
19
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
20
  exit ("Do not access this file directly.");
21
 
22
  if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
@@ -363,7 +363,7 @@ if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
363
 
364
  echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-capabilities-section">' . "\n";
365
  echo '<h3>Packaging Together Custom Capabilities w/ Membership</h3>' . "\n";
366
- echo '<embed type="application/x-shockwave-flash" src="//www.youtube.com/p/A2C07377CF60025E?version=3&hd=1&fs=1&rel=0" allowscriptaccess="always" allowfullscreen="true" style="float:right; margin:0 0 20px 20px; width:300px; height:200px;"></embed>' . "\n";
367
  echo '<p>Using one of s2Member\'s Payment Button and/or Form Generators, you can add Custom Capabilities in comma-delimited format. s2Member builds upon existing functionality offered by <a href="http://codex.wordpress.org/Roles_and_Capabilities" target="_blank" rel="external">WordPress Roles/Capabilities</a>. s2Member supports Free Subscribers <em>(at Level #0)</em>, and several Primary Roles created by the s2Member plugin <em>(i.e. s2Member Levels 1-4, or up to the number of configured Levels)</em>. Each s2Member Level <em>(aka: s2Member Role)</em> provides the Capability <code>current_user_can("access_s2member_level0"), 1, 2, 3, 4</code>, where <code>access_s2member_level[0-4]</code> is the Capability associated with each Role; and Membership Levels provide incremental access <em>(i.e. Level #4 Members can also access content at Levels 0, 1, 2, and 3 beneath them)</em>. In short, these Level-based permissions are the default Capabilities that come with each Membership Level being sold on your site.</p>' . "\n";
368
  echo '<p>Now, if you\'d like to package together some variations of each Membership Level that you\'re selling, you can! All you do is add <strong>Custom Capabilities</strong> whenever you create your Payment Button and/or Form Shortcode (<em>there is a field in the Button &amp; Form Generators where you can enter Custom Capabilities</em>). You can sell Membership Packages that come with Custom Capabilities, and even with custom prices.</p>' . "\n";
369
  echo '<p>Custom Capabilities are an extension to a feature that already exists in WordPress. The <code>current_user_can()</code> function, can be used to test for these additional Capabilities that you allow. Whenever a Member completes the checkout process, after having purchased a Membership from you (one that included Custom Capabilities), s2Member will add those Custom Capabilities to the account for that specific Member.</p>' . "\n";
16
  *
17
  * @TODO Shortcode equivalents using [else] syntax.
18
  */
19
+ if(!defined('WPINC')) // MUST have WordPress.
20
  exit ("Do not access this file directly.");
21
 
22
  if (!class_exists ("c_ws_plugin__s2member_menu_page_scripting"))
363
 
364
  echo '<div class="ws-menu-page-section ws-plugin--s2member-custom-capabilities-section">' . "\n";
365
  echo '<h3>Packaging Together Custom Capabilities w/ Membership</h3>' . "\n";
366
+ echo '<iframe width="560" height="315" src="https://www.youtube.com/embed/_F91xzrmq-Q" frameborder="0" allowscriptaccess="always" allowfullscreen="true" style="float:right; margin:0 0 20px 20px; width:300px; height:200px;"></iframe>' . "\n";
367
  echo '<p>Using one of s2Member\'s Payment Button and/or Form Generators, you can add Custom Capabilities in comma-delimited format. s2Member builds upon existing functionality offered by <a href="http://codex.wordpress.org/Roles_and_Capabilities" target="_blank" rel="external">WordPress Roles/Capabilities</a>. s2Member supports Free Subscribers <em>(at Level #0)</em>, and several Primary Roles created by the s2Member plugin <em>(i.e. s2Member Levels 1-4, or up to the number of configured Levels)</em>. Each s2Member Level <em>(aka: s2Member Role)</em> provides the Capability <code>current_user_can("access_s2member_level0"), 1, 2, 3, 4</code>, where <code>access_s2member_level[0-4]</code> is the Capability associated with each Role; and Membership Levels provide incremental access <em>(i.e. Level #4 Members can also access content at Levels 0, 1, 2, and 3 beneath them)</em>. In short, these Level-based permissions are the default Capabilities that come with each Membership Level being sold on your site.</p>' . "\n";
368
  echo '<p>Now, if you\'d like to package together some variations of each Membership Level that you\'re selling, you can! All you do is add <strong>Custom Capabilities</strong> whenever you create your Payment Button and/or Form Shortcode (<em>there is a field in the Button &amp; Form Generators where you can enter Custom Capabilities</em>). You can sell Membership Packages that come with Custom Capabilities, and even with custom prices.</p>' . "\n";
369
  echo '<p>Custom Capabilities are an extension to a feature that already exists in WordPress. The <code>current_user_can()</code> function, can be used to test for these additional Capabilities that you allow. Whenever a Member completes the checkout process, after having purchased a Membership from you (one that included Custom Capabilities), s2Member will add those Custom Capabilities to the account for that specific Member.</p>' . "\n";
includes/menu-pages/start.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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_start"))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit ("Do not access this file directly.");
19
 
20
  if (!class_exists ("c_ws_plugin__s2member_menu_page_start"))
includes/menu-pages/trk-ops.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
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_trk_ops"))
14
  * @package s2Member\Menu_Pages
15
  * @since 3.0
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_menu_page_trk_ops"))
includes/menu-pages/updates.inc.php CHANGED
@@ -14,7 +14,7 @@
14
  * @package s2Member\Menu_Pages
15
  * @since 111205
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_updates"))
14
  * @package s2Member\Menu_Pages
15
  * @since 111205
16
  */
17
+ if(!defined('WPINC')) // MUST have WordPress.
18
  exit("Do not access this file directly.");
19
 
20
  if(!class_exists("c_ws_plugin__s2member_menu_pages_updates"))
includes/syscon.inc.php CHANGED
@@ -17,7 +17,7 @@
17
  * @package s2Member
18
  * @since 3.0
19
  */
20
- if(realpath(__FILE__) === realpath($_SERVER['SCRIPT_FILENAME']))
21
  exit('Do not access this file directly.');
22
  /*
23
  Determine the directory.
@@ -85,7 +85,7 @@ $GLOBALS['WS_PLUGIN__']['s2member']['c']['recaptcha'] = array('public_key' => '6
85
  /*
86
  Configure the right menu options panel for s2Member.
87
  */
88
- $GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages'] = array('updates' => TRUE, 'upsell-pro' => TRUE, 'installation' => FALSE, 'tools' => FALSE, 'kb' => TRUE, 'videos' => TRUE, 'support' => TRUE, 'donations' => TRUE);
89
  /*
90
  Check if s2Member has been configured *should be set after the first config via options panel*.
91
  */
@@ -299,9 +299,10 @@ if(!function_exists('ws_plugin__s2member_configure_options_and_their_defaults'))
299
  $default_options['file_download_stream_extensions'] = '';
300
  $default_options['file_download_content_encodong_none'] = '0';
301
 
302
- $default_options['amazon_s3_files_bucket'] = '';
303
- $default_options['amazon_s3_files_access_key'] = '';
304
- $default_options['amazon_s3_files_secret_key'] = '';
 
305
 
306
  $default_options['amazon_cf_files_private_key'] = '';
307
  $default_options['amazon_cf_files_private_key_id'] = '';
17
  * @package s2Member
18
  * @since 3.0
19
  */
20
+ if(!defined('WPINC')) // MUST have WordPress.
21
  exit('Do not access this file directly.');
22
  /*
23
  Determine the directory.
85
  /*
86
  Configure the right menu options panel for s2Member.
87
  */
88
+ $GLOBALS['WS_PLUGIN__']['s2member']['c']['menu_pages'] = array('updates' => TRUE, 'upsell-pro' => TRUE, 'installation' => FALSE, 'tools' => FALSE, 'kb' => TRUE, 'videos' => TRUE, 'support' => TRUE, 'donations' => TRUE, 'beta' => TRUE);
89
  /*
90
  Check if s2Member has been configured *should be set after the first config via options panel*.
91
  */
299
  $default_options['file_download_stream_extensions'] = '';
300
  $default_options['file_download_content_encodong_none'] = '0';
301
 
302
+ $default_options['amazon_s3_files_bucket'] = '';
303
+ $default_options['amazon_s3_files_bucket_region'] = '';
304
+ $default_options['amazon_s3_files_access_key'] = '';
305
+ $default_options['amazon_s3_files_secret_key'] = '';
306
 
307
  $default_options['amazon_cf_files_private_key'] = '';
308
  $default_options['amazon_cf_files_private_key_id'] = '';
includes/templates/badges/s-badge.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if(realpath(__FILE__) === realpath($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
 
5
  switch('%%v%%')
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
 
5
  switch('%%v%%')
includes/templates/buttons/paypal-cancellation-button.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/buttons/paypal-ccaps-checkout-button.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/buttons/paypal-checkout-button.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/buttons/paypal-sp-checkout-button.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/cfg-files/s2-cross-xml.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
- exit("Do not access this file directly.");
4
  ?>
5
 
6
  <?php echo '<?xml version="1.0"?>'."\n"; ?>
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
+ exit('Do not access this file directly.');
4
  ?>
5
 
6
  <?php echo '<?xml version="1.0"?>'."\n"; ?>
includes/templates/cfg-files/s2member-files-no-gzip.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
- exit("Do not access this file directly.");
4
 
5
  global /* A Multisite ``$base`` configuration? */ $base;
6
- $ws_plugin__s2member_temp_s_base = (!empty($base)) ? $base : c_ws_plugin__s2member_utils_urls::parse_url (network_home_url ("/"), PHP_URL_PATH);
7
  // This works on Multisite installs too. The function ``network_home_url ()`` defaults to ``home_url ()`` on standard WordPress installs.
8
  // Do NOT use ``site`` URL. Must use the `home` URL here, because that's what WordPress uses in its own `mod_rewrite` implementation.
9
  ?>
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
+ exit('Do not access this file directly.');
4
 
5
  global /* A Multisite ``$base`` configuration? */ $base;
6
+ $ws_plugin__s2member_temp_s_base = (!empty($base)) ? $base : c_ws_plugin__s2member_utils_urls::parse_url (network_home_url ('/'), PHP_URL_PATH);
7
  // This works on Multisite installs too. The function ``network_home_url ()`` defaults to ``home_url ()`` on standard WordPress installs.
8
  // Do NOT use ``site`` URL. Must use the `home` URL here, because that's what WordPress uses in its own `mod_rewrite` implementation.
9
  ?>
includes/templates/cfg-files/s2member-files.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
- exit("Do not access this file directly.");
4
 
5
  global /* A Multisite ``$base`` configuration? */ $base;
6
- $ws_plugin__s2member_temp_s_base = (!empty($base)) ? $base : c_ws_plugin__s2member_utils_urls::parse_url (network_home_url ("/"), PHP_URL_PATH);
7
  // This works on Multisite installs too. The function ``network_home_url ()`` defaults to ``home_url ()`` on standard WordPress installs.
8
  // Do NOT use ``site`` URL. Must use the `home` URL here, because that's what WordPress uses in its own `mod_rewrite` implementation.
9
  ?>
@@ -27,7 +27,7 @@ $ws_plugin__s2member_temp_s_base = (!empty($base)) ? $base : c_ws_plugin__s2memb
27
 
28
  # Handle virtual directories, common on multisite networks.
29
  RewriteCond %{ENV:s2member_file_download_wp_vdir_check} !^complete$
30
- RewriteCond %{THE_REQUEST} ^(?:GET|HEAD)(?:[\ ]+)(?:<?php echo preg_quote ($ws_plugin__s2member_temp_s_base, " "); ?>)([_0-9a-zA-Z\-]+/)(?:wp-content/)
31
  RewriteRule ^(.*)$ - [E=s2member_file_download_wp_vdir:,E=s2member_file_download_wp_vdir:%1,E=s2member_file_download_wp_vdir_check:complete]
32
 
33
  # Handle streaming download requests via the rewrite engine.
@@ -111,7 +111,4 @@ $ws_plugin__s2member_temp_s_base = (!empty($base)) ? $base : c_ws_plugin__s2memb
111
  </IfModule>
112
  </IfModule>
113
 
114
- # Disallow directory indexing here.
115
- Options -Indexes
116
-
117
  <?php unset($ws_plugin__s2member_temp_s_base); ?>
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
+ exit('Do not access this file directly.');
4
 
5
  global /* A Multisite ``$base`` configuration? */ $base;
6
+ $ws_plugin__s2member_temp_s_base = (!empty($base)) ? $base : c_ws_plugin__s2member_utils_urls::parse_url (network_home_url ('/'), PHP_URL_PATH);
7
  // This works on Multisite installs too. The function ``network_home_url ()`` defaults to ``home_url ()`` on standard WordPress installs.
8
  // Do NOT use ``site`` URL. Must use the `home` URL here, because that's what WordPress uses in its own `mod_rewrite` implementation.
9
  ?>
27
 
28
  # Handle virtual directories, common on multisite networks.
29
  RewriteCond %{ENV:s2member_file_download_wp_vdir_check} !^complete$
30
+ RewriteCond %{THE_REQUEST} ^(?:GET|HEAD)(?:[\ ]+)(?:<?php echo preg_quote ($ws_plugin__s2member_temp_s_base, ' '); ?>)([_0-9a-zA-Z\-]+/)(?:wp-content/)
31
  RewriteRule ^(.*)$ - [E=s2member_file_download_wp_vdir:,E=s2member_file_download_wp_vdir:%1,E=s2member_file_download_wp_vdir_check:complete]
32
 
33
  # Handle streaming download requests via the rewrite engine.
111
  </IfModule>
112
  </IfModule>
113
 
 
 
 
114
  <?php unset($ws_plugin__s2member_temp_s_base); ?>
includes/templates/cfg-files/s2member-logs.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
- exit("Do not access this file directly.");
4
  ?>
5
 
6
  <IfModule authz_core_module>
@@ -8,7 +8,4 @@ if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
8
  </IfModule>
9
  <IfModule !authz_core_module>
10
  deny from all
11
- </IfModule>
12
-
13
- # Disallow directory indexing here.
14
- Options -Indexes
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
+ exit('Do not access this file directly.');
4
  ?>
5
 
6
  <IfModule authz_core_module>
8
  </IfModule>
9
  <IfModule !authz_core_module>
10
  deny from all
11
+ </IfModule>
 
 
 
includes/templates/cfg-files/s2o-mu-plugins.php CHANGED
@@ -1,36 +1,36 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
- exit("Do not access this file directly.");
4
  ?>
5
 
6
  // s2Member-only mode. Only load (o)nly/(a)ll files.
7
 
8
- if (file_exists (WPMU_PLUGIN_DIR . "/s2member-o-hacks.php"))
9
- include_once WPMU_PLUGIN_DIR . "/s2member-o-hacks.php";
10
 
11
- else if (file_exists (WPMU_PLUGIN_DIR . "/s2-o-hacks.php"))
12
- include_once WPMU_PLUGIN_DIR . "/s2-o-hacks.php";
13
 
14
  // --------------------------------------------------
15
 
16
- if (file_exists (WPMU_PLUGIN_DIR . "/s2member-a-hacks.php"))
17
- include_once WPMU_PLUGIN_DIR . "/s2member-a-hacks.php";
18
 
19
- else if (file_exists (WPMU_PLUGIN_DIR . "/s2-a-hacks.php"))
20
- include_once WPMU_PLUGIN_DIR . "/s2-a-hacks.php";
21
 
22
  // --------------------------------------------------
23
 
24
- if (file_exists (WPMU_PLUGIN_DIR . "/s2member-o.php"))
25
- include_once WPMU_PLUGIN_DIR . "/s2member-o.php";
26
 
27
- else if (file_exists (WPMU_PLUGIN_DIR . "/s2-o.php"))
28
- include_once WPMU_PLUGIN_DIR . "/s2-o.php";
29
 
30
  // --------------------------------------------------
31
 
32
- if (file_exists (WPMU_PLUGIN_DIR . "/s2member-a.php"))
33
- include_once WPMU_PLUGIN_DIR . "/s2member-a.php";
34
 
35
- else if (file_exists (WPMU_PLUGIN_DIR . "/s2-a.php"))
36
- include_once WPMU_PLUGIN_DIR . "/s2-a.php";
1
  <?php
2
+ if(!defined('_WS_PLUGIN__S2MEMBER_ONLY'))
3
+ exit('Do not access this file directly.');
4
  ?>
5
 
6
  // s2Member-only mode. Only load (o)nly/(a)ll files.
7
 
8
+ if(is_file(WPMU_PLUGIN_DIR.'/s2member-o-hacks.php'))
9
+ include_once WPMU_PLUGIN_DIR.'/s2member-o-hacks.php';
10
 
11
+ else if(is_file(WPMU_PLUGIN_DIR.'/s2-o-hacks.php'))
12
+ include_once WPMU_PLUGIN_DIR.'/s2-o-hacks.php';
13
 
14
  // --------------------------------------------------
15
 
16
+ if(is_file(WPMU_PLUGIN_DIR.'/s2member-a-hacks.php'))
17
+ include_once WPMU_PLUGIN_DIR.'/s2member-a-hacks.php';
18
 
19
+ else if(is_file(WPMU_PLUGIN_DIR.'/s2-a-hacks.php'))
20
+ include_once WPMU_PLUGIN_DIR.'/s2-a-hacks.php';
21
 
22
  // --------------------------------------------------
23
 
24
+ if(is_file(WPMU_PLUGIN_DIR.'/s2member-o.php'))
25
+ include_once WPMU_PLUGIN_DIR.'/s2member-o.php';
26
 
27
+ else if(is_file(WPMU_PLUGIN_DIR.'/s2-o.php'))
28
+ include_once WPMU_PLUGIN_DIR.'/s2-o.php';
29
 
30
  // --------------------------------------------------
31
 
32
+ if(is_file(WPMU_PLUGIN_DIR.'/s2member-a.php'))
33
+ include_once WPMU_PLUGIN_DIR.'/s2member-a.php';
34
 
35
+ else if(is_file(WPMU_PLUGIN_DIR.'/s2-a.php'))
36
+ include_once WPMU_PLUGIN_DIR.'/s2-a.php';
includes/templates/cfg-files/s2o-nw-plugins.php CHANGED
@@ -1,21 +1,21 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
- exit("Do not access this file directly.");
4
  ?>
5
 
6
  // s2Member-only mode. Only load the s2Member plugin, exclude all others.
7
 
8
- $o_ws_plugin__s2member = preg_replace ("/-o\.php$/", ".php", __FILE__);
9
- $o_ws_plugin__s2member_is_loaded_already = (defined ("WS_PLUGIN__S2MEMBER_VERSION")) ? true : false;
10
- $o_ws_plugin__plugins_s2member = WP_PLUGIN_DIR . "/" . basename (dirname ($o_ws_plugin__s2member)) ."/" . basename($o_ws_plugin__s2member);
11
 
12
- if ((!file_exists ($o_ws_plugin__plugins_s2member) || @is_link ($o_ws_plugin__plugins_s2member)) && file_exists ($o_ws_plugin__s2member) && !$o_ws_plugin__s2member_is_loaded_already)
13
  include_once $o_ws_plugin__s2member; // s2Member in a strange location?
14
 
15
- else if (in_array($o_ws_plugin__plugins_s2member, wp_get_active_network_plugins ()) && file_exists ($o_ws_plugin__plugins_s2member) && !$o_ws_plugin__s2member_is_loaded_already)
16
  include_once $o_ws_plugin__plugins_s2member;
17
 
18
- else if (apply_filters("ws_plugin_s2member_o_force", false) && !$o_ws_plugin__s2member_is_loaded_already) // Off by default. Force s2Member to load?
19
  include_once $o_ws_plugin__s2member;
20
 
21
  unset($o_ws_plugin__plugins_s2member, $o_ws_plugin__s2member_is_loaded_already, $o_ws_plugin__s2member);
1
  <?php
2
+ if(!defined('_WS_PLUGIN__S2MEMBER_ONLY'))
3
+ exit('Do not access this file directly.');
4
  ?>
5
 
6
  // s2Member-only mode. Only load the s2Member plugin, exclude all others.
7
 
8
+ $o_ws_plugin__s2member = preg_replace('/-o\.php$/', '.php', __FILE__);
9
+ $o_ws_plugin__s2member_is_loaded_already = defined('WS_PLUGIN__S2MEMBER_VERSION') ? TRUE : FALSE;
10
+ $o_ws_plugin__plugins_s2member = WP_PLUGIN_DIR.'/'.basename(dirname($o_ws_plugin__s2member)).'/'.basename($o_ws_plugin__s2member);
11
 
12
+ if((!is_file($o_ws_plugin__plugins_s2member) || @is_link($o_ws_plugin__plugins_s2member)) && is_file($o_ws_plugin__s2member) && !$o_ws_plugin__s2member_is_loaded_already)
13
  include_once $o_ws_plugin__s2member; // s2Member in a strange location?
14
 
15
+ else if(in_array($o_ws_plugin__plugins_s2member, wp_get_active_network_plugins()) && is_file($o_ws_plugin__plugins_s2member) && !$o_ws_plugin__s2member_is_loaded_already)
16
  include_once $o_ws_plugin__plugins_s2member;
17
 
18
+ else if(apply_filters('ws_plugin_s2member_o_force', FALSE) && !$o_ws_plugin__s2member_is_loaded_already) // Off by default. Force s2Member to load?
19
  include_once $o_ws_plugin__s2member;
20
 
21
  unset($o_ws_plugin__plugins_s2member, $o_ws_plugin__s2member_is_loaded_already, $o_ws_plugin__s2member);
includes/templates/cfg-files/s2o-st-plugins.php CHANGED
@@ -1,21 +1,21 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
- exit("Do not access this file directly.");
4
  ?>
5
 
6
  // s2Member-only mode. Only load the s2Member plugin, exclude all others.
7
 
8
- $o_ws_plugin__s2member = preg_replace ("/-o\.php$/", ".php", __FILE__);
9
- $o_ws_plugin__s2member_is_loaded_already = (defined ("WS_PLUGIN__S2MEMBER_VERSION")) ? true : false;
10
- $o_ws_plugin__plugins_s2member = WP_PLUGIN_DIR . "/" . basename (dirname ($o_ws_plugin__s2member)) ."/" . basename($o_ws_plugin__s2member);
11
 
12
- if ((!file_exists ($o_ws_plugin__plugins_s2member) || @is_link ($o_ws_plugin__plugins_s2member)) && file_exists ($o_ws_plugin__s2member) && !$o_ws_plugin__s2member_is_loaded_already)
13
  include_once $o_ws_plugin__s2member; // s2Member in a strange location?
14
 
15
- else if (in_array($o_ws_plugin__plugins_s2member, wp_get_active_and_valid_plugins ()) && file_exists ($o_ws_plugin__plugins_s2member) && !$o_ws_plugin__s2member_is_loaded_already)
16
  include_once $o_ws_plugin__plugins_s2member;
17
 
18
- else if (apply_filters("ws_plugin_s2member_o_force", false) && !$o_ws_plugin__s2member_is_loaded_already) // Off by default. Force s2Member to load?
19
  include_once $o_ws_plugin__s2member;
20
 
21
  unset($o_ws_plugin__plugins_s2member, $o_ws_plugin__s2member_is_loaded_already, $o_ws_plugin__s2member);
1
  <?php
2
+ if(!defined('_WS_PLUGIN__S2MEMBER_ONLY'))
3
+ exit('Do not access this file directly.');
4
  ?>
5
 
6
  // s2Member-only mode. Only load the s2Member plugin, exclude all others.
7
 
8
+ $o_ws_plugin__s2member = preg_replace('/-o\.php$/', '.php', __FILE__);
9
+ $o_ws_plugin__s2member_is_loaded_already = defined('WS_PLUGIN__S2MEMBER_VERSION') ? TRUE : FALSE;
10
+ $o_ws_plugin__plugins_s2member = WP_PLUGIN_DIR.'/'.basename(dirname($o_ws_plugin__s2member)).'/'.basename($o_ws_plugin__s2member);
11
 
12
+ if((!is_file($o_ws_plugin__plugins_s2member) || @is_link($o_ws_plugin__plugins_s2member)) && is_file($o_ws_plugin__s2member) && !$o_ws_plugin__s2member_is_loaded_already)
13
  include_once $o_ws_plugin__s2member; // s2Member in a strange location?
14
 
15
+ else if(in_array($o_ws_plugin__plugins_s2member, wp_get_active_and_valid_plugins()) && is_file($o_ws_plugin__plugins_s2member) && !$o_ws_plugin__s2member_is_loaded_already)
16
  include_once $o_ws_plugin__plugins_s2member;
17
 
18
+ else if(apply_filters('ws_plugin_s2member_o_force', FALSE) && !$o_ws_plugin__s2member_is_loaded_already) // Off by default. Force s2Member to load?
19
  include_once $o_ws_plugin__s2member;
20
 
21
  unset($o_ws_plugin__plugins_s2member, $o_ws_plugin__s2member_is_loaded_already, $o_ws_plugin__s2member);
includes/templates/cfg-files/s2o-th-funcs.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
- exit("Do not access this file directly.");
4
  ?>
5
 
6
  // s2Member-only mode. Do NOT load theme functions, exclude all themes.
1
  <?php
2
+ if(!defined('_WS_PLUGIN__S2MEMBER_ONLY'))
3
+ exit('Do not access this file directly.');
4
  ?>
5
 
6
  // s2Member-only mode. Do NOT load theme functions, exclude all themes.
includes/templates/errors/ip-restrictions.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/options/paypal-currencies.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/options/paypal-membership-ccap-terms.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/options/paypal-membership-regular-terms.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/options/paypal-membership-trial-terms.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/options/paypal-sp-hours.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/players/jwplayer-v6-rtmp-only.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/players/jwplayer-v6-rtmp.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/players/jwplayer-v6.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/returns/default-return.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/shortcodes/paypal-cancellation-button-shortcode.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/shortcodes/paypal-ccaps-checkout-button-shortcode.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/shortcodes/paypal-checkout-button-shortcode.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/templates/shortcodes/paypal-sp-checkout-button-shortcode.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- if (realpath (__FILE__) === realpath ($_SERVER["SCRIPT_FILENAME"]))
3
  exit("Do not access this file directly.");
4
  ?>
5
 
1
  <?php
2
+ if(!defined('WPINC')) // MUST have WordPress.
3
  exit("Do not access this file directly.");
4
  ?>
5
 
includes/translations/s2member.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: 150102\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
- "POT-Creation-Date: 2015-01-02 07:19:03+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -12,316 +12,287 @@ msgstr ""
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
- #: s2member/includes/classes/brute-force.inc.php:90
16
  msgctxt "s2member-front"
17
  msgid "Max failed logins. Please wait %s and try again."
18
  msgstr ""
19
 
20
- #: s2member/includes/classes/custom-reg-fields.inc.php:338
21
- #: s2member/includes/classes/custom-reg-fields.inc.php:470
22
- #: s2member/includes/classes/profile-in.inc.php:116
23
- #: s2member/includes/classes/sc-profile-in.inc.php:134
24
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:66
25
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:47
26
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:66
27
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:66
28
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-registration-form.php:47
29
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:66
30
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:66
31
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-registration-form.php:47
32
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:66
33
  msgctxt "s2member-front"
34
  msgid "First Name"
35
  msgstr ""
36
 
37
- #: s2member/includes/classes/custom-reg-fields.inc.php:350
38
- #: s2member/includes/classes/custom-reg-fields.inc.php:485
39
- #: s2member/includes/classes/profile-in.inc.php:135
40
- #: s2member/includes/classes/sc-profile-in.inc.php:153
41
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:72
42
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:53
43
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:72
44
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:72
45
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-registration-form.php:53
46
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:72
47
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:72
48
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-registration-form.php:53
49
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:72
50
  msgctxt "s2member-front"
51
  msgid "Last Name"
52
  msgstr ""
53
 
54
- #: s2member/includes/classes/custom-reg-fields.inc.php:443
55
- #: s2member/includes/classes/custom-reg-fields.inc.php:448
56
- #: s2member/includes/classes/profile-in.inc.php:225
57
- #: s2member/includes/classes/profile-in.inc.php:231
58
- #: s2member/includes/classes/sc-profile-in.inc.php:243
59
- #: s2member/includes/classes/sc-profile-in.inc.php:249
60
  msgctxt "s2member-front"
61
  msgid "Please type your Password twice to confirm."
62
  msgstr ""
63
 
64
- #: s2member/includes/classes/custom-reg-fields.inc.php:444
65
  msgctxt "s2member-front"
66
  msgid "Password (please type it twice)"
67
  msgstr ""
68
 
69
- #: s2member/includes/classes/custom-reg-fields.inc.php:452
70
- #: s2member/includes/classes/profile-in.inc.php:235
71
- #: s2member/includes/classes/sc-profile-in.inc.php:253
72
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:94
73
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:75
74
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:94
75
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-registration-form.php:75
76
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:94
77
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-registration-form.php:75
78
  msgctxt "s2member-front"
79
  msgid "password strength indicator"
80
  msgstr ""
81
 
82
- #: s2member/includes/classes/custom-reg-fields.inc.php:597
83
- #: s2member/includes/classes/custom-reg-fields.inc.php:608
84
  msgctxt "s2member-front"
85
  msgid "Invalid data type. Expecting a string."
86
  msgstr ""
87
 
88
- #: s2member/includes/classes/custom-reg-fields.inc.php:603
89
  msgctxt "s2member-front"
90
  msgid "Invalid data type. Expecting an array."
91
  msgstr ""
92
 
93
- #: s2member/includes/classes/custom-reg-fields.inc.php:616
94
- #: s2member/includes/classes/custom-reg-fields.inc.php:647
95
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:366
96
  msgctxt "s2member-front"
97
  msgid "This is a required field, please try again."
98
  msgstr ""
99
 
100
- #: s2member/includes/classes/custom-reg-fields.inc.php:622
101
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:351
102
  msgctxt "s2member-front"
103
  msgid "Required. This box must be checked."
104
  msgstr ""
105
 
106
- #: s2member/includes/classes/custom-reg-fields.inc.php:627
107
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:346
108
  msgctxt "s2member-front"
109
  msgid "Please check at least one of the boxes."
110
  msgstr ""
111
 
112
- #: s2member/includes/classes/custom-reg-fields.inc.php:632
113
- #: s2member/includes/classes/custom-reg-fields.inc.php:637
114
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:357
115
  msgctxt "s2member-front"
116
  msgid "Please select one of the options."
117
  msgstr ""
118
 
119
- #: s2member/includes/classes/custom-reg-fields.inc.php:642
120
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:362
121
  msgctxt "s2member-front"
122
  msgid "Please select at least one of the options."
123
  msgstr ""
124
 
125
- #: s2member/includes/classes/custom-reg-fields.inc.php:658
126
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:372
127
  msgctxt "s2member-front"
128
  msgid "Must be numeric (with or without decimals, commas allowed)."
129
  msgstr ""
130
 
131
- #: s2member/includes/classes/custom-reg-fields.inc.php:663
132
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:376
133
  msgctxt "s2member-front"
134
  msgid "Must be numeric (with or without decimals, no commas)."
135
  msgstr ""
136
 
137
- #: s2member/includes/classes/custom-reg-fields.inc.php:668
138
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:380
139
  msgctxt "s2member-front"
140
  msgid "Must be an integer (a whole number, without any decimals)."
141
  msgstr ""
142
 
143
- #: s2member/includes/classes/custom-reg-fields.inc.php:673
144
  msgctxt "s2member-front"
145
  msgid "Must be an integer &gt; 0 (whole number, no decimals, greater than 0)."
146
  msgstr ""
147
 
148
- #: s2member/includes/classes/custom-reg-fields.inc.php:678
149
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:388
150
  msgctxt "s2member-front"
151
  msgid "Must be a float (floating point number, decimals required)."
152
  msgstr ""
153
 
154
- #: s2member/includes/classes/custom-reg-fields.inc.php:683
155
  msgctxt "s2member-front"
156
  msgid "Must be a float &gt; 0 (floating point number, decimals required, greater than 0)."
157
  msgstr ""
158
 
159
- #: s2member/includes/classes/custom-reg-fields.inc.php:688
160
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:396
161
  msgctxt "s2member-front"
162
  msgid "Must be a date (required date format: dd/mm/yyyy)."
163
  msgstr ""
164
 
165
- #: s2member/includes/classes/custom-reg-fields.inc.php:693
166
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:400
167
  msgctxt "s2member-front"
168
  msgid "Must be a valid email address."
169
  msgstr ""
170
 
171
- #: s2member/includes/classes/custom-reg-fields.inc.php:696
172
  msgctxt "s2member-front"
173
  msgid "Please use a personal email address. Addresses like &lt;%s@&gt; are problematic."
174
  msgstr ""
175
 
176
- #: s2member/includes/classes/custom-reg-fields.inc.php:701
177
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:408
178
  msgctxt "s2member-front"
179
  msgid "Must be a full URL (starting with http or https)."
180
  msgstr ""
181
 
182
- #: s2member/includes/classes/custom-reg-fields.inc.php:706
183
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:412
184
  msgctxt "s2member-front"
185
  msgid "Must be a domain name (domain name only, without http)."
186
  msgstr ""
187
 
188
- #: s2member/includes/classes/custom-reg-fields.inc.php:711
189
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:416
190
  msgctxt "s2member-front"
191
  msgid "Must be a phone # (10 digits w/possible hyphens, spaces, brackets)."
192
  msgstr ""
193
 
194
- #: s2member/includes/classes/custom-reg-fields.inc.php:716
195
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:420
196
  msgctxt "s2member-front"
197
  msgid "Must be a US zipcode (5-9 digits w/ possible hyphen)."
198
  msgstr ""
199
 
200
- #: s2member/includes/classes/custom-reg-fields.inc.php:721
201
  msgctxt "s2member-front"
202
  msgid "Must be a Canadian zipcode (6 alpha-numerics w/ possible space)."
203
  msgstr ""
204
 
205
- #: s2member/includes/classes/custom-reg-fields.inc.php:726
206
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:428
207
  msgctxt "s2member-front"
208
  msgid "Must be a zipcode (either a US or Canadian zipcode)."
209
  msgstr ""
210
 
211
- #: s2member/includes/classes/custom-reg-fields.inc.php:732
212
  msgctxt "s2member-front"
213
  msgid "Please use alphanumerics, spaces &amp; punctuation only."
214
  msgstr ""
215
 
216
- #: s2member/includes/classes/custom-reg-fields.inc.php:735
217
  msgctxt "s2member-front"
218
  msgid "Please use alphanumerics &amp; spaces only."
219
  msgstr ""
220
 
221
- #: s2member/includes/classes/custom-reg-fields.inc.php:738
222
  msgctxt "s2member-front"
223
  msgid "Please use alphanumerics &amp; punctuation only (no spaces)."
224
  msgstr ""
225
 
226
- #: s2member/includes/classes/custom-reg-fields.inc.php:741
227
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:444
228
  msgctxt "s2member-front"
229
  msgid "Please use alphanumerics only (no spaces/punctuation)."
230
  msgstr ""
231
 
232
- #: s2member/includes/classes/custom-reg-fields.inc.php:744
233
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:448
234
  msgctxt "s2member-front"
235
  msgid "Please use alphabetics only (no digits/spaces/punctuation)."
236
  msgstr ""
237
 
238
- #: s2member/includes/classes/custom-reg-fields.inc.php:747
239
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:452
240
  msgctxt "s2member-front"
241
  msgid "Please use numeric digits only."
242
  msgstr ""
243
 
244
- #: s2member/includes/classes/custom-reg-fields.inc.php:760
245
- #: s2member/includes/classes/custom-reg-fields.inc.php:774
246
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:459
247
- #: s2member/includes/s2member.js:462
248
  msgctxt "s2member-front"
249
  msgid "digit"
250
  msgstr ""
251
 
252
- #: s2member/includes/classes/custom-reg-fields.inc.php:761
253
- #: s2member/includes/classes/custom-reg-fields.inc.php:775
254
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:459
255
- #: s2member/includes/s2member.js:462
256
  msgctxt "s2member-front"
257
  msgid "digits"
258
  msgstr ""
259
 
260
- #: s2member/includes/classes/custom-reg-fields.inc.php:764
261
- #: s2member/includes/classes/custom-reg-fields.inc.php:778
262
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:459
263
- #: s2member/includes/s2member.js:462
264
  msgctxt "s2member-front"
265
  msgid "character"
266
  msgstr ""
267
 
268
- #: s2member/includes/classes/custom-reg-fields.inc.php:765
269
- #: s2member/includes/classes/custom-reg-fields.inc.php:779
270
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:459
271
- #: s2member/includes/s2member.js:462
272
  msgctxt "s2member-front"
273
  msgid "characters"
274
  msgstr ""
275
 
276
- #: s2member/includes/classes/custom-reg-fields.inc.php:767
277
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:459
278
  msgctxt "s2member-front"
279
  msgid "Must be exactly %s %s."
280
  msgstr ""
281
 
282
- #: s2member/includes/classes/custom-reg-fields.inc.php:781
283
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:462
284
  msgctxt "s2member-front"
285
  msgid "Must be at least %s %s."
286
  msgstr ""
287
 
288
- #: s2member/includes/classes/email-configs.inc.php:150
289
  msgctxt "s2member-front"
290
  msgid "as a Member"
291
  msgstr ""
292
 
293
- #: s2member/includes/classes/files-in.inc.php:112
294
- #: s2member/includes/classes/files-in.inc.php:265
295
  msgctxt "s2member-front"
296
  msgid "<strong>404: Sorry, file not found.</strong> Please contact Support for assistance."
297
  msgstr ""
298
 
299
- #: s2member/includes/classes/files-in.inc.php:123
300
  msgctxt "s2member-front"
301
  msgid "<strong>503 (Invalid Key):</strong> Sorry, your access to this file has expired. Please contact Support for assistance."
302
  msgstr ""
303
 
304
- #: s2member/includes/classes/files-in.inc.php:144
305
  msgctxt "s2member-front"
306
  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 -› General Options -› Membership Options Page</code>."
307
  msgstr ""
308
 
309
- #: s2member/includes/classes/files-in.inc.php:155
310
  msgctxt "s2member-front"
311
  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>."
312
  msgstr ""
313
 
314
- #: s2member/includes/classes/files-in.inc.php:496
315
  msgctxt "s2member-front"
316
  msgid "<strong>503: Access denied.</strong> Invalid File Download specs."
317
  msgstr ""
318
 
319
- #: s2member/includes/classes/files-in.inc.php:592
320
  msgctxt "s2member-front"
321
  msgid "Members Only"
322
  msgstr ""
323
 
324
- #: s2member/includes/classes/files-in.inc.php:598
325
  msgctxt "s2member-front"
326
  msgid "<strong>401:</strong> Sorry, access denied."
327
  msgstr ""
@@ -329,12 +300,12 @@ msgstr ""
329
  #. translators: In this translation, `%s` may be filled with an English
330
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
331
  #. if you like.
332
- #: s2member/includes/classes/files-in.inc.php:746
333
  msgctxt "s2member-admin"
334
  msgid "Unable to update existing Amazon S3 Cross-Domain Policy. %s"
335
  msgstr ""
336
 
337
- #: s2member/includes/classes/files-in.inc.php:749
338
  msgctxt "s2member-admin"
339
  msgid "Unable to update existing Amazon S3 Cross-Domain Policy. Connection failed."
340
  msgstr ""
@@ -342,12 +313,12 @@ msgstr ""
342
  #. translators: In this translation, `%s` may be filled with an English
343
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
344
  #. if you like.
345
- #: s2member/includes/classes/files-in.inc.php:753
346
  msgctxt "s2member-admin"
347
  msgid "Unable to update existing Amazon S3 Bucket Policy. %s"
348
  msgstr ""
349
 
350
- #: s2member/includes/classes/files-in.inc.php:756
351
  msgctxt "s2member-admin"
352
  msgid "Unable to update existing Amazon S3 Bucket Policy. Connection failed."
353
  msgstr ""
@@ -355,17 +326,17 @@ msgstr ""
355
  #. translators: In this translation, `%s` may be filled with an English
356
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
357
  #. if you like.
358
- #: s2member/includes/classes/files-in.inc.php:760
359
  msgctxt "s2member-admin"
360
  msgid "Unable to update existing Amazon S3 Bucket ACLs. %s"
361
  msgstr ""
362
 
363
- #: s2member/includes/classes/files-in.inc.php:763
364
  msgctxt "s2member-admin"
365
  msgid "Unable to update existing Amazon S3 Bucket ACLs. Connection failed."
366
  msgstr ""
367
 
368
- #: s2member/includes/classes/files-in.inc.php:766
369
  msgctxt "s2member-admin"
370
  msgid "Unable to acquire/read existing Amazon S3 Bucket ACLs. Unexpected response."
371
  msgstr ""
@@ -373,22 +344,22 @@ msgstr ""
373
  #. translators: In this translation, `%s` may be filled with an English
374
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
375
  #. if you like.
376
- #: s2member/includes/classes/files-in.inc.php:770
377
  msgctxt "s2member-admin"
378
  msgid "Unable to acquire existing Amazon S3 Bucket ACLs. %s"
379
  msgstr ""
380
 
381
- #: s2member/includes/classes/files-in.inc.php:773
382
  msgctxt "s2member-admin"
383
  msgid "Unable to acquire existing Amazon S3 Bucket ACLs. Connection failed."
384
  msgstr ""
385
 
386
- #: s2member/includes/classes/files-in.inc.php:776
387
  msgctxt "s2member-admin"
388
  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."
389
  msgstr ""
390
 
391
- #: s2member/includes/classes/files-in.inc.php:883
392
  msgctxt "s2member-admin"
393
  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."
394
  msgstr ""
@@ -396,12 +367,12 @@ msgstr ""
396
  #. translators: In this translation, `%s` may be filled with an English
397
  #. message, which comes from the Amazon CloudFront API call. Feel free to
398
  #. exclude `%s` if you like.
399
- #: s2member/includes/classes/files-in.inc.php:890
400
  msgctxt "s2member-admin"
401
  msgid "Unable to delete existing Amazon CloudFront Downloads Distro. %s"
402
  msgstr ""
403
 
404
- #: s2member/includes/classes/files-in.inc.php:902
405
  msgctxt "s2member-admin"
406
  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."
407
  msgstr ""
@@ -409,7 +380,7 @@ msgstr ""
409
  #. translators: In this translation, `%s` may be filled with an English
410
  #. message, which comes from the Amazon CloudFront API call. Feel free to
411
  #. exclude `%s` if you like.
412
- #: s2member/includes/classes/files-in.inc.php:909
413
  msgctxt "s2member-admin"
414
  msgid "Unable to delete existing Amazon CloudFront Streaming Distro. %s"
415
  msgstr ""
@@ -417,8 +388,8 @@ msgstr ""
417
  #. translators: In this translation, `%s` may be filled with an English
418
  #. message, which comes from the Amazon CloudFront API call. Feel free to
419
  #. exclude `%s` if you like.
420
- #: s2member/includes/classes/files-in.inc.php:925
421
- #: s2member/includes/classes/files-in.inc.php:1113
422
  msgctxt "s2member-admin"
423
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. %s"
424
  msgstr ""
@@ -426,12 +397,12 @@ msgstr ""
426
  #. translators: In this translation, `%s` may be filled with an English
427
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
428
  #. if you like.
429
- #: s2member/includes/classes/files-in.inc.php:966
430
  msgctxt "s2member-admin"
431
  msgid "Unable to update existing Amazon S3 ACLs. %s"
432
  msgstr ""
433
 
434
- #: s2member/includes/classes/files-in.inc.php:969
435
  msgctxt "s2member-admin"
436
  msgid "Unable to update existing Amazon S3 ACLs. Connection failed."
437
  msgstr ""
@@ -439,14 +410,14 @@ msgstr ""
439
  #. translators: In this translation, `%s` may be filled with an English
440
  #. message, which comes from the Amazon CloudFront API call. Feel free to
441
  #. exclude `%s` if you like.
442
- #: s2member/includes/classes/files-in.inc.php:973
443
- #: s2member/includes/classes/files-in.inc.php:1408
444
  msgctxt "s2member-admin"
445
  msgid "Unable to create Amazon CloudFront Streaming Distro. %s"
446
  msgstr ""
447
 
448
- #: s2member/includes/classes/files-in.inc.php:976
449
- #: s2member/includes/classes/files-in.inc.php:1411
450
  msgctxt "s2member-admin"
451
  msgid "Unable to create Amazon CloudFront Streaming Distro. Connection failed."
452
  msgstr ""
@@ -454,14 +425,14 @@ msgstr ""
454
  #. translators: In this translation, `%s` may be filled with an English
455
  #. message, which comes from the Amazon CloudFront API call. Feel free to
456
  #. exclude `%s` if you like.
457
- #: s2member/includes/classes/files-in.inc.php:980
458
- #: s2member/includes/classes/files-in.inc.php:1386
459
  msgctxt "s2member-admin"
460
  msgid "Unable to create Amazon CloudFront Downloads Distro. %s"
461
  msgstr ""
462
 
463
- #: s2member/includes/classes/files-in.inc.php:983
464
- #: s2member/includes/classes/files-in.inc.php:1389
465
  msgctxt "s2member-admin"
466
  msgid "Unable to create Amazon CloudFront Downloads Distro. Connection failed."
467
  msgstr ""
@@ -469,19 +440,19 @@ msgstr ""
469
  #. translators: In this translation, `%s` may be filled with an English
470
  #. message, which comes from the Amazon CloudFront API call. Feel free to
471
  #. exclude `%s` if you like.
472
- #: s2member/includes/classes/files-in.inc.php:987
473
- #: s2member/includes/classes/files-in.inc.php:1159
474
  msgctxt "s2member-admin"
475
  msgid "Unable to create Amazon CloudFront Origin Access Identity. %s"
476
  msgstr ""
477
 
478
- #: s2member/includes/classes/files-in.inc.php:990
479
- #: s2member/includes/classes/files-in.inc.php:1162
480
  msgctxt "s2member-admin"
481
  msgid "Unable to create Amazon CloudFront Origin Access Identity. Connection failed."
482
  msgstr ""
483
 
484
- #: s2member/includes/classes/files-in.inc.php:993
485
  msgctxt "s2member-admin"
486
  msgid "Unable to clear existing Amazon CloudFront Origin Access Identity."
487
  msgstr ""
@@ -489,19 +460,19 @@ msgstr ""
489
  #. translators: In this translation, `%s` may be filled with an English
490
  #. message, which comes from the Amazon CloudFront API call. Feel free to
491
  #. exclude `%s` if you like.
492
- #: s2member/includes/classes/files-in.inc.php:997
493
- #: s2member/includes/classes/files-in.inc.php:1068
494
  msgctxt "s2member-admin"
495
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. %s"
496
  msgstr ""
497
 
498
- #: s2member/includes/classes/files-in.inc.php:1000
499
- #: s2member/includes/classes/files-in.inc.php:1071
500
  msgctxt "s2member-admin"
501
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. Connection failed."
502
  msgstr ""
503
 
504
- #: s2member/includes/classes/files-in.inc.php:1003
505
  msgctxt "s2member-admin"
506
  msgid "Unable to clear existing Amazon CloudFront Streaming Distro."
507
  msgstr ""
@@ -509,17 +480,17 @@ msgstr ""
509
  #. translators: In this translation, `%s` may be filled with an English
510
  #. message, which comes from the Amazon CloudFront API call. Feel free to
511
  #. exclude `%s` if you like.
512
- #: s2member/includes/classes/files-in.inc.php:1007
513
  msgctxt "s2member-admin"
514
  msgid "Unable to acquire existing Amazon CloudFront Streaming Distro. %s"
515
  msgstr ""
516
 
517
- #: s2member/includes/classes/files-in.inc.php:1010
518
  msgctxt "s2member-admin"
519
  msgid "Unable to acquire existing Amazon CloudFront Streaming Distro. Connection failed."
520
  msgstr ""
521
 
522
- #: s2member/includes/classes/files-in.inc.php:1013
523
  msgctxt "s2member-admin"
524
  msgid "Unable to clear existing Amazon CloudFront Downloads Distro."
525
  msgstr ""
@@ -527,22 +498,22 @@ msgstr ""
527
  #. translators: In this translation, `%s` may be filled with an English
528
  #. message, which comes from the Amazon CloudFront API call. Feel free to
529
  #. exclude `%s` if you like.
530
- #: s2member/includes/classes/files-in.inc.php:1017
531
  msgctxt "s2member-admin"
532
  msgid "Unable to acquire existing Amazon CloudFront Downloads Distro. %s"
533
  msgstr ""
534
 
535
- #: s2member/includes/classes/files-in.inc.php:1020
536
  msgctxt "s2member-admin"
537
  msgid "Unable to acquire existing Amazon CloudFront Downloads Distro. Connection failed."
538
  msgstr ""
539
 
540
- #: s2member/includes/classes/files-in.inc.php:1023
541
  msgctxt "s2member-admin"
542
  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."
543
  msgstr ""
544
 
545
- #: s2member/includes/classes/files-in.inc.php:1026
546
  msgctxt "s2member-admin"
547
  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."
548
  msgstr ""
@@ -550,34 +521,34 @@ msgstr ""
550
  #. translators: In this translation, `%s` may be filled with an English
551
  #. message, which comes from the Amazon CloudFront API call. Feel free to
552
  #. exclude `%s` if you like.
553
- #: s2member/includes/classes/files-in.inc.php:1064
554
  msgctxt "s2member-admin"
555
  msgid "Existing Amazon CloudFront Origin Access Identity NOT found. %s"
556
  msgstr ""
557
 
558
- #: s2member/includes/classes/files-in.inc.php:1074
559
  msgctxt "s2member-admin"
560
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. Invalid Access ID."
561
  msgstr ""
562
 
563
- #: s2member/includes/classes/files-in.inc.php:1116
564
  msgctxt "s2member-admin"
565
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. Connection failed."
566
  msgstr ""
567
 
568
- #: s2member/includes/classes/files-in.inc.php:1119
569
  msgctxt "s2member-admin"
570
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. Invalid Access ID, ETag, or XML config."
571
  msgstr ""
572
 
573
- #: s2member/includes/classes/files-in.inc.php:1146
574
- #: s2member/includes/classes/files-in.inc.php:1373
575
- #: s2member/includes/classes/files-in.inc.php:1395
576
  msgctxt "s2member-admin"
577
  msgid "Created by s2Member, for S3 Bucket: %s."
578
  msgstr ""
579
 
580
- #: s2member/includes/classes/files-in.inc.php:1155
581
  msgctxt "s2member-admin"
582
  msgid "Unable to create/read Amazon CloudFront Origin Access Identity. Unexpected response."
583
  msgstr ""
@@ -585,7 +556,7 @@ msgstr ""
585
  #. translators: In this translation, `%s` may be filled with an English
586
  #. message, which comes from the Amazon CloudFront API call. Feel free to
587
  #. exclude `%s` if you like.
588
- #: s2member/includes/classes/files-in.inc.php:1201
589
  msgctxt "s2member-admin"
590
  msgid "Existing Amazon CloudFront Distro NOT found. %s"
591
  msgstr ""
@@ -593,17 +564,17 @@ msgstr ""
593
  #. translators: In this translation, `%s` may be filled with an English
594
  #. message, which comes from the Amazon CloudFront API call. Feel free to
595
  #. exclude `%s` if you like.
596
- #: s2member/includes/classes/files-in.inc.php:1205
597
  msgctxt "s2member-admin"
598
  msgid "Unable to acquire existing Amazon CloudFront Distro. %s"
599
  msgstr ""
600
 
601
- #: s2member/includes/classes/files-in.inc.php:1208
602
  msgctxt "s2member-admin"
603
  msgid "Unable to acquire existing Amazon CloudFront Distro. Connection failed."
604
  msgstr ""
605
 
606
- #: s2member/includes/classes/files-in.inc.php:1211
607
  msgctxt "s2member-admin"
608
  msgid "Unable to acquire existing Amazon CloudFront Distro. Invalid Distro ID and/or Distro type."
609
  msgstr ""
@@ -611,24 +582,24 @@ msgstr ""
611
  #. translators: In this translation, `%s` may be filled with an English
612
  #. message, which comes from the Amazon CloudFront API call. Feel free to
613
  #. exclude `%s` if you like.
614
- #: s2member/includes/classes/files-in.inc.php:1255
615
- #: s2member/includes/classes/files-in.inc.php:1330
616
  msgctxt "s2member-admin"
617
  msgid "Unable to disable existing Amazon CloudFront Distro. %s"
618
  msgstr ""
619
 
620
- #: s2member/includes/classes/files-in.inc.php:1258
621
- #: s2member/includes/classes/files-in.inc.php:1333
622
  msgctxt "s2member-admin"
623
  msgid "Unable to disable existing Amazon CloudFront Distro. Connection failed."
624
  msgstr ""
625
 
626
- #: s2member/includes/classes/files-in.inc.php:1261
627
  msgctxt "s2member-admin"
628
  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."
629
  msgstr ""
630
 
631
- #: s2member/includes/classes/files-in.inc.php:1267
632
  msgctxt "s2member-admin"
633
  msgid "Unable to disable existing Amazon CloudFront Distro. Invalid Distro ID, ETag, or XML config."
634
  msgstr ""
@@ -636,12 +607,12 @@ msgstr ""
636
  #. translators: In this translation, `%s` may be filled with an English
637
  #. message, which comes from the Amazon CloudFront API call. Feel free to
638
  #. exclude `%s` if you like.
639
- #: s2member/includes/classes/files-in.inc.php:1312
640
  msgctxt "s2member-admin"
641
  msgid "Unable to delete existing Amazon CloudFront Distro. %s"
642
  msgstr ""
643
 
644
- #: s2member/includes/classes/files-in.inc.php:1315
645
  msgctxt "s2member-admin"
646
  msgid "Unable to delete existing Amazon CloudFront Distro. Connection failed."
647
  msgstr ""
@@ -649,7 +620,7 @@ msgstr ""
649
  #. translators: In this translation, `%s` may be filled with an English
650
  #. message, which comes from the Amazon CloudFront API call. Feel free to
651
  #. exclude `%s` if you like.
652
- #: s2member/includes/classes/files-in.inc.php:1319
653
  msgctxt "s2member-admin"
654
  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."
655
  msgstr ""
@@ -657,185 +628,185 @@ msgstr ""
657
  #. translators: In this translation, `%s` may be filled with an English
658
  #. message, which comes from the Amazon CloudFront API call. Feel free to
659
  #. exclude `%s` if you like.
660
- #: s2member/includes/classes/files-in.inc.php:1323
661
  msgctxt "s2member-admin"
662
  msgid "Unable to check status of existing Amazon CloudFront Distro. %s"
663
  msgstr ""
664
 
665
- #: s2member/includes/classes/files-in.inc.php:1326
666
  msgctxt "s2member-admin"
667
  msgid "Unable to check status of existing Amazon CloudFront Distro. Connection failed."
668
  msgstr ""
669
 
670
- #: s2member/includes/classes/files-in.inc.php:1336
671
  msgctxt "s2member-admin"
672
  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."
673
  msgstr ""
674
 
675
- #: s2member/includes/classes/files-in.inc.php:1339
676
  msgctxt "s2member-admin"
677
  msgid "Unable to delete existing Amazon CloudFront Distro. Invalid Distro ID or ETag."
678
  msgstr ""
679
 
680
- #: s2member/includes/classes/files-in.inc.php:1382
681
  msgctxt "s2member-admin"
682
  msgid "Unable to create/read Amazon CloudFront Downloads Distro. Unexpected response."
683
  msgstr ""
684
 
685
- #: s2member/includes/classes/files-in.inc.php:1404
686
  msgctxt "s2member-admin"
687
  msgid "Unable to create/read Amazon CloudFront Streaming Distro. Unexpected response."
688
  msgstr ""
689
 
690
- #: s2member/includes/classes/files-in.inc.php:1415
691
  msgctxt "s2member-admin"
692
  msgid "Unable to create Amazon CloudFront Distro. Invalid Distro type."
693
  msgstr ""
694
 
695
- #: s2member/includes/classes/login-checks.inc.php:51
696
  msgctxt "s2member-front"
697
  msgid "<strong>ERROR</strong>: Invalid username for this site."
698
  msgstr ""
699
 
700
- #: s2member/includes/classes/login-checks.inc.php:78
701
  msgctxt "s2member-front"
702
  msgid "<strong>ERROR</strong>: Max simultaneous logins for username: %1$s. Please wait %2$s and try again."
703
  msgstr ""
704
 
705
- #: s2member/includes/classes/paypal-return-in-no-tx-data.inc.php:66
706
- #: s2member/includes/classes/paypal-return-in-proxy-ty-email.inc.php:64
707
  msgctxt "s2member-front"
708
  msgid "<strong>Thank you! (you MUST check your email before proceeding).</strong><br /><br />* Note: It can take <em>(up to 15 minutes)</em> for Email Confirmation with important details. If you don't receive email confirmation in the next 15 minutes, please contact Support."
709
  msgstr ""
710
 
711
- #: s2member/includes/classes/paypal-return-in-no-tx-data.inc.php:66
712
- #: s2member/includes/classes/paypal-return-in-proxy-ty-email.inc.php:64
713
  msgctxt "s2member-front"
714
  msgid "<strong>** Sandbox Mode **</strong> You may NOT receive this Email in Sandbox Mode. Sandbox addresses are usually bogus (for testing)."
715
  msgstr ""
716
 
717
- #: s2member/includes/classes/paypal-return-in-no-tx-data.inc.php:67
718
- #: s2member/includes/classes/paypal-return-in-proxy-ty-email.inc.php:65
719
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:207
720
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:218
721
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:261
722
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:272
723
- #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:163
724
- #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:174
725
- #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:185
726
- #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:126
727
- #: s2member/includes/classes/paypal-return-in.inc.php:95
728
- #: s2member/includes/classes/paypal-return-in.inc.php:111
729
- #: s2member/includes/classes/paypal-return-in.inc.php:137
730
  msgctxt "s2member-front"
731
  msgid "Back To Home Page"
732
  msgstr ""
733
 
734
- #: s2member/includes/classes/paypal-return-in-proxy-x-preview.inc.php:64
735
  msgctxt "s2member-front"
736
  msgid "<strong>Thank you! (this is a preview, no action necessary).</strong><br /><br />* Note: each of your Customers are returned back to your site immediately after they complete checkout. This Return Page displays a message and instructions for the Customer. s2Member may change the message and instructions dynamically, based on what the Customer is actually doing <em>(i.e. based on the type of transaction that is taking place)</em>.<br /><br /><em>* With <a href=\"%s\" target=\"_blank\">s2Member Pro</a> installed, it is possible to customize this Return Page in various ways.</em>"
737
  msgstr ""
738
 
739
- #: s2member/includes/classes/paypal-return-in-proxy-x-preview.inc.php:65
740
- #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:115
741
  msgctxt "s2member-front"
742
  msgid "Continue (Click Here)"
743
  msgstr ""
744
 
745
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:195
746
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:249
747
  msgctxt "s2member-front"
748
  msgid "Thank you! You've been updated to:"
749
  msgstr ""
750
 
751
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:196
752
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:250
753
- #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:152
754
  msgctxt "s2member-front"
755
  msgid "Please Log Back In (Click Here)"
756
  msgstr ""
757
 
758
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:206
759
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:260
760
  msgctxt "s2member-front"
761
  msgid "<strong>ERROR:</strong> Unable to modify Subscription.<br />Please contact Support for assistance.<br /><br />The existing User ID is associated with an Administrator. Stopping here. Otherwise, an Administrator could lose access. Please make sure that you are NOT logged in as an Administrator while testing."
762
  msgstr ""
763
 
764
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:217
765
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:271
766
  msgctxt "s2member-front"
767
  msgid "<strong>ERROR:</strong> Unable to modify Subscription.<br />Please contact Support for assistance.<br /><br />Could not get the existing User ID from the DB."
768
  msgstr ""
769
 
770
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:228
771
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:383
772
- #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:195
773
- #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:136
774
  msgctxt "s2member-front"
775
  msgid "Thank you! Please check your email for further details regarding your purchase."
776
  msgstr ""
777
 
778
- #: s2member/includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:229
779
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:384
780
- #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:196
781
- #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:137
782
  msgctxt "s2member-front"
783
  msgid "Return to Home Page"
784
  msgstr ""
785
 
786
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:344
787
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:367
788
  msgctxt "s2member-front"
789
  msgid "<strong>Thank you! Your account has been approved.<br />The next step is to Register a Username for immediate access.</strong>"
790
  msgstr ""
791
 
792
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:345
793
- #: s2member/includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:368
794
  msgctxt "s2member-front"
795
  msgid "Please Register Now (Click Here)"
796
  msgstr ""
797
 
798
- #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:151
799
  msgctxt "s2member-front"
800
  msgid "Thank you! You now have access to:"
801
  msgstr ""
802
 
803
- #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:162
804
  msgctxt "s2member-front"
805
  msgid "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact Support for assistance.<br /><br />The existing User ID is associated with an Administrator. Stopping here. Otherwise, an Administrator could lose access. Please make sure that you are NOT logged in as an Administrator while testing."
806
  msgstr ""
807
 
808
- #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:173
809
  msgctxt "s2member-front"
810
  msgid "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact Support for assistance.<br /><br />Could not get the existing User ID from the DB."
811
  msgstr ""
812
 
813
- #: s2member/includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:184
814
  msgctxt "s2member-front"
815
  msgid "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact Support for assistance.<br /><br />Missing User/Member details."
816
  msgstr ""
817
 
818
- #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:114
819
  msgctxt "s2member-front"
820
  msgid "<strong>Thank You! Your transaction has been approved.</strong>"
821
  msgstr ""
822
 
823
- #: s2member/includes/classes/paypal-return-in-web-accept-sp.inc.php:125
824
  msgctxt "s2member-front"
825
  msgid "<strong>ERROR:</strong> Unable to generate Access Link.<br />Please contact Support for assistance."
826
  msgstr ""
827
 
828
- #: s2member/includes/classes/paypal-return-in.inc.php:94
829
  msgctxt "s2member-front"
830
  msgid "<strong>ERROR:</strong> Unexpected <code>txn_type/status</code>.<br />The <code>txn_type/status</code> did not meet requirements.<br />Please contact Support for assistance."
831
  msgstr ""
832
 
833
- #: s2member/includes/classes/paypal-return-in.inc.php:110
834
  msgctxt "s2member-front"
835
  msgid "<strong>ERROR:</strong> Unable to verify <code>$_SERVER[\"HTTP_HOST\"]</code>.<br />Please contact Support for assistance.<br /><br />If you are the site owner, please check the <code>custom</code> value in your Button Code. It MUST start with your domain name."
836
  msgstr ""
837
 
838
- #: s2member/includes/classes/paypal-return-in.inc.php:136
839
  msgctxt "s2member-front"
840
  msgid "<strong>ERROR:</strong> Unable to verify <code>$_POST</code> vars.<br />Please contact Support for assistance.<br /><br />This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility. If you are the site owner, and you're absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure <code>$_POST</code> variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.<br /><br />s2Member uses the <code>WP_Http</code> class for remote connections; which will try to use <code>cURL</code> first, and then fall back on the <code>FOPEN</code> method when <code>cURL</code> is not available. On a Windows server, you may have to disable your <code>cURL</code> extension; and instead, set <code>allow_url_fopen = yes</code> in your php.ini file. The <code>cURL</code> extension (usually) does NOT support SSL connections on a Windows server.<br /><br />Please see <a href=\"http://www.s2member.com/forums/topic/ideal-server-configuration-for-s2member/\" target=\"_blank\">this thread</a> for details regarding the ideal server configuration for s2Member."
841
  msgstr ""
@@ -844,27 +815,25 @@ msgstr ""
844
  #. by PayPal. Replace `%2$s` and `%3$s` with: `Unable to process, please try
845
  #. again`, or something to that affect. Or, if you prefer, you could Filter
846
  #. ``$response["__error"]`` with `ws_plugin__s2member_paypal_api_response`.
847
- #: s2member/includes/classes/paypal-utilities.inc.php:185
848
  msgctxt "s2member-front"
849
  msgid "Error #%1$s. %2$s. %3$s."
850
  msgstr ""
851
 
852
- #: s2member/includes/classes/paypal-utilities.inc.php:188
853
- #: s2member/includes/classes/paypal-utilities.inc.php:316
854
- #: s2member/includes/classes/paypal-utilities.inc.php:324
855
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:97
856
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:325
857
  msgctxt "s2member-front"
858
  msgid "Error. Please contact Support for assistance."
859
  msgstr ""
860
 
861
- #: s2member/includes/classes/paypal-utilities.inc.php:232
862
- #: s2member/includes/classes/paypal-utilities.inc.php:238
863
  msgctxt "s2member-front"
864
  msgid "Error #%s. Transaction declined. Please use an alternate funding source."
865
  msgstr ""
866
 
867
- #: s2member/includes/classes/paypal-utilities.inc.php:235
868
  msgctxt "s2member-front"
869
  msgid "Error #%s. Transaction declined. Express Checkout was NOT confirmed."
870
  msgstr ""
@@ -873,175 +842,148 @@ msgstr ""
873
  #. Replace `%2$s` with: `Unable to process, please try again`, or something to
874
  #. that affect. Or, if you prefer, you could Filter ``$response["__error"]``
875
  #. with `ws_plugin__s2member_paypal_payflow_api_response`.
876
- #. translators: Exclude `%2$s`. This is an English error returned by
877
- #. Authorize.Net. Please replace `%2$s` with: `Unable to process, please try
878
- #. again`, or something to that affect. Or, if you prefer, you could Filter
879
- #. ``$response["__error"]`` with
880
- #. `ws_plugin__s2member_pro_authnet_aim_response`.
881
- #. translators: Exclude `%2$s`. This is an English error returned by
882
- #. Authorize.Net. Please replace `%2$s` with: `Unable to process, please try
883
- #. again`, or something to that affect. Or, if you prefer, you could Filter
884
- #. ``$response["__error"]`` with
885
- #. `ws_plugin__s2member_pro_authnet_arb_response`.
886
- #: s2member/includes/classes/paypal-utilities.inc.php:314
887
- #: s2member/includes/classes/paypal-utilities.inc.php:322
888
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:94
889
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:322
890
  msgctxt "s2member-front"
891
  msgid "Error #%1$s. %2$s."
892
  msgstr ""
893
 
894
- #: s2member/includes/classes/paypal-utilities.inc.php:369
895
  msgctxt "s2member-front"
896
  msgid " Please contact PayPal Merchant Technical Support (www.paypal.com/mts) and request `Recurring Billing` service, and also ask to have `Reference Transactions` enabled for Recurring Billing via Express Checkout."
897
  msgstr ""
898
 
899
- #: s2member/includes/classes/profile-in.inc.php:76
900
- #: s2member/includes/classes/sc-profile-in.inc.php:94
901
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:130
902
  msgctxt "s2member-front"
903
  msgid "Username"
904
  msgstr ""
905
 
906
- #: s2member/includes/classes/profile-in.inc.php:76
907
- #: s2member/includes/classes/sc-profile-in.inc.php:94
908
  msgctxt "s2member-front"
909
  msgid "(cannot be changed)"
910
  msgstr ""
911
 
912
- #: s2member/includes/classes/profile-in.inc.php:95
913
- #: s2member/includes/classes/sc-profile-in.inc.php:113
914
- #: s2member-pro/s2member-pro/includes/separates/gateways/google/google-min.js:1
915
- #: s2member-pro/s2member-pro/includes/separates/gateways/google/google.js:39
916
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:78
917
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:59
918
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:78
919
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:78
920
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-registration-form.php:59
921
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:78
922
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:78
923
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-registration-form.php:59
924
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:78
925
  msgctxt "s2member-front"
926
  msgid "Email Address"
927
  msgstr ""
928
 
929
- #: s2member/includes/classes/profile-in.inc.php:154
930
- #: s2member/includes/classes/sc-profile-in.inc.php:172
931
  msgctxt "s2member-front"
932
  msgid "Display Name"
933
  msgstr ""
934
 
935
- #: s2member/includes/classes/profile-in.inc.php:226
936
- #: s2member/includes/classes/sc-profile-in.inc.php:244
937
  msgctxt "s2member-front"
938
  msgid "New Password?"
939
  msgstr ""
940
 
941
- #: s2member/includes/classes/profile-in.inc.php:226
942
- #: s2member/includes/classes/sc-profile-in.inc.php:244
943
  msgctxt "s2member-front"
944
  msgid "(please type it twice)"
945
  msgstr ""
946
 
947
- #: s2member/includes/classes/profile-in.inc.php:227
948
- #: s2member/includes/classes/sc-profile-in.inc.php:245
949
  msgctxt "s2member-front"
950
  msgid "Only if changing password, otherwise leave blank."
951
  msgstr ""
952
 
953
- #: s2member/includes/classes/profile-in.inc.php:272
954
- #: s2member/includes/classes/sc-profile-in.inc.php:291
955
  msgctxt "s2member-front"
956
  msgid "Save All Changes"
957
  msgstr ""
958
 
959
- #: s2member/includes/classes/profile-mods-in.inc.php:149
960
- #: s2member/includes/classes/profile-mods-in.inc.php:150
961
- #: s2member/includes/classes/profile-mods-in.inc.php:151
962
- #: s2member/includes/classes/sc-profile-in.inc.php:71
963
  msgctxt "s2member-front"
964
  msgid "Profile updated successfully."
965
  msgstr ""
966
 
967
- #: s2member/includes/classes/register-in.inc.php:48
968
- #: s2member/includes/classes/sp-access.inc.php:132
969
  msgctxt "s2member-front"
970
  msgid "<strong>Your Link Expired:</strong><br />Please contact Support if you need assistance."
971
  msgstr ""
972
 
973
- #: s2member/includes/classes/registrations.inc.php:579
974
  msgctxt "s2member-front"
975
  msgid "s2Member security violation. You attempted to POST administrative variables that will NOT be trusted in a NON-administrative zone!"
976
  msgstr ""
977
 
978
- #: s2member/includes/classes/return-templates.inc.php:51
979
  msgctxt "s2member-front"
980
  msgid "Continue"
981
  msgstr ""
982
 
983
- #: s2member/includes/classes/return-templates.inc.php:52
984
  msgctxt "s2member-front"
985
  msgid "Thank you. Please click the link below."
986
  msgstr ""
987
 
988
- #: s2member/includes/classes/return-templates.inc.php:70
989
  msgctxt "s2member-front"
990
  msgid "[ %s ] <strong><em>says&hellip;</em></strong>"
991
  msgstr ""
992
 
993
- #: s2member/includes/classes/return-templates.inc.php:74
994
  msgctxt "s2member-front"
995
  msgid "If you need assistance, please <a href=\"%s\" target=\"_blank\">contact support</a>."
996
  msgstr ""
997
 
998
- #: s2member/includes/classes/sc-paypal-button-e.inc.php:77
999
- #: s2member/includes/classes/sc-paypal-button-in.inc.php:73
1000
- #: s2member/includes/classes/sc-paypal-button-in.inc.php:97
1001
- #: s2member/includes/classes/sc-paypal-button-in.inc.php:152
1002
- #: s2member/includes/classes/sc-paypal-button-in.inc.php:208
1003
- #: s2member/includes/templates/buttons/paypal-cancellation-button.php:7
1004
- #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:34
1005
- #: s2member/includes/templates/buttons/paypal-checkout-button.php:46
1006
- #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:34
1007
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1008
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:293
1009
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:593
1010
  msgctxt "s2member-front paypal-button-lang-code"
1011
  msgid "en_US"
1012
  msgstr ""
1013
 
1014
- #: s2member/includes/classes/translations.inc.php:80
1015
  msgctxt "s2member-front"
1016
  msgid "Username:"
1017
  msgstr ""
1018
 
1019
- #: s2member/includes/classes/translations.inc.php:84
1020
  msgctxt "s2member-front"
1021
  msgid "My Password:"
1022
  msgstr ""
1023
 
1024
- #: s2member/includes/classes/translations.inc.php:91
1025
  msgctxt "s2member-front"
1026
  msgid "Username *"
1027
  msgstr ""
1028
 
1029
- #: s2member/includes/classes/translations.inc.php:95
1030
  msgctxt "s2member-front"
1031
  msgid "Password *"
1032
  msgstr ""
1033
 
1034
- #: s2member/includes/classes/translations.inc.php:99
1035
  msgctxt "s2member-front"
1036
  msgid "Email Address *"
1037
  msgstr ""
1038
 
1039
- #: s2member/includes/classes/translations.inc.php:106
1040
  msgctxt "s2member-front"
1041
  msgid "Registration complete. Please log in."
1042
  msgstr ""
1043
 
1044
- #: s2member/includes/classes/translations.inc.php:113
1045
  msgctxt "s2member-front"
1046
  msgid ""
1047
  "You have been invited to join `%1$s` at\n"
@@ -1050,252 +992,252 @@ msgid ""
1050
  "%4$s\n"
1051
  msgstr ""
1052
 
1053
- #: s2member/includes/classes/translations.inc.php:120
1054
  msgctxt "s2member-front"
1055
  msgid "Your account is now active. <a href=\"%1$s\">Visit site</a> or <a href=\"%2$s\">Log in</a>."
1056
  msgstr ""
1057
 
1058
- #: s2member/includes/classes/translations.inc.php:140
1059
- #: s2member/includes/classes/translations.inc.php:161
1060
  msgctxt "s2member-front"
1061
  msgid "By filling out the form below, you can <strong>add a site to your account</strong>."
1062
  msgstr ""
1063
 
1064
- #: s2member/includes/classes/translations.inc.php:140
1065
  msgctxt "s2member-front"
1066
  msgid "You may create <strong>%s</strong> site."
1067
  msgid_plural "You may create up to <strong>%s</strong> sites."
1068
  msgstr[0] ""
1069
  msgstr[1] ""
1070
 
1071
- #: s2member/includes/classes/translations.inc.php:161
1072
  msgctxt "s2member-front"
1073
  msgid "You may create up to <strong>%s</strong> site."
1074
  msgid_plural "You may create up to <strong>%s</strong> sites."
1075
  msgstr[0] ""
1076
  msgstr[1] ""
1077
 
1078
- #: s2member/includes/classes/users-list-in.inc.php:345
1079
  msgctxt "s2member-front"
1080
  msgid "Additional Profile Fields"
1081
  msgstr ""
1082
 
1083
- #: s2member/includes/classes/users-list-in.inc.php:345
1084
  msgctxt "s2member-front"
1085
  msgid "(for this site)"
1086
  msgstr ""
1087
 
1088
- #: s2member/includes/classes/utils-time.inc.php:55
1089
  msgctxt "s2member-front"
1090
  msgid "less than a minute"
1091
  msgstr ""
1092
 
1093
- #: s2member/includes/classes/utils-time.inc.php:56
1094
  msgctxt "s2member-front"
1095
  msgid "1 minute"
1096
  msgstr ""
1097
 
1098
- #: s2member/includes/classes/utils-time.inc.php:57
1099
  msgctxt "s2member-front"
1100
  msgid "%s minute"
1101
  msgid_plural "%s minutes"
1102
  msgstr[0] ""
1103
  msgstr[1] ""
1104
 
1105
- #: s2member/includes/classes/utils-time.inc.php:58
1106
  msgctxt "s2member-front"
1107
  msgid "about 1 hour"
1108
  msgstr ""
1109
 
1110
- #: s2member/includes/classes/utils-time.inc.php:64
1111
  msgctxt "s2member-front"
1112
  msgid "1 hour"
1113
  msgstr ""
1114
 
1115
- #: s2member/includes/classes/utils-time.inc.php:65
1116
  msgctxt "s2member-front"
1117
  msgid "%s hour"
1118
  msgid_plural "%s hours"
1119
  msgstr[0] ""
1120
  msgstr[1] ""
1121
 
1122
- #: s2member/includes/classes/utils-time.inc.php:66
1123
  msgctxt "s2member-front"
1124
  msgid "about 1 day"
1125
  msgstr ""
1126
 
1127
- #: s2member/includes/classes/utils-time.inc.php:72
1128
  msgctxt "s2member-front"
1129
  msgid "1 day"
1130
  msgstr ""
1131
 
1132
- #: s2member/includes/classes/utils-time.inc.php:73
1133
  msgctxt "s2member-front"
1134
  msgid "%s day"
1135
  msgid_plural "%s days"
1136
  msgstr[0] ""
1137
  msgstr[1] ""
1138
 
1139
- #: s2member/includes/classes/utils-time.inc.php:74
1140
  msgctxt "s2member-front"
1141
  msgid "about 1 week"
1142
  msgstr ""
1143
 
1144
- #: s2member/includes/classes/utils-time.inc.php:80
1145
  msgctxt "s2member-front"
1146
  msgid "1 week"
1147
  msgstr ""
1148
 
1149
- #: s2member/includes/classes/utils-time.inc.php:81
1150
  msgctxt "s2member-front"
1151
  msgid "%s week"
1152
  msgid_plural "%s weeks"
1153
  msgstr[0] ""
1154
  msgstr[1] ""
1155
 
1156
- #: s2member/includes/classes/utils-time.inc.php:82
1157
  msgctxt "s2member-front"
1158
  msgid "about 1 month"
1159
  msgstr ""
1160
 
1161
- #: s2member/includes/classes/utils-time.inc.php:88
1162
  msgctxt "s2member-front"
1163
  msgid "1 month"
1164
  msgstr ""
1165
 
1166
- #: s2member/includes/classes/utils-time.inc.php:89
1167
  msgctxt "s2member-front"
1168
  msgid "%s month"
1169
  msgid_plural "%s months"
1170
  msgstr[0] ""
1171
  msgstr[1] ""
1172
 
1173
- #: s2member/includes/classes/utils-time.inc.php:90
1174
  msgctxt "s2member-front"
1175
  msgid "about 1 year"
1176
  msgstr ""
1177
 
1178
- #: s2member/includes/classes/utils-time.inc.php:96
1179
  msgctxt "s2member-front"
1180
  msgid "1 year"
1181
  msgstr ""
1182
 
1183
- #: s2member/includes/classes/utils-time.inc.php:97
1184
  msgctxt "s2member-front"
1185
  msgid "%s year"
1186
  msgid_plural "%s years"
1187
  msgstr[0] ""
1188
  msgstr[1] ""
1189
 
1190
- #: s2member/includes/classes/utils-time.inc.php:241
1191
  msgctxt "s2member-front"
1192
  msgid "Daily"
1193
  msgstr ""
1194
 
1195
- #: s2member/includes/classes/utils-time.inc.php:241
1196
  msgctxt "s2member-front"
1197
  msgid "Weekly"
1198
  msgstr ""
1199
 
1200
- #: s2member/includes/classes/utils-time.inc.php:241
1201
  msgctxt "s2member-front"
1202
  msgid "Monthly"
1203
  msgstr ""
1204
 
1205
- #: s2member/includes/classes/utils-time.inc.php:241
1206
  msgctxt "s2member-front"
1207
  msgid "Yearly"
1208
  msgstr ""
1209
 
1210
- #: s2member/includes/classes/utils-time.inc.php:241
1211
- #: s2member/includes/classes/utils-time.inc.php:252
1212
  msgctxt "s2member-front"
1213
  msgid "Lifetime"
1214
  msgstr ""
1215
 
1216
- #: s2member/includes/classes/utils-time.inc.php:245
1217
  msgctxt "s2member-front"
1218
  msgid "Bi-Weekly"
1219
  msgstr ""
1220
 
1221
- #: s2member/includes/classes/utils-time.inc.php:246
1222
  msgctxt "s2member-front"
1223
  msgid "Bi-Monthly"
1224
  msgstr ""
1225
 
1226
- #: s2member/includes/classes/utils-time.inc.php:247
1227
  msgctxt "s2member-front"
1228
  msgid "Quarterly"
1229
  msgstr ""
1230
 
1231
- #: s2member/includes/classes/utils-time.inc.php:248
1232
  msgctxt "s2member-front"
1233
  msgid "Semi-Yearly"
1234
  msgstr ""
1235
 
1236
- #: s2member/includes/classes/utils-time.inc.php:252
1237
  msgctxt "s2member-front"
1238
  msgid "Day"
1239
  msgstr ""
1240
 
1241
- #: s2member/includes/classes/utils-time.inc.php:252
1242
  msgctxt "s2member-front"
1243
  msgid "Week"
1244
  msgstr ""
1245
 
1246
- #: s2member/includes/classes/utils-time.inc.php:252
1247
  msgctxt "s2member-front"
1248
  msgid "Month"
1249
  msgstr ""
1250
 
1251
- #: s2member/includes/classes/utils-time.inc.php:252
1252
  msgctxt "s2member-front"
1253
  msgid "Year"
1254
  msgstr ""
1255
 
1256
- #: s2member/includes/classes/utils-time.inc.php:258
1257
  msgctxt "s2member-front"
1258
  msgid "Days"
1259
  msgstr ""
1260
 
1261
- #: s2member/includes/classes/utils-time.inc.php:258
1262
  msgctxt "s2member-front"
1263
  msgid "Weeks"
1264
  msgstr ""
1265
 
1266
- #: s2member/includes/classes/utils-time.inc.php:258
1267
  msgctxt "s2member-front"
1268
  msgid "Months"
1269
  msgstr ""
1270
 
1271
- #: s2member/includes/classes/utils-time.inc.php:258
1272
  msgctxt "s2member-front"
1273
  msgid "Years"
1274
  msgstr ""
1275
 
1276
- #: s2member/includes/classes/utils-time.inc.php:258
1277
  msgctxt "s2member-front"
1278
  msgid "Lifetimes"
1279
  msgstr ""
1280
 
1281
  #. translators: Each cycle ( i.e. `each day/week/month` or `every 2
1282
  #. days/weeks/months`, etc. ). Cycles are translated elsewhere.
1283
- #: s2member/includes/classes/utils-time.inc.php:295
1284
- #: s2member/includes/classes/utils-time.inc.php:338
1285
  msgctxt "s2member-front"
1286
  msgid "each %2$s"
1287
  msgid_plural "every %1$s %3$s"
1288
  msgstr[0] ""
1289
  msgstr[1] ""
1290
 
1291
- #: s2member/includes/classes/utils-time.inc.php:298
1292
  msgctxt "s2member-front"
1293
  msgid "lifetime"
1294
  msgstr ""
1295
 
1296
  #. translators: Membership cycle ( i.e. `1 day/week/month` or `2
1297
  #. days/weeks/months`, etc. ). Most of this is translated elsewhere.
1298
- #: s2member/includes/classes/utils-time.inc.php:302
1299
  msgctxt "s2member-front"
1300
  msgid "%1$s %2$s"
1301
  msgid_plural "%1$s %3$s"
@@ -1304,239 +1246,174 @@ msgstr[1] ""
1304
 
1305
  #. translators: Cycle ( i.e. `for 1 day/week/month` or `for 2
1306
  #. days/weeks/months`, etc. ). Most of this is translated elsewhere.
1307
- #: s2member/includes/classes/utils-time.inc.php:345
1308
  msgctxt "s2member-front"
1309
  msgid "for %1$s %2$s"
1310
  msgid_plural "for %1$s %3$s"
1311
  msgstr[0] ""
1312
  msgstr[1] ""
1313
 
1314
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:35
1315
  msgctxt "s2member-front"
1316
  msgid "— Confirm File Download —"
1317
  msgstr ""
1318
 
1319
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:36
1320
  msgctxt "s2member-front"
1321
  msgid "You`ve downloaded %s protected %s in the last %s."
1322
  msgstr ""
1323
 
1324
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:36
1325
  msgctxt "s2member-front"
1326
  msgid "file"
1327
  msgstr ""
1328
 
1329
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:36
1330
  msgctxt "s2member-front"
1331
  msgid "files"
1332
  msgstr ""
1333
 
1334
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:36
1335
  msgctxt "s2member-front"
1336
  msgid "24 hours"
1337
  msgstr ""
1338
 
1339
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:36
1340
  msgctxt "s2member-front"
1341
  msgid "%s days"
1342
  msgstr ""
1343
 
1344
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:37
1345
  msgctxt "s2member-front"
1346
  msgid "You`re entitled to UNLIMITED downloads though (so, no worries)."
1347
  msgstr ""
1348
 
1349
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:37
1350
  msgctxt "s2member-front"
1351
  msgid "You`re entitled to %s unique %s %s."
1352
  msgstr ""
1353
 
1354
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:37
1355
  msgctxt "s2member-front"
1356
  msgid "download"
1357
  msgstr ""
1358
 
1359
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:37
1360
  msgctxt "s2member-front"
1361
  msgid "downloads"
1362
  msgstr ""
1363
 
1364
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:37
1365
  msgctxt "s2member-front"
1366
  msgid "each day"
1367
  msgstr ""
1368
 
1369
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:37
1370
  msgctxt "s2member-front"
1371
  msgid "every %s-day period"
1372
  msgstr ""
1373
 
1374
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:84
1375
- #: s2member/includes/s2member.js:89 s2member/includes/s2member.js:94
1376
- #: s2member/includes/s2member.js:125 s2member/includes/s2member.js:180
1377
- #: s2member/includes/s2member.js:185 s2member/includes/s2member.js:190
1378
- #: s2member/includes/s2member.js:219 s2member/includes/s2member.js:248
1379
- #: s2member/includes/s2member.js:273
1380
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1381
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:66
1382
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:73
1383
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:160
1384
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:167
1385
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:255
1386
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:262
1387
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:269
1388
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:276
1389
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:520
1390
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:527
1391
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:792
1392
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:799
1393
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:806
1394
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:813
1395
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1396
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:66
1397
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:73
1398
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:160
1399
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:167
1400
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:255
1401
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:262
1402
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:269
1403
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:276
1404
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:568
1405
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:575
1406
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:888
1407
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:895
1408
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:902
1409
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:909
1410
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
1411
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:101
1412
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:106
1413
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:187
1414
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:192
1415
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:197
1416
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:202
1417
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:312
1418
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:317
1419
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:595
1420
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:600
1421
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:605
1422
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:610
1423
  msgctxt "s2member-front"
1424
  msgid "— Oops, you missed something: —"
1425
  msgstr ""
1426
 
1427
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:89
1428
- #: s2member/includes/s2member.js:185
1429
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1430
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:262
1431
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:799
1432
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1433
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:262
1434
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:895
1435
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
1436
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:192
1437
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:600
1438
  msgctxt "s2member-front"
1439
  msgid "Passwords do not match up. Please try again."
1440
  msgstr ""
1441
 
1442
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:94
1443
- #: s2member/includes/s2member.js:190
1444
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
1445
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:269
1446
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:806
1447
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
1448
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:269
1449
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:902
1450
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
1451
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:197
1452
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:605
1453
  msgctxt "s2member-front"
1454
  msgid "Password MUST be at least 6 characters. Please try again."
1455
  msgstr ""
1456
 
1457
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:313
1458
  msgctxt "s2member-front"
1459
  msgid "Strength indicator"
1460
  msgstr ""
1461
 
1462
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:314
1463
  msgctxt "s2member-front"
1464
  msgid "Very weak"
1465
  msgstr ""
1466
 
1467
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:315
1468
  msgctxt "s2member-front"
1469
  msgid "Weak"
1470
  msgstr ""
1471
 
1472
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:316
1473
  msgctxt "s2member-front"
1474
  msgid "Medium"
1475
  msgstr ""
1476
 
1477
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:317
1478
  msgctxt "s2member-front"
1479
  msgid "Strong"
1480
  msgstr ""
1481
 
1482
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:318
1483
  msgctxt "s2member-front"
1484
  msgid "Mismatch"
1485
  msgstr ""
1486
 
1487
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:384
1488
  msgctxt "s2member-front"
1489
  msgid "Must be an integer > 0 (whole number, no decimals, greater than 0)."
1490
  msgstr ""
1491
 
1492
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:392
1493
  msgctxt "s2member-front"
1494
  msgid "Must be a float > 0 (floating point number, decimals required, greater than 0)."
1495
  msgstr ""
1496
 
1497
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:404
1498
  msgctxt "s2member-front"
1499
  msgid ""
1500
  "Please use a personal email address.\n"
1501
  "Addresses like <%s@> are problematic."
1502
  msgstr ""
1503
 
1504
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:424
1505
  msgctxt "s2member-front"
1506
  msgid "Must be a Canadian zipcode (6 alpha-numerics w/possible space)."
1507
  msgstr ""
1508
 
1509
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:432
1510
  msgctxt "s2member-front"
1511
  msgid "Please use alphanumerics, spaces & punctuation only."
1512
  msgstr ""
1513
 
1514
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:436
1515
  msgctxt "s2member-front"
1516
  msgid "Please use alphanumerics & spaces only."
1517
  msgstr ""
1518
 
1519
- #: s2member/includes/s2member-min.js:1 s2member/includes/s2member.js:440
1520
  msgctxt "s2member-front"
1521
  msgid "Please use alphanumerics & punctuation only (no spaces)."
1522
  msgstr ""
1523
 
1524
- #: s2member/includes/syscon.inc.php:84
1525
  msgctxt "s2member-front recaptcha-lang-code"
1526
  msgid "en"
1527
  msgstr ""
1528
 
1529
- #: s2member/includes/syscon.inc.php:154
1530
  msgctxt "s2member-front"
1531
  msgid "Yes, I want to receive updates via email."
1532
  msgstr ""
1533
 
1534
- #: s2member/includes/syscon.inc.php:210
1535
  msgctxt "s2member-front"
1536
  msgid "[%s] Username/Password"
1537
  msgstr ""
1538
 
1539
- #: s2member/includes/syscon.inc.php:211
1540
  msgctxt "s2member-front"
1541
  msgid ""
1542
  "Your Username/Password for:\n"
@@ -1547,12 +1424,12 @@ msgid ""
1547
  "%%%%wp_login_url%%%%"
1548
  msgstr ""
1549
 
1550
- #: s2member/includes/syscon.inc.php:214
1551
  msgctxt "s2member-front"
1552
  msgid "[%s] New User Registration"
1553
  msgstr ""
1554
 
1555
- #: s2member/includes/syscon.inc.php:215
1556
  msgctxt "s2member-front"
1557
  msgid ""
1558
  "New User Registration on your site:\n"
@@ -1564,13 +1441,12 @@ msgid ""
1564
  "IP Address: %%%%user_ip%%%%"
1565
  msgstr ""
1566
 
1567
- #: s2member/includes/syscon.inc.php:237
1568
- #: s2member-pro/s2member-pro/includes/syscon.inc.php:95
1569
  msgctxt "s2member-front"
1570
  msgid "Congratulations! (your membership has been approved)"
1571
  msgstr ""
1572
 
1573
- #: s2member/includes/syscon.inc.php:238
1574
  msgctxt "s2member-front"
1575
  msgid ""
1576
  "Thanks %%%%first_name%%%%! Your membership has been approved.\n"
@@ -1586,12 +1462,12 @@ msgid ""
1586
  "%s"
1587
  msgstr ""
1588
 
1589
- #: s2member/includes/syscon.inc.php:241 s2member/includes/syscon.inc.php:245
1590
  msgctxt "s2member-front"
1591
  msgid "Thank you! Your account has been updated."
1592
  msgstr ""
1593
 
1594
- #: s2member/includes/syscon.inc.php:242 s2member/includes/syscon.inc.php:246
1595
  msgctxt "s2member-front"
1596
  msgid ""
1597
  "Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n"
@@ -1602,13 +1478,12 @@ msgid ""
1602
  "%s"
1603
  msgstr ""
1604
 
1605
- #: s2member/includes/syscon.inc.php:249
1606
- #: s2member-pro/s2member-pro/includes/syscon.inc.php:99
1607
  msgctxt "s2member-front"
1608
  msgid "Thank You! (instructions for access)"
1609
  msgstr ""
1610
 
1611
- #: s2member/includes/syscon.inc.php:250
1612
  msgctxt "s2member-front"
1613
  msgid ""
1614
  "Thanks %%%%first_name%%%%!\n"
@@ -1625,3563 +1500,530 @@ msgid ""
1625
  "%s"
1626
  msgstr ""
1627
 
1628
- #: s2member/includes/syscon.inc.php:289
1629
  msgctxt "s2member-front"
1630
  msgid "Free Subscriber"
1631
  msgstr ""
1632
 
1633
- #: s2member/includes/syscon.inc.php:289
1634
  msgctxt "s2member-front"
1635
  msgid "Bronze Member"
1636
  msgstr ""
1637
 
1638
- #: s2member/includes/syscon.inc.php:289
1639
  msgctxt "s2member-front"
1640
  msgid "Silver Member"
1641
  msgstr ""
1642
 
1643
- #: s2member/includes/syscon.inc.php:289
1644
  msgctxt "s2member-front"
1645
  msgid "Gold Member"
1646
  msgstr ""
1647
 
1648
- #: s2member/includes/syscon.inc.php:289
1649
  msgctxt "s2member-front"
1650
  msgid "Platinum Member"
1651
  msgstr ""
1652
 
1653
- #: s2member/includes/syscon.inc.php:289
1654
  msgctxt "s2member-front"
1655
  msgid "Level %s Member"
1656
  msgstr ""
1657
 
1658
- #: s2member/includes/templates/badges/s-badge.php:22
1659
  msgctxt "s2member-front"
1660
  msgid "s2Member&reg; ( Security for WordPress&reg; )"
1661
  msgstr ""
1662
 
1663
- #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:9
1664
- #: s2member/includes/templates/buttons/paypal-checkout-button.php:9
1665
- #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:9
1666
  msgctxt "s2member-admin"
1667
  msgid "Instant Payment Notification & Return Page Details"
1668
  msgstr ""
1669
 
1670
- #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:14
1671
- #: s2member/includes/templates/buttons/paypal-checkout-button.php:14
1672
- #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:14
1673
  msgctxt "s2member-admin"
1674
  msgid "Configures Basic Checkout Fields"
1675
  msgstr ""
1676
 
1677
- #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:22
1678
- #: s2member/includes/templates/buttons/paypal-checkout-button.php:22
1679
- #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:22
1680
- #: s2member/includes/templates/shortcodes/paypal-ccaps-checkout-button-shortcode.php:6
1681
- #: s2member/includes/templates/shortcodes/paypal-checkout-button-shortcode.php:6
1682
- #: s2member/includes/templates/shortcodes/paypal-sp-checkout-button-shortcode.php:6
1683
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/alipay-ccaps-checkout-button-shortcode.php:6
1684
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/alipay-checkout-button-shortcode.php:6
1685
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/alipay-sp-checkout-button-shortcode.php:6
1686
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/authnet-ccaps-checkout-form-shortcode.php:6
1687
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/authnet-checkout-form-shortcode.php:6
1688
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/authnet-sp-checkout-form-shortcode.php:6
1689
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/ccbill-ccaps-checkout-button-shortcode.php:6
1690
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/ccbill-checkout-button-shortcode.php:6
1691
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/ccbill-sp-checkout-button-shortcode.php:6
1692
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/clickbank-ccaps-checkout-button-shortcode.php:6
1693
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/clickbank-checkout-button-shortcode.php:6
1694
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/clickbank-sp-checkout-button-shortcode.php:6
1695
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/google-ccaps-checkout-button-shortcode.php:6
1696
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/google-checkout-button-shortcode.php:6
1697
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/google-sp-checkout-button-shortcode.php:6
1698
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/paypal-ccaps-checkout-form-shortcode.php:6
1699
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/paypal-checkout-form-shortcode.php:6
1700
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/paypal-sp-checkout-form-shortcode.php:6
1701
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/stripe-ccaps-checkout-form-shortcode.php:6
1702
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/stripe-checkout-form-shortcode.php:6
1703
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/stripe-sp-checkout-form-shortcode.php:6
1704
  msgctxt "s2member-admin"
1705
  msgid "Description and pricing details here."
1706
  msgstr ""
1707
 
1708
- #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:25
1709
- #: s2member/includes/templates/buttons/paypal-checkout-button.php:24
1710
- #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:25
1711
  msgctxt "s2member-admin"
1712
  msgid "Configures s2Member's Unique Invoice ID/Code"
1713
  msgstr ""
1714
 
1715
- #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:27
1716
- #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:27
1717
  msgctxt "s2member-admin"
1718
  msgid "Associates Purchase With A User/Member (when/if applicable)"
1719
  msgstr ""
1720
 
1721
- #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:30
1722
- #: s2member/includes/templates/buttons/paypal-checkout-button.php:29
1723
- #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:30
1724
  msgctxt "s2member-admin"
1725
  msgid "Identifies The Customer's IP Address For Tracking"
1726
  msgstr ""
1727
 
1728
- #: s2member/includes/templates/buttons/paypal-ccaps-checkout-button.php:33
1729
- #: s2member/includes/templates/buttons/paypal-checkout-button.php:45
1730
- #: s2member/includes/templates/buttons/paypal-sp-checkout-button.php:33
1731
  msgctxt "s2member-admin"
1732
  msgid "Displays The PayPal Image Button"
1733
  msgstr ""
1734
 
1735
- #: s2member/includes/templates/buttons/paypal-checkout-button.php:26
1736
  msgctxt "s2member-admin"
1737
  msgid "Identifies/Updates An Existing User/Member (when/if applicable)"
1738
  msgstr ""
1739
 
1740
- #: s2member/includes/templates/buttons/paypal-checkout-button.php:32
1741
  msgctxt "s2member-admin"
1742
  msgid "Controls Modify Behavior At PayPal Checkout"
1743
  msgstr ""
1744
 
1745
- #: s2member/includes/templates/buttons/paypal-checkout-button.php:34
1746
  msgctxt "s2member-admin"
1747
  msgid "Customizes Prices, Payments & Billing Cycle"
1748
  msgstr ""
1749
 
1750
- #: s2member/includes/templates/errors/ip-restrictions.php:10
1751
  msgctxt "s2member-front"
1752
  msgid "503: Service Temporarily Unavailable"
1753
  msgstr ""
1754
 
1755
- #: s2member/includes/templates/errors/ip-restrictions.php:13
1756
  msgctxt "s2member-front"
1757
  msgid "<strong>503: Service Temporarily Unavailable</strong><br />Too many IP addresses accessing one secure area<em>!</em><br />Please contact Support if you need assistance."
1758
  msgstr ""
1759
 
1760
- #: s2member/includes/templates/options/paypal-currencies.php:6
1761
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-currencies.php:6
1762
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-currencies.php:6
1763
- #: s2member-pro/s2member-pro/includes/templates/options/google-currencies.php:6
1764
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-currencies.php:6
1765
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-currencies.php:6
1766
  msgctxt "s2member-admin"
1767
  msgid "Currency"
1768
  msgstr ""
1769
 
1770
- #: s2member/includes/templates/options/paypal-membership-ccap-terms.php:6
1771
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:43
1772
  msgctxt "s2member-admin"
1773
  msgid "PayPal (Buy Now)"
1774
  msgstr ""
1775
 
1776
- #: s2member/includes/templates/options/paypal-membership-ccap-terms.php:7
1777
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-ccap-terms.php:7
1778
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-ccap-terms.php:7
1779
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-ccap-terms.php:7
1780
  msgctxt "s2member-admin"
1781
  msgid "One Time (for lifetime access, non-recurring)"
1782
  msgstr ""
1783
 
1784
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:6
1785
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:19
1786
  msgctxt "s2member-admin"
1787
  msgid "PayPal® (Subscriptions)"
1788
  msgstr ""
1789
 
1790
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:7
1791
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:7
1792
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:7
1793
  msgctxt "s2member-admin"
1794
  msgid "Daily (recurring charge, for ongoing access)"
1795
  msgstr ""
1796
 
1797
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:8
1798
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:7
1799
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:7
1800
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:8
1801
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:8
1802
  msgctxt "s2member-admin"
1803
  msgid "Weekly (recurring charge, for ongoing access)"
1804
  msgstr ""
1805
 
1806
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:9
1807
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:8
1808
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:8
1809
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:9
1810
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:9
1811
  msgctxt "s2member-admin"
1812
  msgid "Bi-Weekly (recurring charge, for ongoing access)"
1813
  msgstr ""
1814
 
1815
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:10
1816
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:9
1817
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:7
1818
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:7
1819
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:9
1820
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:10
1821
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:10
1822
  msgctxt "s2member-admin"
1823
  msgid "Monthly (recurring charge, for ongoing access)"
1824
  msgstr ""
1825
 
1826
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:11
1827
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:10
1828
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:8
1829
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:11
1830
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:11
1831
  msgctxt "s2member-admin"
1832
  msgid "Bi-Monthly (recurring charge, for ongoing access)"
1833
  msgstr ""
1834
 
1835
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:12
1836
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:11
1837
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:9
1838
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:10
1839
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:12
1840
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:12
1841
  msgctxt "s2member-admin"
1842
  msgid "Quarterly (recurring charge, for ongoing access)"
1843
  msgstr ""
1844
 
1845
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:13
1846
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:12
1847
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:11
1848
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:13
1849
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:13
1850
  msgctxt "s2member-admin"
1851
  msgid "Semi-Yearly (recurring charge, for ongoing access)"
1852
  msgstr ""
1853
 
1854
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:14
1855
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:13
1856
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:12
1857
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:14
1858
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:14
1859
  msgctxt "s2member-admin"
1860
  msgid "Yearly (recurring charge, for ongoing access)"
1861
  msgstr ""
1862
 
1863
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:20
1864
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:18
1865
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:20
1866
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:20
1867
  msgctxt "s2member-admin"
1868
  msgid "One Time (for 1 day access, non-recurring)"
1869
  msgstr ""
1870
 
1871
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:21
1872
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:19
1873
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:21
1874
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:21
1875
  msgctxt "s2member-admin"
1876
  msgid "One Time (for 2 day access, non-recurring)"
1877
  msgstr ""
1878
 
1879
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:22
1880
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:20
1881
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:22
1882
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:22
1883
  msgctxt "s2member-admin"
1884
  msgid "One Time (for 3 day access, non-recurring)"
1885
  msgstr ""
1886
 
1887
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:23
1888
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:21
1889
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:23
1890
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:23
1891
  msgctxt "s2member-admin"
1892
  msgid "One Time (for 4 day access, non-recurring)"
1893
  msgstr ""
1894
 
1895
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:24
1896
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:22
1897
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:24
1898
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:24
1899
  msgctxt "s2member-admin"
1900
  msgid "One Time (for 5 day access, non-recurring)"
1901
  msgstr ""
1902
 
1903
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:25
1904
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:23
1905
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:25
1906
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:25
1907
  msgctxt "s2member-admin"
1908
  msgid "One Time (for 6 day access, non-recurring)"
1909
  msgstr ""
1910
 
1911
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:27
1912
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:19
1913
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:25
1914
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:27
1915
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:27
1916
  msgctxt "s2member-admin"
1917
  msgid "One Time (for 1 week access, non-recurring)"
1918
  msgstr ""
1919
 
1920
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:28
1921
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:20
1922
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:26
1923
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:28
1924
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:28
1925
  msgctxt "s2member-admin"
1926
  msgid "One Time (for 2 week access, non-recurring)"
1927
  msgstr ""
1928
 
1929
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:29
1930
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:21
1931
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:27
1932
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:29
1933
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:29
1934
  msgctxt "s2member-admin"
1935
  msgid "One Time (for 3 week access, non-recurring)"
1936
  msgstr ""
1937
 
1938
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:31
1939
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:23
1940
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:13
1941
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:29
1942
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:31
1943
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:31
1944
  msgctxt "s2member-admin"
1945
  msgid "One Time (for 1 month access, non-recurring)"
1946
  msgstr ""
1947
 
1948
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:32
1949
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:24
1950
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:30
1951
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:32
1952
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:32
1953
  msgctxt "s2member-admin"
1954
  msgid "One Time (for 2 month access, non-recurring)"
1955
  msgstr ""
1956
 
1957
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:33
1958
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:25
1959
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:31
1960
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:33
1961
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:33
1962
  msgctxt "s2member-admin"
1963
  msgid "One Time (for 3 month access, non-recurring)"
1964
  msgstr ""
1965
 
1966
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:34
1967
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:26
1968
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:32
1969
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:34
1970
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:34
1971
  msgctxt "s2member-admin"
1972
  msgid "One Time (for 4 month access, non-recurring)"
1973
  msgstr ""
1974
 
1975
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:35
1976
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:27
1977
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:33
1978
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:35
1979
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:35
1980
  msgctxt "s2member-admin"
1981
  msgid "One Time (for 5 month access, non-recurring)"
1982
  msgstr ""
1983
 
1984
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:36
1985
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:28
1986
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:34
1987
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:36
1988
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:36
1989
  msgctxt "s2member-admin"
1990
  msgid "One Time (for 6 month access, non-recurring)"
1991
  msgstr ""
1992
 
1993
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:38
1994
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:30
1995
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:36
1996
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:38
1997
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:38
1998
  msgctxt "s2member-admin"
1999
  msgid "One Time (for 1 year access, non-recurring)"
2000
  msgstr ""
2001
 
2002
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:44
2003
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:36
2004
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:19
2005
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:42
2006
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:44
2007
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:44
2008
  msgctxt "s2member-admin"
2009
  msgid "One Time (for 1 day access, non-recurring, no trial)"
2010
  msgstr ""
2011
 
2012
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:45
2013
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:37
2014
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:15
2015
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:20
2016
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:43
2017
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:45
2018
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:45
2019
  msgctxt "s2member-admin"
2020
  msgid "One Time (for 2 day access, non-recurring, no trial)"
2021
  msgstr ""
2022
 
2023
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:46
2024
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:38
2025
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:16
2026
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:21
2027
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:44
2028
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:46
2029
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:46
2030
  msgctxt "s2member-admin"
2031
  msgid "One Time (for 3 day access, non-recurring, no trial)"
2032
  msgstr ""
2033
 
2034
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:47
2035
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:39
2036
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:17
2037
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:22
2038
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:45
2039
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:47
2040
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:47
2041
  msgctxt "s2member-admin"
2042
  msgid "One Time (for 4 day access, non-recurring, no trial)"
2043
  msgstr ""
2044
 
2045
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:48
2046
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:40
2047
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:18
2048
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:23
2049
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:46
2050
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:48
2051
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:48
2052
  msgctxt "s2member-admin"
2053
  msgid "One Time (for 5 day access, non-recurring, no trial)"
2054
  msgstr ""
2055
 
2056
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:49
2057
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:41
2058
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:19
2059
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:24
2060
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:47
2061
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:49
2062
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:49
2063
  msgctxt "s2member-admin"
2064
  msgid "One Time (for 6 day access, non-recurring, no trial)"
2065
  msgstr ""
2066
 
2067
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:51
2068
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:43
2069
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:21
2070
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:26
2071
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:49
2072
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:51
2073
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:51
2074
  msgctxt "s2member-admin"
2075
  msgid "One Time (for 1 week access, non-recurring, no trial)"
2076
  msgstr ""
2077
 
2078
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:52
2079
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:44
2080
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:22
2081
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:27
2082
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:50
2083
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:52
2084
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:52
2085
  msgctxt "s2member-admin"
2086
  msgid "One Time (for 2 week access, non-recurring, no trial)"
2087
  msgstr ""
2088
 
2089
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:53
2090
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:45
2091
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:23
2092
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:28
2093
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:51
2094
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:53
2095
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:53
2096
  msgctxt "s2member-admin"
2097
  msgid "One Time (for 3 week access, non-recurring, no trial)"
2098
  msgstr ""
2099
 
2100
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:55
2101
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:47
2102
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:25
2103
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:30
2104
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:53
2105
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:55
2106
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:55
2107
  msgctxt "s2member-admin"
2108
  msgid "One Time (for 1 month access, non-recurring, no trial)"
2109
  msgstr ""
2110
 
2111
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:56
2112
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:48
2113
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:26
2114
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:31
2115
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:54
2116
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:56
2117
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:56
2118
  msgctxt "s2member-admin"
2119
  msgid "One Time (for 2 month access, non-recurring, no trial)"
2120
  msgstr ""
2121
 
2122
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:57
2123
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:49
2124
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:27
2125
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:32
2126
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:55
2127
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:57
2128
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:57
2129
  msgctxt "s2member-admin"
2130
  msgid "One Time (for 3 month access, non-recurring, no trial)"
2131
  msgstr ""
2132
 
2133
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:58
2134
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:50
2135
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:28
2136
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:33
2137
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:56
2138
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:58
2139
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:58
2140
  msgctxt "s2member-admin"
2141
  msgid "One Time (for 4 month access, non-recurring, no trial)"
2142
  msgstr ""
2143
 
2144
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:59
2145
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:51
2146
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:29
2147
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:34
2148
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:57
2149
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:59
2150
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:59
2151
  msgctxt "s2member-admin"
2152
  msgid "One Time (for 5 month access, non-recurring, no trial)"
2153
  msgstr ""
2154
 
2155
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:60
2156
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:52
2157
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:30
2158
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:35
2159
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:58
2160
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:60
2161
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:60
2162
  msgctxt "s2member-admin"
2163
  msgid "One Time (for 6 month access, non-recurring, no trial)"
2164
  msgstr ""
2165
 
2166
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:62
2167
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:54
2168
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:32
2169
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:37
2170
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:60
2171
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:62
2172
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:62
2173
  msgctxt "s2member-admin"
2174
  msgid "One Time (for 1 year access, non-recurring, no trial)"
2175
  msgstr ""
2176
 
2177
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:63
2178
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:55
2179
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:38
2180
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:61
2181
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:63
2182
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:63
2183
  msgctxt "s2member-admin"
2184
  msgid "One Time (for 2 year access, non-recurring, no trial)"
2185
  msgstr ""
2186
 
2187
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:64
2188
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:56
2189
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:39
2190
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:62
2191
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:64
2192
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:64
2193
  msgctxt "s2member-admin"
2194
  msgid "One Time (for 3 year access, non-recurring, no trial)"
2195
  msgstr ""
2196
 
2197
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:65
2198
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:57
2199
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:40
2200
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:63
2201
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:65
2202
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:65
2203
  msgctxt "s2member-admin"
2204
  msgid "One Time (for 4 year access, non-recurring, no trial)"
2205
  msgstr ""
2206
 
2207
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:66
2208
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:58
2209
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:41
2210
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:64
2211
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:66
2212
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:66
2213
  msgctxt "s2member-admin"
2214
  msgid "One Time (for 5 year access, non-recurring, no trial)"
2215
  msgstr ""
2216
 
2217
- #: s2member/includes/templates/options/paypal-membership-regular-terms.php:68
2218
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:60
2219
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:43
2220
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:66
2221
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:68
2222
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:68
2223
  msgctxt "s2member-admin"
2224
  msgid "One Time (for lifetime access, non-recurring, no trial)"
2225
  msgstr ""
2226
 
2227
- #: s2member/includes/templates/options/paypal-membership-trial-terms.php:6
2228
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-trial-terms.php:6
2229
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-trial-terms.php:6
2230
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-trial-terms.php:6
2231
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-trial-terms.php:6
2232
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-trial-terms.php:6
2233
  msgctxt "s2member-admin"
2234
  msgid "Days"
2235
  msgstr ""
2236
 
2237
- #: s2member/includes/templates/options/paypal-membership-trial-terms.php:7
2238
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-trial-terms.php:7
2239
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-trial-terms.php:7
2240
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-trial-terms.php:7
2241
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-trial-terms.php:7
2242
  msgctxt "s2member-admin"
2243
  msgid "Weeks"
2244
  msgstr ""
2245
 
2246
- #: s2member/includes/templates/options/paypal-membership-trial-terms.php:8
2247
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-trial-terms.php:8
2248
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-trial-terms.php:8
2249
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-trial-terms.php:8
2250
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-trial-terms.php:8
2251
  msgctxt "s2member-admin"
2252
  msgid "Months"
2253
  msgstr ""
2254
 
2255
- #: s2member/includes/templates/options/paypal-membership-trial-terms.php:9
2256
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-trial-terms.php:9
2257
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-trial-terms.php:9
2258
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-trial-terms.php:9
2259
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-trial-terms.php:9
2260
  msgctxt "s2member-admin"
2261
  msgid "Years"
2262
  msgstr ""
2263
 
2264
- #: s2member/includes/templates/options/paypal-sp-hours.php:6
2265
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:6
2266
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:6
2267
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:6
2268
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:6
2269
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:6
2270
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:6
2271
  msgctxt "s2member-admin"
2272
  msgid "Expires In Hours"
2273
  msgstr ""
2274
 
2275
- #: s2member/includes/templates/options/paypal-sp-hours.php:7
2276
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:7
2277
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:7
2278
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:7
2279
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:7
2280
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:7
2281
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:7
2282
  msgctxt "s2member-admin"
2283
  msgid "Buy Now (Specific Post/Page, link valid for 2 hours)"
2284
  msgstr ""
2285
 
2286
- #: s2member/includes/templates/options/paypal-sp-hours.php:8
2287
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:8
2288
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:8
2289
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:8
2290
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:8
2291
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:8
2292
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:8
2293
  msgctxt "s2member-admin"
2294
  msgid "Buy Now (Specific Post/Page, link valid for 4 hours)"
2295
  msgstr ""
2296
 
2297
- #: s2member/includes/templates/options/paypal-sp-hours.php:9
2298
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:9
2299
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:9
2300
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:9
2301
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:9
2302
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:9
2303
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:9
2304
  msgctxt "s2member-admin"
2305
  msgid "Buy Now (Specific Post/Page, link valid for 6 hours)"
2306
  msgstr ""
2307
 
2308
- #: s2member/includes/templates/options/paypal-sp-hours.php:10
2309
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:10
2310
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:10
2311
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:10
2312
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:10
2313
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:10
2314
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:10
2315
  msgctxt "s2member-admin"
2316
  msgid "Buy Now (Specific Post/Page, link valid for 8 hours)"
2317
  msgstr ""
2318
 
2319
- #: s2member/includes/templates/options/paypal-sp-hours.php:11
2320
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:11
2321
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:11
2322
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:11
2323
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:11
2324
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:11
2325
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:11
2326
  msgctxt "s2member-admin"
2327
  msgid "Buy Now (Specific Post/Page, link valid for 10 hours)"
2328
  msgstr ""
2329
 
2330
- #: s2member/includes/templates/options/paypal-sp-hours.php:12
2331
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:12
2332
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:12
2333
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:12
2334
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:12
2335
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:12
2336
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:12
2337
  msgctxt "s2member-admin"
2338
  msgid "Buy Now (Specific Post/Page, link valid for 12 hours)"
2339
  msgstr ""
2340
 
2341
- #: s2member/includes/templates/options/paypal-sp-hours.php:17
2342
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:17
2343
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:17
2344
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:6
2345
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:17
2346
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:17
2347
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:17
2348
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:17
2349
  msgctxt "s2member-admin"
2350
  msgid "Expires In Days"
2351
  msgstr ""
2352
 
2353
- #: s2member/includes/templates/options/paypal-sp-hours.php:18
2354
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:18
2355
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:18
2356
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:18
2357
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:18
2358
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:18
2359
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:18
2360
  msgctxt "s2member-admin"
2361
  msgid "Buy Now (Specific Post/Page, link valid for 1 day)"
2362
  msgstr ""
2363
 
2364
- #: s2member/includes/templates/options/paypal-sp-hours.php:19
2365
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:19
2366
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:19
2367
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:7
2368
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:19
2369
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:19
2370
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:19
2371
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:19
2372
  msgctxt "s2member-admin"
2373
  msgid "Buy Now (Specific Post/Page, link valid for 2 days)"
2374
  msgstr ""
2375
 
2376
- #: s2member/includes/templates/options/paypal-sp-hours.php:20
2377
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:20
2378
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:20
2379
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:8
2380
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:20
2381
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:20
2382
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:20
2383
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:20
2384
  msgctxt "s2member-admin"
2385
  msgid "Buy Now (Specific Post/Page, link valid for 3 days)"
2386
  msgstr ""
2387
 
2388
- #: s2member/includes/templates/options/paypal-sp-hours.php:21
2389
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:21
2390
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:21
2391
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:9
2392
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:21
2393
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:21
2394
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:21
2395
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:21
2396
  msgctxt "s2member-admin"
2397
  msgid "Buy Now (Specific Post/Page, link valid for 4 days)"
2398
  msgstr ""
2399
 
2400
- #: s2member/includes/templates/options/paypal-sp-hours.php:22
2401
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:22
2402
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:22
2403
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:10
2404
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:22
2405
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:22
2406
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:22
2407
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:22
2408
  msgctxt "s2member-admin"
2409
  msgid "Buy Now (Specific Post/Page, link valid for 5 days)"
2410
  msgstr ""
2411
 
2412
- #: s2member/includes/templates/options/paypal-sp-hours.php:23
2413
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:23
2414
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:23
2415
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:11
2416
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:23
2417
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:23
2418
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:23
2419
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:23
2420
  msgctxt "s2member-admin"
2421
  msgid "Buy Now (Specific Post/Page, link valid for 6 days)"
2422
  msgstr ""
2423
 
2424
- #: s2member/includes/templates/options/paypal-sp-hours.php:28
2425
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:28
2426
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:28
2427
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:16
2428
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:28
2429
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:28
2430
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:28
2431
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:28
2432
  msgctxt "s2member-admin"
2433
  msgid "Expires In Weeks"
2434
  msgstr ""
2435
 
2436
- #: s2member/includes/templates/options/paypal-sp-hours.php:29
2437
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:29
2438
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:29
2439
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:17
2440
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:29
2441
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:29
2442
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:29
2443
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:29
2444
  msgctxt "s2member-admin"
2445
  msgid "Buy Now (Specific Post/Page, link valid for 1 week)"
2446
  msgstr ""
2447
 
2448
- #: s2member/includes/templates/options/paypal-sp-hours.php:30
2449
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:30
2450
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:30
2451
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:18
2452
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:30
2453
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:30
2454
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:30
2455
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:30
2456
  msgctxt "s2member-admin"
2457
  msgid "Buy Now (Specific Post/Page, link valid for 2 weeks)"
2458
  msgstr ""
2459
 
2460
- #: s2member/includes/templates/options/paypal-sp-hours.php:31
2461
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:31
2462
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:31
2463
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:19
2464
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:31
2465
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:31
2466
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:31
2467
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:31
2468
  msgctxt "s2member-admin"
2469
  msgid "Buy Now (Specific Post/Page, link valid for 3 weeks)"
2470
  msgstr ""
2471
 
2472
- #: s2member/includes/templates/options/paypal-sp-hours.php:36
2473
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:36
2474
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:36
2475
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:24
2476
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:36
2477
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:36
2478
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:36
2479
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:36
2480
  msgctxt "s2member-admin"
2481
  msgid "Expires In Months"
2482
  msgstr ""
2483
 
2484
- #: s2member/includes/templates/options/paypal-sp-hours.php:37
2485
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:37
2486
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:37
2487
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:25
2488
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:37
2489
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:37
2490
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:37
2491
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:37
2492
  msgctxt "s2member-admin"
2493
  msgid "Buy Now (Specific Post/Page, link valid for 1 month)"
2494
  msgstr ""
2495
 
2496
- #: s2member/includes/templates/options/paypal-sp-hours.php:38
2497
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:38
2498
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:38
2499
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:26
2500
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:38
2501
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:38
2502
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:38
2503
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:38
2504
  msgctxt "s2member-admin"
2505
  msgid "Buy Now (Specific Post/Page, link valid for 2 months)"
2506
  msgstr ""
2507
 
2508
- #: s2member/includes/templates/options/paypal-sp-hours.php:39
2509
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:39
2510
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:39
2511
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:27
2512
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:39
2513
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:39
2514
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:39
2515
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:39
2516
  msgctxt "s2member-admin"
2517
  msgid "Buy Now (Specific Post/Page, link valid for 3 months)"
2518
  msgstr ""
2519
 
2520
- #: s2member/includes/templates/options/paypal-sp-hours.php:40
2521
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:40
2522
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:40
2523
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:28
2524
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:40
2525
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:40
2526
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:40
2527
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:40
2528
  msgctxt "s2member-admin"
2529
  msgid "Buy Now (Specific Post/Page, link valid for 6 months)"
2530
  msgstr ""
2531
 
2532
- #: s2member/includes/templates/options/paypal-sp-hours.php:45
2533
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:45
2534
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:45
2535
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:33
2536
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:45
2537
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:45
2538
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:45
2539
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:45
2540
  msgctxt "s2member-admin"
2541
  msgid "Expires In Years"
2542
  msgstr ""
2543
 
2544
- #: s2member/includes/templates/options/paypal-sp-hours.php:46
2545
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:46
2546
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:46
2547
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:34
2548
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:46
2549
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:46
2550
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:46
2551
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:46
2552
  msgctxt "s2member-admin"
2553
  msgid "Buy Now (Specific Post/Page, link valid for 1 year)"
2554
  msgstr ""
2555
 
2556
- #: s2member/includes/templates/options/paypal-sp-hours.php:47
2557
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:47
2558
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:47
2559
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:35
2560
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:47
2561
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:47
2562
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:47
2563
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:47
2564
  msgctxt "s2member-admin"
2565
  msgid "Buy Now (Specific Post/Page, link valid for 2 years)"
2566
  msgstr ""
2567
 
2568
- #: s2member/includes/templates/options/paypal-sp-hours.php:48
2569
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:48
2570
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:48
2571
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:36
2572
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:48
2573
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:48
2574
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:48
2575
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:48
2576
  msgctxt "s2member-admin"
2577
  msgid "Buy Now (Specific Post/Page, link valid for 3 years)"
2578
  msgstr ""
2579
 
2580
- #: s2member/includes/templates/options/paypal-sp-hours.php:49
2581
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:49
2582
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:49
2583
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:37
2584
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:49
2585
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:49
2586
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:49
2587
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:49
2588
  msgctxt "s2member-admin"
2589
  msgid "Buy Now (Specific Post/Page, link valid for 4 years)"
2590
  msgstr ""
2591
 
2592
- #: s2member/includes/templates/options/paypal-sp-hours.php:50
2593
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:50
2594
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:50
2595
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:38
2596
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:50
2597
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:50
2598
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:50
2599
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:50
2600
  msgctxt "s2member-admin"
2601
  msgid "Buy Now (Specific Post/Page, link valid for 5 years)"
2602
  msgstr ""
2603
 
2604
- #: s2member/includes/templates/options/paypal-sp-hours.php:51
2605
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-sp-hours.php:51
2606
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-sp-hours.php:51
2607
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-sp-hours.php:39
2608
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-sp-hours.php:51
2609
- #: s2member-pro/s2member-pro/includes/templates/options/google-sp-hours.php:51
2610
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-sp-hours.php:51
2611
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-sp-hours.php:51
2612
  msgctxt "s2member-admin"
2613
  msgid "Buy Now (Specific Post/Page, link valid for 50 years)"
2614
  msgstr ""
2615
-
2616
- #: s2member-pro/s2member-pro/includes/classes/gateways/alipay/alipay-return-in.inc.php:117
2617
- msgctxt "s2member-front"
2618
- msgid ""
2619
- "ERROR: Unexpected status. Please contact Support for assistance.\n"
2620
- "\n"
2621
- "The AliPay status did NOT match a required action."
2622
- msgstr ""
2623
-
2624
- #: s2member-pro/s2member-pro/includes/classes/gateways/alipay/alipay-return-in.inc.php:132
2625
- msgctxt "s2member-front"
2626
- msgid ""
2627
- "ERROR: Unable to verify POST vars. Please contact Support for assistance.\n"
2628
- "\n"
2629
- "This is most likely related to an invalid AliPay configuration. If you are the site owner, please check: s2Member -› AliPay Options."
2630
- msgstr ""
2631
-
2632
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:114
2633
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:115
2634
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:115
2635
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:116
2636
- msgctxt "s2member-front"
2637
- msgid "<strong>Billing termination confirmed.</strong> Your account has been cancelled."
2638
- msgstr ""
2639
-
2640
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:122
2641
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:130
2642
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:138
2643
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:127
2644
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:139
2645
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:147
2646
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:127
2647
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:144
2648
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:157
2649
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:127
2650
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:137
2651
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:147
2652
- msgctxt "s2member-front"
2653
- msgid "<strong>Billing terminated.</strong> Your account has been cancelled."
2654
- msgstr ""
2655
-
2656
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-cancellation-in.inc.php:145
2657
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:136
2658
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:156
2659
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:169
2660
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:153
2661
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:145
2662
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:156
2663
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-update-in.inc.php:101
2664
- msgctxt "s2member-front"
2665
- msgid "You're <strong>NOT</strong> logged in."
2666
- msgstr ""
2667
-
2668
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:290
2669
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:630
2670
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:343
2671
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:668
2672
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:411
2673
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:751
2674
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:478
2675
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:917
2676
- msgctxt "s2member-front"
2677
- msgid "<strong>Thank you.</strong> Your account has been updated.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">log back in</a> now."
2678
- msgstr ""
2679
-
2680
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:494
2681
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:747
2682
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:503
2683
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:821
2684
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:588
2685
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:903
2686
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:746
2687
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1071
2688
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:407
2689
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:602
2690
- msgctxt "s2member-front"
2691
- msgid "<strong>Thank you.</strong> Your account has been approved.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">login</a>."
2692
- msgstr ""
2693
-
2694
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:503
2695
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:527
2696
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:756
2697
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:777
2698
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:124
2699
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:141
2700
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:512
2701
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:533
2702
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:830
2703
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:851
2704
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:597
2705
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:618
2706
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:912
2707
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:933
2708
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:755
2709
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:776
2710
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1080
2711
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1101
2712
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:124
2713
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:141
2714
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:419
2715
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:614
2716
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-registration-in.inc.php:126
2717
- msgctxt "s2member-front"
2718
- msgid "<strong>Oops.</strong> A slight problem. Please contact Support for assistance."
2719
- msgstr ""
2720
-
2721
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:518
2722
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:768
2723
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:524
2724
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:842
2725
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:609
2726
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:924
2727
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:767
2728
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1092
2729
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:408
2730
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:603
2731
- msgctxt "s2member-front"
2732
- msgid "<strong>Thank you.</strong> Your account has been approved.<br />&mdash; You'll receive an email momentarily."
2733
- msgstr ""
2734
-
2735
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-checkout-in.inc.php:788
2736
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:862
2737
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-pf-in.inc.php:944
2738
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:1112
2739
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:136
2740
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:618
2741
- msgctxt "s2member-front"
2742
- msgid "<strong>Unknown error.</strong> Please contact Support for assistance."
2743
- msgstr ""
2744
-
2745
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:162
2746
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:273
2747
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:426
2748
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:566
2749
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:777
2750
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:167
2751
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:278
2752
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:432
2753
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:572
2754
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:785
2755
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:162
2756
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:243
2757
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:317
2758
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:386
2759
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:514
2760
- msgctxt "s2member-front"
2761
- msgid "Security Code"
2762
- msgstr ""
2763
-
2764
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:240
2765
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:744
2766
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:246
2767
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:753
2768
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:216
2769
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-form-in.inc.php:487
2770
- msgctxt "s2member-front"
2771
- msgid "Additional Info"
2772
- msgstr ""
2773
-
2774
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:381
2775
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:521
2776
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:696
2777
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:387
2778
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:527
2779
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:705
2780
- msgctxt "s2member-front"
2781
- msgid "Visa"
2782
- msgstr ""
2783
-
2784
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:381
2785
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:521
2786
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:696
2787
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:387
2788
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:527
2789
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:705
2790
- msgctxt "s2member-front"
2791
- msgid "MasterCard"
2792
- msgstr ""
2793
-
2794
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:381
2795
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:521
2796
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:696
2797
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:387
2798
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:527
2799
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:705
2800
- msgctxt "s2member-front"
2801
- msgid "Discover"
2802
- msgstr ""
2803
-
2804
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:381
2805
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:521
2806
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:696
2807
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:387
2808
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:527
2809
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:705
2810
- msgctxt "s2member-front"
2811
- msgid "American Express"
2812
- msgstr ""
2813
-
2814
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2815
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2816
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2817
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2818
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2819
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2820
- msgctxt "s2member-front"
2821
- msgid "01 January"
2822
- msgstr ""
2823
-
2824
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2825
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2826
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2827
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2828
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2829
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2830
- msgctxt "s2member-front"
2831
- msgid "02 February"
2832
- msgstr ""
2833
-
2834
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2835
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2836
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2837
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2838
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2839
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2840
- msgctxt "s2member-front"
2841
- msgid "03 March"
2842
- msgstr ""
2843
-
2844
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2845
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2846
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2847
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2848
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2849
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2850
- msgctxt "s2member-front"
2851
- msgid "04 April"
2852
- msgstr ""
2853
-
2854
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2855
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2856
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2857
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2858
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2859
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2860
- msgctxt "s2member-front"
2861
- msgid "05 May"
2862
- msgstr ""
2863
-
2864
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2865
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2866
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2867
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2868
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2869
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2870
- msgctxt "s2member-front"
2871
- msgid "06 June"
2872
- msgstr ""
2873
-
2874
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2875
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2876
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2877
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2878
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2879
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2880
- msgctxt "s2member-front"
2881
- msgid "07 July"
2882
- msgstr ""
2883
-
2884
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2885
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2886
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2887
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2888
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2889
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2890
- msgctxt "s2member-front"
2891
- msgid "08 August"
2892
- msgstr ""
2893
-
2894
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2895
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2896
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2897
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2898
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2899
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2900
- msgctxt "s2member-front"
2901
- msgid "09 September"
2902
- msgstr ""
2903
-
2904
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2905
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2906
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2907
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2908
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2909
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2910
- msgctxt "s2member-front"
2911
- msgid "10 October"
2912
- msgstr ""
2913
-
2914
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2915
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2916
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2917
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2918
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2919
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2920
- msgctxt "s2member-front"
2921
- msgid "11 November"
2922
- msgstr ""
2923
-
2924
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:391
2925
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:531
2926
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-form-in.inc.php:706
2927
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:397
2928
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:537
2929
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:715
2930
- msgctxt "s2member-front"
2931
- msgid "12 December"
2932
- msgstr ""
2933
-
2934
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:117
2935
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:117
2936
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-registration-in.inc.php:118
2937
- msgctxt "s2member-front"
2938
- msgid "<strong>Thank you.</strong> Please <a href=\"%s\" rel=\"nofollow\">login</a>."
2939
- msgstr ""
2940
-
2941
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-registration-in.inc.php:134
2942
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-registration-in.inc.php:134
2943
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-registration-in.inc.php:119
2944
- msgctxt "s2member-front"
2945
- msgid "<strong>Thank you.</strong> You'll receive an email momentarily."
2946
- msgstr ""
2947
-
2948
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:205
2949
- msgctxt "s2member-admin"
2950
- msgid "Authorize.Net configuration error. Please configure your Authorize.Net API Login ID."
2951
- msgstr ""
2952
-
2953
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:208
2954
- msgctxt "s2member-admin"
2955
- msgid "Authorize.Net configuration error. Your Authorize.Net API Transaction Key is not yet configured."
2956
- msgstr ""
2957
-
2958
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:211
2959
- msgctxt "s2member-admin"
2960
- msgid "Authorize.Net configuration error. Your Authorize.Net Secret MD5 Hash is not yet configured."
2961
- msgstr ""
2962
-
2963
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:233
2964
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:517
2965
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:236
2966
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:595
2967
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:243
2968
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:526
2969
- msgctxt "s2member-front"
2970
- msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to cancel your account."
2971
- msgstr ""
2972
-
2973
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:236
2974
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:239
2975
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:246
2976
- msgctxt "s2member-front"
2977
- msgid "Nothing to cancel. You're NOT a paid Member."
2978
- msgstr ""
2979
-
2980
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:241
2981
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:244
2982
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:244
2983
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:250
2984
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:259
2985
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:265
2986
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:249
2987
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:252
2988
- msgctxt "s2member-front"
2989
- msgid "Nothing to cancel. You have NO recurring fees."
2990
- msgstr ""
2991
-
2992
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:250
2993
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:528
2994
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:271
2995
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:606
2996
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:257
2997
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:537
2998
- msgctxt "s2member-front"
2999
- msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to update your billing information."
3000
- msgstr ""
3001
-
3002
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:253
3003
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:274
3004
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:260
3005
- msgctxt "s2member-front"
3006
- msgid "Nothing to update. You're NOT a paid Member."
3007
- msgstr ""
3008
-
3009
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:258
3010
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:261
3011
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:279
3012
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:288
3013
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:300
3014
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:306
3015
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:263
3016
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:266
3017
- msgctxt "s2member-front"
3018
- msgid "Nothing to update. You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance."
3019
- msgstr ""
3020
-
3021
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:267
3022
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:312
3023
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:271
3024
- msgctxt "s2member-admin"
3025
- msgid "Invalid form configuration. Missing \"level\" attribute. Membership Level. Must be numeric [0-%s]."
3026
- msgstr ""
3027
-
3028
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:270
3029
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:315
3030
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:274
3031
- msgctxt "s2member-admin"
3032
- msgid "Invalid form configuration. Invalid \"level\" attribute. Membership Level. Must be numeric [0-%s]."
3033
- msgstr ""
3034
-
3035
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:273
3036
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:361
3037
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:318
3038
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:424
3039
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:277
3040
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:368
3041
- msgctxt "s2member-admin"
3042
- msgid "Invalid form configuration. Invalid \"ccaps\" attribute. Custom Capabilities. When provided, must be all lowercase [a-z_0-9,]. A preceding `-all,` directive is also acceptable."
3043
- msgstr ""
3044
-
3045
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:276
3046
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:385
3047
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:321
3048
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:466
3049
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:280
3050
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:392
3051
- msgctxt "s2member-admin"
3052
- msgid "Invalid form configuration. Invalid \"tp\" attribute. The Trial Period. When provided, must be numeric."
3053
- msgstr ""
3054
-
3055
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:279
3056
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:388
3057
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:324
3058
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:469
3059
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:283
3060
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:395
3061
- msgctxt "s2member-admin"
3062
- msgid "Invalid form configuration. Invalid \"tp\" attribute. The Trial Period. When provided, must be >= 1."
3063
- msgstr ""
3064
-
3065
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:282
3066
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:391
3067
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:327
3068
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:472
3069
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:286
3070
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:398
3071
- msgctxt "s2member-admin"
3072
- msgid "Invalid form configuration. Missing \"tt\" attribute. The Trial Term. When \"tp\" is provided, \"tt\" (Trial Term) must be one of D,W,M,Y."
3073
- msgstr ""
3074
-
3075
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:285
3076
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:394
3077
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:330
3078
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:475
3079
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:289
3080
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:401
3081
- msgctxt "s2member-admin"
3082
- msgid "Invalid form configuration. Invalid \"tt\" attribute. The Trial Term. When \"tp\" is provided, \"tt\" (Trial Term) must be one of D,W,M,Y."
3083
- msgstr ""
3084
-
3085
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:288
3086
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:333
3087
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:292
3088
- msgctxt "s2member-admin"
3089
- msgid "Invalid form configuration. Invalid \"custom\" attribute. When provided, must start with your domain name."
3090
- msgstr ""
3091
-
3092
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:293
3093
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:338
3094
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:297
3095
- msgctxt "s2member-admin"
3096
- msgid "Invalid form configuration. Missing \"ids\" attribute. Must contain comma-delimited Post/Page IDs."
3097
- msgstr ""
3098
-
3099
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:296
3100
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:341
3101
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:300
3102
- msgctxt "s2member-admin"
3103
- msgid "Invalid form configuration. Invalid \"ids\" attribute. Must contain comma-delimited Post/Page IDs. Must contain [0-9,] only."
3104
- msgstr ""
3105
-
3106
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:299
3107
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:344
3108
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:303
3109
- msgctxt "s2member-admin"
3110
- msgid "Invalid form configuration. Missing \"exp\" attribute. Specific Post/Page Expiration (in hours). Must be numeric."
3111
- msgstr ""
3112
-
3113
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:302
3114
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:347
3115
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:306
3116
- msgctxt "s2member-admin"
3117
- msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration (in hours). Must be numeric."
3118
- msgstr ""
3119
-
3120
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:305
3121
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:350
3122
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:309
3123
- msgctxt "s2member-admin"
3124
- msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration (in hours). Must be >= 1."
3125
- msgstr ""
3126
-
3127
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:308
3128
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:353
3129
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:312
3130
- msgctxt "s2member-admin"
3131
- msgid "Invalid form configuration. Invalid \"exp\" attribute. Specific Post/Page Expiration (in hours). Must be <= 43800."
3132
- msgstr ""
3133
-
3134
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:311
3135
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:356
3136
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:315
3137
- msgctxt "s2member-admin"
3138
- msgid "Invalid form configuration. Missing \"sp_ids_exp\" internal attribute. Please check Shortcode Attributes."
3139
- msgstr ""
3140
-
3141
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:314
3142
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:359
3143
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:318
3144
- msgctxt "s2member-admin"
3145
- msgid "Invalid form configuration. Invalid \"sp_ids_exp\" internal attribute. Please check Shortcode Attributes."
3146
- msgstr ""
3147
-
3148
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:317
3149
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:367
3150
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:362
3151
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:430
3152
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:321
3153
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:374
3154
- msgctxt "s2member-admin"
3155
- msgid "Invalid form configuration. Missing \"desc\" attribute. Please provide a Description for this form."
3156
- msgstr ""
3157
-
3158
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:320
3159
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:370
3160
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:365
3161
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:433
3162
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:324
3163
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:377
3164
- msgctxt "s2member-admin"
3165
- msgid "Invalid form configuration. Your \"desc\" (Description) attribute must be <= 100 characters long."
3166
- msgstr ""
3167
-
3168
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:323
3169
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:373
3170
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:368
3171
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:436
3172
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:327
3173
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:380
3174
- msgctxt "s2member-admin"
3175
- msgid "Invalid form configuration. Missing \"custom\" attribute. Must start with your domain name."
3176
- msgstr ""
3177
-
3178
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:326
3179
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:371
3180
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:330
3181
- msgctxt "s2member-admin"
3182
- msgid "Invalid form configuration. Invalid \"custom\" attribute. Must start with your domain name."
3183
- msgstr ""
3184
-
3185
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:329
3186
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:379
3187
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:374
3188
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:442
3189
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:333
3190
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:386
3191
- msgctxt "s2member-admin"
3192
- msgid "Invalid form configuration. Missing \"cc\" attribute. Must be a 3 character Currency Code."
3193
- msgstr ""
3194
-
3195
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:332
3196
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:382
3197
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:377
3198
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:445
3199
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:336
3200
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:389
3201
- msgctxt "s2member-admin"
3202
- msgid "Invalid form configuration. Invalid \"cc\" attribute. Must be a 3 character Currency Code."
3203
- msgstr ""
3204
-
3205
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:335
3206
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:463
3207
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:398
3208
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:535
3209
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:339
3210
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:467
3211
- msgctxt "s2member-admin"
3212
- msgid "Invalid form configuration. Missing \"ra\" attribute. The Regular Amount. Must be >= 0.00."
3213
- msgstr ""
3214
-
3215
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:338
3216
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:466
3217
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:401
3218
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:538
3219
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:342
3220
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:470
3221
- msgctxt "s2member-admin"
3222
- msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be numeric."
3223
- msgstr ""
3224
-
3225
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:341
3226
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:469
3227
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:404
3228
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:541
3229
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:345
3230
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:473
3231
- msgctxt "s2member-admin"
3232
- msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be >= 0.00."
3233
- msgstr ""
3234
-
3235
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:344
3236
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:472
3237
- msgctxt "s2member-admin"
3238
- msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be <= 99999.00."
3239
- msgstr ""
3240
-
3241
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:349
3242
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:412
3243
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:356
3244
- msgctxt "s2member-front"
3245
- msgid "You must <a href=\"%s\" rel=\"nofollow\">login</a> to update your billing plan."
3246
- msgstr ""
3247
-
3248
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:352
3249
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:415
3250
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:359
3251
- msgctxt "s2member-front"
3252
- msgid "You must <a href=\"%s\" rel=\"nofollow\">login</a> before making this purchase."
3253
- msgstr ""
3254
-
3255
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:355
3256
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:418
3257
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:362
3258
- msgctxt "s2member-admin"
3259
- msgid "Invalid form configuration. Missing \"level\" attribute. Membership Level. Must be numeric [1-%s], or an asterisk (*)."
3260
- msgstr ""
3261
-
3262
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:358
3263
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:421
3264
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:365
3265
- msgctxt "s2member-admin"
3266
- msgid "Invalid form configuration. Invalid \"level\" attribute. Membership Level. Must be numeric [1-%s], or an asterisk (*)."
3267
- msgstr ""
3268
-
3269
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:364
3270
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:427
3271
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:371
3272
- msgctxt "s2member-admin"
3273
- msgid "Invalid form configuration. Missing or invalid \"ccaps\" attribute. When \"level\" is \"*\" for (Independent Custom Capabilities), \"ccaps\" is required. All lowercase [a-z_0-9,]. A preceding `-all,` directive is also acceptable."
3274
- msgstr ""
3275
-
3276
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:376
3277
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:439
3278
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:383
3279
- msgctxt "s2member-admin"
3280
- msgid "Invalid form configuration. Invalid \"custom\" attribute. Must start with matching domain."
3281
- msgstr ""
3282
-
3283
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:397
3284
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:404
3285
- msgctxt "s2member-admin"
3286
- msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. There is an Intial/Trial amount, and \"tt\" (Trial Term) attribute is \"D\", and \"tp\" (Trial Period) > 365."
3287
- msgstr ""
3288
-
3289
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:400
3290
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:407
3291
- msgctxt "s2member-admin"
3292
- msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. There is an Intial/Trial amount, and \"tt\" (Trial Term) attribute is \"W\", and \"tp\" (Trial Period) > 52."
3293
- msgstr ""
3294
-
3295
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:403
3296
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:410
3297
- msgctxt "s2member-admin"
3298
- msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. There is an Intial/Trial amount, and \"tt\" (Trial Term) attribute is \"M\", and \"tp\" (Trial Period) > 12."
3299
- msgstr ""
3300
-
3301
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:406
3302
- msgctxt "s2member-admin"
3303
- msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. There is an Intial/Trial amount, and \"tt\" (Trial Term) attribute is \"Y\", and \"tp\" (Trial Period) > 1."
3304
- msgstr ""
3305
-
3306
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:409
3307
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:478
3308
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:416
3309
- msgctxt "s2member-admin"
3310
- msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be numeric."
3311
- msgstr ""
3312
-
3313
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:412
3314
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:481
3315
- msgctxt "s2member-admin"
3316
- msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be >= 0.00."
3317
- msgstr ""
3318
-
3319
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:415
3320
- msgctxt "s2member-admin"
3321
- msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be <= 99999.00."
3322
- msgstr ""
3323
-
3324
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:418
3325
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:487
3326
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:425
3327
- msgctxt "s2member-admin"
3328
- msgid "Invalid form configuration. Missing \"rp\" attribute. The Regular Period. Must be >= 1."
3329
- msgstr ""
3330
-
3331
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:421
3332
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:490
3333
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:428
3334
- msgctxt "s2member-admin"
3335
- msgid "Invalid form configuration. Invalid \"rp\" attribute. The Regular Period. Must be numeric."
3336
- msgstr ""
3337
-
3338
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:424
3339
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:493
3340
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:431
3341
- msgctxt "s2member-admin"
3342
- msgid "Invalid form configuration. Invalid \"rp\" attribute. The Regular Period. Must be >= 1."
3343
- msgstr ""
3344
-
3345
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:427
3346
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:496
3347
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:434
3348
- msgctxt "s2member-admin"
3349
- msgid "Invalid form configuration. Missing \"rt\" attribute. The Regular Term. Must be one of D,W,M,Y,L."
3350
- msgstr ""
3351
-
3352
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:430
3353
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:499
3354
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:437
3355
- msgctxt "s2member-admin"
3356
- msgid "Invalid form configuration. Invalid \"rt\" attribute. The Regular Term. Must be one of D,W,M,Y,L."
3357
- msgstr ""
3358
-
3359
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:433
3360
- msgctxt "s2member-admin"
3361
- msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"D\", \"rp\" (Regular Period) is < 7, and \"rr\" is not \"BN\" (Buy Now)."
3362
- msgstr ""
3363
-
3364
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:436
3365
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:502
3366
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:440
3367
- msgctxt "s2member-admin"
3368
- msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"D\", \"rp\" (Regular Period) > 365, and \"rr\" is not \"BN\" (Buy Now)."
3369
- msgstr ""
3370
-
3371
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:439
3372
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:505
3373
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:443
3374
- msgctxt "s2member-admin"
3375
- msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"W\", \"rp\" (Regular Period) > 52, and \"rr\" is not \"BN\" (Buy Now)."
3376
- msgstr ""
3377
-
3378
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:442
3379
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:508
3380
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:446
3381
- msgctxt "s2member-admin"
3382
- msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"M\", \"rp\" (Regular Period) > 12, and \"rr\" is not \"BN\" (Buy Now)."
3383
- msgstr ""
3384
-
3385
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:445
3386
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:517
3387
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:449
3388
- msgctxt "s2member-admin"
3389
- msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"Y\", \"rp\" (Regular Period) > 1, and \"rr\" is not \"BN\" (Buy Now)."
3390
- msgstr ""
3391
-
3392
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:448
3393
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:520
3394
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:452
3395
- msgctxt "s2member-admin"
3396
- msgid "Invalid form configuration. Invalid \"rp, rt\" attributes. The \"rt\" (Regular Term) attribute is \"L\" (Lifetime), and \"rp\" (Regular Period) > 1."
3397
- msgstr ""
3398
-
3399
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:451
3400
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:523
3401
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:455
3402
- msgctxt "s2member-admin"
3403
- msgid "Invalid form configuration. Invalid \"rt, rr\" attributes. The \"rt\" (Regular Term) attribute is \"L\" (Lifetime), and \"rr\" is not \"BN\" (Buy Now)."
3404
- msgstr ""
3405
-
3406
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:454
3407
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:526
3408
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:458
3409
- msgctxt "s2member-admin"
3410
- msgid "Invalid form configuration. Missing \"level_ccaps_eotper\" attribute. Please check Shortcode Attributes."
3411
- msgstr ""
3412
-
3413
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:457
3414
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:460
3415
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:529
3416
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:532
3417
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:461
3418
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:464
3419
- msgctxt "s2member-admin"
3420
- msgid "Invalid form configuration. Invalid \"level_ccaps_eotper\" attribute. Please check Shortcode Attributes."
3421
- msgstr ""
3422
-
3423
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:475
3424
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:547
3425
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:482
3426
- msgctxt "s2member-admin"
3427
- msgid "Invalid form configuration. Invalid \"rr\" attribute. Regular Recurring. When provided, must be 0, 1, or BN."
3428
- msgstr ""
3429
-
3430
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:478
3431
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:550
3432
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:485
3433
- msgctxt "s2member-admin"
3434
- msgid "Invalid form configuration. Invalid \"rr, tp\" attributes. The \"rr\" (Regular Recurring) attribute is \"BN\" (Buy Now), and \"tp\" (Trial Period) is not \"0\"."
3435
- msgstr ""
3436
-
3437
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:481
3438
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:553
3439
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:488
3440
- msgctxt "s2member-admin"
3441
- msgid "Invalid form configuration. Invalid \"level, rr\" attributes. The \"level\" (Level) attribute is \"*\" for (Independent Custom Capabilities), and \"rr\" is not \"BN\" (Buy Now)."
3442
- msgstr ""
3443
-
3444
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:484
3445
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:556
3446
- msgctxt "s2member-admin"
3447
- msgid "Invalid form configuration. Invalid \"ta, tp, tt\" attributes. Trial Period. When provided, these cannot be exactly the same as your \"ra, rp, rt\" attributes."
3448
- msgstr ""
3449
-
3450
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:487
3451
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:559
3452
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:494
3453
- msgctxt "s2member-admin"
3454
- msgid "Invalid form configuration. Invalid \"rrt\" attribute. Recurring Times (fixed). When provided, must be numeric."
3455
- msgstr ""
3456
-
3457
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:490
3458
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:562
3459
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:497
3460
- msgctxt "s2member-admin"
3461
- msgid "Invalid form configuration. Invalid \"rrt\" attribute. Recurring Times (fixed). When provided, must be >= 1."
3462
- msgstr ""
3463
-
3464
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:493
3465
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:565
3466
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:500
3467
- msgctxt "s2member-admin"
3468
- msgid "Invalid form configuration. Invalid \"rr, rrt\" attributes. When \"rrt\" (Recurring Times) is provided, \"rr\" (Regular Recurring) must be 1."
3469
- msgstr ""
3470
-
3471
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:520
3472
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:570
3473
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:617
3474
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:673
3475
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:768
3476
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:598
3477
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:648
3478
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:695
3479
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:751
3480
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:846
3481
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:529
3482
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:546
3483
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:595
3484
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:624
3485
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:694
3486
- msgctxt "s2member-front"
3487
- msgid "Missing or invalid Security Code. Please try again."
3488
- msgstr ""
3489
-
3490
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:523
3491
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:531
3492
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:684
3493
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:601
3494
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:609
3495
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:762
3496
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:532
3497
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:540
3498
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:637
3499
- msgctxt "s2member-admin"
3500
- msgid "Unable to process. You are an Administrator. Stopping here for security. Otherwise, an Administrator could lose access."
3501
- msgstr ""
3502
-
3503
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:534
3504
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:634
3505
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:729
3506
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:612
3507
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:712
3508
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:807
3509
- msgctxt "s2member-front"
3510
- msgid "Missing Card Type (Billing Method). Please try again."
3511
- msgstr ""
3512
-
3513
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:537
3514
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:637
3515
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:640
3516
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:732
3517
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:735
3518
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:615
3519
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:715
3520
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:718
3521
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:810
3522
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:813
3523
- msgctxt "s2member-front"
3524
- msgid "Invalid Card Type (Billing Method). Please try again."
3525
- msgstr ""
3526
-
3527
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:540
3528
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:643
3529
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:738
3530
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:618
3531
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:721
3532
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:816
3533
- msgctxt "s2member-front"
3534
- msgid "Missing Card Number. Please try again."
3535
- msgstr ""
3536
-
3537
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:543
3538
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:646
3539
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:741
3540
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:621
3541
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:724
3542
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:819
3543
- msgctxt "s2member-front"
3544
- msgid "Missing Card Expiration Date (mm/yyyy). Please try again."
3545
- msgstr ""
3546
-
3547
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:546
3548
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:649
3549
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:744
3550
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:624
3551
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:727
3552
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:822
3553
- msgctxt "s2member-front"
3554
- msgid "Invalid Card Expiration Date. Must be in this format (mm/yyyy). Please try again."
3555
- msgstr ""
3556
-
3557
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:549
3558
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:652
3559
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:747
3560
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:627
3561
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:730
3562
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:825
3563
- msgctxt "s2member-front"
3564
- msgid "Missing Card Verification Code. It's on the back of your Card. 3-4 digits. Please try again."
3565
- msgstr ""
3566
-
3567
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:552
3568
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:655
3569
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:750
3570
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:630
3571
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:733
3572
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:828
3573
- msgctxt "s2member-front"
3574
- msgid "Missing Card Start Date, or Issue #. Required for Maestro/Solo. Please try again."
3575
- msgstr ""
3576
-
3577
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:555
3578
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:658
3579
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:753
3580
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:633
3581
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:736
3582
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:831
3583
- msgctxt "s2member-front"
3584
- msgid "Missing Street Address. Please try again."
3585
- msgstr ""
3586
-
3587
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:558
3588
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:661
3589
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:756
3590
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:636
3591
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:739
3592
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:834
3593
- msgctxt "s2member-front"
3594
- msgid "Missing City/Town. Please try again."
3595
- msgstr ""
3596
-
3597
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:561
3598
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:664
3599
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:759
3600
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:639
3601
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:742
3602
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:837
3603
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:615
3604
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:685
3605
- msgctxt "s2member-front"
3606
- msgid "Missing State/Province. Please try again."
3607
- msgstr ""
3608
-
3609
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:564
3610
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:667
3611
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:762
3612
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:642
3613
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:745
3614
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:840
3615
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:618
3616
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:688
3617
- msgctxt "s2member-front"
3618
- msgid "Missing Country. Please try again."
3619
- msgstr ""
3620
-
3621
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:567
3622
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:670
3623
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:765
3624
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:645
3625
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:748
3626
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:843
3627
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:621
3628
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:691
3629
- msgctxt "s2member-front"
3630
- msgid "Missing Postal/Zip Code. Please try again."
3631
- msgstr ""
3632
-
3633
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:575
3634
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:622
3635
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:687
3636
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:653
3637
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:700
3638
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:765
3639
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:553
3640
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:600
3641
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:640
3642
- msgctxt "s2member-front"
3643
- msgid "Missing First Name. Please try again."
3644
- msgstr ""
3645
-
3646
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:578
3647
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:625
3648
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:690
3649
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:656
3650
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:703
3651
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:768
3652
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:556
3653
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:603
3654
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:643
3655
- msgctxt "s2member-front"
3656
- msgid "Missing Last Name. Please try again."
3657
- msgstr ""
3658
-
3659
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:581
3660
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:628
3661
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:693
3662
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:659
3663
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:706
3664
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:771
3665
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:559
3666
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:606
3667
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:646
3668
- msgctxt "s2member-front"
3669
- msgid "Missing or invalid Email Address. Please try again."
3670
- msgstr ""
3671
-
3672
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:584
3673
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:631
3674
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:696
3675
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:662
3676
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:709
3677
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:774
3678
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:562
3679
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:609
3680
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:649
3681
- msgctxt "s2member-front"
3682
- msgid "Invalid Email Address. Please try again."
3683
- msgstr ""
3684
-
3685
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:587
3686
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:699
3687
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:665
3688
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:777
3689
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:565
3690
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:652
3691
- msgctxt "s2member-front"
3692
- msgid "That Email Address is already in use. Please try again."
3693
- msgstr ""
3694
-
3695
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:590
3696
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:702
3697
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:668
3698
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:780
3699
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:568
3700
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:655
3701
- msgctxt "s2member-front"
3702
- msgid "Missing or invalid Username. Please try again."
3703
- msgstr ""
3704
-
3705
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:593
3706
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:705
3707
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:671
3708
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:783
3709
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:571
3710
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:658
3711
- msgctxt "s2member-front"
3712
- msgid "Invalid Username. Please try again. Use ONLY lowercase alphanumerics."
3713
- msgstr ""
3714
-
3715
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:596
3716
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:708
3717
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:674
3718
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:786
3719
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:574
3720
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:661
3721
- msgctxt "s2member-front"
3722
- msgid "That Username is already in use. Please try again."
3723
- msgstr ""
3724
-
3725
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:602
3726
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:714
3727
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:680
3728
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:792
3729
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:580
3730
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:667
3731
- msgctxt "s2member-front"
3732
- msgid "Missing Password. Please try again."
3733
- msgstr ""
3734
-
3735
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:605
3736
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:717
3737
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:683
3738
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:795
3739
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:583
3740
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:670
3741
- msgctxt "s2member-front"
3742
- msgid "Invalid Password. Must be at least 6 characters. Please try again."
3743
- msgstr ""
3744
-
3745
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:608
3746
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:720
3747
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:686
3748
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:798
3749
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:586
3750
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:673
3751
- msgctxt "s2member-front"
3752
- msgid "Invalid Password. Max length is 20 characters. Please try again."
3753
- msgstr ""
3754
-
3755
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:611
3756
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:723
3757
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:689
3758
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:801
3759
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:589
3760
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:676
3761
- msgctxt "s2member-front"
3762
- msgid "Password fields do NOT match. Please try again."
3763
- msgstr ""
3764
-
3765
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:678
3766
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:756
3767
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:631
3768
- msgctxt "s2member-front"
3769
- msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> to modify your billing plan."
3770
- msgstr ""
3771
-
3772
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:681
3773
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:759
3774
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:634
3775
- msgctxt "s2member-front"
3776
- msgid "You must <a href=\"%s\" rel=\"nofollow\">log in</a> before making this purchase."
3777
- msgstr ""
3778
-
3779
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-responses.inc.php:771
3780
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:849
3781
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:697
3782
- msgctxt "s2member-front"
3783
- msgid "Unknown form submission type. Please contact Support."
3784
- msgstr ""
3785
-
3786
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:169
3787
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:288
3788
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-sp-checkout-in.inc.php:154
3789
- msgctxt "s2member-front"
3790
- msgid "<strong>Thank you.</strong> Your purchase has been approved.<br />&mdash; Please <a href=\"%s\" rel=\"nofollow\">click here</a> to proceed."
3791
- msgstr ""
3792
-
3793
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-sp-checkout-in.inc.php:176
3794
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-sp-checkout-in.inc.php:295
3795
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-sp-checkout-in.inc.php:161
3796
- msgctxt "s2member-front"
3797
- msgid "<strong>Oops.</strong> Unable to generate Access Link. Please contact Support for assistance."
3798
- msgstr ""
3799
-
3800
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:110
3801
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:115
3802
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:118
3803
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-update-in.inc.php:88
3804
- msgctxt "s2member-front"
3805
- msgid "<strong>Confirmed.</strong> Your billing information has been updated."
3806
- msgstr ""
3807
-
3808
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:122
3809
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:131
3810
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:130
3811
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-update-in.inc.php:97
3812
- msgctxt "s2member-front"
3813
- msgid "<strong>Unable to update.</strong> You have NO recurring fees. Or, your billing profile is no longer active. Please contact Support if you need assistance."
3814
- msgstr ""
3815
-
3816
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-update-in.inc.php:131
3817
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:148
3818
- msgctxt "s2member-front"
3819
- msgid "<strong>Oops.</strong> No Subscr. ID. Please contact Support for assistance."
3820
- msgstr ""
3821
-
3822
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:663
3823
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:806
3824
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:311
3825
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:467
3826
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:857
3827
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1011
3828
- msgctxt "s2member-front percentage-symbol"
3829
- msgid "%"
3830
- msgstr ""
3831
-
3832
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:805
3833
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:466
3834
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1010
3835
- msgctxt "s2member-front"
3836
- msgid " + tax"
3837
- msgstr ""
3838
-
3839
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:850
3840
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:902
3841
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:915
3842
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:937
3843
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:997
3844
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1012
3845
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:512
3846
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:564
3847
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:577
3848
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:597
3849
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:657
3850
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:672
3851
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1056
3852
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1108
3853
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1121
3854
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1141
3855
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1201
3856
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1216
3857
- msgctxt "s2member-front"
3858
- msgid "COUPON %s off. (Now: %s)"
3859
- msgstr ""
3860
-
3861
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:851
3862
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:903
3863
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:916
3864
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:938
3865
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:998
3866
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1013
3867
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:513
3868
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:565
3869
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:578
3870
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:598
3871
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:658
3872
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:673
3873
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1057
3874
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1109
3875
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1122
3876
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1142
3877
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1202
3878
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1217
3879
- msgctxt "s2member-front"
3880
- msgid "<div>Coupon: <strong>%s off</strong>. (Now: <strong>%s</strong>)</div>"
3881
- msgstr ""
3882
-
3883
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:863
3884
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:876
3885
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:889
3886
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:952
3887
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:967
3888
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:982
3889
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:525
3890
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:538
3891
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:551
3892
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:612
3893
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:627
3894
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:642
3895
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1069
3896
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1082
3897
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1095
3898
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1156
3899
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1171
3900
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1186
3901
- msgctxt "s2member-front"
3902
- msgid "COUPON %s off. (Now: %s, then %s)"
3903
- msgstr ""
3904
-
3905
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:864
3906
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:877
3907
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:890
3908
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:953
3909
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:968
3910
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:983
3911
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:526
3912
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:539
3913
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:552
3914
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:613
3915
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:628
3916
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:643
3917
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1070
3918
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1083
3919
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1096
3920
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1157
3921
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1172
3922
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1187
3923
- msgctxt "s2member-front"
3924
- msgid "<div>Coupon: <strong>%s off</strong>. (Now: <strong>%s, then %s</strong>)</div>"
3925
- msgstr ""
3926
-
3927
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:920
3928
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1017
3929
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:581
3930
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:676
3931
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1125
3932
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1220
3933
- msgctxt "s2member-front"
3934
- msgid "<div>Sorry, your Coupon is not applicable.</div>"
3935
- msgstr ""
3936
-
3937
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1021
3938
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:679
3939
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1224
3940
- msgctxt "s2member-front"
3941
- msgid "<div>Coupon: <strong>%s0.00 off</strong>.</div>"
3942
- msgstr ""
3943
-
3944
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1025
3945
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:682
3946
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1228
3947
- msgctxt "s2member-front"
3948
- msgid "<div>Sorry, your Coupon cannot be applied to this particular purchase.</div>"
3949
- msgstr ""
3950
-
3951
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1029
3952
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:685
3953
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1232
3954
- msgctxt "s2member-front"
3955
- msgid "<div>Sorry, your Coupon <strong>expired</strong>: <em>%s</em>.</div>"
3956
- msgstr ""
3957
-
3958
- #. translators: `%1$s` is new price/description, after coupon applied. `%2$s`
3959
- #. is original description.
3960
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1035
3961
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:690
3962
- msgctxt "s2member-front"
3963
- msgid "%1$s ~ ORIGINALLY: %2$s"
3964
- msgstr ""
3965
-
3966
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1064
3967
- #: s2member-pro/s2member-pro/includes/classes/gateways/authnet/authnet-utilities.inc.php:1067
3968
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:719
3969
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-utilities.inc.php:722
3970
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1266
3971
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1269
3972
- msgctxt "s2member-front"
3973
- msgid "<div>Sorry, your Coupon is N/A, invalid or expired.</div>"
3974
- msgstr ""
3975
-
3976
- #: s2member-pro/s2member-pro/includes/classes/gateways/clickbank/clickbank-return-in.inc.php:187
3977
- msgctxt "s2member-front"
3978
- msgid "ERROR: Unexpected txnType. Please contact Support for assistance.\\n\\nThe ClickBank txnType did not match a required action."
3979
- msgstr ""
3980
-
3981
- #: s2member-pro/s2member-pro/includes/classes/gateways/clickbank/clickbank-return-in.inc.php:222
3982
- msgctxt "s2member-front"
3983
- msgid "ERROR: Unable to verify POST vars. Please contact Support for assistance.\\n\\nThis is most likely related to an invalid ClickBank configuration. If you are the site owner, please check: s2Member -› ClickBank Options."
3984
- msgstr ""
3985
-
3986
- #: s2member-pro/s2member-pro/includes/classes/gateways/clickbank/clickbank-utilities.inc.php:237
3987
- msgctxt "s2member-front"
3988
- msgid "<strong>Reminder:</strong> Purchases at this site will appear on your credit card or bank statement as: <code>ClickBank</code> or <code>CLKBANK*COM</code>."
3989
- msgstr ""
3990
-
3991
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:123
3992
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:247
3993
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:262
3994
- msgctxt "s2member-front"
3995
- msgid "<strong>Unable to cancel at this time.</strong> Your account is pending other changes. Please try again in 15 minutes."
3996
- msgstr ""
3997
-
3998
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-in.inc.php:135
3999
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-cancellation-pf-in.inc.php:140
4000
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:257
4001
- msgctxt "s2member-front"
4002
- msgid "Please <a href=\"%s\" rel=\"nofollow\">log in at PayPal</a> to cancel your Subscription."
4003
- msgstr ""
4004
-
4005
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:355
4006
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-in.inc.php:680
4007
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:495
4008
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-checkout-rdp-in.inc.php:929
4009
- msgctxt "s2member-front"
4010
- msgid "<strong>Sorry.</strong> Your account is pending other changes. Please try again in 15 minutes."
4011
- msgstr ""
4012
-
4013
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:387
4014
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:527
4015
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:705
4016
- msgctxt "s2member-front"
4017
- msgid "Maestro"
4018
- msgstr ""
4019
-
4020
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:387
4021
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:527
4022
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:705
4023
- msgctxt "s2member-front"
4024
- msgid "Solo"
4025
- msgstr ""
4026
-
4027
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:527
4028
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:705
4029
- msgctxt "s2member-front"
4030
- msgid "PayPal"
4031
- msgstr ""
4032
-
4033
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:620
4034
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-form-in.inc.php:834
4035
- msgctxt "s2member-front"
4036
- msgid "We Accept PayPal"
4037
- msgstr ""
4038
-
4039
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:205
4040
- msgctxt "s2member-admin"
4041
- msgid "PayPal configuration error. Please configure your PayPal Email Address."
4042
- msgstr ""
4043
-
4044
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:208
4045
- msgctxt "s2member-admin"
4046
- msgid "PayPal configuration error. Your PayPal API Username is not yet configured."
4047
- msgstr ""
4048
-
4049
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:211
4050
- msgctxt "s2member-admin"
4051
- msgid "PayPal configuration error. Your PayPal API Password is not yet configured."
4052
- msgstr ""
4053
-
4054
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:214
4055
- msgctxt "s2member-admin"
4056
- msgid "PayPal configuration error. Your PayPal API Signature is not yet configured."
4057
- msgstr ""
4058
-
4059
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:282
4060
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:295
4061
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:298
4062
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:79
4063
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:135
4064
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:139
4065
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:79
4066
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:134
4067
- msgctxt "s2member-front"
4068
- msgid "Please <a href=\"%s\" rel=\"nofollow\">log in at PayPal</a> to update your billing information."
4069
- msgstr ""
4070
-
4071
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:285
4072
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:303
4073
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-in.inc.php:127
4074
- msgctxt "s2member-front"
4075
- msgid "<strong>Unable to update at this time.</strong> Your account is pending other changes. Please try again in 15 minutes."
4076
- msgstr ""
4077
-
4078
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:380
4079
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:448
4080
- msgctxt "s2member-admin"
4081
- msgid "Invalid form configuration. Missing \"dg\" attribute. Digital indicator. Must be numeric [0-1]."
4082
- msgstr ""
4083
-
4084
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:383
4085
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:451
4086
- msgctxt "s2member-admin"
4087
- msgid "Invalid form configuration. Invalid \"dg\" attribute. Digital indicator. Must be numeric [0-1]."
4088
- msgstr ""
4089
-
4090
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:386
4091
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:454
4092
- msgctxt "s2member-admin"
4093
- msgid "Invalid form configuration. Missing \"ns\" attribute. Shipping configuration. Must be numeric [0-2]."
4094
- msgstr ""
4095
-
4096
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:389
4097
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:457
4098
- msgctxt "s2member-admin"
4099
- msgid "Invalid form configuration. Invalid \"ns\" attribute. Shipping configuration. Must be numeric [0-2]."
4100
- msgstr ""
4101
-
4102
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:392
4103
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:460
4104
- msgctxt "s2member-admin"
4105
- msgid "Invalid form configuration. Invalid \"ns\" attribute. Shipping configuration. Must be 1 with \"dg\" (digital) items."
4106
- msgstr ""
4107
-
4108
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:395
4109
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:463
4110
- msgctxt "s2member-admin"
4111
- msgid "Invalid form configuration. Invalid \"lc\" attribute. Locale Code. When provided, must be a 2 character country code."
4112
- msgstr ""
4113
-
4114
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:407
4115
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:544
4116
- msgctxt "s2member-admin"
4117
- msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be <= 10000.00."
4118
- msgstr ""
4119
-
4120
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:484
4121
- msgctxt "s2member-admin"
4122
- msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be <= 10000.00."
4123
- msgstr ""
4124
-
4125
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:511
4126
- msgctxt "s2member-admin"
4127
- msgid "Invalid Payflow form configuration. Invalid \"rt, rp, rr\" attributes. Payflow supports a specific set of recurring intervals. Pro Forms can be configured to charge: weekly, bi-weekly, monthly, quarterly, semi-yearly or yearly. Any other combination results in this error. This is a Payflow limitation."
4128
- msgstr ""
4129
-
4130
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:514
4131
- msgctxt "s2member-admin"
4132
- msgid "Invalid form configuration. Invalid \"rt, rp, rr\" attributes. The \"rt\" (Regular Term) attribute is \"Y\", \"rp\" (Regular Period) > 5, and \"rr\" is not \"BN\" (Buy Now)."
4133
- msgstr ""
4134
-
4135
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:568
4136
- msgctxt "s2member-admin"
4137
- msgid "Invalid form configuration. Invalid \"rr, rra\" attributes. When \"rr\" (Regular Recurring) is 0 or 1, \"rra\" (Recurring Retry Attempts) must be numeric."
4138
- msgstr ""
4139
-
4140
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-responses.inc.php:571
4141
- msgctxt "s2member-admin"
4142
- msgid "Invalid form configuration. Invalid \"rr, rra\" attributes. When \"rr\" (Regular Recurring) is 0 or 1, \"rra\" (Recurring Retry Attempts) must be >= 0."
4143
- msgstr ""
4144
-
4145
- #: s2member-pro/s2member-pro/includes/classes/gateways/paypal/paypal-update-pf-in.inc.php:140
4146
- msgctxt "s2member-front"
4147
- msgid "<strong>No Subscr. ID.</strong> Please contact Support for assistance."
4148
- msgstr ""
4149
-
4150
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-cancellation-in.inc.php:123
4151
- msgctxt "s2member-front"
4152
- msgid "API failure. Please contact Support for assistance."
4153
- msgstr ""
4154
-
4155
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:248
4156
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-checkout-in.inc.php:495
4157
- msgctxt "s2member-front"
4158
- msgid "<strong>Thank you.</strong> Your account has been updated :-)"
4159
- msgstr ""
4160
-
4161
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:216
4162
- msgctxt "s2member-admin"
4163
- msgid "Stripe configuration error. Please configure your Publishable Stripe API Key."
4164
- msgstr ""
4165
-
4166
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:219
4167
- msgctxt "s2member-admin"
4168
- msgid "Stripe configuration error. Your Secret Stripe API Key is not yet configured."
4169
- msgstr ""
4170
-
4171
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:348
4172
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:476
4173
- msgctxt "s2member-admin"
4174
- msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount (when greater than 0.00), must be >= 0.50; i.e. the minimum amount that Stripe will charge is 0.50"
4175
- msgstr ""
4176
-
4177
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:351
4178
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:479
4179
- msgctxt "s2member-admin"
4180
- msgid "Invalid form configuration. Invalid \"ra\" attribute. The Regular Amount. Must be <= 999999.99."
4181
- msgstr ""
4182
-
4183
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:413
4184
- msgctxt "s2member-admin"
4185
- msgid "Invalid form configuration. Invalid \"tt, tp\" attributes. There is an Intial/Trial amount, and \"tt\" (Trial Term) attribute is \"Y\", and \"tp\" (Trial Period) > 2."
4186
- msgstr ""
4187
-
4188
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:419
4189
- msgctxt "s2member-admin"
4190
- msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be >= 0.50."
4191
- msgstr ""
4192
-
4193
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:422
4194
- msgctxt "s2member-admin"
4195
- msgid "Invalid form configuration. Invalid \"ta\" attribute. The Trial Amount. When provided, must be <= 999999.99."
4196
- msgstr ""
4197
-
4198
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:543
4199
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:612
4200
- msgctxt "s2member-front"
4201
- msgid "Missing Billing Info. Please try again."
4202
- msgstr ""
4203
-
4204
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-responses.inc.php:682
4205
- msgctxt "s2member-front"
4206
- msgid "Missing Billing Method. Please try again."
4207
- msgstr ""
4208
-
4209
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-update-in.inc.php:99
4210
- msgctxt "s2member-front"
4211
- msgid "<strong>Oops.</strong> No Customer|Subscr. ID. Please contact Support for assistance."
4212
- msgstr ""
4213
-
4214
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:630
4215
- msgctxt "s2member-front"
4216
- msgid "Error code: <code>%1$s</code>. %2$s."
4217
- msgstr ""
4218
-
4219
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:634
4220
- msgctxt "s2member-front"
4221
- msgid "Invalid parameters to Stripe; please contact the site owner."
4222
- msgstr ""
4223
-
4224
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:637
4225
- msgctxt "s2member-front"
4226
- msgid "Invalid Stripe API keys; please contact the site owner."
4227
- msgstr ""
4228
-
4229
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:640
4230
- msgctxt "s2member-front"
4231
- msgid "Network communication failure with Stripe; please try again."
4232
- msgstr ""
4233
-
4234
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:643
4235
- msgctxt "s2member-front"
4236
- msgid "Stripe API error; please try again."
4237
- msgstr ""
4238
-
4239
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:645
4240
- msgctxt "s2member-front"
4241
- msgid "Stripe error; please try again."
4242
- msgstr ""
4243
-
4244
- #. translators: `%1$s` is new price/description, after coupon applied. `%2$s`
4245
- #. is original description.
4246
- #: s2member-pro/s2member-pro/includes/classes/gateways/stripe/stripe-utilities.inc.php:1237
4247
- msgctxt "s2member-front"
4248
- msgid "%1$s %2$s ~ ORIGINALLY: %3$s"
4249
- msgstr ""
4250
-
4251
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:135
4252
- msgctxt "s2member-front"
4253
- msgid "Password"
4254
- msgstr ""
4255
-
4256
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:141
4257
- msgctxt "s2member-front"
4258
- msgid "signup now"
4259
- msgstr ""
4260
-
4261
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:142
4262
- msgctxt "s2member-front"
4263
- msgid "forgot password?"
4264
- msgstr ""
4265
-
4266
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:146
4267
- msgctxt "s2member-front"
4268
- msgid "Remember Me"
4269
- msgstr ""
4270
-
4271
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:152
4272
- msgctxt "s2member-front"
4273
- msgid "Log Me In"
4274
- msgstr ""
4275
-
4276
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:202
4277
- msgctxt "s2member-front"
4278
- msgid "My Account"
4279
- msgstr ""
4280
-
4281
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:203
4282
- msgctxt "s2member-front"
4283
- msgid "Please disable popup blockers and try again!"
4284
- msgstr ""
4285
-
4286
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:203
4287
- msgctxt "s2member-front"
4288
- msgid "Edit My Profile"
4289
- msgstr ""
4290
-
4291
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:204
4292
- msgctxt "s2member-front"
4293
- msgid "Logout"
4294
- msgstr ""
4295
-
4296
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:341
4297
- msgctxt "s2member-front"
4298
- msgid "Membership Login"
4299
- msgstr ""
4300
-
4301
- #: s2member-pro/s2member-pro/includes/classes/login-widget.inc.php:341
4302
- msgctxt "s2member-front"
4303
- msgid "My Profile Summary"
4304
- msgstr ""
4305
-
4306
- #: s2member-pro/s2member-pro/includes/classes/sc-member-list-in.inc.php:209
4307
- msgctxt "s2member-front"
4308
- msgid "Search users..."
4309
- msgstr ""
4310
-
4311
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4312
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:73
4313
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:167
4314
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:276
4315
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:527
4316
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:813
4317
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4318
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:73
4319
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:167
4320
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:276
4321
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:575
4322
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:909
4323
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4324
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:106
4325
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:202
4326
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:317
4327
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:610
4328
- msgctxt "s2member-front"
4329
- msgid "Security Code missing. Please try again."
4330
- msgstr ""
4331
-
4332
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4333
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:142
4334
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:502
4335
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:774
4336
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4337
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:142
4338
- msgctxt "s2member-front"
4339
- msgid "Please choose a Billing Method."
4340
- msgstr ""
4341
-
4342
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4343
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:346
4344
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:598
4345
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4346
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:350
4347
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:650
4348
- msgctxt "s2member-front"
4349
- msgid "Calculating Sales Tax..."
4350
- msgstr ""
4351
-
4352
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4353
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:346
4354
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:598
4355
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4356
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:350
4357
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:650
4358
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4359
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:466
4360
- msgctxt "s2member-front"
4361
- msgid "calculating sales tax..."
4362
- msgstr ""
4363
-
4364
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4365
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:357
4366
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:609
4367
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4368
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:361
4369
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:661
4370
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4371
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:483
4372
- msgctxt "s2member-front"
4373
- msgid "<strong>Sales Tax%s:</strong> %s<br /><strong>— Total%s:</strong> %s"
4374
- msgstr ""
4375
-
4376
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4377
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:357
4378
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:609
4379
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4380
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:361
4381
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:661
4382
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4383
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:483
4384
- msgctxt "s2member-front"
4385
- msgid "Today"
4386
- msgstr ""
4387
-
4388
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4389
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:671
4390
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4391
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:723
4392
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4393
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:411
4394
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:62
4395
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:43
4396
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:62
4397
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-registration-form.php:43
4398
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:62
4399
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-registration-form.php:43
4400
- msgctxt "s2member-front"
4401
- msgid "Create Profile"
4402
- msgstr ""
4403
-
4404
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet-min.js:1
4405
- #: s2member-pro/s2member-pro/includes/separates/gateways/authnet/authnet.js:672
4406
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4407
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:724
4408
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4409
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:412
4410
- msgctxt "s2member-front"
4411
- msgid "Your Profile"
4412
- msgstr ""
4413
-
4414
- #: s2member-pro/s2member-pro/includes/separates/gateways/google/google-min.js:1
4415
- #: s2member-pro/s2member-pro/includes/separates/gateways/google/google.js:49
4416
- msgctxt "s2member-front"
4417
- msgid "Thank you! Please check your email for further details."
4418
- msgstr ""
4419
-
4420
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal-min.js:1
4421
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:292
4422
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:293
4423
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:592
4424
- #: s2member-pro/s2member-pro/includes/separates/gateways/paypal/paypal.js:593
4425
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-cancellation-form.php:36
4426
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:199
4427
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:94
4428
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:180
4429
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:118
4430
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-cancellation-form.php:36
4431
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:199
4432
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-registration-form.php:94
4433
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:180
4434
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:118
4435
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-cancellation-form.php:36
4436
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:161
4437
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-registration-form.php:94
4438
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:142
4439
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-update-form.php:52
4440
- msgctxt "s2member-front"
4441
- msgid "Submit Form"
4442
- msgstr ""
4443
-
4444
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4445
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:277
4446
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:557
4447
- msgctxt "s2member-front"
4448
- msgid "Add"
4449
- msgstr ""
4450
-
4451
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe-min.js:1
4452
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:296
4453
- #: s2member-pro/s2member-pro/includes/separates/gateways/stripe/stripe.js:580
4454
- msgctxt "s2member-front"
4455
- msgid "No Billing Method; please try again."
4456
- msgstr ""
4457
-
4458
- #: s2member-pro/s2member-pro/includes/syscon.inc.php:96
4459
- msgctxt "s2member-front"
4460
- msgid ""
4461
- "Thanks %%%%first_name%%%%! Your membership has been approved.\n"
4462
- "\n"
4463
- "%%%%item_name%%%%\n"
4464
- "\n"
4465
- "Subscr. ID: %%%%subscr_id%%%%\n"
4466
- "Charges today: %%%%currency_symbol%%%%%%%%initial%%%%\n"
4467
- "Recurring charges: %%%%currency_symbol%%%%%%%%recurring/regular_cycle%%%%\n"
4468
- "\n"
4469
- "Your Username/Password will arrive shortly, in a separate email. If you have any trouble, please feel free to contact us.\n"
4470
- "\n"
4471
- "Best Regards,\n"
4472
- "%s"
4473
- msgstr ""
4474
-
4475
- #: s2member-pro/s2member-pro/includes/syscon.inc.php:100
4476
- msgctxt "s2member-front"
4477
- msgid ""
4478
- "Thanks %%%%first_name%%%%!\n"
4479
- "\n"
4480
- "%%%%item_name%%%%\n"
4481
- "\n"
4482
- "Transaction ID: %%%%txn_id%%%%\n"
4483
- "Charges today: %%%%currency_symbol%%%%%%%%amount%%%%\n"
4484
- "\n"
4485
- "Your order can be retrieved here:\n"
4486
- "%%%%sp_access_url%%%%\n"
4487
- "( link expires in %%%%sp_access_exp%%%% )\n"
4488
- "\n"
4489
- "If you have any trouble, please feel free to contact us.\n"
4490
- "\n"
4491
- "Best Regards,\n"
4492
- "%s"
4493
- msgstr ""
4494
-
4495
- #: s2member-pro/s2member-pro/includes/syscon.inc.php:122
4496
- msgctxt "s2member-front"
4497
- msgid "<div><small style=\"font-size:70%;\">ClickBank is the retailer of products on this site. CLICKBANK® is a registered trademark of Click Sales, Inc., a Delaware corporation located at 917 S. Lusk Street, Suite 200, Boise Idaho, 83706, USA and used by permission. ClickBank's role as retailer does not constitute an endorsement, approval or review of these products or any claim, statement or opinion used in promotion of these products.</small></div><p>%1$s <strong><em>says&hellip;</em></strong></p>"
4498
- msgstr ""
4499
-
4500
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-cancellation-form.php:32
4501
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-cancellation-form.php:32
4502
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-cancellation-form.php:32
4503
- msgctxt "s2member-front"
4504
- msgid "Confirm Cancellation"
4505
- msgstr ""
4506
-
4507
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:21
4508
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:21
4509
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:21
4510
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:21
4511
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:21
4512
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:21
4513
- msgctxt "s2member-front"
4514
- msgid "Checkout Options"
4515
- msgstr ""
4516
-
4517
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:42
4518
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:42
4519
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:42
4520
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:42
4521
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:42
4522
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:42
4523
- msgctxt "s2member-front"
4524
- msgid "Coupon Code"
4525
- msgstr ""
4526
-
4527
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:49
4528
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:49
4529
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:49
4530
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:49
4531
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:49
4532
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:49
4533
- msgctxt "s2member-front"
4534
- msgid "Have a Coupon Code?"
4535
- msgstr ""
4536
-
4537
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:52
4538
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:52
4539
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:52
4540
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:52
4541
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:52
4542
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:52
4543
- msgctxt "s2member-front"
4544
- msgid "Apply Coupon"
4545
- msgstr ""
4546
-
4547
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:84
4548
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:65
4549
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:84
4550
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-registration-form.php:65
4551
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:84
4552
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-registration-form.php:65
4553
- msgctxt "s2member-front"
4554
- msgid "Username (lowercase letters and/or numbers)"
4555
- msgstr ""
4556
-
4557
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:90
4558
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:71
4559
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:90
4560
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-registration-form.php:71
4561
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:90
4562
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-registration-form.php:71
4563
- msgctxt "s2member-front"
4564
- msgid "Password (type this twice please)"
4565
- msgstr ""
4566
-
4567
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:106
4568
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:88
4569
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:106
4570
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:88
4571
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:106
4572
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:88
4573
- msgctxt "s2member-front"
4574
- msgid "Billing Method"
4575
- msgstr ""
4576
-
4577
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:113
4578
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:95
4579
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:36
4580
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:113
4581
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:95
4582
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:36
4583
- msgctxt "s2member-front"
4584
- msgid "Card Number (no dashes or spaces)"
4585
- msgstr ""
4586
-
4587
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:119
4588
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:101
4589
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:42
4590
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:119
4591
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:101
4592
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:42
4593
- msgctxt "s2member-front"
4594
- msgid "Card Expiration Date (mm/yyyy)"
4595
- msgstr ""
4596
-
4597
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:131
4598
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:113
4599
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:54
4600
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:131
4601
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:113
4602
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:54
4603
- msgctxt "s2member-front"
4604
- msgid "Card Verification Code (3-4 digits)"
4605
- msgstr ""
4606
-
4607
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:131
4608
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:113
4609
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:54
4610
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:131
4611
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:113
4612
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:54
4613
- msgctxt "s2member-front"
4614
- msgid "need help?"
4615
- msgstr ""
4616
-
4617
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:138
4618
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:120
4619
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:61
4620
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:138
4621
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:120
4622
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:61
4623
- msgctxt "s2member-front"
4624
- msgid "Card Start Date (mm/yyyy), or Issue Number"
4625
- msgstr ""
4626
-
4627
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:148
4628
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:130
4629
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:71
4630
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:148
4631
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:130
4632
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:71
4633
- msgctxt "s2member-front"
4634
- msgid "Billing Address"
4635
- msgstr ""
4636
-
4637
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:152
4638
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:134
4639
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:75
4640
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:152
4641
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:134
4642
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:75
4643
- msgctxt "s2member-front"
4644
- msgid "Street Address"
4645
- msgstr ""
4646
-
4647
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:158
4648
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:140
4649
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:81
4650
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:158
4651
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:140
4652
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:81
4653
- msgctxt "s2member-front"
4654
- msgid "City / Town"
4655
- msgstr ""
4656
-
4657
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:164
4658
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:146
4659
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:87
4660
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:164
4661
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:146
4662
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:87
4663
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:126
4664
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:108
4665
- msgctxt "s2member-front"
4666
- msgid "State / Province"
4667
- msgstr ""
4668
-
4669
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:170
4670
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:152
4671
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:93
4672
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:170
4673
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:152
4674
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:93
4675
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:132
4676
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:114
4677
- msgctxt "s2member-front"
4678
- msgid "Postal / Zip Code"
4679
- msgstr ""
4680
-
4681
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:176
4682
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:158
4683
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:99
4684
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:176
4685
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:158
4686
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:99
4687
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:138
4688
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:120
4689
- msgctxt "s2member-front"
4690
- msgid "Country"
4691
- msgstr ""
4692
-
4693
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-checkout-form.php:194
4694
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:176
4695
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-checkout-form.php:194
4696
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:176
4697
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:156
4698
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:138
4699
- msgctxt "s2member-front"
4700
- msgid "Checkout Now"
4701
- msgstr ""
4702
-
4703
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:21
4704
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-registration-form.php:21
4705
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-registration-form.php:21
4706
- msgctxt "s2member-front"
4707
- msgid "Registration Options"
4708
- msgstr ""
4709
-
4710
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-registration-form.php:89
4711
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-registration-form.php:89
4712
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-registration-form.php:89
4713
- msgctxt "s2member-front"
4714
- msgid "Complete Registration"
4715
- msgstr ""
4716
-
4717
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-sp-checkout-form.php:62
4718
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-sp-checkout-form.php:62
4719
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:62
4720
- msgctxt "s2member-front"
4721
- msgid "Contact Info"
4722
- msgstr ""
4723
-
4724
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:29
4725
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:29
4726
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-update-form.php:29
4727
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-update-form.php:33
4728
- msgctxt "s2member-front"
4729
- msgid "New Billing Method"
4730
- msgstr ""
4731
-
4732
- #: s2member-pro/s2member-pro/includes/templates/forms/authnet-update-form.php:114
4733
- #: s2member-pro/s2member-pro/includes/templates/forms/paypal-update-form.php:114
4734
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-update-form.php:48
4735
- msgctxt "s2member-front"
4736
- msgid "Update Billing Information"
4737
- msgstr ""
4738
-
4739
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:110
4740
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:92
4741
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-update-form.php:33
4742
- msgctxt "s2member-front"
4743
- msgid "[+]"
4744
- msgstr ""
4745
-
4746
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:110
4747
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:92
4748
- msgctxt "s2member-front"
4749
- msgid "Add Billing Method"
4750
- msgstr ""
4751
-
4752
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-checkout-form.php:122
4753
- #: s2member-pro/s2member-pro/includes/templates/forms/stripe-sp-checkout-form.php:104
4754
- msgctxt "s2member-front"
4755
- msgid "Tax Location"
4756
- msgstr ""
4757
-
4758
- #: s2member-pro/s2member-pro/includes/templates/members/member-list-search-box.php:27
4759
- msgctxt "s2member-front"
4760
- msgid "Search"
4761
- msgstr ""
4762
-
4763
- #: s2member-pro/s2member-pro/includes/templates/members/member-list.php:93
4764
- msgctxt "s2member-front"
4765
- msgid "Page:"
4766
- msgstr ""
4767
-
4768
- #: s2member-pro/s2member-pro/includes/templates/members/member-list.php:101
4769
- msgctxt "s2member-front"
4770
- msgid "Sorry, your search returned 0 results."
4771
- msgstr ""
4772
-
4773
- #: s2member-pro/s2member-pro/includes/templates/members/member-list.php:104
4774
- msgctxt "s2member-front"
4775
- msgid "Sorry, search is not allowed here. The shortcode attribute `enable_list_search` is not enabled by the site owner."
4776
- msgstr ""
4777
-
4778
- #: s2member-pro/s2member-pro/includes/templates/members/member-list.php:107
4779
- msgctxt "s2member-front"
4780
- msgid "Sorry, there are no users to list at this time."
4781
- msgstr ""
4782
-
4783
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-ccap-terms.php:6
4784
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:6
4785
- msgctxt "s2member-admin"
4786
- msgid "AliPay (Buy Now)"
4787
- msgstr ""
4788
-
4789
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-ccap-terms.php:7
4790
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:31
4791
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-ccap-terms.php:7
4792
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-ccap-fixed-terms.php:7
4793
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:31
4794
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-ccap-terms.php:7
4795
- msgctxt "s2member-admin"
4796
- msgid "One Time (for lifetime access)"
4797
- msgstr ""
4798
-
4799
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:7
4800
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:7
4801
- msgctxt "s2member-admin"
4802
- msgid "One Time (for 1 day access)"
4803
- msgstr ""
4804
-
4805
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:8
4806
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:8
4807
- msgctxt "s2member-admin"
4808
- msgid "One Time (for 2 day access)"
4809
- msgstr ""
4810
-
4811
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:9
4812
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:9
4813
- msgctxt "s2member-admin"
4814
- msgid "One Time (for 3 day access)"
4815
- msgstr ""
4816
-
4817
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:10
4818
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:10
4819
- msgctxt "s2member-admin"
4820
- msgid "One Time (for 4 day access)"
4821
- msgstr ""
4822
-
4823
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:11
4824
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:11
4825
- msgctxt "s2member-admin"
4826
- msgid "One Time (for 5 day access)"
4827
- msgstr ""
4828
-
4829
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:12
4830
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:12
4831
- msgctxt "s2member-admin"
4832
- msgid "One Time (for 6 day access)"
4833
- msgstr ""
4834
-
4835
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:14
4836
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:14
4837
- msgctxt "s2member-admin"
4838
- msgid "One Time (for 1 week access)"
4839
- msgstr ""
4840
-
4841
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:15
4842
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:15
4843
- msgctxt "s2member-admin"
4844
- msgid "One Time (for 2 week access)"
4845
- msgstr ""
4846
-
4847
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:16
4848
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:16
4849
- msgctxt "s2member-admin"
4850
- msgid "One Time (for 3 week access)"
4851
- msgstr ""
4852
-
4853
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:18
4854
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:18
4855
- msgctxt "s2member-admin"
4856
- msgid "One Time (for 1 month access)"
4857
- msgstr ""
4858
-
4859
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:19
4860
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:19
4861
- msgctxt "s2member-admin"
4862
- msgid "One Time (for 2 month access)"
4863
- msgstr ""
4864
-
4865
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:20
4866
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:20
4867
- msgctxt "s2member-admin"
4868
- msgid "One Time (for 3 month access)"
4869
- msgstr ""
4870
-
4871
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:21
4872
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:21
4873
- msgctxt "s2member-admin"
4874
- msgid "One Time (for 4 month access)"
4875
- msgstr ""
4876
-
4877
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:22
4878
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:22
4879
- msgctxt "s2member-admin"
4880
- msgid "One Time (for 5 month access)"
4881
- msgstr ""
4882
-
4883
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:23
4884
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:23
4885
- msgctxt "s2member-admin"
4886
- msgid "One Time (for 6 month access)"
4887
- msgstr ""
4888
-
4889
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:25
4890
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:25
4891
- msgctxt "s2member-admin"
4892
- msgid "One Time (for 1 year access)"
4893
- msgstr ""
4894
-
4895
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:26
4896
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:26
4897
- msgctxt "s2member-admin"
4898
- msgid "One Time (for 2 year access)"
4899
- msgstr ""
4900
-
4901
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:27
4902
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:27
4903
- msgctxt "s2member-admin"
4904
- msgid "One Time (for 3 year access)"
4905
- msgstr ""
4906
-
4907
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:28
4908
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:28
4909
- msgctxt "s2member-admin"
4910
- msgid "One Time (for 4 year access)"
4911
- msgstr ""
4912
-
4913
- #: s2member-pro/s2member-pro/includes/templates/options/alipay-membership-regular-terms.php:29
4914
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:29
4915
- msgctxt "s2member-admin"
4916
- msgid "One Time (for 5 year access)"
4917
- msgstr ""
4918
-
4919
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-ccap-terms.php:6
4920
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:35
4921
- msgctxt "s2member-admin"
4922
- msgid "Authorize.Net (Buy Now)"
4923
- msgstr ""
4924
-
4925
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:6
4926
- #: s2member-pro/s2member-pro/includes/templates/options/authnet-membership-regular-terms.php:18
4927
- msgctxt "s2member-admin"
4928
- msgid "Authorize.Net (Subscriptions)"
4929
- msgstr ""
4930
-
4931
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-ccap-terms.php:6
4932
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:14
4933
- msgctxt "s2member-admin"
4934
- msgid "ccBill Non-Recurring / Buy Now"
4935
- msgstr ""
4936
-
4937
- #: s2member-pro/s2member-pro/includes/templates/options/ccbill-membership-regular-terms.php:6
4938
- msgctxt "s2member-admin"
4939
- msgid "ccBill Recurring Plans"
4940
- msgstr ""
4941
-
4942
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-ccap-fixed-terms.php:6
4943
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-fixed-terms.php:6
4944
- msgctxt "s2member-admin"
4945
- msgid "ClickBank (Fixed Terms)"
4946
- msgstr ""
4947
-
4948
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-ccap-product-types.php:6
4949
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-product-types.php:6
4950
- msgctxt "s2member-admin"
4951
- msgid "Standard"
4952
- msgstr ""
4953
-
4954
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-product-types.php:7
4955
- msgctxt "s2member-admin"
4956
- msgid "Recurring"
4957
- msgstr ""
4958
-
4959
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-regular-p3s.php:6
4960
- msgctxt "s2member-admin"
4961
- msgid "Weekly"
4962
- msgstr ""
4963
-
4964
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-regular-p3s.php:7
4965
- msgctxt "s2member-admin"
4966
- msgid "Bi-Weekly"
4967
- msgstr ""
4968
-
4969
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-regular-p3s.php:8
4970
- msgctxt "s2member-admin"
4971
- msgid "Monthly"
4972
- msgstr ""
4973
-
4974
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-regular-p3s.php:9
4975
- msgctxt "s2member-admin"
4976
- msgid "Quarterly"
4977
- msgstr ""
4978
-
4979
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:6
4980
- msgctxt "s2member-admin"
4981
- msgid "No Trial"
4982
- msgstr ""
4983
-
4984
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:7
4985
- msgctxt "s2member-admin"
4986
- msgid "3 Days"
4987
- msgstr ""
4988
-
4989
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:8
4990
- msgctxt "s2member-admin"
4991
- msgid "4 Days"
4992
- msgstr ""
4993
-
4994
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:9
4995
- msgctxt "s2member-admin"
4996
- msgid "5 Days"
4997
- msgstr ""
4998
-
4999
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:10
5000
- msgctxt "s2member-admin"
5001
- msgid "6 Days"
5002
- msgstr ""
5003
-
5004
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:11
5005
- msgctxt "s2member-admin"
5006
- msgid "7 Days"
5007
- msgstr ""
5008
-
5009
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:12
5010
- msgctxt "s2member-admin"
5011
- msgid "8 Days"
5012
- msgstr ""
5013
-
5014
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:13
5015
- msgctxt "s2member-admin"
5016
- msgid "9 Days"
5017
- msgstr ""
5018
-
5019
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:14
5020
- msgctxt "s2member-admin"
5021
- msgid "10 Days"
5022
- msgstr ""
5023
-
5024
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:15
5025
- msgctxt "s2member-admin"
5026
- msgid "11 Days"
5027
- msgstr ""
5028
-
5029
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:16
5030
- msgctxt "s2member-admin"
5031
- msgid "12 Days"
5032
- msgstr ""
5033
-
5034
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:17
5035
- msgctxt "s2member-admin"
5036
- msgid "13 Days"
5037
- msgstr ""
5038
-
5039
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:18
5040
- msgctxt "s2member-admin"
5041
- msgid "14 Days"
5042
- msgstr ""
5043
-
5044
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:19
5045
- msgctxt "s2member-admin"
5046
- msgid "15 Days"
5047
- msgstr ""
5048
-
5049
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:20
5050
- msgctxt "s2member-admin"
5051
- msgid "16 Days"
5052
- msgstr ""
5053
-
5054
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:21
5055
- msgctxt "s2member-admin"
5056
- msgid "17 Days"
5057
- msgstr ""
5058
-
5059
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:22
5060
- msgctxt "s2member-admin"
5061
- msgid "18 Days"
5062
- msgstr ""
5063
-
5064
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:23
5065
- msgctxt "s2member-admin"
5066
- msgid "19 Days"
5067
- msgstr ""
5068
-
5069
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:24
5070
- msgctxt "s2member-admin"
5071
- msgid "20 Days"
5072
- msgstr ""
5073
-
5074
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:25
5075
- msgctxt "s2member-admin"
5076
- msgid "21 Days"
5077
- msgstr ""
5078
-
5079
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:26
5080
- msgctxt "s2member-admin"
5081
- msgid "22 Days"
5082
- msgstr ""
5083
-
5084
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:27
5085
- msgctxt "s2member-admin"
5086
- msgid "23 Days"
5087
- msgstr ""
5088
-
5089
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:28
5090
- msgctxt "s2member-admin"
5091
- msgid "24 Days"
5092
- msgstr ""
5093
-
5094
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:29
5095
- msgctxt "s2member-admin"
5096
- msgid "25 Days"
5097
- msgstr ""
5098
-
5099
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:30
5100
- msgctxt "s2member-admin"
5101
- msgid "26 Days"
5102
- msgstr ""
5103
-
5104
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:31
5105
- msgctxt "s2member-admin"
5106
- msgid "27 Days"
5107
- msgstr ""
5108
-
5109
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:32
5110
- msgctxt "s2member-admin"
5111
- msgid "28 Days"
5112
- msgstr ""
5113
-
5114
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:33
5115
- msgctxt "s2member-admin"
5116
- msgid "29 Days"
5117
- msgstr ""
5118
-
5119
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:34
5120
- msgctxt "s2member-admin"
5121
- msgid "30 Days"
5122
- msgstr ""
5123
-
5124
- #: s2member-pro/s2member-pro/includes/templates/options/clickbank-trial-p1s.php:35
5125
- msgctxt "s2member-admin"
5126
- msgid "31 Days"
5127
- msgstr ""
5128
-
5129
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-ccap-terms.php:6
5130
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:18
5131
- msgctxt "s2member-admin"
5132
- msgid "Google (Buy Now)"
5133
- msgstr ""
5134
-
5135
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:6
5136
- #: s2member-pro/s2member-pro/includes/templates/options/google-membership-regular-terms.php:12
5137
- msgctxt "s2member-admin"
5138
- msgid "Google (Subscriptions)"
5139
- msgstr ""
5140
-
5141
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:6
5142
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:17
5143
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:6
5144
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:19
5145
- msgctxt "s2member-admin"
5146
- msgid "PayPal Pro (Subscriptions)"
5147
- msgstr ""
5148
-
5149
- #: s2member-pro/s2member-pro/includes/templates/options/payflow-membership-regular-terms.php:41
5150
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-ccap-terms.php:6
5151
- #: s2member-pro/s2member-pro/includes/templates/options/paypal-membership-regular-terms.php:43
5152
- msgctxt "s2member-admin"
5153
- msgid "PayPal Pro (Buy Now)"
5154
- msgstr ""
5155
-
5156
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-ccap-terms.php:6
5157
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:43
5158
- msgctxt "s2member-admin"
5159
- msgid "Stripe (Buy Now)"
5160
- msgstr ""
5161
-
5162
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:6
5163
- #: s2member-pro/s2member-pro/includes/templates/options/stripe-membership-regular-terms.php:19
5164
- msgctxt "s2member-admin"
5165
- msgid "Stripe (Subscriptions)"
5166
- msgstr ""
5167
-
5168
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/authnet-cancellation-form-shortcode.php:6
5169
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/paypal-cancellation-form-shortcode.php:6
5170
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/stripe-cancellation-form-shortcode.php:6
5171
- msgctxt "s2member-front"
5172
- msgid "This will cancel your account. Are you sure?"
5173
- msgstr ""
5174
-
5175
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/authnet-registration-form-shortcode.php:6
5176
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/paypal-registration-form-shortcode.php:6
5177
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/stripe-registration-form-shortcode.php:6
5178
- msgctxt "s2member-front"
5179
- msgid "Signup now, it's Free!"
5180
- msgstr ""
5181
-
5182
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/authnet-update-form-shortcode.php:6
5183
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/paypal-update-form-shortcode.php:6
5184
- #: s2member-pro/s2member-pro/includes/templates/shortcodes/stripe-update-form-shortcode.php:6
5185
- msgctxt "s2member-front"
5186
- msgid "Update your billing information."
5187
- msgstr ""
2
  # This file is distributed under the same license as the package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: 150203\n"
6
  "Report-Msgid-Bugs-To: http://wordpress.org/tag/s2member\n"
7
+ "POT-Creation-Date: 2015-02-03 22:16:54+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
 
15
+ #: includes/classes/brute-force.inc.php:90
16
  msgctxt "s2member-front"
17
  msgid "Max failed logins. Please wait %s and try again."
18
  msgstr ""
19
 
20
+ #: includes/classes/custom-reg-fields.inc.php:338
21
+ #: includes/classes/custom-reg-fields.inc.php:470
22
+ #: includes/classes/profile-in.inc.php:116
23
+ #: includes/classes/sc-profile-in.inc.php:134
 
 
 
 
 
 
 
 
 
24
  msgctxt "s2member-front"
25
  msgid "First Name"
26
  msgstr ""
27
 
28
+ #: includes/classes/custom-reg-fields.inc.php:350
29
+ #: includes/classes/custom-reg-fields.inc.php:485
30
+ #: includes/classes/profile-in.inc.php:135
31
+ #: includes/classes/sc-profile-in.inc.php:153
 
 
 
 
 
 
 
 
 
32
  msgctxt "s2member-front"
33
  msgid "Last Name"
34
  msgstr ""
35
 
36
+ #: includes/classes/custom-reg-fields.inc.php:443
37
+ #: includes/classes/custom-reg-fields.inc.php:448
38
+ #: includes/classes/profile-in.inc.php:225
39
+ #: includes/classes/profile-in.inc.php:231
40
+ #: includes/classes/sc-profile-in.inc.php:243
41
+ #: includes/classes/sc-profile-in.inc.php:249
42
  msgctxt "s2member-front"
43
  msgid "Please type your Password twice to confirm."
44
  msgstr ""
45
 
46
+ #: includes/classes/custom-reg-fields.inc.php:444
47
  msgctxt "s2member-front"
48
  msgid "Password (please type it twice)"
49
  msgstr ""
50
 
51
+ #: includes/classes/custom-reg-fields.inc.php:452
52
+ #: includes/classes/profile-in.inc.php:235
53
+ #: includes/classes/sc-profile-in.inc.php:253
 
 
 
 
 
 
54
  msgctxt "s2member-front"
55
  msgid "password strength indicator"
56
  msgstr ""
57
 
58
+ #: includes/classes/custom-reg-fields.inc.php:597
59
+ #: includes/classes/custom-reg-fields.inc.php:608
60
  msgctxt "s2member-front"
61
  msgid "Invalid data type. Expecting a string."
62
  msgstr ""
63
 
64
+ #: includes/classes/custom-reg-fields.inc.php:603
65
  msgctxt "s2member-front"
66
  msgid "Invalid data type. Expecting an array."
67
  msgstr ""
68
 
69
+ #: includes/classes/custom-reg-fields.inc.php:616
70
+ #: includes/classes/custom-reg-fields.inc.php:647 includes/s2member-min.js:1
71
+ #: includes/s2member.js:366
72
  msgctxt "s2member-front"
73
  msgid "This is a required field, please try again."
74
  msgstr ""
75
 
76
+ #: includes/classes/custom-reg-fields.inc.php:622 includes/s2member-min.js:1
77
+ #: includes/s2member.js:351
78
  msgctxt "s2member-front"
79
  msgid "Required. This box must be checked."
80
  msgstr ""
81
 
82
+ #: includes/classes/custom-reg-fields.inc.php:627 includes/s2member-min.js:1
83
+ #: includes/s2member.js:346
84
  msgctxt "s2member-front"
85
  msgid "Please check at least one of the boxes."
86
  msgstr ""
87
 
88
+ #: includes/classes/custom-reg-fields.inc.php:632
89
+ #: includes/classes/custom-reg-fields.inc.php:637 includes/s2member-min.js:1
90
+ #: includes/s2member.js:357
91
  msgctxt "s2member-front"
92
  msgid "Please select one of the options."
93
  msgstr ""
94
 
95
+ #: includes/classes/custom-reg-fields.inc.php:642 includes/s2member-min.js:1
96
+ #: includes/s2member.js:362
97
  msgctxt "s2member-front"
98
  msgid "Please select at least one of the options."
99
  msgstr ""
100
 
101
+ #: includes/classes/custom-reg-fields.inc.php:658 includes/s2member-min.js:1
102
+ #: includes/s2member.js:372
103
  msgctxt "s2member-front"
104
  msgid "Must be numeric (with or without decimals, commas allowed)."
105
  msgstr ""
106
 
107
+ #: includes/classes/custom-reg-fields.inc.php:663 includes/s2member-min.js:1
108
+ #: includes/s2member.js:376
109
  msgctxt "s2member-front"
110
  msgid "Must be numeric (with or without decimals, no commas)."
111
  msgstr ""
112
 
113
+ #: includes/classes/custom-reg-fields.inc.php:668 includes/s2member-min.js:1
114
+ #: includes/s2member.js:380
115
  msgctxt "s2member-front"
116
  msgid "Must be an integer (a whole number, without any decimals)."
117
  msgstr ""
118
 
119
+ #: includes/classes/custom-reg-fields.inc.php:673
120
  msgctxt "s2member-front"
121
  msgid "Must be an integer &gt; 0 (whole number, no decimals, greater than 0)."
122
  msgstr ""
123
 
124
+ #: includes/classes/custom-reg-fields.inc.php:678 includes/s2member-min.js:1
125
+ #: includes/s2member.js:388
126
  msgctxt "s2member-front"
127
  msgid "Must be a float (floating point number, decimals required)."
128
  msgstr ""
129
 
130
+ #: includes/classes/custom-reg-fields.inc.php:683
131
  msgctxt "s2member-front"
132
  msgid "Must be a float &gt; 0 (floating point number, decimals required, greater than 0)."
133
  msgstr ""
134
 
135
+ #: includes/classes/custom-reg-fields.inc.php:688 includes/s2member-min.js:1
136
+ #: includes/s2member.js:396
137
  msgctxt "s2member-front"
138
  msgid "Must be a date (required date format: dd/mm/yyyy)."
139
  msgstr ""
140
 
141
+ #: includes/classes/custom-reg-fields.inc.php:693 includes/s2member-min.js:1
142
+ #: includes/s2member.js:400
143
  msgctxt "s2member-front"
144
  msgid "Must be a valid email address."
145
  msgstr ""
146
 
147
+ #: includes/classes/custom-reg-fields.inc.php:696
148
  msgctxt "s2member-front"
149
  msgid "Please use a personal email address. Addresses like &lt;%s@&gt; are problematic."
150
  msgstr ""
151
 
152
+ #: includes/classes/custom-reg-fields.inc.php:701 includes/s2member-min.js:1
153
+ #: includes/s2member.js:408
154
  msgctxt "s2member-front"
155
  msgid "Must be a full URL (starting with http or https)."
156
  msgstr ""
157
 
158
+ #: includes/classes/custom-reg-fields.inc.php:706 includes/s2member-min.js:1
159
+ #: includes/s2member.js:412
160
  msgctxt "s2member-front"
161
  msgid "Must be a domain name (domain name only, without http)."
162
  msgstr ""
163
 
164
+ #: includes/classes/custom-reg-fields.inc.php:711 includes/s2member-min.js:1
165
+ #: includes/s2member.js:416
166
  msgctxt "s2member-front"
167
  msgid "Must be a phone # (10 digits w/possible hyphens, spaces, brackets)."
168
  msgstr ""
169
 
170
+ #: includes/classes/custom-reg-fields.inc.php:716 includes/s2member-min.js:1
171
+ #: includes/s2member.js:420
172
  msgctxt "s2member-front"
173
  msgid "Must be a US zipcode (5-9 digits w/ possible hyphen)."
174
  msgstr ""
175
 
176
+ #: includes/classes/custom-reg-fields.inc.php:721
177
  msgctxt "s2member-front"
178
  msgid "Must be a Canadian zipcode (6 alpha-numerics w/ possible space)."
179
  msgstr ""
180
 
181
+ #: includes/classes/custom-reg-fields.inc.php:726 includes/s2member-min.js:1
182
+ #: includes/s2member.js:428
183
  msgctxt "s2member-front"
184
  msgid "Must be a zipcode (either a US or Canadian zipcode)."
185
  msgstr ""
186
 
187
+ #: includes/classes/custom-reg-fields.inc.php:732
188
  msgctxt "s2member-front"
189
  msgid "Please use alphanumerics, spaces &amp; punctuation only."
190
  msgstr ""
191
 
192
+ #: includes/classes/custom-reg-fields.inc.php:735
193
  msgctxt "s2member-front"
194
  msgid "Please use alphanumerics &amp; spaces only."
195
  msgstr ""
196
 
197
+ #: includes/classes/custom-reg-fields.inc.php:738
198
  msgctxt "s2member-front"
199
  msgid "Please use alphanumerics &amp; punctuation only (no spaces)."
200
  msgstr ""
201
 
202
+ #: includes/classes/custom-reg-fields.inc.php:741 includes/s2member-min.js:1
203
+ #: includes/s2member.js:444
204
  msgctxt "s2member-front"
205
  msgid "Please use alphanumerics only (no spaces/punctuation)."
206
  msgstr ""
207
 
208
+ #: includes/classes/custom-reg-fields.inc.php:744 includes/s2member-min.js:1
209
+ #: includes/s2member.js:448
210
  msgctxt "s2member-front"
211
  msgid "Please use alphabetics only (no digits/spaces/punctuation)."
212
  msgstr ""
213
 
214
+ #: includes/classes/custom-reg-fields.inc.php:747 includes/s2member-min.js:1
215
+ #: includes/s2member.js:452
216
  msgctxt "s2member-front"
217
  msgid "Please use numeric digits only."
218
  msgstr ""
219
 
220
+ #: includes/classes/custom-reg-fields.inc.php:760
221
+ #: includes/classes/custom-reg-fields.inc.php:774 includes/s2member-min.js:1
222
+ #: includes/s2member.js:459 includes/s2member.js:462
 
223
  msgctxt "s2member-front"
224
  msgid "digit"
225
  msgstr ""
226
 
227
+ #: includes/classes/custom-reg-fields.inc.php:761
228
+ #: includes/classes/custom-reg-fields.inc.php:775 includes/s2member-min.js:1
229
+ #: includes/s2member.js:459 includes/s2member.js:462
 
230
  msgctxt "s2member-front"
231
  msgid "digits"
232
  msgstr ""
233
 
234
+ #: includes/classes/custom-reg-fields.inc.php:764
235
+ #: includes/classes/custom-reg-fields.inc.php:778 includes/s2member-min.js:1
236
+ #: includes/s2member.js:459 includes/s2member.js:462
 
237
  msgctxt "s2member-front"
238
  msgid "character"
239
  msgstr ""
240
 
241
+ #: includes/classes/custom-reg-fields.inc.php:765
242
+ #: includes/classes/custom-reg-fields.inc.php:779 includes/s2member-min.js:1
243
+ #: includes/s2member.js:459 includes/s2member.js:462
 
244
  msgctxt "s2member-front"
245
  msgid "characters"
246
  msgstr ""
247
 
248
+ #: includes/classes/custom-reg-fields.inc.php:767 includes/s2member-min.js:1
249
+ #: includes/s2member.js:459
250
  msgctxt "s2member-front"
251
  msgid "Must be exactly %s %s."
252
  msgstr ""
253
 
254
+ #: includes/classes/custom-reg-fields.inc.php:781 includes/s2member-min.js:1
255
+ #: includes/s2member.js:462
256
  msgctxt "s2member-front"
257
  msgid "Must be at least %s %s."
258
  msgstr ""
259
 
260
+ #: includes/classes/email-configs.inc.php:150
261
  msgctxt "s2member-front"
262
  msgid "as a Member"
263
  msgstr ""
264
 
265
+ #: includes/classes/files-in.inc.php:112 includes/classes/files-in.inc.php:265
 
266
  msgctxt "s2member-front"
267
  msgid "<strong>404: Sorry, file not found.</strong> Please contact Support for assistance."
268
  msgstr ""
269
 
270
+ #: includes/classes/files-in.inc.php:123
271
  msgctxt "s2member-front"
272
  msgid "<strong>503 (Invalid Key):</strong> Sorry, your access to this file has expired. Please contact Support for assistance."
273
  msgstr ""
274
 
275
+ #: includes/classes/files-in.inc.php:144
276
  msgctxt "s2member-front"
277
  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 -› General Options -› Membership Options Page</code>."
278
  msgstr ""
279
 
280
+ #: includes/classes/files-in.inc.php:155
281
  msgctxt "s2member-front"
282
  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>."
283
  msgstr ""
284
 
285
+ #: includes/classes/files-in.inc.php:496
286
  msgctxt "s2member-front"
287
  msgid "<strong>503: Access denied.</strong> Invalid File Download specs."
288
  msgstr ""
289
 
290
+ #: includes/classes/files-in.inc.php:592
291
  msgctxt "s2member-front"
292
  msgid "Members Only"
293
  msgstr ""
294
 
295
+ #: includes/classes/files-in.inc.php:598
296
  msgctxt "s2member-front"
297
  msgid "<strong>401:</strong> Sorry, access denied."
298
  msgstr ""
300
  #. translators: In this translation, `%s` may be filled with an English
301
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
302
  #. if you like.
303
+ #: includes/classes/files-in.inc.php:905
304
  msgctxt "s2member-admin"
305
  msgid "Unable to update existing Amazon S3 Cross-Domain Policy. %s"
306
  msgstr ""
307
 
308
+ #: includes/classes/files-in.inc.php:908
309
  msgctxt "s2member-admin"
310
  msgid "Unable to update existing Amazon S3 Cross-Domain Policy. Connection failed."
311
  msgstr ""
313
  #. translators: In this translation, `%s` may be filled with an English
314
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
315
  #. if you like.
316
+ #: includes/classes/files-in.inc.php:912
317
  msgctxt "s2member-admin"
318
  msgid "Unable to update existing Amazon S3 Bucket Policy. %s"
319
  msgstr ""
320
 
321
+ #: includes/classes/files-in.inc.php:915
322
  msgctxt "s2member-admin"
323
  msgid "Unable to update existing Amazon S3 Bucket Policy. Connection failed."
324
  msgstr ""
326
  #. translators: In this translation, `%s` may be filled with an English
327
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
328
  #. if you like.
329
+ #: includes/classes/files-in.inc.php:919
330
  msgctxt "s2member-admin"
331
  msgid "Unable to update existing Amazon S3 Bucket ACLs. %s"
332
  msgstr ""
333
 
334
+ #: includes/classes/files-in.inc.php:922
335
  msgctxt "s2member-admin"
336
  msgid "Unable to update existing Amazon S3 Bucket ACLs. Connection failed."
337
  msgstr ""
338
 
339
+ #: includes/classes/files-in.inc.php:925
340
  msgctxt "s2member-admin"
341
  msgid "Unable to acquire/read existing Amazon S3 Bucket ACLs. Unexpected response."
342
  msgstr ""
344
  #. translators: In this translation, `%s` may be filled with an English
345
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
346
  #. if you like.
347
+ #: includes/classes/files-in.inc.php:929
348
  msgctxt "s2member-admin"
349
  msgid "Unable to acquire existing Amazon S3 Bucket ACLs. %s"
350
  msgstr ""
351
 
352
+ #: includes/classes/files-in.inc.php:932
353
  msgctxt "s2member-admin"
354
  msgid "Unable to acquire existing Amazon S3 Bucket ACLs. Connection failed."
355
  msgstr ""
356
 
357
+ #: includes/classes/files-in.inc.php:935
358
  msgctxt "s2member-admin"
359
  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."
360
  msgstr ""
361
 
362
+ #: includes/classes/files-in.inc.php:1042
363
  msgctxt "s2member-admin"
364
  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."
365
  msgstr ""
367
  #. translators: In this translation, `%s` may be filled with an English
368
  #. message, which comes from the Amazon CloudFront API call. Feel free to
369
  #. exclude `%s` if you like.
370
+ #: includes/classes/files-in.inc.php:1049
371
  msgctxt "s2member-admin"
372
  msgid "Unable to delete existing Amazon CloudFront Downloads Distro. %s"
373
  msgstr ""
374
 
375
+ #: includes/classes/files-in.inc.php:1061
376
  msgctxt "s2member-admin"
377
  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."
378
  msgstr ""
380
  #. translators: In this translation, `%s` may be filled with an English
381
  #. message, which comes from the Amazon CloudFront API call. Feel free to
382
  #. exclude `%s` if you like.
383
+ #: includes/classes/files-in.inc.php:1068
384
  msgctxt "s2member-admin"
385
  msgid "Unable to delete existing Amazon CloudFront Streaming Distro. %s"
386
  msgstr ""
388
  #. translators: In this translation, `%s` may be filled with an English
389
  #. message, which comes from the Amazon CloudFront API call. Feel free to
390
  #. exclude `%s` if you like.
391
+ #: includes/classes/files-in.inc.php:1084
392
+ #: includes/classes/files-in.inc.php:1272
393
  msgctxt "s2member-admin"
394
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. %s"
395
  msgstr ""
397
  #. translators: In this translation, `%s` may be filled with an English
398
  #. message, which comes from the Amazon S3 API call. Feel free to exclude `%s`
399
  #. if you like.
400
+ #: includes/classes/files-in.inc.php:1125
401
  msgctxt "s2member-admin"
402
  msgid "Unable to update existing Amazon S3 ACLs. %s"
403
  msgstr ""
404
 
405
+ #: includes/classes/files-in.inc.php:1128
406
  msgctxt "s2member-admin"
407
  msgid "Unable to update existing Amazon S3 ACLs. Connection failed."
408
  msgstr ""
410
  #. translators: In this translation, `%s` may be filled with an English
411
  #. message, which comes from the Amazon CloudFront API call. Feel free to
412
  #. exclude `%s` if you like.
413
+ #: includes/classes/files-in.inc.php:1132
414
+ #: includes/classes/files-in.inc.php:1567
415
  msgctxt "s2member-admin"
416
  msgid "Unable to create Amazon CloudFront Streaming Distro. %s"
417
  msgstr ""
418
 
419
+ #: includes/classes/files-in.inc.php:1135
420
+ #: includes/classes/files-in.inc.php:1570
421
  msgctxt "s2member-admin"
422
  msgid "Unable to create Amazon CloudFront Streaming Distro. Connection failed."
423
  msgstr ""
425
  #. translators: In this translation, `%s` may be filled with an English
426
  #. message, which comes from the Amazon CloudFront API call. Feel free to
427
  #. exclude `%s` if you like.
428
+ #: includes/classes/files-in.inc.php:1139
429
+ #: includes/classes/files-in.inc.php:1545
430
  msgctxt "s2member-admin"
431
  msgid "Unable to create Amazon CloudFront Downloads Distro. %s"
432
  msgstr ""
433
 
434
+ #: includes/classes/files-in.inc.php:1142
435
+ #: includes/classes/files-in.inc.php:1548
436
  msgctxt "s2member-admin"
437
  msgid "Unable to create Amazon CloudFront Downloads Distro. Connection failed."
438
  msgstr ""
440
  #. translators: In this translation, `%s` may be filled with an English
441
  #. message, which comes from the Amazon CloudFront API call. Feel free to
442
  #. exclude `%s` if you like.
443
+ #: includes/classes/files-in.inc.php:1146
444
+ #: includes/classes/files-in.inc.php:1318
445
  msgctxt "s2member-admin"
446
  msgid "Unable to create Amazon CloudFront Origin Access Identity. %s"
447
  msgstr ""
448
 
449
+ #: includes/classes/files-in.inc.php:1149
450
+ #: includes/classes/files-in.inc.php:1321
451
  msgctxt "s2member-admin"
452
  msgid "Unable to create Amazon CloudFront Origin Access Identity. Connection failed."
453
  msgstr ""
454
 
455
+ #: includes/classes/files-in.inc.php:1152
456
  msgctxt "s2member-admin"
457
  msgid "Unable to clear existing Amazon CloudFront Origin Access Identity."
458
  msgstr ""
460
  #. translators: In this translation, `%s` may be filled with an English
461
  #. message, which comes from the Amazon CloudFront API call. Feel free to
462
  #. exclude `%s` if you like.
463
+ #: includes/classes/files-in.inc.php:1156
464
+ #: includes/classes/files-in.inc.php:1227
465
  msgctxt "s2member-admin"
466
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. %s"
467
  msgstr ""
468
 
469
+ #: includes/classes/files-in.inc.php:1159
470
+ #: includes/classes/files-in.inc.php:1230
471
  msgctxt "s2member-admin"
472
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. Connection failed."
473
  msgstr ""
474
 
475
+ #: includes/classes/files-in.inc.php:1162
476
  msgctxt "s2member-admin"
477
  msgid "Unable to clear existing Amazon CloudFront Streaming Distro."
478
  msgstr ""
480
  #. translators: In this translation, `%s` may be filled with an English
481
  #. message, which comes from the Amazon CloudFront API call. Feel free to
482
  #. exclude `%s` if you like.
483
+ #: includes/classes/files-in.inc.php:1166
484
  msgctxt "s2member-admin"
485
  msgid "Unable to acquire existing Amazon CloudFront Streaming Distro. %s"
486
  msgstr ""
487
 
488
+ #: includes/classes/files-in.inc.php:1169
489
  msgctxt "s2member-admin"
490
  msgid "Unable to acquire existing Amazon CloudFront Streaming Distro. Connection failed."
491
  msgstr ""
492
 
493
+ #: includes/classes/files-in.inc.php:1172
494
  msgctxt "s2member-admin"
495
  msgid "Unable to clear existing Amazon CloudFront Downloads Distro."
496
  msgstr ""
498
  #. translators: In this translation, `%s` may be filled with an English
499
  #. message, which comes from the Amazon CloudFront API call. Feel free to
500
  #. exclude `%s` if you like.
501
+ #: includes/classes/files-in.inc.php:1176
502
  msgctxt "s2member-admin"
503
  msgid "Unable to acquire existing Amazon CloudFront Downloads Distro. %s"
504
  msgstr ""
505
 
506
+ #: includes/classes/files-in.inc.php:1179
507
  msgctxt "s2member-admin"
508
  msgid "Unable to acquire existing Amazon CloudFront Downloads Distro. Connection failed."
509
  msgstr ""
510
 
511
+ #: includes/classes/files-in.inc.php:1182
512
  msgctxt "s2member-admin"
513
  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."
514
  msgstr ""
515
 
516
+ #: includes/classes/files-in.inc.php:1185
517
  msgctxt "s2member-admin"
518
  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."
519
  msgstr ""
521
  #. translators: In this translation, `%s` may be filled with an English
522
  #. message, which comes from the Amazon CloudFront API call. Feel free to
523
  #. exclude `%s` if you like.
524
+ #: includes/classes/files-in.inc.php:1223
525
  msgctxt "s2member-admin"
526
  msgid "Existing Amazon CloudFront Origin Access Identity NOT found. %s"
527
  msgstr ""
528
 
529
+ #: includes/classes/files-in.inc.php:1233
530
  msgctxt "s2member-admin"
531
  msgid "Unable to acquire existing Amazon CloudFront Origin Access Identity. Invalid Access ID."
532
  msgstr ""
533
 
534
+ #: includes/classes/files-in.inc.php:1275
535
  msgctxt "s2member-admin"
536
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. Connection failed."
537
  msgstr ""
538
 
539
+ #: includes/classes/files-in.inc.php:1278
540
  msgctxt "s2member-admin"
541
  msgid "Unable to delete existing Amazon CloudFront Origin Access Identity. Invalid Access ID, ETag, or XML config."
542
  msgstr ""
543
 
544
+ #: includes/classes/files-in.inc.php:1305
545
+ #: includes/classes/files-in.inc.php:1532
546
+ #: includes/classes/files-in.inc.php:1554
547
  msgctxt "s2member-admin"
548
  msgid "Created by s2Member, for S3 Bucket: %s."
549
  msgstr ""
550
 
551
+ #: includes/classes/files-in.inc.php:1314
552
  msgctxt "s2member-admin"
553
  msgid "Unable to create/read Amazon CloudFront Origin Access Identity. Unexpected response."
554
  msgstr ""
556
  #. translators: In this translation, `%s` may be filled with an English
557
  #. message, which comes from the Amazon CloudFront API call. Feel free to
558
  #. exclude `%s` if you like.
559
+ #: includes/classes/files-in.inc.php:1360
560
  msgctxt "s2member-admin"
561
  msgid "Existing Amazon CloudFront Distro NOT found. %s"
562
  msgstr ""
564
  #. translators: In this translation, `%s` may be filled with an English
565
  #. message, which comes from the Amazon CloudFront API call. Feel free to
566
  #. exclude `%s` if you like.
567
+ #: includes/classes/files-in.inc.php:1364
568
  msgctxt "s2member-admin"
569
  msgid "Unable to acquire existing Amazon CloudFront Distro. %s"
570
  msgstr ""
571
 
572
+ #: includes/classes/files-in.inc.php:1367
573
  msgctxt "s2member-admin"
574
  msgid "Unable to acquire existing Amazon CloudFront Distro. Connection failed."
575
  msgstr ""
576
 
577
+ #: includes/classes/files-in.inc.php:1370
578
  msgctxt "s2member-admin"
579
  msgid "Unable to acquire existing Amazon CloudFront Distro. Invalid Distro ID and/or Distro type."
580
  msgstr ""
582
  #. translators: In this translation, `%s` may be filled with an English
583
  #. message, which comes from the Amazon CloudFront API call. Feel free to
584
  #. exclude `%s` if you like.
585
+ #: includes/classes/files-in.inc.php:1414
586
+ #: includes/classes/files-in.inc.php:1489
587
  msgctxt "s2member-admin"
588
  msgid "Unable to disable existing Amazon CloudFront Distro. %s"
589
  msgstr ""
590
 
591
+ #: includes/classes/files-in.inc.php:1417
592
+ #: includes/classes/files-in.inc.php:1492
593
  msgctxt "s2member-admin"
594
  msgid "Unable to disable existing Amazon CloudFront Distro. Connection failed."
595
  msgstr ""
596
 
597
+ #: includes/classes/files-in.inc.php:1420
598
  msgctxt "s2member-admin"
599
  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."
600
  msgstr ""
601
 
602
+ #: includes/classes/files-in.inc.php:1426
603
  msgctxt "s2member-admin"
604
  msgid "Unable to disable existing Amazon CloudFront Distro. Invalid Distro ID, ETag, or XML config."
605
  msgstr ""
607
  #. translators: In this translation, `%s` may be filled with an English
608
  #. message, which comes from the Amazon CloudFront API call. Feel free to
609
  #. exclude `%s` if you like.
610
+ #: includes/classes/files-in.inc.php:1471
611
  msgctxt "s2member-admin"
612
  msgid "Unable to delete existing Amazon CloudFront Distro. %s"
613
  msgstr ""
614
 
615
+ #: includes/classes/files-in.inc.php:1474
616
  msgctxt "s2member-admin"
617
  msgid "Unable to delete existing Amazon CloudFront Distro. Connection failed."
618
  msgstr ""
620
  #. translators: In this translation, `%s` may be filled with an English
621
  #. message, which comes from the Amazon CloudFront API call. Feel free to
622
  #. exclude `%s` if you like.
623
+ #: includes/classes/files-in.inc.php:1478
624
  msgctxt "s2member-admin"
625
  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."
626
  msgstr ""
628
  #. translators: In this translation, `%s` may be filled with an English
629
  #. message, which comes from the Amazon CloudFront API call. Feel free to
630
  #. exclude `%s` if you like.
631
+ #: includes/classes/files-in.inc.php:1482
632
  msgctxt "s2member-admin"
633
  msgid "Unable to check status of existing Amazon CloudFront Distro. %s"
634
  msgstr ""
635
 
636
+ #: includes/classes/files-in.inc.php:1485
637
  msgctxt "s2member-admin"
638
  msgid "Unable to check status of existing Amazon CloudFront Distro. Connection failed."
639
  msgstr ""
640
 
641
+ #: includes/classes/files-in.inc.php:1495
642
  msgctxt "s2member-admin"
643
  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."
644
  msgstr ""
645
 
646
+ #: includes/classes/files-in.inc.php:1498
647
  msgctxt "s2member-admin"
648
  msgid "Unable to delete existing Amazon CloudFront Distro. Invalid Distro ID or ETag."
649
  msgstr ""
650
 
651
+ #: includes/classes/files-in.inc.php:1541
652
  msgctxt "s2member-admin"
653
  msgid "Unable to create/read Amazon CloudFront Downloads Distro. Unexpected response."
654
  msgstr ""
655
 
656
+ #: includes/classes/files-in.inc.php:1563
657
  msgctxt "s2member-admin"
658
  msgid "Unable to create/read Amazon CloudFront Streaming Distro. Unexpected response."
659
  msgstr ""
660
 
661
+ #: includes/classes/files-in.inc.php:1574
662
  msgctxt "s2member-admin"
663
  msgid "Unable to create Amazon CloudFront Distro. Invalid Distro type."
664
  msgstr ""
665
 
666
+ #: includes/classes/login-checks.inc.php:51
667
  msgctxt "s2member-front"
668
  msgid "<strong>ERROR</strong>: Invalid username for this site."
669
  msgstr ""
670
 
671
+ #: includes/classes/login-checks.inc.php:78
672
  msgctxt "s2member-front"
673
  msgid "<strong>ERROR</strong>: Max simultaneous logins for username: %1$s. Please wait %2$s and try again."
674
  msgstr ""
675
 
676
+ #: includes/classes/paypal-return-in-no-tx-data.inc.php:66
677
+ #: includes/classes/paypal-return-in-proxy-ty-email.inc.php:64
678
  msgctxt "s2member-front"
679
  msgid "<strong>Thank you! (you MUST check your email before proceeding).</strong><br /><br />* Note: It can take <em>(up to 15 minutes)</em> for Email Confirmation with important details. If you don't receive email confirmation in the next 15 minutes, please contact Support."
680
  msgstr ""
681
 
682
+ #: includes/classes/paypal-return-in-no-tx-data.inc.php:66
683
+ #: includes/classes/paypal-return-in-proxy-ty-email.inc.php:64
684
  msgctxt "s2member-front"
685
  msgid "<strong>** Sandbox Mode **</strong> You may NOT receive this Email in Sandbox Mode. Sandbox addresses are usually bogus (for testing)."
686
  msgstr ""
687
 
688
+ #: includes/classes/paypal-return-in-no-tx-data.inc.php:67
689
+ #: includes/classes/paypal-return-in-proxy-ty-email.inc.php:65
690
+ #: includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:207
691
+ #: includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:218
692
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:261
693
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:272
694
+ #: includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:163
695
+ #: includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:174
696
+ #: includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:185
697
+ #: includes/classes/paypal-return-in-web-accept-sp.inc.php:126
698
+ #: includes/classes/paypal-return-in.inc.php:95
699
+ #: includes/classes/paypal-return-in.inc.php:111
700
+ #: includes/classes/paypal-return-in.inc.php:137
701
  msgctxt "s2member-front"
702
  msgid "Back To Home Page"
703
  msgstr ""
704
 
705
+ #: includes/classes/paypal-return-in-proxy-x-preview.inc.php:64
706
  msgctxt "s2member-front"
707
  msgid "<strong>Thank you! (this is a preview, no action necessary).</strong><br /><br />* Note: each of your Customers are returned back to your site immediately after they complete checkout. This Return Page displays a message and instructions for the Customer. s2Member may change the message and instructions dynamically, based on what the Customer is actually doing <em>(i.e. based on the type of transaction that is taking place)</em>.<br /><br /><em>* With <a href=\"%s\" target=\"_blank\">s2Member Pro</a> installed, it is possible to customize this Return Page in various ways.</em>"
708
  msgstr ""
709
 
710
+ #: includes/classes/paypal-return-in-proxy-x-preview.inc.php:65
711
+ #: includes/classes/paypal-return-in-web-accept-sp.inc.php:115
712
  msgctxt "s2member-front"
713
  msgid "Continue (Click Here)"
714
  msgstr ""
715
 
716
+ #: includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:195
717
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:249
718
  msgctxt "s2member-front"
719
  msgid "Thank you! You've been updated to:"
720
  msgstr ""
721
 
722
+ #: includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:196
723
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:250
724
+ #: includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:152
725
  msgctxt "s2member-front"
726
  msgid "Please Log Back In (Click Here)"
727
  msgstr ""
728
 
729
+ #: includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:206
730
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:260
731
  msgctxt "s2member-front"
732
  msgid "<strong>ERROR:</strong> Unable to modify Subscription.<br />Please contact Support for assistance.<br /><br />The existing User ID is associated with an Administrator. Stopping here. Otherwise, an Administrator could lose access. Please make sure that you are NOT logged in as an Administrator while testing."
733
  msgstr ""
734
 
735
+ #: includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:217
736
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:271
737
  msgctxt "s2member-front"
738
  msgid "<strong>ERROR:</strong> Unable to modify Subscription.<br />Please contact Support for assistance.<br /><br />Could not get the existing User ID from the DB."
739
  msgstr ""
740
 
741
+ #: includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:228
742
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:383
743
+ #: includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:195
744
+ #: includes/classes/paypal-return-in-web-accept-sp.inc.php:136
745
  msgctxt "s2member-front"
746
  msgid "Thank you! Please check your email for further details regarding your purchase."
747
  msgstr ""
748
 
749
+ #: includes/classes/paypal-return-in-subscr-modify-w-level.inc.php:229
750
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:384
751
+ #: includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:196
752
+ #: includes/classes/paypal-return-in-web-accept-sp.inc.php:137
753
  msgctxt "s2member-front"
754
  msgid "Return to Home Page"
755
  msgstr ""
756
 
757
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:344
758
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:367
759
  msgctxt "s2member-front"
760
  msgid "<strong>Thank you! Your account has been approved.<br />The next step is to Register a Username for immediate access.</strong>"
761
  msgstr ""
762
 
763
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:345
764
+ #: includes/classes/paypal-return-in-subscr-or-wa-w-level.inc.php:368
765
  msgctxt "s2member-front"
766
  msgid "Please Register Now (Click Here)"
767
  msgstr ""
768
 
769
+ #: includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:151
770
  msgctxt "s2member-front"
771
  msgid "Thank you! You now have access to:"
772
  msgstr ""
773
 
774
+ #: includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:162
775
  msgctxt "s2member-front"
776
  msgid "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact Support for assistance.<br /><br />The existing User ID is associated with an Administrator. Stopping here. Otherwise, an Administrator could lose access. Please make sure that you are NOT logged in as an Administrator while testing."
777
  msgstr ""
778
 
779
+ #: includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:173
780
  msgctxt "s2member-front"
781
  msgid "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact Support for assistance.<br /><br />Could not get the existing User ID from the DB."
782
  msgstr ""
783
 
784
+ #: includes/classes/paypal-return-in-wa-ccaps-wo-level.inc.php:184
785
  msgctxt "s2member-front"
786
  msgid "<strong>ERROR:</strong> Unable to add new Capabilities.<br />Please contact Support for assistance.<br /><br />Missing User/Member details."
787
  msgstr ""
788
 
789
+ #: includes/classes/paypal-return-in-web-accept-sp.inc.php:114
790
  msgctxt "s2member-front"
791
  msgid "<strong>Thank You! Your transaction has been approved.</strong>"
792
  msgstr ""
793
 
794
+ #: includes/classes/paypal-return-in-web-accept-sp.inc.php:125
795
  msgctxt "s2member-front"
796
  msgid "<strong>ERROR:</strong> Unable to generate Access Link.<br />Please contact Support for assistance."
797
  msgstr ""
798
 
799
+ #: includes/classes/paypal-return-in.inc.php:94
800
  msgctxt "s2member-front"
801
  msgid "<strong>ERROR:</strong> Unexpected <code>txn_type/status</code>.<br />The <code>txn_type/status</code> did not meet requirements.<br />Please contact Support for assistance."
802
  msgstr ""
803
 
804
+ #: includes/classes/paypal-return-in.inc.php:110
805
  msgctxt "s2member-front"
806
  msgid "<strong>ERROR:</strong> Unable to verify <code>$_SERVER[\"HTTP_HOST\"]</code>.<br />Please contact Support for assistance.<br /><br />If you are the site owner, please check the <code>custom</code> value in your Button Code. It MUST start with your domain name."
807
  msgstr ""
808
 
809
+ #: includes/classes/paypal-return-in.inc.php:136
810
  msgctxt "s2member-front"
811
  msgid "<strong>ERROR:</strong> Unable to verify <code>$_POST</code> vars.<br />Please contact Support for assistance.<br /><br />This is most likely related to an invalid configuration of s2Member, or a problem with server compatibility. If you are the site owner, and you're absolutely SURE that your configuration is valid, you may want to run some tests on your server, just to be sure <code>$_POST</code> variables are populated, and that your server is able to connect/communicate with your Payment Gateway over an HTTPS connection.<br /><br />s2Member uses the <code>WP_Http</code> class for remote connections; which will try to use <code>cURL</code> first, and then fall back on the <code>FOPEN</code> method when <code>cURL</code> is not available. On a Windows server, you may have to disable your <code>cURL</code> extension; and instead, set <code>allow_url_fopen = yes</code> in your php.ini file. The <code>cURL</code> extension (usually) does NOT support SSL connections on a Windows server.<br /><br />Please see <a href=\"http://www.s2member.com/forums/topic/ideal-server-configuration-for-s2member/\" target=\"_blank\">this thread</a> for details regarding the ideal server configuration for s2Member."
812
  msgstr ""
815
  #. by PayPal. Replace `%2$s` and `%3$s` with: `Unable to process, please try
816
  #. again`, or something to that affect. Or, if you prefer, you could Filter
817
  #. ``$response["__error"]`` with `ws_plugin__s2member_paypal_api_response`.
818
+ #: includes/classes/paypal-utilities.inc.php:185
819
  msgctxt "s2member-front"
820
  msgid "Error #%1$s. %2$s. %3$s."
821
  msgstr ""
822
 
823
+ #: includes/classes/paypal-utilities.inc.php:188
824
+ #: includes/classes/paypal-utilities.inc.php:316
825
+ #: includes/classes/paypal-utilities.inc.php:324
 
 
826
  msgctxt "s2member-front"
827
  msgid "Error. Please contact Support for assistance."
828
  msgstr ""
829
 
830
+ #: includes/classes/paypal-utilities.inc.php:232
831
+ #: includes/classes/paypal-utilities.inc.php:238
832
  msgctxt "s2member-front"
833
  msgid "Error #%s. Transaction declined. Please use an alternate funding source."
834
  msgstr ""
835
 
836
+ #: includes/classes/paypal-utilities.inc.php:235
837
  msgctxt "s2member-front"
838
  msgid "Error #%s. Transaction declined. Express Checkout was NOT confirmed."
839
  msgstr ""
842
  #. Replace `%2$s` with: `Unable to process, please try again`, or something to
843
  #. that affect. Or, if you prefer, you could Filter ``$response["__error"]``
844
  #. with `ws_plugin__s2member_paypal_payflow_api_response`.
845
+ #: includes/classes/paypal-utilities.inc.php:314
846
+ #: includes/classes/paypal-utilities.inc.php:322
 
 
 
 
 
 
 
 
 
 
 
 
847
  msgctxt "s2member-front"
848
  msgid "Error #%1$s. %2$s."
849
  msgstr ""
850
 
851
+ #: includes/classes/paypal-utilities.inc.php:369
852
  msgctxt "s2member-front"
853
  msgid " Please contact PayPal Merchant Technical Support (www.paypal.com/mts) and request `Recurring Billing` service, and also ask to have `Reference Transactions` enabled for Recurring Billing via Express Checkout."
854
  msgstr ""
855
 
856
+ #: includes/classes/profile-in.inc.php:76
857
+ #: includes/classes/sc-profile-in.inc.php:94
 
858
  msgctxt "s2member-front"
859
  msgid "Username"
860
  msgstr ""
861
 
862
+ #: includes/classes/profile-in.inc.php:76
863
+ #: includes/classes/sc-profile-in.inc.php:94
864
  msgctxt "s2member-front"
865
  msgid "(cannot be changed)"
866
  msgstr ""
867
 
868
+ #: includes/classes/profile-in.inc.php:95
869
+ #: includes/classes/sc-profile-in.inc.php:113
 
 
 
 
 
 
 
 
 
 
 
870
  msgctxt "s2member-front"
871
  msgid "Email Address"
872
  msgstr ""
873
 
874
+ #: includes/classes/profile-in.inc.php:154
875
+ #: includes/classes/sc-profile-in.inc.php:172
876
  msgctxt "s2member-front"
877
  msgid "Display Name"
878
  msgstr ""
879
 
880
+ #: includes/classes/profile-in.inc.php:226
881
+ #: includes/classes/sc-profile-in.inc.php:244
882
  msgctxt "s2member-front"
883
  msgid "New Password?"
884
  msgstr ""
885
 
886
+ #: includes/classes/profile-in.inc.php:226
887
+ #: includes/classes/sc-profile-in.inc.php:244
888
  msgctxt "s2member-front"
889
  msgid "(please type it twice)"
890
  msgstr ""
891
 
892
+ #: includes/classes/profile-in.inc.php:227
893
+ #: includes/classes/sc-profile-in.inc.php:245
894
  msgctxt "s2member-front"
895
  msgid "Only if changing password, otherwise leave blank."
896
  msgstr ""
897
 
898
+ #: includes/classes/profile-in.inc.php:272
899
+ #: includes/classes/sc-profile-in.inc.php:291
900
  msgctxt "s2member-front"
901
  msgid "Save All Changes"
902
  msgstr ""
903
 
904
+ #: includes/classes/profile-mods-in.inc.php:149
905
+ #: includes/classes/profile-mods-in.inc.php:150
906
+ #: includes/classes/profile-mods-in.inc.php:151
907
+ #: includes/classes/sc-profile-in.inc.php:71
908
  msgctxt "s2member-front"
909
  msgid "Profile updated successfully."
910
  msgstr ""
911
 
912
+ #: includes/classes/register-in.inc.php:48
913
+ #: includes/classes/sp-access.inc.php:132
914
  msgctxt "s2member-front"
915
  msgid "<strong>Your Link Expired:</strong><br />Please contact Support if you need assistance."
916
  msgstr ""
917
 
918
+ #: includes/classes/registrations.inc.php:579
919
  msgctxt "s2member-front"
920
  msgid "s2Member security violation. You attempted to POST administrative variables that will NOT be trusted in a NON-administrative zone!"
921
  msgstr ""
922
 
923
+ #: includes/classes/return-templates.inc.php:51
924
  msgctxt "s2member-front"
925
  msgid "Continue"
926
  msgstr ""
927
 
928
+ #: includes/classes/return-templates.inc.php:52
929
  msgctxt "s2member-front"
930
  msgid "Thank you. Please click the link below."
931
  msgstr ""
932
 
933
+ #: includes/classes/return-templates.inc.php:70
934
  msgctxt "s2member-front"
935
  msgid "[ %s ] <strong><em>says&hellip;</em></strong>"
936
  msgstr ""
937
 
938
+ #: includes/classes/return-templates.inc.php:74
939
  msgctxt "s2member-front"
940
  msgid "If you need assistance, please <a href=\"%s\" target=\"_blank\">contact support</a>."
941
  msgstr ""
942
 
943
+ #: includes/classes/sc-paypal-button-e.inc.php:77
944
+ #: includes/classes/sc-paypal-button-in.inc.php:73
945
+ #: includes/classes/sc-paypal-button-in.inc.php:97
946
+ #: includes/classes/sc-paypal-button-in.inc.php:152
947
+ #: includes/classes/sc-paypal-button-in.inc.php:208
948
+ #: includes/templates/buttons/paypal-cancellation-button.php:7
949
+ #: includes/templates/buttons/paypal-ccaps-checkout-button.php:34
950
+ #: includes/templates/buttons/paypal-checkout-button.php:46
951
+ #: includes/templates/buttons/paypal-sp-checkout-button.php:34
 
 
 
952
  msgctxt "s2member-front paypal-button-lang-code"
953
  msgid "en_US"
954
  msgstr ""
955
 
956
+ #: includes/classes/translations.inc.php:80
957
  msgctxt "s2member-front"
958
  msgid "Username:"
959
  msgstr ""
960
 
961
+ #: includes/classes/translations.inc.php:84
962
  msgctxt "s2member-front"
963
  msgid "My Password:"
964
  msgstr ""
965
 
966
+ #: includes/classes/translations.inc.php:91
967
  msgctxt "s2member-front"
968
  msgid "Username *"
969
  msgstr ""
970
 
971
+ #: includes/classes/translations.inc.php:95
972
  msgctxt "s2member-front"
973
  msgid "Password *"
974
  msgstr ""
975
 
976
+ #: includes/classes/translations.inc.php:99
977
  msgctxt "s2member-front"
978
  msgid "Email Address *"
979
  msgstr ""
980
 
981
+ #: includes/classes/translations.inc.php:106
982
  msgctxt "s2member-front"
983
  msgid "Registration complete. Please log in."
984
  msgstr ""
985
 
986
+ #: includes/classes/translations.inc.php:113
987
  msgctxt "s2member-front"
988
  msgid ""
989
  "You have been invited to join `%1$s` at\n"
992
  "%4$s\n"
993
  msgstr ""
994
 
995
+ #: includes/classes/translations.inc.php:120
996
  msgctxt "s2member-front"
997
  msgid "Your account is now active. <a href=\"%1$s\">Visit site</a> or <a href=\"%2$s\">Log in</a>."
998
  msgstr ""
999
 
1000
+ #: includes/classes/translations.inc.php:140
1001
+ #: includes/classes/translations.inc.php:161
1002
  msgctxt "s2member-front"
1003
  msgid "By filling out the form below, you can <strong>add a site to your account</strong>."
1004
  msgstr ""
1005
 
1006
+ #: includes/classes/translations.inc.php:140
1007
  msgctxt "s2member-front"
1008
  msgid "You may create <strong>%s</strong> site."
1009
  msgid_plural "You may create up to <strong>%s</strong> sites."
1010
  msgstr[0] ""
1011
  msgstr[1] ""
1012
 
1013
+ #: includes/classes/translations.inc.php:161
1014
  msgctxt "s2member-front"
1015
  msgid "You may create up to <strong>%s</strong> site."
1016
  msgid_plural "You may create up to <strong>%s</strong> sites."
1017
  msgstr[0] ""
1018
  msgstr[1] ""
1019
 
1020
+ #: includes/classes/users-list-in.inc.php:349
1021
  msgctxt "s2member-front"
1022
  msgid "Additional Profile Fields"
1023
  msgstr ""
1024
 
1025
+ #: includes/classes/users-list-in.inc.php:349
1026
  msgctxt "s2member-front"
1027
  msgid "(for this site)"
1028
  msgstr ""
1029
 
1030
+ #: includes/classes/utils-time.inc.php:55
1031
  msgctxt "s2member-front"
1032
  msgid "less than a minute"
1033
  msgstr ""
1034
 
1035
+ #: includes/classes/utils-time.inc.php:56
1036
  msgctxt "s2member-front"
1037
  msgid "1 minute"
1038
  msgstr ""
1039
 
1040
+ #: includes/classes/utils-time.inc.php:57
1041
  msgctxt "s2member-front"
1042
  msgid "%s minute"
1043
  msgid_plural "%s minutes"
1044
  msgstr[0] ""
1045
  msgstr[1] ""
1046
 
1047
+ #: includes/classes/utils-time.inc.php:58
1048
  msgctxt "s2member-front"
1049
  msgid "about 1 hour"
1050
  msgstr ""
1051
 
1052
+ #: includes/classes/utils-time.inc.php:64
1053
  msgctxt "s2member-front"
1054
  msgid "1 hour"
1055
  msgstr ""
1056
 
1057
+ #: includes/classes/utils-time.inc.php:65
1058
  msgctxt "s2member-front"
1059
  msgid "%s hour"
1060
  msgid_plural "%s hours"
1061
  msgstr[0] ""
1062
  msgstr[1] ""
1063
 
1064
+ #: includes/classes/utils-time.inc.php:66
1065
  msgctxt "s2member-front"
1066
  msgid "about 1 day"
1067
  msgstr ""
1068
 
1069
+ #: includes/classes/utils-time.inc.php:72
1070
  msgctxt "s2member-front"
1071
  msgid "1 day"
1072
  msgstr ""
1073
 
1074
+ #: includes/classes/utils-time.inc.php:73
1075
  msgctxt "s2member-front"
1076
  msgid "%s day"
1077
  msgid_plural "%s days"
1078
  msgstr[0] ""
1079
  msgstr[1] ""
1080
 
1081
+ #: includes/classes/utils-time.inc.php:74
1082
  msgctxt "s2member-front"
1083
  msgid "about 1 week"
1084
  msgstr ""
1085
 
1086
+ #: includes/classes/utils-time.inc.php:80
1087
  msgctxt "s2member-front"
1088
  msgid "1 week"
1089
  msgstr ""
1090
 
1091
+ #: includes/classes/utils-time.inc.php:81
1092
  msgctxt "s2member-front"
1093
  msgid "%s week"
1094
  msgid_plural "%s weeks"
1095
  msgstr[0] ""
1096
  msgstr[1] ""
1097
 
1098
+ #: includes/classes/utils-time.inc.php:82
1099
  msgctxt "s2member-front"
1100
  msgid "about 1 month"
1101
  msgstr ""
1102
 
1103
+ #: includes/classes/utils-time.inc.php:88
1104
  msgctxt "s2member-front"
1105
  msgid "1 month"
1106
  msgstr ""
1107
 
1108
+ #: includes/classes/utils-time.inc.php:89
1109
  msgctxt "s2member-front"
1110
  msgid "%s month"
1111
  msgid_plural "%s months"
1112
  msgstr[0] ""
1113
  msgstr[1] ""
1114
 
1115
+ #: includes/classes/utils-time.inc.php:90
1116
  msgctxt "s2member-front"
1117
  msgid "about 1 year"
1118
  msgstr ""
1119
 
1120
+ #: includes/classes/utils-time.inc.php:96
1121
  msgctxt "s2member-front"
1122
  msgid "1 year"
1123
  msgstr ""
1124
 
1125
+ #: includes/classes/utils-time.inc.php:97
1126
  msgctxt "s2member-front"
1127
  msgid "%s year"
1128
  msgid_plural "%s years"
1129
  msgstr[0] ""
1130
  msgstr[1] ""
1131
 
1132
+ #: includes/classes/utils-time.inc.php:241
1133
  msgctxt "s2member-front"
1134
  msgid "Daily"
1135
  msgstr ""
1136
 
1137
+ #: includes/classes/utils-time.inc.php:241
1138
  msgctxt "s2member-front"
1139
  msgid "Weekly"
1140
  msgstr ""
1141
 
1142
+ #: includes/classes/utils-time.inc.php:241
1143
  msgctxt "s2member-front"
1144
  msgid "Monthly"
1145
  msgstr ""
1146
 
1147
+ #: includes/classes/utils-time.inc.php:241
1148
  msgctxt "s2member-front"
1149
  msgid "Yearly"
1150
  msgstr ""
1151
 
1152
+ #: includes/classes/utils-time.inc.php:241
1153
+ #: includes/classes/utils-time.inc.php:252
1154
  msgctxt "s2member-front"
1155
  msgid "Lifetime"
1156
  msgstr ""
1157
 
1158
+ #: includes/classes/utils-time.inc.php:245
1159
  msgctxt "s2member-front"
1160
  msgid "Bi-Weekly"
1161
  msgstr ""
1162
 
1163
+ #: includes/classes/utils-time.inc.php:246
1164
  msgctxt "s2member-front"
1165
  msgid "Bi-Monthly"
1166
  msgstr ""
1167
 
1168
+ #: includes/classes/utils-time.inc.php:247
1169
  msgctxt "s2member-front"
1170
  msgid "Quarterly"
1171
  msgstr ""
1172
 
1173
+ #: includes/classes/utils-time.inc.php:248
1174
  msgctxt "s2member-front"
1175
  msgid "Semi-Yearly"
1176
  msgstr ""
1177
 
1178
+ #: includes/classes/utils-time.inc.php:252
1179
  msgctxt "s2member-front"
1180
  msgid "Day"
1181
  msgstr ""
1182
 
1183
+ #: includes/classes/utils-time.inc.php:252
1184
  msgctxt "s2member-front"
1185
  msgid "Week"
1186
  msgstr ""
1187
 
1188
+ #: includes/classes/utils-time.inc.php:252
1189
  msgctxt "s2member-front"
1190
  msgid "Month"
1191
  msgstr ""
1192
 
1193
+ #: includes/classes/utils-time.inc.php:252
1194
  msgctxt "s2member-front"
1195
  msgid "Year"
1196
  msgstr ""
1197
 
1198
+ #: includes/classes/utils-time.inc.php:258
1199
  msgctxt "s2member-front"
1200
  msgid "Days"
1201
  msgstr ""
1202
 
1203
+ #: includes/classes/utils-time.inc.php:258
1204
  msgctxt "s2member-front"
1205
  msgid "Weeks"
1206
  msgstr ""
1207
 
1208
+ #: includes/classes/utils-time.inc.php:258
1209
  msgctxt "s2member-front"
1210
  msgid "Months"
1211
  msgstr ""
1212
 
1213
+ #: includes/classes/utils-time.inc.php:258
1214
  msgctxt "s2member-front"
1215
  msgid "Years"
1216
  msgstr ""
1217
 
1218
+ #: includes/classes/utils-time.inc.php:258
1219
  msgctxt "s2member-front"
1220
  msgid "Lifetimes"
1221
  msgstr ""
1222
 
1223
  #. translators: Each cycle ( i.e. `each day/week/month` or `every 2
1224
  #. days/weeks/months`, etc. ). Cycles are translated elsewhere.
1225
+ #: includes/classes/utils-time.inc.php:295
1226
+ #: includes/classes/utils-time.inc.php:338
1227
  msgctxt "s2member-front"
1228
  msgid "each %2$s"
1229
  msgid_plural "every %1$s %3$s"
1230
  msgstr[0] ""
1231
  msgstr[1] ""
1232
 
1233
+ #: includes/classes/utils-time.inc.php:298
1234
  msgctxt "s2member-front"
1235
  msgid "lifetime"
1236
  msgstr ""
1237
 
1238
  #. translators: Membership cycle ( i.e. `1 day/week/month` or `2
1239
  #. days/weeks/months`, etc. ). Most of this is translated elsewhere.
1240
+ #: includes/classes/utils-time.inc.php:302
1241
  msgctxt "s2member-front"
1242
  msgid "%1$s %2$s"
1243
  msgid_plural "%1$s %3$s"
1246
 
1247
  #. translators: Cycle ( i.e. `for 1 day/week/month` or `for 2
1248
  #. days/weeks/months`, etc. ). Most of this is translated elsewhere.
1249
+ #: includes/classes/utils-time.inc.php:345
1250
  msgctxt "s2member-front"
1251
  msgid "for %1$s %2$s"
1252
  msgid_plural "for %1$s %3$s"
1253
  msgstr[0] ""
1254
  msgstr[1] ""
1255
 
1256
+ #: includes/s2member-min.js:1 includes/s2member.js:35
1257
  msgctxt "s2member-front"
1258
  msgid "— Confirm File Download —"
1259
  msgstr ""
1260
 
1261
+ #: includes/s2member-min.js:1 includes/s2member.js:36
1262
  msgctxt "s2member-front"
1263
  msgid "You`ve downloaded %s protected %s in the last %s."
1264
  msgstr ""
1265
 
1266
+ #: includes/s2member-min.js:1 includes/s2member.js:36
1267
  msgctxt "s2member-front"
1268
  msgid "file"
1269
  msgstr ""
1270
 
1271
+ #: includes/s2member-min.js:1 includes/s2member.js:36
1272
  msgctxt "s2member-front"
1273
  msgid "files"
1274
  msgstr ""
1275
 
1276
+ #: includes/s2member-min.js:1 includes/s2member.js:36
1277
  msgctxt "s2member-front"
1278
  msgid "24 hours"
1279
  msgstr ""
1280
 
1281
+ #: includes/s2member-min.js:1 includes/s2member.js:36
1282
  msgctxt "s2member-front"
1283
  msgid "%s days"
1284
  msgstr ""
1285
 
1286
+ #: includes/s2member-min.js:1 includes/s2member.js:37
1287
  msgctxt "s2member-front"
1288
  msgid "You`re entitled to UNLIMITED downloads though (so, no worries)."
1289
  msgstr ""
1290
 
1291
+ #: includes/s2member-min.js:1 includes/s2member.js:37
1292
  msgctxt "s2member-front"
1293
  msgid "You`re entitled to %s unique %s %s."
1294
  msgstr ""
1295
 
1296
+ #: includes/s2member-min.js:1 includes/s2member.js:37
1297
  msgctxt "s2member-front"
1298
  msgid "download"
1299
  msgstr ""
1300
 
1301
+ #: includes/s2member-min.js:1 includes/s2member.js:37
1302
  msgctxt "s2member-front"
1303
  msgid "downloads"
1304
  msgstr ""
1305
 
1306
+ #: includes/s2member-min.js:1 includes/s2member.js:37
1307
  msgctxt "s2member-front"
1308
  msgid "each day"
1309
  msgstr ""
1310
 
1311
+ #: includes/s2member-min.js:1 includes/s2member.js:37
1312
  msgctxt "s2member-front"
1313
  msgid "every %s-day period"
1314
  msgstr ""
1315
 
1316
+ #: includes/s2member-min.js:1 includes/s2member.js:84 includes/s2member.js:89
1317
+ #: includes/s2member.js:94 includes/s2member.js:125 includes/s2member.js:180
1318
+ #: includes/s2member.js:185 includes/s2member.js:190 includes/s2member.js:219
1319
+ #: includes/s2member.js:248 includes/s2member.js:273
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1320
  msgctxt "s2member-front"
1321
  msgid "— Oops, you missed something: —"
1322
  msgstr ""
1323
 
1324
+ #: includes/s2member-min.js:1 includes/s2member.js:89 includes/s2member.js:185
 
 
 
 
 
 
 
 
 
 
1325
  msgctxt "s2member-front"
1326
  msgid "Passwords do not match up. Please try again."
1327
  msgstr ""
1328
 
1329
+ #: includes/s2member-min.js:1 includes/s2member.js:94 includes/s2member.js:190
 
 
 
 
 
 
 
 
 
 
1330
  msgctxt "s2member-front"
1331
  msgid "Password MUST be at least 6 characters. Please try again."
1332
  msgstr ""
1333
 
1334
+ #: includes/s2member-min.js:1 includes/s2member.js:313
1335
  msgctxt "s2member-front"
1336
  msgid "Strength indicator"
1337
  msgstr ""
1338
 
1339
+ #: includes/s2member-min.js:1 includes/s2member.js:314
1340
  msgctxt "s2member-front"
1341
  msgid "Very weak"
1342
  msgstr ""
1343
 
1344
+ #: includes/s2member-min.js:1 includes/s2member.js:315
1345
  msgctxt "s2member-front"
1346
  msgid "Weak"
1347
  msgstr ""
1348
 
1349
+ #: includes/s2member-min.js:1 includes/s2member.js:316
1350
  msgctxt "s2member-front"
1351
  msgid "Medium"
1352
  msgstr ""
1353
 
1354
+ #: includes/s2member-min.js:1 includes/s2member.js:317
1355
  msgctxt "s2member-front"
1356
  msgid "Strong"
1357
  msgstr ""
1358
 
1359
+ #: includes/s2member-min.js:1 includes/s2member.js:318
1360
  msgctxt "s2member-front"
1361
  msgid "Mismatch"
1362
  msgstr ""
1363
 
1364
+ #: includes/s2member-min.js:1 includes/s2member.js:384
1365
  msgctxt "s2member-front"
1366
  msgid "Must be an integer > 0 (whole number, no decimals, greater than 0)."
1367
  msgstr ""
1368
 
1369
+ #: includes/s2member-min.js:1 includes/s2member.js:392
1370
  msgctxt "s2member-front"
1371
  msgid "Must be a float > 0 (floating point number, decimals required, greater than 0)."
1372
  msgstr ""
1373
 
1374
+ #: includes/s2member-min.js:1 includes/s2member.js:404
1375
  msgctxt "s2member-front"
1376
  msgid ""
1377
  "Please use a personal email address.\n"
1378
  "Addresses like <%s@> are problematic."
1379
  msgstr ""
1380
 
1381
+ #: includes/s2member-min.js:1 includes/s2member.js:424
1382
  msgctxt "s2member-front"
1383
  msgid "Must be a Canadian zipcode (6 alpha-numerics w/possible space)."
1384
  msgstr ""
1385
 
1386
+ #: includes/s2member-min.js:1 includes/s2member.js:432
1387
  msgctxt "s2member-front"
1388
  msgid "Please use alphanumerics, spaces & punctuation only."
1389
  msgstr ""
1390
 
1391
+ #: includes/s2member-min.js:1 includes/s2member.js:436
1392
  msgctxt "s2member-front"
1393
  msgid "Please use alphanumerics & spaces only."
1394
  msgstr ""
1395
 
1396
+ #: includes/s2member-min.js:1 includes/s2member.js:440
1397
  msgctxt "s2member-front"
1398
  msgid "Please use alphanumerics & punctuation only (no spaces)."
1399
  msgstr ""
1400
 
1401
+ #: includes/syscon.inc.php:84
1402
  msgctxt "s2member-front recaptcha-lang-code"
1403
  msgid "en"
1404
  msgstr ""
1405
 
1406
+ #: includes/syscon.inc.php:154
1407
  msgctxt "s2member-front"
1408
  msgid "Yes, I want to receive updates via email."
1409
  msgstr ""
1410
 
1411
+ #: includes/syscon.inc.php:210
1412
  msgctxt "s2member-front"
1413
  msgid "[%s] Username/Password"
1414
  msgstr ""
1415
 
1416
+ #: includes/syscon.inc.php:211
1417
  msgctxt "s2member-front"
1418
  msgid ""
1419
  "Your Username/Password for:\n"
1424
  "%%%%wp_login_url%%%%"
1425
  msgstr ""
1426
 
1427
+ #: includes/syscon.inc.php:214
1428
  msgctxt "s2member-front"
1429
  msgid "[%s] New User Registration"
1430
  msgstr ""
1431
 
1432
+ #: includes/syscon.inc.php:215
1433
  msgctxt "s2member-front"
1434
  msgid ""
1435
  "New User Registration on your site:\n"
1441
  "IP Address: %%%%user_ip%%%%"
1442
  msgstr ""
1443
 
1444
+ #: includes/syscon.inc.php:237
 
1445
  msgctxt "s2member-front"
1446
  msgid "Congratulations! (your membership has been approved)"
1447
  msgstr ""
1448
 
1449
+ #: includes/syscon.inc.php:238
1450
  msgctxt "s2member-front"
1451
  msgid ""
1452
  "Thanks %%%%first_name%%%%! Your membership has been approved.\n"
1462
  "%s"
1463
  msgstr ""
1464
 
1465
+ #: includes/syscon.inc.php:241 includes/syscon.inc.php:245
1466
  msgctxt "s2member-front"
1467
  msgid "Thank you! Your account has been updated."
1468
  msgstr ""
1469
 
1470
+ #: includes/syscon.inc.php:242 includes/syscon.inc.php:246
1471
  msgctxt "s2member-front"
1472
  msgid ""
1473
  "Thanks %%%%first_name%%%%! Your account now has access to: %%%%item_name%%%%.\n"
1478
  "%s"
1479
  msgstr ""
1480
 
1481
+ #: includes/syscon.inc.php:249
 
1482
  msgctxt "s2member-front"
1483
  msgid "Thank You! (instructions for access)"
1484
  msgstr ""
1485
 
1486
+ #: includes/syscon.inc.php:250
1487
  msgctxt "s2member-front"
1488
  msgid ""
1489
  "Thanks %%%%first_name%%%%!\n"
1500
  "%s"
1501
  msgstr ""
1502
 
1503
+ #: includes/syscon.inc.php:289
1504
  msgctxt "s2member-front"
1505
  msgid "Free Subscriber"
1506
  msgstr ""
1507
 
1508
+ #: includes/syscon.inc.php:289
1509
  msgctxt "s2member-front"
1510
  msgid "Bronze Member"
1511
  msgstr ""
1512
 
1513
+ #: includes/syscon.inc.php:289
1514
  msgctxt "s2member-front"
1515
  msgid "Silver Member"
1516
  msgstr ""
1517
 
1518
+ #: includes/syscon.inc.php:289
1519
  msgctxt "s2member-front"
1520
  msgid "Gold Member"
1521
  msgstr ""
1522
 
1523
+ #: includes/syscon.inc.php:289
1524
  msgctxt "s2member-front"
1525
  msgid "Platinum Member"
1526
  msgstr ""
1527
 
1528
+ #: includes/syscon.inc.php:289
1529
  msgctxt "s2member-front"
1530
  msgid "Level %s Member"
1531
  msgstr ""
1532
 
1533
+ #: includes/templates/badges/s-badge.php:22
1534
  msgctxt "s2member-front"
1535
  msgid "s2Member&reg; ( Security for WordPress&reg; )"
1536
  msgstr ""
1537
 
1538
+ #: includes/templates/buttons/paypal-ccaps-checkout-button.php:9
1539
+ #: includes/templates/buttons/paypal-checkout-button.php:9
1540
+ #: includes/templates/buttons/paypal-sp-checkout-button.php:9
1541
  msgctxt "s2member-admin"
1542
  msgid "Instant Payment Notification & Return Page Details"
1543
  msgstr ""
1544
 
1545
+ #: includes/templates/buttons/paypal-ccaps-checkout-button.php:14
1546
+ #: includes/templates/buttons/paypal-checkout-button.php:14
1547
+ #: includes/templates/buttons/paypal-sp-checkout-button.php:14
1548
  msgctxt "s2member-admin"
1549
  msgid "Configures Basic Checkout Fields"
1550
  msgstr ""
1551
 
1552
+ #: includes/templates/buttons/paypal-ccaps-checkout-button.php:22
1553
+ #: includes/templates/buttons/paypal-checkout-button.php:22
1554
+ #: includes/templates/buttons/paypal-sp-checkout-button.php:22
1555
+ #: includes/templates/shortcodes/paypal-ccaps-checkout-button-shortcode.php:6
1556
+ #: includes/templates/shortcodes/paypal-checkout-button-shortcode.php:6
1557
+ #: includes/templates/shortcodes/paypal-sp-checkout-button-shortcode.php:6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1558
  msgctxt "s2member-admin"
1559
  msgid "Description and pricing details here."
1560
  msgstr ""
1561
 
1562
+ #: includes/templates/buttons/paypal-ccaps-checkout-button.php:25
1563
+ #: includes/templates/buttons/paypal-checkout-button.php:24
1564
+ #: includes/templates/buttons/paypal-sp-checkout-button.php:25
1565
  msgctxt "s2member-admin"
1566
  msgid "Configures s2Member's Unique Invoice ID/Code"
1567
  msgstr ""
1568
 
1569
+ #: includes/templates/buttons/paypal-ccaps-checkout-button.php:27
1570
+ #: includes/templates/buttons/paypal-sp-checkout-button.php:27
1571
  msgctxt "s2member-admin"
1572
  msgid "Associates Purchase With A User/Member (when/if applicable)"
1573
  msgstr ""
1574
 
1575
+ #: includes/templates/buttons/paypal-ccaps-checkout-button.php:30
1576
+ #: includes/templates/buttons/paypal-checkout-button.php:29
1577
+ #: includes/templates/buttons/paypal-sp-checkout-button.php:30
1578
  msgctxt "s2member-admin"
1579
  msgid "Identifies The Customer's IP Address For Tracking"
1580
  msgstr ""
1581
 
1582
+ #: includes/templates/buttons/paypal-ccaps-checkout-button.php:33
1583
+ #: includes/templates/buttons/paypal-checkout-button.php:45
1584
+ #: includes/templates/buttons/paypal-sp-checkout-button.php:33
1585
  msgctxt "s2member-admin"
1586
  msgid "Displays The PayPal Image Button"
1587
  msgstr ""
1588
 
1589
+ #: includes/templates/buttons/paypal-checkout-button.php:26
1590
  msgctxt "s2member-admin"
1591
  msgid "Identifies/Updates An Existing User/Member (when/if applicable)"
1592
  msgstr ""
1593
 
1594
+ #: includes/templates/buttons/paypal-checkout-button.php:32
1595
  msgctxt "s2member-admin"
1596
  msgid "Controls Modify Behavior At PayPal Checkout"
1597
  msgstr ""
1598
 
1599
+ #: includes/templates/buttons/paypal-checkout-button.php:34
1600
  msgctxt "s2member-admin"
1601
  msgid "Customizes Prices, Payments & Billing Cycle"
1602
  msgstr ""
1603
 
1604
+ #: includes/templates/errors/ip-restrictions.php:10
1605
  msgctxt "s2member-front"
1606
  msgid "503: Service Temporarily Unavailable"
1607
  msgstr ""
1608
 
1609
+ #: includes/templates/errors/ip-restrictions.php:13
1610
  msgctxt "s2member-front"
1611
  msgid "<strong>503: Service Temporarily Unavailable</strong><br />Too many IP addresses accessing one secure area<em>!</em><br />Please contact Support if you need assistance."
1612
  msgstr ""
1613
 
1614
+ #: includes/templates/options/paypal-currencies.php:6
 
 
 
 
 
1615
  msgctxt "s2member-admin"
1616
  msgid "Currency"
1617
  msgstr ""
1618
 
1619
+ #: includes/templates/options/paypal-membership-ccap-terms.php:6
1620
+ #: includes/templates/options/paypal-membership-regular-terms.php:43
1621
  msgctxt "s2member-admin"
1622
  msgid "PayPal (Buy Now)"
1623
  msgstr ""
1624
 
1625
+ #: includes/templates/options/paypal-membership-ccap-terms.php:7
 
 
 
1626
  msgctxt "s2member-admin"
1627
  msgid "One Time (for lifetime access, non-recurring)"
1628
  msgstr ""
1629
 
1630
+ #: includes/templates/options/paypal-membership-regular-terms.php:6
1631
+ #: includes/templates/options/paypal-membership-regular-terms.php:19
1632
  msgctxt "s2member-admin"
1633
  msgid "PayPal® (Subscriptions)"
1634
  msgstr ""
1635
 
1636
+ #: includes/templates/options/paypal-membership-regular-terms.php:7
 
 
1637
  msgctxt "s2member-admin"
1638
  msgid "Daily (recurring charge, for ongoing access)"
1639
  msgstr ""
1640
 
1641
+ #: includes/templates/options/paypal-membership-regular-terms.php:8
 
 
 
 
1642
  msgctxt "s2member-admin"
1643
  msgid "Weekly (recurring charge, for ongoing access)"
1644
  msgstr ""
1645
 
1646
+ #: includes/templates/options/paypal-membership-regular-terms.php:9
 
 
 
 
1647
  msgctxt "s2member-admin"
1648
  msgid "Bi-Weekly (recurring charge, for ongoing access)"
1649
  msgstr ""
1650
 
1651
+ #: includes/templates/options/paypal-membership-regular-terms.php:10
 
 
 
 
 
 
1652
  msgctxt "s2member-admin"
1653
  msgid "Monthly (recurring charge, for ongoing access)"
1654
  msgstr ""
1655
 
1656
+ #: includes/templates/options/paypal-membership-regular-terms.php:11
 
 
 
 
1657
  msgctxt "s2member-admin"
1658
  msgid "Bi-Monthly (recurring charge, for ongoing access)"
1659
  msgstr ""
1660
 
1661
+ #: includes/templates/options/paypal-membership-regular-terms.php:12
 
 
 
 
 
1662
  msgctxt "s2member-admin"
1663
  msgid "Quarterly (recurring charge, for ongoing access)"
1664
  msgstr ""
1665
 
1666
+ #: includes/templates/options/paypal-membership-regular-terms.php:13
 
 
 
 
1667
  msgctxt "s2member-admin"
1668
  msgid "Semi-Yearly (recurring charge, for ongoing access)"
1669
  msgstr ""
1670
 
1671
+ #: includes/templates/options/paypal-membership-regular-terms.php:14
 
 
 
 
1672
  msgctxt "s2member-admin"
1673
  msgid "Yearly (recurring charge, for ongoing access)"
1674
  msgstr ""
1675
 
1676
+ #: includes/templates/options/paypal-membership-regular-terms.php:20
 
 
 
1677
  msgctxt "s2member-admin"
1678
  msgid "One Time (for 1 day access, non-recurring)"
1679
  msgstr ""
1680
 
1681
+ #: includes/templates/options/paypal-membership-regular-terms.php:21
 
 
 
1682
  msgctxt "s2member-admin"
1683
  msgid "One Time (for 2 day access, non-recurring)"
1684
  msgstr ""
1685
 
1686
+ #: includes/templates/options/paypal-membership-regular-terms.php:22
 
 
 
1687
  msgctxt "s2member-admin"
1688
  msgid "One Time (for 3 day access, non-recurring)"
1689
  msgstr ""
1690
 
1691
+ #: includes/templates/options/paypal-membership-regular-terms.php:23
 
 
 
1692
  msgctxt "s2member-admin"
1693
  msgid "One Time (for 4 day access, non-recurring)"
1694
  msgstr ""
1695
 
1696
+ #: includes/templates/options/paypal-membership-regular-terms.php:24
 
 
 
1697
  msgctxt "s2member-admin"
1698
  msgid "One Time (for 5 day access, non-recurring)"
1699
  msgstr ""
1700
 
1701
+ #: includes/templates/options/paypal-membership-regular-terms.php:25
 
 
 
1702
  msgctxt "s2member-admin"
1703
  msgid "One Time (for 6 day access, non-recurring)"
1704
  msgstr ""
1705
 
1706
+ #: includes/templates/options/paypal-membership-regular-terms.php:27
 
 
 
 
1707
  msgctxt "s2member-admin"
1708
  msgid "One Time (for 1 week access, non-recurring)"
1709
  msgstr ""
1710
 
1711
+ #: includes/templates/options/paypal-membership-regular-terms.php:28
 
 
 
 
1712
  msgctxt "s2member-admin"
1713
  msgid "One Time (for 2 week access, non-recurring)"
1714
  msgstr ""
1715
 
1716
+ #: includes/templates/options/paypal-membership-regular-terms.php:29
 
 
 
 
1717
  msgctxt "s2member-admin"
1718
  msgid "One Time (for 3 week access, non-recurring)"
1719
  msgstr ""
1720
 
1721
+ #: includes/templates/options/paypal-membership-regular-terms.php:31
 
 
 
 
 
1722
  msgctxt "s2member-admin"
1723
  msgid "One Time (for 1 month access, non-recurring)"
1724
  msgstr ""
1725
 
1726
+ #: includes/templates/options/paypal-membership-regular-terms.php:32
 
 
 
 
1727
  msgctxt "s2member-admin"
1728
  msgid "One Time (for 2 month access, non-recurring)"
1729
  msgstr ""
1730
 
1731
+ #: includes/templates/options/paypal-membership-regular-terms.php:33
 
 
 
 
1732
  msgctxt "s2member-admin"
1733
  msgid "One Time (for 3 month access, non-recurring)"
1734
  msgstr ""
1735
 
1736
+ #: includes/templates/options/paypal-membership-regular-terms.php:34
 
 
 
 
1737
  msgctxt "s2member-admin"
1738
  msgid "One Time (for 4 month access, non-recurring)"
1739
  msgstr ""
1740
 
1741
+ #: includes/templates/options/paypal-membership-regular-terms.php:35
 
 
 
 
1742
  msgctxt "s2member-admin"
1743
  msgid "One Time (for 5 month access, non-recurring)"
1744
  msgstr ""
1745
 
1746
+ #: includes/templates/options/paypal-membership-regular-terms.php:36
 
 
 
 
1747
  msgctxt "s2member-admin"
1748
  msgid "One Time (for 6 month access, non-recurring)"
1749
  msgstr ""
1750
 
1751
+ #: includes/templates/options/paypal-membership-regular-terms.php:38
 
 
 
 
1752
  msgctxt "s2member-admin"
1753
  msgid "One Time (for 1 year access, non-recurring)"
1754
  msgstr ""
1755
 
1756
+ #: includes/templates/options/paypal-membership-regular-terms.php:44
 
 
 
 
 
1757
  msgctxt "s2member-admin"
1758
  msgid "One Time (for 1 day access, non-recurring, no trial)"
1759
  msgstr ""
1760
 
1761
+ #: includes/templates/options/paypal-membership-regular-terms.php:45
 
 
 
 
 
 
1762
  msgctxt "s2member-admin"
1763
  msgid "One Time (for 2 day access, non-recurring, no trial)"
1764
  msgstr ""
1765
 
1766
+ #: includes/templates/options/paypal-membership-regular-terms.php:46
 
 
 
 
 
 
1767
  msgctxt "s2member-admin"
1768
  msgid "One Time (for 3 day access, non-recurring, no trial)"
1769
  msgstr ""
1770
 
1771
+ #: includes/templates/options/paypal-membership-regular-terms.php:47
 
 
 
 
 
 
1772
  msgctxt "s2member-admin"
1773
  msgid "One Time (for 4 day access, non-recurring, no trial)"
1774
  msgstr ""
1775
 
1776
+ #: includes/templates/options/paypal-membership-regular-terms.php:48
 
 
 
 
 
 
1777
  msgctxt "s2member-admin"
1778
  msgid "One Time (for 5 day access, non-recurring, no trial)"
1779
  msgstr ""
1780
 
1781
+ #: includes/templates/options/paypal-membership-regular-terms.php:49
 
 
 
 
 
 
1782
  msgctxt "s2member-admin"
1783
  msgid "One Time (for 6 day access, non-recurring, no trial)"
1784
  msgstr ""
1785
 
1786
+ #: includes/templates/options/paypal-membership-regular-terms.php:51
 
 
 
 
 
 
1787
  msgctxt "s2member-admin"
1788
  msgid "One Time (for 1 week access, non-recurring, no trial)"
1789
  msgstr ""
1790
 
1791
+ #: includes/templates/options/paypal-membership-regular-terms.php:52
 
 
 
 
 
 
1792
  msgctxt "s2member-admin"
1793
  msgid "One Time (for 2 week access, non-recurring, no trial)"
1794
  msgstr ""
1795
 
1796
+ #: includes/templates/options/paypal-membership-regular-terms.php:53
 
 
 
 
 
 
1797
  msgctxt "s2member-admin"
1798
  msgid "One Time (for 3 week access, non-recurring, no trial)"
1799
  msgstr ""
1800
 
1801
+ #: includes/templates/options/paypal-membership-regular-terms.php:55
 
 
 
 
 
 
1802
  msgctxt "s2member-admin"
1803
  msgid "One Time (for 1 month access, non-recurring, no trial)"
1804
  msgstr ""
1805
 
1806
+ #: includes/templates/options/paypal-membership-regular-terms.php:56
 
 
 
 
 
 
1807
  msgctxt "s2member-admin"
1808
  msgid "One Time (for 2 month access, non-recurring, no trial)"
1809
  msgstr ""
1810
 
1811
+ #: includes/templates/options/paypal-membership-regular-terms.php:57
 
 
 
 
 
 
1812
  msgctxt "s2member-admin"
1813
  msgid "One Time (for 3 month access, non-recurring, no trial)"
1814
  msgstr ""
1815
 
1816
+ #: includes/templates/options/paypal-membership-regular-terms.php:58
 
 
 
 
 
 
1817
  msgctxt "s2member-admin"
1818
  msgid "One Time (for 4 month access, non-recurring, no trial)"
1819
  msgstr ""
1820
 
1821
+ #: includes/templates/options/paypal-membership-regular-terms.php:59
 
 
 
 
 
 
1822
  msgctxt "s2member-admin"
1823
  msgid "One Time (for 5 month access, non-recurring, no trial)"
1824
  msgstr ""
1825
 
1826
+ #: includes/templates/options/paypal-membership-regular-terms.php:60
 
 
 
 
 
 
1827
  msgctxt "s2member-admin"
1828
  msgid "One Time (for 6 month access, non-recurring, no trial)"
1829
  msgstr ""
1830
 
1831
+ #: includes/templates/options/paypal-membership-regular-terms.php:62
 
 
 
 
 
 
1832
  msgctxt "s2member-admin"
1833
  msgid "One Time (for 1 year access, non-recurring, no trial)"
1834
  msgstr ""
1835
 
1836
+ #: includes/templates/options/paypal-membership-regular-terms.php:63
 
 
 
 
 
1837
  msgctxt "s2member-admin"
1838
  msgid "One Time (for 2 year access, non-recurring, no trial)"
1839
  msgstr ""
1840
 
1841
+ #: includes/templates/options/paypal-membership-regular-terms.php:64
 
 
 
 
 
1842
  msgctxt "s2member-admin"
1843
  msgid "One Time (for 3 year access, non-recurring, no trial)"
1844
  msgstr ""
1845
 
1846
+ #: includes/templates/options/paypal-membership-regular-terms.php:65
 
 
 
 
 
1847
  msgctxt "s2member-admin"
1848
  msgid "One Time (for 4 year access, non-recurring, no trial)"
1849
  msgstr ""
1850
 
1851
+ #: includes/templates/options/paypal-membership-regular-terms.php:66
 
 
 
 
 
1852
  msgctxt "s2member-admin"
1853
  msgid "One Time (for 5 year access, non-recurring, no trial)"
1854
  msgstr ""
1855
 
1856
+ #: includes/templates/options/paypal-membership-regular-terms.php:68
 
 
 
 
 
1857
  msgctxt "s2member-admin"
1858
  msgid "One Time (for lifetime access, non-recurring, no trial)"
1859
  msgstr ""
1860
 
1861
+ #: includes/templates/options/paypal-membership-trial-terms.php:6
 
 
 
 
 
1862
  msgctxt "s2member-admin"
1863
  msgid "Days"
1864
  msgstr ""
1865
 
1866
+ #: includes/templates/options/paypal-membership-trial-terms.php:7
 
 
 
 
1867
  msgctxt "s2member-admin"
1868
  msgid "Weeks"
1869
  msgstr ""
1870
 
1871
+ #: includes/templates/options/paypal-membership-trial-terms.php:8
 
 
 
 
1872
  msgctxt "s2member-admin"
1873
  msgid "Months"
1874
  msgstr ""
1875
 
1876
+ #: includes/templates/options/paypal-membership-trial-terms.php:9
 
 
 
 
1877
  msgctxt "s2member-admin"
1878
  msgid "Years"
1879
  msgstr ""
1880
 
1881
+ #: includes/templates/options/paypal-sp-hours.php:6
 
 
 
 
 
 
1882
  msgctxt "s2member-admin"
1883
  msgid "Expires In Hours"
1884
  msgstr ""
1885
 
1886
+ #: includes/templates/options/paypal-sp-hours.php:7
 
 
 
 
 
 
1887
  msgctxt "s2member-admin"
1888
  msgid "Buy Now (Specific Post/Page, link valid for 2 hours)"
1889
  msgstr ""
1890
 
1891
+ #: includes/templates/options/paypal-sp-hours.php:8
 
 
 
 
 
 
1892
  msgctxt "s2member-admin"
1893
  msgid "Buy Now (Specific Post/Page, link valid for 4 hours)"
1894
  msgstr ""
1895
 
1896
+ #: includes/templates/options/paypal-sp-hours.php:9
 
 
 
 
 
 
1897
  msgctxt "s2member-admin"
1898
  msgid "Buy Now (Specific Post/Page, link valid for 6 hours)"
1899
  msgstr ""
1900
 
1901
+ #: includes/templates/options/paypal-sp-hours.php:10
 
 
 
 
 
 
1902
  msgctxt "s2member-admin"
1903
  msgid "Buy Now (Specific Post/Page, link valid for 8 hours)"
1904
  msgstr ""
1905
 
1906
+ #: includes/templates/options/paypal-sp-hours.php:11
 
 
 
 
 
 
1907
  msgctxt "s2member-admin"
1908
  msgid "Buy Now (Specific Post/Page, link valid for 10 hours)"
1909
  msgstr ""
1910
 
1911
+ #: includes/templates/options/paypal-sp-hours.php:12
 
 
 
 
 
 
1912
  msgctxt "s2member-admin"
1913
  msgid "Buy Now (Specific Post/Page, link valid for 12 hours)"
1914
  msgstr ""
1915
 
1916
+ #: includes/templates/options/paypal-sp-hours.php:17
 
 
 
 
 
 
 
1917
  msgctxt "s2member-admin"
1918
  msgid "Expires In Days"
1919
  msgstr ""
1920
 
1921
+ #: includes/templates/options/paypal-sp-hours.php:18
 
 
 
 
 
 
1922
  msgctxt "s2member-admin"
1923
  msgid "Buy Now (Specific Post/Page, link valid for 1 day)"
1924
  msgstr ""
1925
 
1926
+ #: includes/templates/options/paypal-sp-hours.php:19
 
 
 
 
 
 
 
1927
  msgctxt "s2member-admin"
1928
  msgid "Buy Now (Specific Post/Page, link valid for 2 days)"
1929
  msgstr ""
1930
 
1931
+ #: includes/templates/options/paypal-sp-hours.php:20
 
 
 
 
 
 
 
1932
  msgctxt "s2member-admin"
1933
  msgid "Buy Now (Specific Post/Page, link valid for 3 days)"
1934
  msgstr ""
1935
 
1936
+ #: includes/templates/options/paypal-sp-hours.php:21
 
 
 
 
 
 
 
1937
  msgctxt "s2member-admin"
1938
  msgid "Buy Now (Specific Post/Page, link valid for 4 days)"
1939
  msgstr ""
1940
 
1941
+ #: includes/templates/options/paypal-sp-hours.php:22
 
 
 
 
 
 
 
1942
  msgctxt "s2member-admin"
1943
  msgid "Buy Now (Specific Post/Page, link valid for 5 days)"
1944
  msgstr ""
1945
 
1946
+ #: includes/templates/options/paypal-sp-hours.php:23
 
 
 
 
 
 
 
1947
  msgctxt "s2member-admin"
1948
  msgid "Buy Now (Specific Post/Page, link valid for 6 days)"
1949
  msgstr ""
1950
 
1951
+ #: includes/templates/options/paypal-sp-hours.php:28
 
 
 
 
 
 
 
1952
  msgctxt "s2member-admin"
1953
  msgid "Expires In Weeks"
1954
  msgstr ""
1955
 
1956
+ #: includes/templates/options/paypal-sp-hours.php:29
 
 
 
 
 
 
 
1957
  msgctxt "s2member-admin"
1958
  msgid "Buy Now (Specific Post/Page, link valid for 1 week)"
1959
  msgstr ""
1960
 
1961
+ #: includes/templates/options/paypal-sp-hours.php:30
 
 
 
 
 
 
 
1962
  msgctxt "s2member-admin"
1963
  msgid "Buy Now (Specific Post/Page, link valid for 2 weeks)"
1964
  msgstr ""
1965
 
1966
+ #: includes/templates/options/paypal-sp-hours.php:31
 
 
 
 
 
 
 
1967
  msgctxt "s2member-admin"
1968
  msgid "Buy Now (Specific Post/Page, link valid for 3 weeks)"
1969
  msgstr ""
1970
 
1971
+ #: includes/templates/options/paypal-sp-hours.php:36
 
 
 
 
 
 
 
1972
  msgctxt "s2member-admin"
1973
  msgid "Expires In Months"
1974
  msgstr ""
1975
 
1976
+ #: includes/templates/options/paypal-sp-hours.php:37
 
 
 
 
 
 
 
1977
  msgctxt "s2member-admin"
1978
  msgid "Buy Now (Specific Post/Page, link valid for 1 month)"
1979
  msgstr ""
1980
 
1981
+ #: includes/templates/options/paypal-sp-hours.php:38
 
 
 
 
 
 
 
1982
  msgctxt "s2member-admin"
1983
  msgid "Buy Now (Specific Post/Page, link valid for 2 months)"
1984
  msgstr ""
1985
 
1986
+ #: includes/templates/options/paypal-sp-hours.php:39
 
 
 
 
 
 
 
1987
  msgctxt "s2member-admin"
1988
  msgid "Buy Now (Specific Post/Page, link valid for 3 months)"
1989
  msgstr ""
1990
 
1991
+ #: includes/templates/options/paypal-sp-hours.php:40
 
 
 
 
 
 
 
1992
  msgctxt "s2member-admin"
1993
  msgid "Buy Now (Specific Post/Page, link valid for 6 months)"
1994
  msgstr ""
1995
 
1996
+ #: includes/templates/options/paypal-sp-hours.php:45
 
 
 
 
 
 
 
1997
  msgctxt "s2member-admin"
1998
  msgid "Expires In Years"
1999
  msgstr ""
2000
 
2001
+ #: includes/templates/options/paypal-sp-hours.php:46
 
 
 
 
 
 
 
2002
  msgctxt "s2member-admin"
2003
  msgid "Buy Now (Specific Post/Page, link valid for 1 year)"
2004
  msgstr ""
2005
 
2006
+ #: includes/templates/options/paypal-sp-hours.php:47
 
 
 
 
 
 
 
2007
  msgctxt "s2member-admin"
2008
  msgid "Buy Now (Specific Post/Page, link valid for 2 years)"
2009
  msgstr ""
2010
 
2011
+ #: includes/templates/options/paypal-sp-hours.php:48
 
 
 
 
 
 
 
2012
  msgctxt "s2member-admin"
2013
  msgid "Buy Now (Specific Post/Page, link valid for 3 years)"
2014
  msgstr ""
2015
 
2016
+ #: includes/templates/options/paypal-sp-hours.php:49
 
 
 
 
 
 
 
2017
  msgctxt "s2member-admin"
2018
  msgid "Buy Now (Specific Post/Page, link valid for 4 years)"
2019
  msgstr ""
2020
 
2021
+ #: includes/templates/options/paypal-sp-hours.php:50
 
 
 
 
 
 
 
2022
  msgctxt "s2member-admin"
2023
  msgid "Buy Now (Specific Post/Page, link valid for 5 years)"
2024
  msgstr ""
2025
 
2026
+ #: includes/templates/options/paypal-sp-hours.php:51
 
 
 
 
 
 
 
2027
  msgctxt "s2member-admin"
2028
  msgid "Buy Now (Specific Post/Page, link valid for 50 years)"
2029
  msgstr ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -1,7 +1,7 @@
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
- Version: 150102
4
- Stable tag: 150102
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
@@ -25,11 +25,12 @@ Tested up to PHP: 5.6
25
 
26
  Copyright: © 2009 WebSharks, Inc.
27
  License: GNU General Public License v2 or later.
28
- Contributors: WebSharks, JasWSInc, anguz, raamdev
29
 
30
  Author: s2Member® / WebSharks, Inc.
31
  Author URI: http://www.s2member.com/
32
  Donate link: http://www.s2member.com/donate/
 
33
 
34
  Text Domain: s2member
35
  Domain Path: /includes/translations
@@ -174,12 +175,30 @@ Released under the terms of the [GNU General Public License](http://www.gnu.org/
174
 
175
  == Upgrade Notice ==
176
 
177
- = v150102 =
178
 
179
  (Maintenance Release) Upgrade immediately.
180
 
181
  == Changelog ==
182
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  = v150102 =
184
 
185
  - (s2Member/s2Member Pro) **Custom Field Mapping:** This release of s2Member adds an internal mapping from s2Member's Custom Field values for each user, to the `get_user_option()` function in the WordPress core. This makes it possible to retrieve user custom field values like always via `get_user_field()` or now through the native `get_user_option()` function also. The benefit of this is that s2Member's custom fields are now more compatible with other themes/plugins for WordPress.
1
  === s2Member Framework (Member Roles, Capabilities, Membership, PayPal Members) ===
2
 
3
+ Version: 150203
4
+ Stable tag: 150203
5
 
6
  SSL Compatible: yes
7
  bbPress® Compatible: yes
25
 
26
  Copyright: © 2009 WebSharks, Inc.
27
  License: GNU General Public License v2 or later.
28
+ Contributors: WebSharks, JasWSInc, anguz, raamdev, bruce-caldwell
29
 
30
  Author: s2Member® / WebSharks, Inc.
31
  Author URI: http://www.s2member.com/
32
  Donate link: http://www.s2member.com/donate/
33
+ Beta link: http://www.s2member.com/beta-testers/
34
 
35
  Text Domain: s2member
36
  Domain Path: /includes/translations
175
 
176
  == Upgrade Notice ==
177
 
178
+ = v150203 =
179
 
180
  (Maintenance Release) Upgrade immediately.
181
 
182
  == Changelog ==
183
 
184
+ = v150203 =
185
+
186
+ - (s2Member Pro) **Gift/Redemption Codes:** This release adds a powerful new shortcode: `[s2Member-Gift-Codes /]`. This makes it easy to generate and sell access to gift codes (i.e. gift certificates) and/or to a list of redemption codes. For instance, where a single team leader might like to purchase multiple accounts they can distribute to others on a team, or in a group. Video demo here: https://www.youtube.com/watch?v=T3N_vygowbM&feature=youtu.be ~ See also: [this GitHub issue](https://github.com/websharks/s2member/issues/386) for additional technical details.
187
+ - (s2Member Pro) **User-Specific Coupon Codes:** This release of s2Member makes it possible to configure Pro Form Coupon Codes that are connected (i.e. only valid) when entered by specific Users/Members who are logged into the site. See: `Dashboard ⥱ s2Member ⥱ Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/403) for additional technical details.
188
+ - (s2Member Pro) **Coupon Code Max Uses:** This release of s2Member Pro adds the ability to set a maximum number of times that a Coupon Code can be used. This makes it easy to create Coupon Codes that are designed to be used only one time, for instance; or for X number of times. After a Coupon Code is used X number of times, it will expire automatically. See: `Dashboard ⥱ s2Member ⥱ Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
189
+ - (s2Member Pro) **Coupon Code Usage Tracking:** This release of s2Member Pro adds the ability to track the number of times that each of your Coupon Codes have been used. It is also possible to alter the number of uses, and/or set a maximum number of uses. See: `Dashboard ⥱ s2Member ⥱ Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
190
+ - (s2Member Pro) **Coupon Code Active/Expires Dates:** This release of s2Member Pro makes it possible to establish both a start and end time for each of your Pro Coupon Codes. In previous versions of s2Member, it was only possible to set an expiration date. You can now create Coupon Codes that will become active at some point in the future automatically. See: `Dashboard ⥱ s2Member ⥱ Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
191
+ - (s2Member Pro) **Coupon Code UI Enhancements:** This release of s2Member Pro comes with an updated UI that makes it easier to manage your Pro Coupon Codes. See: `Dashboard ⥱ s2Member ⥱ Pro Coupon Codes`. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/285) for technical details.
192
+ - (s2Member Pro) **Store Coupon Codes for Each User:** s2Member Pro now stores a list of all coupon codes that a customer has used on your site. See: `Dashboard ⥱ Users ⥱ Choose User [Edit]`. Scrolling down to the set of s2-related fields will reveal a new list of coupon codes. This list will be filled for new customers only; i.e. s2Member does not have this data for past purchases; only for new customers that you acquire after updating to the latest release. See also [this GitHub issue](https://github.com/websharks/s2member/issues/462) if you'd additional details.
193
+ - (s2Member/s2Member Pro) **EOT Custom Value:** In this release of s2Member, the `get_user_option('s2member_custom')` value is preserved after an EOT has taken place, making it possible for site owners to continue to read this value (along with any custom pipe-delimited values they have injected there), even after an EOT has taken place. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/449).
194
+ - (s2Member/s2Member Pro) **JW Player Broken Links:** This release corrects some broken links referenced by the inline documentation for s2Member in the WordPress Dashboard. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/448) if you'd like further details.
195
+ - (s2Member/s2Member Pro) **Security:** This release of s2Member checks for the existence of the WordPress PHP Constant: `WPINC` instead of looking for the less reliable `$_SERVER['SCRIPT_FILENAME']`. Some site owners reported this was causing trouble in a localhost environment during testing, or when running s2Member on some hosts that are missing the `SCRIPT_FILENAME` environment variable; e.g. some Windows servers. Fixed in this release. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/454) if you'd like additional details.
196
+ - (s2Member Pro) **Advanced Import/Export Compat:** This release of s2Member Pro includes compatibility and a bug fix when running on WordPress v4.1+. Three PHP notices during importation, along with some quirky behavior associated with the `role` CSV column have been corrected. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/455) for technical details.
197
+ - (s2Member Pro) **`[s2Member-List /]` Bug Fix:** This release resolves an issue with pagination in the `[s2Member-List /]` shortcode after recent improvements to the search functionality. See [this GitHub issue](https://github.com/websharks/s2member/issues/155#issuecomment-69403120) if you'd like additional details.
198
+ - (s2Member Pro) **`[s2Member-List /]` Enhancement:** This release improves search functionality in the `[s2Member-List /]` shortcode, making it so that all searches default to `*[query]*`; i.e. are automatically wrapped by wildcards. If a user enters a wildcard explicitly (or a double quote), this default behavior is overridden and the search query is taken as given in such a scenario. This makes the search functionality easier for end-users to work with, since it no longer requires an exact match. Default behavior is now a fuzzy match. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/394) if you'd like further details.
199
+ - (s2Member/s2Member Pro) **AWS v4 Authentication:** This release of s2Member adds AWS v4 Authentication support for Amazon Web Service Regions that only accept the AWS v4 authentication scheme. If you had trouble in the recent past when attempting to integrate s2Member with S3 Buckets (or with CloudFront) in regions outside the USA, this release should resolve those issues for you. See also: [this GitHub issue](https://github.com/websharks/s2member/issues/440) if you'd like additional technical details.
200
+ - (s2Member Pro) **Bug Fix:** Pro Form Checkout Options not working in all cases whenever they are used together with Free Registration Forms. Resolved in this release.
201
+
202
  = v150102 =
203
 
204
  - (s2Member/s2Member Pro) **Custom Field Mapping:** This release of s2Member adds an internal mapping from s2Member's Custom Field values for each user, to the `get_user_option()` function in the WordPress core. This makes it possible to retrieve user custom field values like always via `get_user_field()` or now through the native `get_user_option()` function also. The benefit of this is that s2Member's custom fields are now more compatible with other themes/plugins for WordPress.
s2member-o.php CHANGED
@@ -14,6 +14,8 @@
14
  * @package s2Member
15
  * @since 110912
16
  */
 
 
17
  include_once dirname(__FILE__).'/includes/classes/utils-s2o.inc.php';
18
 
19
  if(($ws_plugin__s2member_o['wp_dir'] = c_ws_plugin__s2member_utils_s2o::wp_dir(dirname(__FILE__), dirname($_SERVER['SCRIPT_FILENAME']))))
@@ -29,6 +31,7 @@ if(($ws_plugin__s2member_o['wp_dir'] = c_ws_plugin__s2member_utils_s2o::wp_dir(d
29
  * @var bool
30
  */
31
  define ('SHORTINIT', TRUE);
 
32
  /**
33
  * Flag indicating only s2Member is being loaded.
34
  *
@@ -38,11 +41,12 @@ if(($ws_plugin__s2member_o['wp_dir'] = c_ws_plugin__s2member_utils_s2o::wp_dir(d
38
  * @var bool
39
  */
40
  define ('WS_PLUGIN__S2MEMBER_ONLY', TRUE);
 
41
  /*
42
  Load WordPress.
43
  */
44
  require($ws_plugin__s2member_o['wp_dir'].'/wp-load.php');
45
- eval ('?>'.$ws_plugin__s2member_o['wp_settings_as']); // Settings after ``SHORTINIT``.
46
  }
47
  else // Else fallback on full WordPress.
48
  require($ws_plugin__s2member_o['wp_dir'].'/wp-load.php');
14
  * @package s2Member
15
  * @since 110912
16
  */
17
+ define ('_WS_PLUGIN__S2MEMBER_ONLY', TRUE);
18
+
19
  include_once dirname(__FILE__).'/includes/classes/utils-s2o.inc.php';
20
 
21
  if(($ws_plugin__s2member_o['wp_dir'] = c_ws_plugin__s2member_utils_s2o::wp_dir(dirname(__FILE__), dirname($_SERVER['SCRIPT_FILENAME']))))
31
  * @var bool
32
  */
33
  define ('SHORTINIT', TRUE);
34
+
35
  /**
36
  * Flag indicating only s2Member is being loaded.
37
  *
41
  * @var bool
42
  */
43
  define ('WS_PLUGIN__S2MEMBER_ONLY', TRUE);
44
+
45
  /*
46
  Load WordPress.
47
  */
48
  require($ws_plugin__s2member_o['wp_dir'].'/wp-load.php');
49
+ eval ('?>'.$ws_plugin__s2member_o['wp_settings_as']);
50
  }
51
  else // Else fallback on full WordPress.
52
  require($ws_plugin__s2member_o['wp_dir'].'/wp-load.php');
s2member.php CHANGED
@@ -19,8 +19,8 @@
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
- Version: 150102
23
- Stable tag: 150102
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
@@ -40,7 +40,7 @@ Requires at least: 3.3
40
 
41
  Copyright: © 2009 WebSharks, Inc.
42
  License: GNU General Public License
43
- Contributors: WebSharks
44
 
45
  Author: s2Member / WebSharks, Inc.
46
  Author URI: http://www.s2member.com/
@@ -64,7 +64,7 @@ Description: s2Member, a powerful (free) membership plugin for WordPress. Protec
64
  Tags: s2, s2member, s2 member, membership, users, user, members, member, subscribers, subscriber, members only, roles, capabilities, capability, register, signup, paypal, paypal pro, pay pal, authorize, authorize.net, google wallet, clickbank, click bank, buddypress, buddy press, bbpress, bb press, shopping cart, cart, checkout, ecommerce
65
 
66
  -- end section for WordPress parsing. ------------------------------------------------------------------------------- */
67
- if(realpath(__FILE__) === realpath($_SERVER['SCRIPT_FILENAME']))
68
  exit('Do not access this file directly.');
69
  /**
70
  * The installed version of s2Member.
@@ -75,7 +75,7 @@ if(realpath(__FILE__) === realpath($_SERVER['SCRIPT_FILENAME']))
75
  * @var string
76
  */
77
  if(!defined('WS_PLUGIN__S2MEMBER_VERSION'))
78
- define('WS_PLUGIN__S2MEMBER_VERSION', '150102' /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
@@ -105,7 +105,7 @@ if(!defined('WS_PLUGIN__S2MEMBER_MIN_WP_VERSION'))
105
  * @var string
106
  */
107
  if(!defined('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION'))
108
- define('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION', '150102' /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.
@@ -132,15 +132,15 @@ if(version_compare(PHP_VERSION, WS_PLUGIN__S2MEMBER_MIN_PHP_VERSION, '>=') && ve
132
  /*
133
  Load a possible Pro module, if/when available.
134
  */
135
- if(apply_filters('ws_plugin__s2member_load_pro', TRUE) && file_exists(dirname(__FILE__).'-pro/pro-module.php'))
136
  {
137
- include_once dirname(__FILE__).'-pro/pro-module.php';
138
- if(is_dir(WP_PLUGIN_DIR.'/codestyling-localization') && !is_dir(dirname(__FILE__).'/s2member-pro') && function_exists('symlink'))
139
- {
140
- // Removing this for now. It causes problems during upgrades.
141
- //@symlink(dirname(__FILE__).'-pro', dirname(__FILE__).'/s2member-pro'); // For CS localization compatibility.
142
- //@chmod(dirname(__FILE__).'/s2member-pro', 0755);
143
- }
144
  }
145
  /*
146
  Configure options and their defaults.
19
  */
20
  /* -- This section for WordPress parsing. ------------------------------------------------------------------------------
21
 
22
+ Version: 150203
23
+ Stable tag: 150203
24
 
25
  SSL Compatible: yes
26
  bbPress Compatible: yes
40
 
41
  Copyright: © 2009 WebSharks, Inc.
42
  License: GNU General Public License
43
+ Contributors: WebSharks, JasWSInc, anguz, raamdev, bruce-caldwell
44
 
45
  Author: s2Member / WebSharks, Inc.
46
  Author URI: http://www.s2member.com/
64
  Tags: s2, s2member, s2 member, membership, users, user, members, member, subscribers, subscriber, members only, roles, capabilities, capability, register, signup, paypal, paypal pro, pay pal, authorize, authorize.net, google wallet, clickbank, click bank, buddypress, buddy press, bbpress, bb press, shopping cart, cart, checkout, ecommerce
65
 
66
  -- end section for WordPress parsing. ------------------------------------------------------------------------------- */
67
+ if(!defined('WPINC')) // MUST have WordPress.
68
  exit('Do not access this file directly.');
69
  /**
70
  * The installed version of s2Member.
75
  * @var string
76
  */
77
  if(!defined('WS_PLUGIN__S2MEMBER_VERSION'))
78
+ define('WS_PLUGIN__S2MEMBER_VERSION', '150203' /* !#distro-version#! */);
79
  /**
80
  * Minimum PHP version required to run s2Member.
81
  *
105
  * @var string
106
  */
107
  if(!defined('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION'))
108
+ define('WS_PLUGIN__S2MEMBER_MIN_PRO_VERSION', '150203' /* !#distro-version#! */);
109
  /*
110
  Several compatibility checks.
111
  If all pass, load the s2Member plugin.
132
  /*
133
  Load a possible Pro module, if/when available.
134
  */
135
+ if(apply_filters('ws_plugin__s2member_load_pro', TRUE))
136
  {
137
+ if(is_file($_s2member_pro = dirname(__FILE__).'-pro/pro-module.php'))
138
+ include_once $_s2member_pro;
139
+
140
+ else if(is_file($_s2member_pro = WP_PLUGIN_DIR.'/'.basename(dirname(__FILE__)).'-pro/pro-module.php'))
141
+ include_once $_s2member_pro;
142
+
143
+ unset($_s2member_pro); // Housekeeping.
144
  }
145
  /*
146
  Configure options and their defaults.