PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 261011
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v261011
261011 261001 260927 260917 260913 260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 All 192 releases
s2member / src / includes / classes / registrations.inc.php

registrations.inc.php in s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions 261011, at src/includes/classes/registrations.inc.php

1,368 lines 78.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // @codingStandardsIgnoreFile
3 /**
4 * Registration handlers.
5 *
6 * Copyright: © 2009-2011
7 * {@link http://websharks-inc.com/ WebSharks, Inc.}
8 * (coded in the USA)
9 *
10 * Released under the terms of the GNU General Public License.
11 * You should have received a copy of the GNU General Public License,
12 * along with this software. In the main directory, see: /licensing/
13 * If not, see: {@link http://www.gnu.org/licenses/}.
14 *
15 * @package s2Member\Registrations
16 * @since 3.5
17 */
18 if(!defined('WPINC')) // MUST have WordPress.
19 exit ('Do not access this file directly.');
20
21 if(!class_exists('c_ws_plugin__s2member_registrations'))
22 {
23 /**
24 * Registration handlers.
25 *
26 * @package s2Member\Registrations
27 * @since 3.5
28 */
29 class c_ws_plugin__s2member_registrations
30 {
31 /**
32 * Custom password; else randomly generated password.
33 *
34 * @package s2Member\Registrations
35 * @since 150826
36 *
37 * @param string $password Expects plain text pass.
38 *
39 * @return string Password.
40 */
41 public static function maybe_custom_pass(&$password)
42 {
43 $GLOBALS['ws_plugin__s2member_custom_password'] = ''; // Initialize.
44 $password = trim(stripslashes((string)$password));
45
46 if($password && $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_password'])
47 {
48 $GLOBALS['ws_plugin__s2member_custom_password'] = $password;
49 return ($GLOBALS['ws_plugin__s2member_plain_text_pass'] = $GLOBALS['ws_plugin__s2member_custom_password']);
50 }
51 if($password && c_ws_plugin__s2member_utils_conds::pro_is_installed() && c_ws_plugin__s2member_pro_remote_ops::is_remote_op('create_user'))
52 {
53 $GLOBALS['ws_plugin__s2member_custom_password'] = $password;
54 return ($GLOBALS['ws_plugin__s2member_plain_text_pass'] = $GLOBALS['ws_plugin__s2member_custom_password']);
55 }
56 return ($GLOBALS['ws_plugin__s2member_plain_text_pass'] = wp_generate_password());
57 }
58
59 /**
60 * Returns an error when an email domain cannot receive mail.
61 *
62 * @package s2Member\Registrations
63 * @since 261005
64 *
65 * @param string $email Email address being validated.
66 *
67 * @return string Error message, or an empty string when allowed/not enabled.
68 */
69 public static function registration_email_domain_validation_error($email = '')
70 {
71 if(empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_require_valid_email_domain']) || !is_email($email))
72 return '';
73
74 if(self::email_domain_validates($email))
75 return '';
76
77 return _x('Please use an email address with a valid mail domain.', 's2member-front', 's2member');
78 }
79
80 /**
81 * Determines whether an email domain can receive mail.
82 *
83 * An MX record is preferred. Without MX, SMTP permits delivery to the domain's
84 * address record, so A/AAAA is accepted as a standards-compatible fallback.
85 * Resolver/runtime failures fail open; an explicit null MX fails closed.
86 *
87 * @package s2Member\Registrations
88 * @since 261005
89 *
90 * @param string $email Syntactically valid email address.
91 *
92 * @return bool True when mail delivery is possible or DNS cannot be checked safely.
93 */
94 public static function email_domain_validates($email = '')
95 {
96 $email = trim((string)$email);
97 if(!is_email($email) || !($at = strrpos($email, '@')) || !isset($email[$at + 1]))
98 return TRUE; // Syntax validation belongs to the existing email validator, not this DNS-only check.
99
100 $domain = strtolower(substr($email, $at + 1));
101 //261005.0438 Allow deterministic QA/custom resolvers to short-circuit DNS without changing the production fail-open behavior.
102 $pre = apply_filters('ws_plugin__s2member_pre_email_domain_validation', NULL, $domain, $email);
103 if($pre !== NULL)
104 return (bool)$pre;
105
106 if(!function_exists('dns_get_record'))
107 return TRUE;
108
109 $mx_records = @dns_get_record($domain, DNS_MX);
110 if($mx_records === FALSE)
111 return TRUE; // Resolver/runtime problem: do not lock out registration.
112
113 $has_null_mx = FALSE;
114 foreach((array)$mx_records as $_record)
115 if(isset($_record['target']))
116 {
117 if(strlen(trim((string)$_record['target'], ". \t\n\r\0\x0B")))
118 return TRUE;
119 $has_null_mx = TRUE;
120 }
121 unset($_record);
122 if($has_null_mx)
123 return FALSE; // Explicit null MX: the domain intentionally does not accept email.
124
125 $address_records = @dns_get_record($domain, DNS_A | DNS_AAAA);
126 if($address_records === FALSE)
127 return TRUE; // Resolver/runtime problem: fail open.
128
129 foreach((array)$address_records as $_record)
130 if(!empty($_record['type']) && ($_record['type'] === 'A' || $_record['type'] === 'AAAA'))
131 return TRUE;
132 unset($_record);
133 return FALSE;
134 }
135
136 /**
137 * Filters WordPress-generated passwords.
138 *
139 * This can ONLY be fired through `/wp-login.php` on the front-side.
140 * Or through `/register` via BuddyPress.
141 *
142 * @package s2Member\Registrations
143 * @since 3.5
144 *
145 * @attaches-to ``add_filter('random_password');``
146 *
147 * @param string $password Expects a plain text password passed through by the filter.
148 *
149 * @return string Plain text password value.
150 */
151 public static function generate_password($password = '')
152 {
153 if (did_action('retrieve_password') || did_action('login_form_rp') || did_action('login_form_resetpass')) //260214
154 return $password;
155
156 static $did_generate_password = false; // Once only.
157
158 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
159 do_action('ws_plugin__s2member_before_generate_password', get_defined_vars());
160 unset($__refs, $__v); // Housekeeping.
161
162 $ci = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ruris_case_sensitive'] ? '' : 'i';
163
164 if(!empty($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_password']) && !$did_generate_password && !is_admin() && ((preg_match('/\/wp-login\.php/'.$ci, $_SERVER['REQUEST_URI']) && did_action('login_form_register')) || (c_ws_plugin__s2member_utils_conds::bp_is_installed() && bp_is_register_page()))) //260214
165 {
166 $GLOBALS['ws_plugin__s2member_custom_wp_login_bp_password'] = false; // Initialize.
167
168 if(!empty($_POST['ws_plugin__s2member_custom_reg_field_user_pass1']) && preg_match('/\/wp-login\.php/'.$ci, $_SERVER['REQUEST_URI']))
169 {
170 $password = self::maybe_custom_pass($_POST['ws_plugin__s2member_custom_reg_field_user_pass1']);
171 $GLOBALS['ws_plugin__s2member_custom_wp_login_bp_password'] = !empty($GLOBALS['ws_plugin__s2member_custom_password']) && $password === $GLOBALS['ws_plugin__s2member_custom_password'];
172 }
173 $GLOBALS['ws_plugin__s2member_plain_text_wp_login_bp_pass'] = $password; // Plain-text password.
174 $GLOBALS['ws_plugin__s2member_plain_text_pass'] = $password; // Plain-text password.
175
176 remove_filter('random_password', 'c_ws_plugin__s2member_registrations::generate_password');
177 $did_generate_password = true; // One time only.
178 }
179 return apply_filters('ws_plugin__s2member_generate_password', $password, get_defined_vars());
180 }
181
182 /**
183 * Intersects with ``register_new_user()`` in the WordPress core.
184 *
185 * This function Filters registration errors inside `/wp-login.php` via ``register_new_user()``.
186 *
187 * This can ONLY be fired through `/wp-login.php` on the front-side.
188 *
189 * @package s2Member\Registrations
190 * @since 140518
191 *
192 * @attaches-to ``add_filter('registration_errors');``
193 *
194 * @param WP_Error $errors Expects a `WP_Error` object passed in by the Filter.
195 * @param string $user_login Expects the User's Username, passed in by the Filter.
196 * @param string $user_email Expects the User's Email Address, passed in by the Filter.
197 *
198 * @return WP_Error A `WP_Error` object instance.
199 */
200 public static function custom_registration_field_errors($errors = NULL, $user_login = '', $user_email = '')
201 {
202 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
203 do_action('ws_plugin__s2member_before_custom_registration_field_errors', get_defined_vars());
204 unset($__refs, $__v); // Housekeeping.
205
206 $ci = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ruris_case_sensitive'] ? '' : 'i';
207
208 if(!is_admin() && preg_match('/\/wp-login\.php/'.$ci, $_SERVER['REQUEST_URI']))
209 if(is_wp_error($errors) && !empty($_POST) && is_array($_POST))
210 {
211 //261005.0438 Validate the core registration email server-side; browser JavaScript cannot reliably inspect DNS.
212 if(($_email_domain_error = self::registration_email_domain_validation_error($user_email)))
213 $errors->add('invalid_email_domain', $_email_domain_error);
214
215 foreach(c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST)) as $_key => $_value)
216 if(strpos($_key, 'ws_plugin__s2member_custom_reg_field_') === 0)
217 $input[str_replace('ws_plugin__s2member_custom_reg_field_', '', $_key)] = $_value;
218
219 $fields_to_validate = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level('auto-detection', 'registration', TRUE);
220 $validation_errors = c_ws_plugin__s2member_custom_reg_fields::validation_errors(!empty($input) ? $input : array(), $fields_to_validate);
221
222 if($validation_errors) foreach($validation_errors as $_field_var => $_error)
223 $errors->add('custom_reg_field_'.$_field_var, $_error);
224 unset($_field_var, $_error);
225 }
226 return apply_filters('ws_plugin__s2member_custom_registration_field_errors', $errors, get_defined_vars());
227 }
228
229 /**
230 * Intersects with ``bp_core_screen_signup()`` in the BuddyPress core.
231 *
232 * This can ONLY be fired through `/register` via BuddyPress.
233 *
234 * @package s2Member\Registrations
235 * @since 140518
236 *
237 * @attaches-to ``add_action('bp_signup_validate');``
238 */
239 public static function custom_registration_field_errors_4bp()
240 {
241 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
242 do_action('ws_plugin__s2member_before_custom_registration_field_errors_4bp', get_defined_vars());
243 unset($__refs, $__v); // Housekeeping.
244
245 if(!is_admin() && c_ws_plugin__s2member_utils_conds::bp_is_installed() && bp_is_register_page())
246 {
247 //261005.0438 On single-site BuddyPress, validate the account email here; Multisite is covered by `wpmu_validate_user_signup` below.
248 if(!is_multisite() && !empty($GLOBALS['bp']->signup) && is_object($GLOBALS['bp']->signup) && !empty($_POST['signup_email']) && ($_email_domain_error = self::registration_email_domain_validation_error(stripslashes((string)$_POST['signup_email']))))
249 $GLOBALS['bp']->signup->errors['signup_email'] = $_email_domain_error;
250
251 if(in_array('registration', $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_fields_4bp']))
252 if(apply_filters('ws_plugin__s2member_custom_registration_fields_4bp_display', TRUE, get_defined_vars()))
253 if(!empty($GLOBALS['bp']->signup) && is_object($GLOBALS['bp']->signup) && !empty($_POST) && is_array($_POST))
254 {
255 foreach(c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST)) as $_key => $_value)
256 if(strpos($_key, 'ws_plugin__s2member_custom_reg_field_') === 0)
257 $input[str_replace('ws_plugin__s2member_custom_reg_field_', '', $_key)] = $_value;
258
259 $fields_to_validate = c_ws_plugin__s2member_custom_reg_fields::custom_fields_configured_at_level('auto-detection', 'registration', TRUE);
260 $validation_errors = c_ws_plugin__s2member_custom_reg_fields::validation_errors(!empty($input) ? $input : array(), $fields_to_validate);
261
262 if($validation_errors) foreach($validation_errors as $_field_var => $_error)
263 $GLOBALS['bp']->signup->errors['custom_reg_field_'.$_field_var] = $_error;
264 unset($_field_var, $_error);
265 }
266 }
267 }
268
269 /**
270 * Filters Multisite User validation.
271 *
272 * This can ONLY be fired through `/wp-signup.php` on the front-side.
273 * Or through `/register` via BuddyPress.
274 *
275 * @package s2Member\Registrations
276 * @since 3.5
277 *
278 * @attaches-to ``add_filter('wpmu_validate_user_signup');``
279 *
280 * @param array $result Expects a ``$result`` array to be passed through by the Filter.
281 *
282 * @return array The Filtered ``$result`` array. Possibly containing errors introduced by s2Member.
283 */
284 public static function ms_validate_user_signup($result = array())
285 {
286 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
287 do_action('ws_plugin__s2member_before_ms_validate_user_signup', get_defined_vars());
288 unset($__refs, $__v); // Housekeeping.
289
290 $ci = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ruris_case_sensitive'] ? '' : 'i';
291
292 if(is_multisite()) // This event should ONLY be processed with Multisite Networking.
293 if(!is_admin() && isset ($result['user_name'], $result['user_email'], $result['errors']) && ((preg_match('/\/wp-signup\.php/'.$ci, $_SERVER['REQUEST_URI']) && !empty($_POST['stage']) && preg_match('/^validate-(user|blog)-signup$/', (string)$_POST['stage'])) || (c_ws_plugin__s2member_utils_conds::bp_is_installed() && bp_is_register_page())))
294 {
295 $errors =& $result['errors'];
296 /** @var $errors WP_Error Reference for IDEs. Needed in the routines below. */
297
298 if(in_array($errors->get_error_code(), array('user_name', 'user_email', 'user_email_used')))
299 if(c_ws_plugin__s2member_utils_users::ms_user_login_email_exists_but_not_on_blog($result['user_name'], $result['user_email']))
300 {
301 unset($errors->errors['user_name'], $errors->errors['user_email'], $errors->errors['user_email_used']);
302 unset($errors->error_data['user_name'], $errors->error_data['user_email'], $errors->error_data['user_email_used']);
303 }
304 //261005.0438 Enforce mail-domain validity on Multisite account creation after s2Member's existing-user join exception has been handled.
305 if(!c_ws_plugin__s2member_utils_users::ms_user_login_email_exists_but_not_on_blog($result['user_name'], $result['user_email']) && ($_email_domain_error = self::registration_email_domain_validation_error($result['user_email'])))
306 $errors->add('user_email_domain', $_email_domain_error);
307
308 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
309 do_action('ws_plugin__s2member_during_ms_validate_user_signup', get_defined_vars());
310 unset($__refs, $__v); // Housekeeping.
311 }
312 return apply_filters('ws_plugin__s2member_ms_validate_user_signup', $result, get_defined_vars());
313 }
314
315 /**
316 * Adds hidden fields for ``$_POST`` vars on signup.
317 *
318 * This can ONLY be fired through `/wp-signup.php` on the front-side.
319 * Or through `/register` via BuddyPress.
320 *
321 * @package s2Member\Registrations
322 * @since 3.5
323 *
324 * @attaches-to ``add_filter('signup_hidden_fields');``
325 */
326 public static function ms_process_signup_hidden_fields()
327 {
328 do_action('ws_plugin__s2member_before_ms_process_signup_hidden_fields', get_defined_vars());
329
330 $ci = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ruris_case_sensitive'] ? '' : 'i';
331
332 if(is_multisite()) // This event should ONLY be processed with Multisite Networking.
333 if(!is_admin() && !empty($_POST) && is_array($_POST) && ((preg_match('/\/wp-signup\.php/'.$ci, $_SERVER['REQUEST_URI']) && !empty($_POST['stage']) && preg_match('/^validate-(user|blog)-signup$/', (string)$_POST['stage'])) || (c_ws_plugin__s2member_utils_conds::bp_is_installed() && bp_is_register_page())))
334 {
335 foreach(c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST)) as $key => $value)
336 if(preg_match('/^ws_plugin__s2member_(custom_reg_field|user_new)_/', $key))
337 if($key = preg_replace('/_user_new_/', '_custom_reg_field_', $key))
338 echo '<input type="hidden" name="'.esc_attr($key).'" value="'.esc_attr(maybe_serialize($value)).'" />'."\n";
339
340 do_action('ws_plugin__s2member_during_ms_process_signup_hidden_fields', get_defined_vars());
341 }
342 do_action('ws_plugin__s2member_after_ms_process_signup_hidden_fields', get_defined_vars());
343 }
344
345 /**
346 * Adds Customs Fields to ``$meta`` on signup.
347 *
348 * This can ONLY be fired through `/wp-signup.php` on the front-side.
349 * Or possibly through `/user-new.php` in the admin.
350 * Or through `/register` via BuddyPress.
351 *
352 * @package s2Member\Registrations
353 * @since 3.5
354 *
355 * @attaches-to ``add_filter('add_signup_meta');``
356 * @attaches-to ``add_filter('bp_signup_usermeta');``
357 *
358 * @param array $meta Expects an array of meta-data to be passed in by the Filter.
359 *
360 * @return array Full ``$meta`` array with s2Member Custom Fields included.
361 */
362 public static function ms_process_signup_meta($meta = array())
363 {
364 global /* Multisite Networking. */
365 $current_site, $current_blog;
366 global $pagenow; // Need this to detect the current admin page.
367
368 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
369 do_action('ws_plugin__s2member_before_ms_process_signup_meta', get_defined_vars());
370 unset($__refs, $__v); // Housekeeping.
371
372 $ci = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ruris_case_sensitive'] ? '' : 'i';
373
374 if(is_multisite()) // This event should ONLY be processed with Multisite Networking.
375 if(!empty($_POST) && is_array($_POST) && ((is_blog_admin() && $pagenow === 'user-new.php') || (!is_admin() && ((preg_match('/\/wp-signup\.php/'.$ci, $_SERVER['REQUEST_URI']) && !empty($_POST['stage']) && preg_match('/^validate-(user|blog)-signup$/', (string)$_POST['stage'])) || (c_ws_plugin__s2member_utils_conds::bp_is_installed() && bp_is_register_page())))))
376 {
377 c_ws_plugin__s2member_email_configs::email_config(); // Configures `From:` header used in notifications.
378
379 $meta['add_to_blog'] = (empty($meta['add_to_blog'])) ? $current_blog->blog_id : $meta['add_to_blog'];
380 $meta['new_role'] = (empty($meta['new_role'])) ? get_option('default_role') : $meta['new_role'];
381
382 foreach(c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_POST)) as $key => $value)
383 if(preg_match('/^ws_plugin__s2member_(custom_reg_field|user_new)_/', $key))
384 if($key = preg_replace('/_user_new_/', '_custom_reg_field_', $key))
385 $meta['s2member_ms_signup_meta'][$key] = c_ws_plugin__s2member_utils_arrays::maybe_unserialize($value);
386 }
387 return apply_filters('ws_plugin__s2member_ms_process_signup_meta', $meta, get_defined_vars());
388 }
389
390 /**
391 * Intersects with ``wpmu_activate_signup()`` through s2Member's Multisite Networking patch.
392 *
393 * This function should return the same array that `wpmu_activate_signup()` returns; with the assumption that ``$user_already_exists``.
394 * Which is exactly where this function intersects inside the `/wp-includes/ms-functions.php`.
395 *
396 * This can ONLY be fired through `/wp-activate.php` on the front-side.
397 * Or through `/activate` via BuddyPress.
398 *
399 * @package s2Member\Registrations
400 * @since 3.5
401 *
402 * @attaches-to ``add_filter('_wpmu_activate_existing_error_');``
403 *
404 * @param WP_Error $_error Expects a `WP_Error` object to be passed through by the Filter.
405 * @param array $vars Expects the defined variables from the scope of the calling Filter.
406 *
407 * @return WP_Error|array If unable to add an existing User, the original ``$_error`` obj is returned.
408 * Otherwise we return an array of User details for continued processing by the caller.
409 */
410 public static function ms_activate_existing_user($_error = NULL, $vars = array())
411 {
412 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
413 do_action('ws_plugin__s2member_before_ms_activate_existing_user', get_defined_vars());
414 unset($__refs, $__v); // Housekeeping.
415
416 extract($vars); // Extract all variables from ``wpmu_activate_signup()`` function.
417
418 $ci = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ruris_case_sensitive'] ? '' : 'i';
419
420 if(is_multisite()) // This event should ONLY be processed with Multisite Networking.
421 if(!is_admin() && ((preg_match('/\/wp-activate\.php/'.$ci, $_SERVER['REQUEST_URI'])) || (c_ws_plugin__s2member_utils_conds::bp_is_installed() && bp_is_activation_page())))
422 {
423 if(!empty($user_id) && !empty($user_login) && !empty($user_email) && !empty($password) && !empty($meta) && !empty($meta['add_to_blog']) && !empty($meta['new_role']))
424 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']))
425 {
426 add_user_to_blog($meta['add_to_blog'], $user_id, $meta['new_role']); // Add this User to the specified Blog.
427 wp_update_user(wp_slash(array('ID' => $user_id, 'user_pass' => $password))); // Update Password so it's the same as in the following msg.
428 wpmu_welcome_user_notification($user_id, $password, $meta); // Send welcome letter via email just like ``wpmu_activate_signup()`` does.
429
430 do_action('wpmu_activate_user', $user_id, $password, $meta); // Process Hook that would have been fired inside ``wpmu_activate_signup()``.
431
432 return apply_filters('ws_plugin__s2member_ms_activate_existing_user', array('user_id' => $user_id, 'password' => $password, 'meta' => $meta), get_defined_vars());
433 }
434 }
435 return apply_filters('ws_plugin__s2member_ms_activate_existing_user', $_error, get_defined_vars()); // Else, return the standardized error.
436 }
437
438 /**
439 * Configures new Users on a Multisite Network installation.
440 *
441 * This can ONLY be fired in the admin via `/user-new.php`.
442 * Or also during an actual activation; through `/wp-activate.php`.
443 * Or also during an actual activation; through `/activate` via BuddyPress.
444 *
445 * @package s2Member\Registrations
446 * @since 3.5
447 *
448 * @attaches-to ``add_action('wpmu_activate_user');``
449 *
450 * @param int|string $user_id A numeric WordPress User ID.
451 * @param string $password Plain text Password should be passed through by the Action Hook.
452 * @param array $meta Expects an array of ``$meta`` details, passed through by the Action Hook.
453 */
454 public static function configure_user_on_ms_user_activation($user_id = '', $password = '', $meta = array())
455 {
456 global $pagenow; // Detect the current admin page.
457
458 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
459 do_action('ws_plugin__s2member_before_configure_user_on_ms_user_activation', get_defined_vars());
460 unset($__refs, $__v); // Housekeeping.
461
462 $ci = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ruris_case_sensitive'] ? '' : 'i';
463
464 if(is_multisite()) // This event should ONLY be processed with Multisite Networking.
465 if((is_blog_admin() && $pagenow === 'user-new.php' && isset ($_POST['noconfirmation'])) || (!is_admin() && ((preg_match('/\/wp-activate\.php/'.$ci, $_SERVER['REQUEST_URI'])) || (c_ws_plugin__s2member_utils_conds::bp_is_installed() && bp_is_activation_page()))))
466 {
467 c_ws_plugin__s2member_registrations::configure_user_registration($user_id, $password, ((isset ($meta['s2member_ms_signup_meta']) && is_array($meta['s2member_ms_signup_meta'])) ? $meta['s2member_ms_signup_meta'] : array()));
468 delete_user_meta($user_id, 's2member_ms_signup_meta');
469 }
470 do_action('ws_plugin__s2member_after_configure_user_on_ms_user_activation', get_defined_vars());
471 }
472
473 /**
474 * Configures new Users on a Multisite Network installation.
475 *
476 * This does NOT fire for a Super Admin managing Network Blogs.
477 * Actually it does; BUT it's blocked by the routine below.
478 * A Super Admin should NOT trigger this event.
479 *
480 * This function should ONLY be fired through `/wp-activate.php`.
481 * Or also through `/activate` via BuddyPress.
482 *
483 * @package s2Member\Registrations
484 * @since 3.5
485 *
486 * @attaches-to ``add_action('wpmu_activate_blog');``
487 *
488 * @param int|string $blog_id A numeric WordPress Blog ID.
489 * @param int|string $user_id A numeric WordPress User ID.
490 * @param string $password Plain text Password should be passed through by the Action Hook.
491 * @param string $title The title that a User chose during signup; for their new Blog on the Network.
492 * @param array $meta Expects an array of ``$meta`` details, passed through by the Action Hook.
493 */
494 public static function configure_user_on_ms_blog_activation($blog_id = '', $user_id = '', $password = '', $title = '', $meta = array())
495 {
496 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
497 do_action('ws_plugin__s2member_before_configure_user_on_ms_blog_activation', get_defined_vars());
498 unset($__refs, $__v); // Housekeeping.
499
500 $ci = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ruris_case_sensitive'] ? '' : 'i';
501
502 if(is_multisite()) // This event should ONLY be processed with Multisite Networking.
503 if(!is_admin() && ((preg_match('/\/wp-activate\.php/'.$ci, $_SERVER['REQUEST_URI'])) || (c_ws_plugin__s2member_utils_conds::bp_is_installed() && bp_is_activation_page())))
504 {
505 c_ws_plugin__s2member_registrations::configure_user_registration($user_id, $password, ((isset ($meta['s2member_ms_signup_meta']) && is_array($meta['s2member_ms_signup_meta'])) ? $meta['s2member_ms_signup_meta'] : array()));
506 delete_user_meta($user_id, 's2member_ms_signup_meta');
507 }
508 do_action('ws_plugin__s2member_after_configure_user_on_ms_blog_activation', get_defined_vars());
509 }
510
511 /**
512 * Assigns the proper role/ccaps on BP user activation.
513 *
514 * @attaches-to `bp_core_activated_user`
515 *
516 * @param string|integer $user_id Passed in by hook.
517 */
518 public static function bp_user_activation($user_id)
519 {
520 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
521 do_action('ws_plugin__s2member_before_bp_user_activation', get_defined_vars());
522 unset($__refs, $__v); // Housekeeping.
523
524 if(is_multisite() || !$user_id) return; // Nothing to do.
525
526 $role = get_user_option('s2member_bp_activation_role', $user_id);
527 $ccaps = get_user_option('s2member_bp_activation_ccaps', $user_id);
528
529 delete_user_option($user_id, 's2member_bp_activation_role');
530 delete_user_option($user_id, 's2member_bp_activation_ccaps');
531
532 if($role && ($user = new WP_User($user_id)) && $user->ID)
533 {
534 $user->set_role($role);
535 if($ccaps && is_array($ccaps)) foreach($ccaps as $_ccap)
536 $user->add_cap('access_s2member_ccap_'.$_ccap);
537 unset($_ccap); // Housekeeping.
538 }
539 }
540
541 /**
542 * Intersects with ``register_new_user()`` through s2Member's Multisite Networking patch.
543 *
544 * This function Filters registration errors inside `/wp-login.php` via ``register_new_user()``.
545 * When an existing Multisite User is registering, this takes over registration processing.
546 *
547 * This can ONLY be fired through `/wp-login.php` on the front-side.
548 *
549 * @package s2Member\Registrations
550 * @since 3.5
551 *
552 * @attaches-to ``add_filter('registration_errors');``
553 *
554 * @param WP_Error $errors Expects a `WP_Error` object passed in by the Filter.
555 * @param string $user_login Expects the User's Username, passed in by the Filter.
556 * @param string $user_email Expects the User's Email Address, passed in by the Filter.
557 *
558 * @return WP_Error A `WP_Error` object, or exits script execution after handling registration redirection.
559 */
560 public static function ms_register_existing_user($errors = NULL, $user_login = '', $user_email = '')
561 {
562 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
563 do_action('ws_plugin__s2member_before_ms_register_existing_user', get_defined_vars());
564 unset($__refs, $__v); // Housekeeping.
565
566 /** @var $ms_errors WP_Error Reference for IDEs. This is needed below. */
567 $ci = $GLOBALS['WS_PLUGIN__']['s2member']['o']['ruris_case_sensitive'] ? '' : 'i';
568
569 if(is_multisite()) // This event should ONLY be processed with Multisite Networking.
570 if(!is_admin() && preg_match('/\/wp-login\.php/'.$ci, $_SERVER['REQUEST_URI']))
571 if(is_wp_error($errors) && $errors->get_error_codes()) // Errors?
572 {
573 if(($user_id = c_ws_plugin__s2member_utils_users::ms_user_login_email_exists_but_not_on_blog($user_login, $user_email)))
574 {
575 foreach($errors->get_error_codes() as $error_code)
576 if(!in_array($error_code, array('username_exists', 'email_exists')))
577 $other_important_errors_exist[] = $error_code;
578
579 if(empty($other_important_errors_exist)) // Only if/when NO other important errors exist already.
580 {
581 $user_pass = wp_generate_password(); // Generate password for this user.
582 $has_custom_password = !empty($GLOBALS['ws_plugin__s2member_custom_password'])
583 && $user_pass === $GLOBALS['ws_plugin__s2member_custom_password'];
584 c_ws_plugin__s2member_registrations::ms_create_existing_user($user_login, $user_email, $user_pass, $user_id);
585
586 update_user_option($user_id, 'default_password_nag', $has_custom_password ? false : true, true);
587
588 if (version_compare(get_bloginfo('version'), '4.3.1', '>='))
589 wp_new_user_notification($user_id, null, $has_custom_password ? 'admin' : 'both', $user_pass);
590 else if (version_compare(get_bloginfo('version'), '4.3', '>='))
591 wp_new_user_notification($user_id, $has_custom_password ? 'admin' : 'both', $user_pass);
592 else wp_new_user_notification($user_id, $user_pass);
593
594 $redirect_to = !empty($_REQUEST['redirect_to']) ? trim(stripslashes($_REQUEST['redirect_to'])) : FALSE;
595 $redirect_to = $redirect_to ? $redirect_to // Note: the `checkemail` message is translated if using custom passwords.
596 : add_query_arg('checkemail', urlencode('registered'), wp_login_url());
597
598 do_action('ws_plugin__s2member_during_ms_register_existing_user', get_defined_vars());
599
600 wp_safe_redirect($redirect_to).exit (); // Safe, like: ``register_new_user()``.
601 }
602 }
603 }
604 else if(($ms = wpmu_validate_user_signup($user_login, $user_email)) && isset ($ms['errors']) && is_wp_error($ms_errors = $ms['errors']) && $ms_errors->get_error_code())
605 $errors->add($ms_errors->get_error_code(), $ms_errors->get_error_message());
606
607 return apply_filters('ws_plugin__s2member_ms_register_existing_user', $errors, get_defined_vars());
608 }
609
610 /**
611 * For Multisite Networks, this function is used to add a User to an existing Blog; and to simulate ``wp_create_user()`` behavior.
612 *
613 * The ``$user_id`` value will be returned by this function, just like ``wp_create_user()`` does.
614 * This function will fire the Hook `user_register`.
615 *
616 * @package s2Member\Registrations
617 * @since 3.5
618 *
619 * @param string $user_login Expects the User's Username.
620 * @param string $user_email Expects the User's Email Address.
621 * @param string $user_pass Expects the User's plain text Password.
622 * @param int|string $user_id Optional. A numeric WordPress User ID.
623 * If unspecified, a lookup is performed with ``$user_login`` and ``$user_email``.
624 *
625 * @return int|false Returns numeric ``$user_id`` on success, else false on failure.
626 */
627 public static function ms_create_existing_user($user_login = '', $user_email = '', $user_pass = '', $user_id = '')
628 {
629 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
630 do_action('ws_plugin__s2member_before_ms_create_existing_user', get_defined_vars());
631 unset($__refs, $__v); // Housekeeping.
632
633 if(is_multisite()) // This event should ONLY be processed with Multisite Networking.
634 {
635 if(($user_id || ($user_id = c_ws_plugin__s2member_utils_users::ms_user_login_email_exists_but_not_on_blog($user_login, $user_email))) && $user_pass)
636 {
637 $role = get_option('default_role'); // Use default Role.
638 add_existing_user_to_blog(array('user_id' => $user_id, 'role' => $role)); // Add User.
639 wp_update_user(wp_slash(array('ID' => $user_id, 'user_pass' => $user_pass))); // Update to ``$user_pass``.
640
641 do_action('ws_plugin__s2member_during_ms_create_existing_user', get_defined_vars());
642 do_action('user_register', $user_id); // So s2Member knows a User is registering.
643
644 return apply_filters('ws_plugin__s2member_ms_create_existing_user', $user_id, get_defined_vars());
645 }
646 }
647 return apply_filters('ws_plugin__s2member_ms_create_existing_user', FALSE, get_defined_vars());
648 }
649
650 /**
651 * Configures all new Users.
652 *
653 * The Hook `user_register` is also fired by calling:
654 * ``c_ws_plugin__s2member_registrations::ms_create_existing_user()`` and/or ``wpmu_create_user()``.
655 *
656 * This function also receives hand-offs from s2Member's handlers for these two Hooks:
657 * `wpmu_activate_user` and `wpmu_activate_blog`.
658 *
659 * @package s2Member\Registrations
660 * @since 3.5
661 *
662 * @attaches-to ``add_action('user_register');``
663 *
664 * @param int|string $user_id A numeric WordPress User ID.
665 * @param string $password Optional in most cases. A User's plain text Password. If unspecified, attempts are made to collect the plain text Password from other sources.
666 * @param array $meta Optional in most cases. Defaults to false. An array of meta data for a User/Member.
667 *
668 * @TODO Impossible to delete cookies when fired inside: `/wp-activate.php`?
669 */
670 public static function configure_user_registration($user_id = '', $password = '', $meta = array())
671 {
672 global $wpdb; // Global database object reference.
673 global $pagenow; // We need this to detect the current administration page.
674 global $current_site, $current_blog; // Adds support for Multisite Networking.
675 static $email_config, $processed; // Static vars prevent duplicate processing.
676
677 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
678 do_action('ws_plugin__s2member_before_configure_user_registration', get_defined_vars());
679 unset($__refs, $__v); // Housekeeping.
680
681 // With Multisite Networking, we need this to run on `user_register` ahead of `wpmu_activate_[user|blog]`.
682 if(!isset ($email_config) && ($email_config = TRUE)) // Anytime this routine is fired; we configure email.
683 c_ws_plugin__s2member_email_configs::email_config(); // Configures `From:` email header.
684
685 $_p = (isset ($_POST)) ? $_POST : NULL; // Grab global ``$_POST`` array here, if it's possible to do so.
686 $rvs = (isset ($GLOBALS['ws_plugin__s2member_registration_vars'])) ? $GLOBALS['ws_plugin__s2member_registration_vars'] : NULL;
687
688 if(!$processed /* Process only once. Safeguard this routine against duplicate processing via plugins (or even WordPress itself). */)
689
690 if(is_array($_p) || is_array($meta) || is_array($rvs) /* We MUST have at least ONE of these three arrays. Any of these will do in most cases. */)
691
692 if(!(is_multisite() && is_blog_admin() && $pagenow === 'user-new.php' && isset ($_p['noconfirmation']) && is_super_admin() && !is_array($meta)))
693 if(!(preg_match('/\/wp-activate\.php/', $_SERVER['REQUEST_URI']) && !is_array($meta)) /* If activating; we absolutely MUST have a ``$meta`` array. */)
694 if(!(c_ws_plugin__s2member_utils_conds::bp_is_installed() && bp_is_activation_page() && !is_array($meta)) /* If activating; MUST have ``$meta``. */)
695 if(!(c_ws_plugin__s2member_utils_conds::pro_is_installed() && c_ws_plugin__s2member_pro_remote_ops::is_remote_op('create_user') && !is_array($rvs)))
696
697 if($user_id && is_object($user = new WP_User ($user_id)) && !empty($user->ID) && ($user_id = $user->ID) && ($processed = TRUE))
698 {
699 settype($_p, 'array').settype($meta, 'array').settype($rvs, 'array'); // Force arrays here.
700
701 $_p = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($_p));
702 $meta = c_ws_plugin__s2member_utils_strings::trim_deep(stripslashes_deep($meta));
703 $rvs = c_ws_plugin__s2member_utils_strings::trim_deep($rvs /* Do NOT strip. */);
704
705 foreach($_p as $_key => $_value) // Scan ``$_p`` vars; adding `custom_reg_field` keys.
706 if(preg_match('/^ws_plugin__s2member_user_new_/', $_key)) // Look for keys.
707 if($_key = str_replace('_user_new_', '_custom_reg_field_', $_key))
708 $_p[$_key] = $_value; // Add each of these key conversions.
709 unset ($_key, $_value /* Just a little housekeeping here. */);
710
711 if(!is_admin()
712 && (isset ($_p['ws_plugin__s2member_custom_reg_field_s2member_subscr_gateway'])
713 || isset ($_p['ws_plugin__s2member_custom_reg_field_s2member_subscr_id'])
714 || isset ($_p['ws_plugin__s2member_custom_reg_field_s2member_subscr_baid'])
715 || isset ($_p['ws_plugin__s2member_custom_reg_field_s2member_subscr_cid'])
716 || isset ($_p['ws_plugin__s2member_custom_reg_field_s2member_custom'])
717 || isset ($_p['ws_plugin__s2member_custom_reg_field_s2member_level']) //240321
718 || isset ($_p['ws_plugin__s2member_custom_reg_field_s2member_ccaps'])
719 || isset ($_p['ws_plugin__s2member_custom_reg_field_s2member_auto_eot_time'])
720 || isset ($_p['ws_plugin__s2member_custom_reg_field_s2member_notes']))
721 )
722 exit (_x('s2Member security violation. You attempted to POST administrative variables that will NOT be trusted in a NON-administrative zone!', 's2member-front', 's2member'));
723
724 $_pmr = array_merge($_p, $meta, $rvs); // Merge all of these arrays together now, in this specific order.
725 unset($_p, $meta, $rvs); // These variables can all be unset now; we have them all in the ``$_pmr`` array.
726
727 $custom_reg_display_name = $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_display_name']; // Can be configured by the site owner.
728
729 if(!is_admin() && (!c_ws_plugin__s2member_utils_conds::pro_is_installed() || !c_ws_plugin__s2member_pro_remote_ops::is_remote_op('create_user')) && ($reg_cookies = c_ws_plugin__s2member_register_access::reg_cookies_ok()) && extract($reg_cookies))
730 { /* This routine could be processed through `/wp-login.php?action=register`, `/wp-activate.php`, or `/activate` via BuddyPress`.
731 This may also be processed through a standard BuddyPress installation, or another plugin calling `user_register`.
732 If processed through `/wp-activate.php`, it could've originated inside the admin—via `/user-new.php`. */
733 /**
734 * @var $subscr_gateway string Reference for IDEs.
735 * @var $subscr_id string Reference for IDEs.
736 * @var $custom string Reference for IDEs.
737 * @var $item_number string Reference for IDEs.
738 */
739 $processed = 'yes'; // Mark this as yes.
740
741 $current_role = c_ws_plugin__s2member_user_access::user_access_role($user);
742 //260814 Parse and pad optional CCaps/EOT components instead of suppressing undefined list() offsets.
743 list ($level, $ccaps, $eotper) = array_pad(explode(':', $item_number, 3), 3, '');
744 $role = 's2member_level'.$level; // Membership Level.
745
746 $email = $user->user_email;
747 $login = $user->user_login;
748 $ip = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_registration_ip'];
749 $ip = (!$ip) ? c_ws_plugin__s2member_utils_ip::current() : $ip;
750 $subscr_baid = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_subscr_baid'];
751 $subscr_cid = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_subscr_cid'];
752
753 if(!($auto_eot_time = '') && $eotper) // If a specific EOT Period is included.
754 $auto_eot_time = c_ws_plugin__s2member_utils_time::auto_eot_time('', '', '', $eotper);
755
756 $notes = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_notes'];
757
758 $opt_in = (!$GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_opt_in']) ? TRUE : FALSE;
759 $opt_in = (!$opt_in && !empty($_pmr['ws_plugin__s2member_custom_reg_field_opt_in'])) ? TRUE : $opt_in;
760
761 if(!($fname = $user->first_name))
762 if(!empty($_pmr['ws_plugin__s2member_custom_reg_field_first_name']))
763 $fname = (string)$_pmr['ws_plugin__s2member_custom_reg_field_first_name'];
764
765 if(!$fname) // Also try BuddyPress.
766 if(!empty($_pmr['field_1'])) // BuddyPress?
767 $fname = trim(preg_replace('/ (.*)$/', '', (string)$_pmr['field_1']));
768
769 if(!($lname = $user->last_name))
770 if(!empty($_pmr['ws_plugin__s2member_custom_reg_field_last_name']))
771 $lname = (string)$_pmr['ws_plugin__s2member_custom_reg_field_last_name'];
772
773 if(!$lname) // Also try BuddyPress.
774 if(!empty($_pmr['field_1']) && preg_match('/^(.+?) (.+)$/', (string)$_pmr['field_1']))
775 $lname = trim(preg_replace('/^(.+?) (.+)$/', '$2', (string)$_pmr['field_1']));
776
777 if($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_names'] && !$fname && $login)
778 {
779 $fname = trim($login);
780 $lname = ''; // Username and empty Last Name.
781 }
782 $name = trim($fname.' '.$lname); // Both names.
783
784 if(!($pass = $password)) // Try s2Member's generator.
785 if(!empty($GLOBALS['ws_plugin__s2member_plain_text_pass']))
786 $pass = (string)$GLOBALS['ws_plugin__s2member_plain_text_pass'];
787
788 if(!$pass) // Also try BuddyPress Password.
789 if(!empty($_pmr['signup_password'])) // BuddyPress?
790 $pass = (string)$_pmr['signup_password'];
791
792 if($pass) // No Password nag. Update this globally.
793 {
794 (!headers_sent()) ? delete_user_setting('default_password_nag', $user_id) : NULL;
795 update_user_option($user_id, 'default_password_nag', FALSE, TRUE);
796 }
797 update_user_option($user_id, 's2member_registration_ip', $ip);
798 update_user_option($user_id, 's2member_auto_eot_time', $auto_eot_time);
799 update_user_option($user_id, 's2member_subscr_gateway', $subscr_gateway);
800 update_user_option($user_id, 's2member_subscr_id', $subscr_id);
801 update_user_option($user_id, 's2member_subscr_baid', $subscr_baid);
802 update_user_option($user_id, 's2member_subscr_cid', $subscr_cid);
803 update_user_option($user_id, 's2member_custom', $custom);
804 update_user_option($user_id, 's2member_notes', $notes);
805
806 if(!$user->first_name && $fname)
807 update_user_meta($user_id, 'first_name', $fname);
808
809 if(!$user->last_name && $lname)
810 update_user_meta($user_id, 'last_name', $lname);
811
812 if(!$user->display_name || $user->display_name === $user->user_login)
813 {
814 if($custom_reg_display_name === 'full' && $name)
815 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $name)));
816 else if($custom_reg_display_name === 'first' && $fname)
817 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $fname)));
818 else if($custom_reg_display_name === 'last' && $lname)
819 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $lname)));
820 else if($custom_reg_display_name === 'login' && $login)
821 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $login)));
822 }
823 if(is_multisite()) // Should we handle Main Site permissions and Originating Blog ID#?
824 {
825 if(!is_main_site() && strtotime($user->user_registered) >= strtotime('-10 seconds'))
826 remove_user_from_blog($user_id, $current_site->blog_id); // No Main Site Role.
827
828 if(!get_user_meta($user_id, 's2member_originating_blog', TRUE)) // Recorded yet?
829 update_user_meta($user_id, 's2member_originating_blog', $current_blog->blog_id);
830 }
831 if($current_role !== $role) // Only if NOT the current Role.
832 $user->set_role($role); // s2Member.
833
834 if($ccaps && preg_match('/^-all/', str_replace('+', '', $ccaps)))
835 foreach($user->allcaps as $cap => $cap_enabled)
836 if(preg_match('/^access_s2member_ccap_/', $cap))
837 $user->remove_cap($ccap = $cap);
838
839 if($ccaps && preg_replace('/^-all['."\r\n\t".'\s;,]*/', '', str_replace('+', '', $ccaps)))
840 foreach(preg_split('/['."\r\n\t".'\s;,]+/', preg_replace('/^-all['."\r\n\t".'\s;,]*/', '', str_replace('+', '', $ccaps))) as $ccap)
841 if(strlen($ccap = trim(strtolower(preg_replace('/[^a-z_0-9]/i', '', $ccap)))))
842 $user->add_cap('access_s2member_ccap_'.$ccap);
843
844 if(!($fields = array()) && $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_fields'])
845 foreach(json_decode($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_fields'], TRUE) as $field)
846 {
847 $field_var = preg_replace('/[^a-z0-9]/i', '_', strtolower($field['id']));
848 $field_id_class = preg_replace('/_/', '-', $field_var);
849
850 if(isset ($_pmr['ws_plugin__s2member_custom_reg_field_'.$field_var]))
851 $fields[$field_var] = $_pmr['ws_plugin__s2member_custom_reg_field_'.$field_var];
852 }
853 unset($field, $field_var, $field_id_class); // Housekeeping.
854
855 if(!empty($fields)) // Only if NOT empty.
856 update_user_option($user_id, 's2member_custom_fields', $fields);
857
858 if($level > 0) // We ONLY process this if they are higher than Level #0.
859 {
860 $pr_times = get_user_option('s2member_paid_registration_times', $user_id);
861 $pr_times['level'] = (empty($pr_times['level'])) ? time() : $pr_times['level'];
862 $pr_times['level'.$level] = (empty($pr_times['level'.$level])) ? time() : $pr_times['level'.$level];
863 update_user_option($user_id, 's2member_paid_registration_times', $pr_times); // Update now.
864 }
865 if(!is_multisite() && c_ws_plugin__s2member_utils_conds::bp_is_installed() && bp_is_register_page())
866 {
867 update_user_option($user_id, 's2member_bp_activation_role', $role);
868 update_user_option($user_id, 's2member_bp_activation_ccaps', c_ws_plugin__s2member_user_access::user_access_ccaps($user));
869 }
870 if(($transient = 's2m_'.md5('s2member_transient_ipn_signup_vars_'.$subscr_id)) && is_array($ipn_signup_vars = get_transient($transient)))
871 {
872 update_user_option($user_id, 's2member_ipn_signup_vars', $ipn_signup_vars); // For future reference.
873 delete_transient($transient); // This can be deleted now.
874 }
875 if(($transient = 's2m_'.md5('s2member_transient_ipn_subscr_payment_'.$subscr_id)) && is_array($subscr_payment = get_transient($transient)) && !empty($subscr_payment['subscr_gateway']))
876 {
877 $proxy = array('s2member_paypal_proxy' => stripslashes((string)$subscr_payment['subscr_gateway']), 's2member_paypal_proxy_verification' => c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen());
878 c_ws_plugin__s2member_utils_urls::remote(home_url('/?s2member_paypal_notify=1'), array_merge(stripslashes_deep($subscr_payment), $proxy), array('timeout' => 20));
879 delete_transient($transient); // This can be deleted now.
880 }
881 if(($transient = 's2m_'.md5('s2member_transient_ipn_subscr_eot_'.$subscr_id)) && is_array($subscr_eot = get_transient($transient)) && !empty($subscr_eot['subscr_gateway']))
882 {
883 $proxy = array('s2member_paypal_proxy' => stripslashes((string)$subscr_eot['subscr_gateway']), 's2member_paypal_proxy_verification' => c_ws_plugin__s2member_paypal_utilities::paypal_proxy_key_gen());
884 c_ws_plugin__s2member_utils_urls::remote(home_url('/?s2member_paypal_notify=1'), array_merge(stripslashes_deep($subscr_eot), $proxy), array('timeout' => 20));
885 delete_transient($transient); // This can be deleted now.
886 }
887 if(!headers_sent()) // Only if headers are NOT yet sent. Here we establish both Signup and Payment Tracking Cookies.
888 @setcookie('s2member_tracking', ($s2member_tracking = c_ws_plugin__s2member_utils_encryption::encrypt($subscr_id)), time() + 31556926, COOKIEPATH, COOKIE_DOMAIN).
889 @setcookie('s2member_tracking', $s2member_tracking, time() + 31556926, SITECOOKIEPATH, COOKIE_DOMAIN).
890 ($_COOKIE['s2member_tracking'] = $s2member_tracking);
891
892 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
893 do_action('ws_plugin__s2member_during_configure_user_registration_front_side_paid', get_defined_vars());
894 do_action('ws_plugin__s2member_during_configure_user_registration_front_side', get_defined_vars());
895 unset($__refs, $__v);
896 }
897 else if(!is_admin() && (!c_ws_plugin__s2member_utils_conds::pro_is_installed() || !c_ws_plugin__s2member_pro_remote_ops::is_remote_op('create_user')))
898 { /* This routine could be processed through `/wp-login.php?action=register`, `/wp-activate.php`, or `/activate` via BuddyPress`.
899 This may also be processed through a standard BuddyPress installation, or another plugin calling `user_register`.
900 If processed through `/wp-activate.php`, it could've originated inside the admin, via `/user-new.php`. */
901
902 $processed = 'yes'; // Mark this as yes.
903
904 $current_role = c_ws_plugin__s2member_user_access::user_access_role($user);
905 $role = ''; // Initialize ``$role`` to an empty string here, before processing.
906 $role = (!$role && ($level = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_level']) > 0) ? 's2member_level'.$level : $role;
907 $role = (!$role && ($level = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_level']) === '0') ? 'subscriber' : $role;
908 $role = (!$role && $current_role) ? $current_role : $role; // Use existing Role?
909 $role = (!$role) ? get_option('default_role') : $role; // Otherwise default.
910
911 $level = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_level'];
912 $level = (!$level && preg_match('/^(administrator|editor|author|contributor)$/i', $role)) ? $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels'] : $level;
913 $level = (!$level && preg_match('/^s2member_level[1-9][0-9]*$/i', $role)) ? preg_replace('/^s2member_level/', '', $role) : $level;
914 $level = (!$level && preg_match('/^subscriber$/i', $role)) ? '0' : $level;
915 $level = (!$level) ? '0' : $level;
916
917 $ccaps = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_ccaps'];
918
919 $email = $user->user_email;
920 $login = $user->user_login;
921 $ip = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_registration_ip'];
922 $ip = (!$ip) ? c_ws_plugin__s2member_utils_ip::current() : $ip;
923 $custom = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_custom'];
924 $subscr_id = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_subscr_id'];
925 $subscr_baid = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_subscr_baid'];
926 $subscr_cid = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_subscr_cid'];
927 $subscr_gateway = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_subscr_gateway'];
928
929 $auto_eot_time = ($eot = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_auto_eot_time']) ? strtotime($eot) : '';
930 $notes = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_notes'];
931
932 $opt_in = (!$GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_opt_in']) ? TRUE : FALSE;
933 $opt_in = (!$opt_in && !empty($_pmr['ws_plugin__s2member_custom_reg_field_opt_in'])) ? TRUE : $opt_in;
934
935 if(!($fname = $user->first_name))
936 if(!empty($_pmr['ws_plugin__s2member_custom_reg_field_first_name']))
937 $fname = (string)$_pmr['ws_plugin__s2member_custom_reg_field_first_name'];
938
939 if(!$fname) // Also try BuddyPress.
940 if(!empty($_pmr['field_1'])) // BuddyPress?
941 $fname = trim(preg_replace('/ (.*)$/', '', (string)$_pmr['field_1']));
942
943 if(!($lname = $user->last_name))
944 if(!empty($_pmr['ws_plugin__s2member_custom_reg_field_last_name']))
945 $lname = (string)$_pmr['ws_plugin__s2member_custom_reg_field_last_name'];
946
947 if(!$lname) // Also try BuddyPress.
948 if(!empty($_pmr['field_1']) && preg_match('/^(.+?) (.+)$/', (string)$_pmr['field_1']))
949 $lname = trim(preg_replace('/^(.+?) (.+)$/', '$2', (string)$_pmr['field_1']));
950
951 if($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_names'] && !$fname && $login)
952 {
953 $fname = trim($login);
954 $lname = ''; // Username and empty Last Name.
955 }
956 $name = trim($fname.' '.$lname); // Both names.
957
958 if(!($pass = $password)) // Try s2Member's generator.
959 if(!empty($GLOBALS['ws_plugin__s2member_plain_text_pass']))
960 $pass = (string)$GLOBALS['ws_plugin__s2member_plain_text_pass'];
961
962 if(!$pass) // Also try BuddyPress Password.
963 if(!empty($_pmr['signup_password'])) // BuddyPress?
964 $pass = (string)$_pmr['signup_password'];
965
966 if($pass) // No Password nag. Update this globally.
967 {
968 (!headers_sent()) ? delete_user_setting('default_password_nag', $user_id) : NULL;
969 update_user_option($user_id, 'default_password_nag', FALSE, TRUE);
970 }
971 update_user_option($user_id, 's2member_registration_ip', $ip);
972 update_user_option($user_id, 's2member_auto_eot_time', $auto_eot_time);
973 update_user_option($user_id, 's2member_subscr_gateway', $subscr_gateway);
974 update_user_option($user_id, 's2member_subscr_id', $subscr_id);
975 update_user_option($user_id, 's2member_subscr_baid', $subscr_baid);
976 update_user_option($user_id, 's2member_subscr_cid', $subscr_cid);
977 update_user_option($user_id, 's2member_custom', $custom);
978 update_user_option($user_id, 's2member_notes', $notes);
979
980 if(!$user->first_name && $fname)
981 update_user_meta($user_id, 'first_name', $fname);
982
983 if(!$user->last_name && $lname)
984 update_user_meta($user_id, 'last_name', $lname);
985
986 if(!$user->display_name || $user->display_name === $user->user_login)
987 {
988 if($custom_reg_display_name === 'full' && $name)
989 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $name)));
990 else if($custom_reg_display_name === 'first' && $fname)
991 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $fname)));
992 else if($custom_reg_display_name === 'last' && $lname)
993 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $lname)));
994 else if($custom_reg_display_name === 'login' && $login)
995 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $login)));
996 }
997 if(is_multisite( /* Should we handle Main Site permissions and Originating Blog ID#? */))
998 {
999 if(!is_main_site() && strtotime($user->user_registered) >= strtotime('-10 seconds'))
1000 remove_user_from_blog($user_id, $current_site->blog_id); // No Main Site Role.
1001
1002 if(!get_user_meta($user_id, 's2member_originating_blog', TRUE)) // Recorded yet?
1003 update_user_meta($user_id, 's2member_originating_blog', $current_blog->blog_id);
1004 }
1005 if($current_role !== $role) // Only if NOT the current Role.
1006 $user->set_role($role); // s2Member.
1007
1008 if($ccaps && preg_match('/^-all/', str_replace('+', '', $ccaps)))
1009 foreach($user->allcaps as $cap => $cap_enabled)
1010 if(preg_match('/^access_s2member_ccap_/', $cap))
1011 $user->remove_cap($ccap = $cap);
1012
1013 if($ccaps && preg_replace('/^-all['."\r\n\t".'\s;,]*/', '', str_replace('+', '', $ccaps)))
1014 foreach(preg_split('/['."\r\n\t".'\s;,]+/', preg_replace('/^-all['."\r\n\t".'\s;,]*/', '', str_replace('+', '', $ccaps))) as $ccap)
1015 if(strlen($ccap = trim(strtolower(preg_replace('/[^a-z_0-9]/i', '', $ccap)))))
1016 $user->add_cap('access_s2member_ccap_'.$ccap);
1017
1018 if(!($fields = array()) && $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_fields'])
1019 foreach(json_decode($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_fields'], TRUE) as $field)
1020 {
1021 $field_var = preg_replace('/[^a-z0-9]/i', '_', strtolower($field['id']));
1022 $field_id_class = preg_replace('/_/', '-', $field_var);
1023
1024 if(isset ($_pmr['ws_plugin__s2member_custom_reg_field_'.$field_var]))
1025 $fields[$field_var] = $_pmr['ws_plugin__s2member_custom_reg_field_'.$field_var];
1026 }
1027 unset($field, $field_var, $field_id_class); // Housekeeping.
1028
1029 if(!empty($fields)) // Only if NOT empty.
1030 update_user_option($user_id, 's2member_custom_fields', $fields);
1031
1032 if($level > 0) // We ONLY process this if they are higher than Level#0.
1033 {
1034 $pr_times = get_user_option('s2member_paid_registration_times', $user_id);
1035 $pr_times['level'] = (empty($pr_times['level'])) ? time() : $pr_times['level'];
1036 $pr_times['level'.$level] = (empty($pr_times['level'.$level])) ? time() : $pr_times['level'.$level];
1037 update_user_option($user_id, 's2member_paid_registration_times', $pr_times); // Update now.
1038 }
1039 if(!is_multisite() && c_ws_plugin__s2member_utils_conds::bp_is_installed() && bp_is_register_page())
1040 {
1041 update_user_option($user_id, 's2member_bp_activation_role', $role);
1042 update_user_option($user_id, 's2member_bp_activation_ccaps', c_ws_plugin__s2member_user_access::user_access_ccaps($user));
1043 }
1044 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
1045 do_action('ws_plugin__s2member_during_configure_user_registration_front_side_free', get_defined_vars());
1046 do_action('ws_plugin__s2member_during_configure_user_registration_front_side', get_defined_vars());
1047 unset($__refs, $__v);
1048 }
1049 else if((is_blog_admin() && $pagenow === 'user-new.php') || (c_ws_plugin__s2member_utils_conds::pro_is_installed() && c_ws_plugin__s2member_pro_remote_ops::is_remote_op('create_user')))
1050 { // Can only be processed through `/user-new.php` in the Admin panel, or through Remote Op: `create_user`.
1051
1052 $processed = 'yes'; // Mark this as yes, to indicate that a routine was processed.
1053
1054 $current_role = c_ws_plugin__s2member_user_access::user_access_role($user);
1055 $role = ''; // Initialize $role to an empty string here, before processing.
1056 $role = (!$role && ($level = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_level']) > 0) ? 's2member_level'.$level : $role;
1057 $role = (!$role && ($level = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_level']) === '0') ? 'subscriber' : $role;
1058 $role = (!$role && $current_role) ? $current_role : $role; // Use existing Role?
1059 $role = (!$role) ? get_option('default_role') : $role; // Otherwise default.
1060
1061 $level = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_level'];
1062 $level = (!$level && preg_match('/^(administrator|editor|author|contributor)$/i', $role)) ? $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels'] : $level;
1063 $level = (!$level && preg_match('/^s2member_level[1-9][0-9]*$/i', $role)) ? preg_replace('/^s2member_level/', '', $role) : $level;
1064 $level = (!$level && preg_match('/^subscriber$/i', $role)) ? '0' : $level;
1065 $level = (!$level) ? '0' : $level;
1066
1067 $ccaps = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_ccaps'];
1068
1069 $email = $user->user_email;
1070 $login = $user->user_login;
1071 $ip = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_registration_ip'];
1072 $custom = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_custom'];
1073 $subscr_id = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_subscr_id'];
1074 $subscr_baid = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_subscr_baid'];
1075 $subscr_cid = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_subscr_cid'];
1076 $subscr_gateway = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_subscr_gateway'];
1077
1078 $auto_eot_time = ($eot = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_auto_eot_time']) ? strtotime($eot) : '';
1079 $notes = (string)@$_pmr['ws_plugin__s2member_custom_reg_field_s2member_notes'];
1080
1081 $opt_in = (!empty($_pmr['ws_plugin__s2member_custom_reg_field_opt_in'])) ? TRUE : FALSE;
1082
1083 if(!($fname = $user->first_name)) // `Users → Add New`.
1084 if(!empty($_pmr['ws_plugin__s2member_custom_reg_field_first_name']))
1085 $fname = (string)$_pmr['ws_plugin__s2member_custom_reg_field_first_name'];
1086
1087 if(!($lname = $user->last_name)) // `Users → Add New`.
1088 if(!empty($_pmr['ws_plugin__s2member_custom_reg_field_last_name']))
1089 $lname = (string)$_pmr['ws_plugin__s2member_custom_reg_field_last_name'];
1090
1091 if($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_names'] && !$fname && $login)
1092 {
1093 $fname = trim($login);
1094 $lname = ''; // Username and empty Last Name.
1095 }
1096 $name = trim($fname.' '.$lname); // Both names.
1097
1098 if(!($pass = $password)) // Try s2Member's generator.
1099 if(!empty($GLOBALS['ws_plugin__s2member_plain_text_pass']))
1100 $pass = (string)$GLOBALS['ws_plugin__s2member_plain_text_pass'];
1101
1102 if(!$pass) // Also try the `Users → Add New` form.
1103 if(!empty($_pmr['pass1'])) // Field in `/user-new.php`.
1104 $pass = (string)$_pmr['pass1'];
1105
1106 if($pass) // No Password nag. Update this globally.
1107 {
1108 (!headers_sent()) ? delete_user_setting('default_password_nag', $user_id) : NULL;
1109 update_user_option($user_id, 'default_password_nag', FALSE, TRUE);
1110 }
1111 update_user_option($user_id, 's2member_registration_ip', $ip);
1112 update_user_option($user_id, 's2member_auto_eot_time', $auto_eot_time);
1113 update_user_option($user_id, 's2member_subscr_gateway', $subscr_gateway);
1114 update_user_option($user_id, 's2member_subscr_id', $subscr_id);
1115 update_user_option($user_id, 's2member_subscr_baid', $subscr_baid);
1116 update_user_option($user_id, 's2member_subscr_cid', $subscr_cid);
1117 update_user_option($user_id, 's2member_custom', $custom);
1118 update_user_option($user_id, 's2member_notes', $notes);
1119
1120 if(!$user->first_name && $fname)
1121 update_user_meta($user_id, 'first_name', $fname);
1122
1123 if(!$user->last_name && $lname)
1124 update_user_meta($user_id, 'last_name', $lname);
1125
1126 if(!$user->display_name || $user->display_name === $user->user_login)
1127 {
1128 if($custom_reg_display_name === 'full' && $name)
1129 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $name)));
1130 else if($custom_reg_display_name === 'first' && $fname)
1131 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $fname)));
1132 else if($custom_reg_display_name === 'last' && $lname)
1133 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $lname)));
1134 else if($custom_reg_display_name === 'login' && $login)
1135 wp_update_user(wp_slash(array('ID' => $user_id, 'display_name' => $login)));
1136 }
1137 if(is_multisite()) // Should we handle Main Site permissions and Originating Blog ID#?
1138 {
1139 if(!is_main_site() && strtotime($user->user_registered) >= strtotime('-10 seconds'))
1140 remove_user_from_blog($user_id, $current_site->blog_id); // No Main Site Role.
1141
1142 if(!get_user_meta($user_id, 's2member_originating_blog', TRUE)) // Recorded yet?
1143 update_user_meta($user_id, 's2member_originating_blog', $current_blog->blog_id);
1144 }
1145 if($current_role !== $role) // Only if NOT the current Role.
1146 $user->set_role($role); // s2Member.
1147
1148 if($ccaps && preg_match('/^-all/', str_replace('+', '', $ccaps)))
1149 foreach($user->allcaps as $cap => $cap_enabled)
1150 if(preg_match('/^access_s2member_ccap_/', $cap))
1151 $user->remove_cap($ccap = $cap);
1152
1153 if($ccaps && preg_replace('/^-all['."\r\n\t".'\s;,]*/', '', str_replace('+', '', $ccaps)))
1154 foreach(preg_split('/['."\r\n\t".'\s;,]+/', preg_replace('/^-all['."\r\n\t".'\s;,]*/', '', str_replace('+', '', $ccaps))) as $ccap)
1155 if(strlen($ccap = trim(strtolower(preg_replace('/[^a-z_0-9]/i', '', $ccap)))))
1156 $user->add_cap('access_s2member_ccap_'.$ccap);
1157
1158 if(!($fields = array()) && $GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_fields'])
1159 foreach(json_decode($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_fields'], TRUE) as $field)
1160 {
1161 $field_var = preg_replace('/[^a-z0-9]/i', '_', strtolower($field['id']));
1162 $field_id_class = preg_replace('/_/', '-', $field_var);
1163
1164 if(isset ($_pmr['ws_plugin__s2member_custom_reg_field_'.$field_var]))
1165 $fields[$field_var] = $_pmr['ws_plugin__s2member_custom_reg_field_'.$field_var];
1166 }
1167 unset($field, $field_var, $field_id_class); // Housekeeping.
1168
1169 if(!empty($fields)) // Only if NOT empty.
1170 update_user_option($user_id, 's2member_custom_fields', $fields);
1171
1172 if($level > 0) // We ONLY process this if they are higher than Level#0.
1173 {
1174 $pr_times = get_user_option('s2member_paid_registration_times', $user_id);
1175 $pr_times['level'] = (empty($pr_times['level'])) ? time() : $pr_times['level'];
1176 $pr_times['level'.$level] = (empty($pr_times['level'.$level])) ? time() : $pr_times['level'.$level];
1177 update_user_option($user_id, 's2member_paid_registration_times', $pr_times); // Update now.
1178 }
1179 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
1180 do_action('ws_plugin__s2member_during_configure_user_registration_admin_side', get_defined_vars());
1181 unset($__refs, $__v);
1182 }
1183
1184 //260223 Plaintext password should not remain available beyond account configuration.
1185 // Blank it before notifications, return URL replacements, list-server processing, logs, and later hooks.
1186 $pass = 'xxxxxxxx/pass';
1187 $password = 'xxxxxxxx/pass';
1188
1189 if($processed === 'yes') // If registration was processed by one of the routines above.
1190 {
1191 /**
1192 * If processed, all of these will have been defined by now.
1193 *
1194 * @var $role string Reference for IDEs.
1195 * @var $level string Reference for IDEs.
1196 * @var $ccaps string Reference for IDEs.
1197 * @var $auto_eot_time string|integer Reference for IDEs.
1198 * @var $fname string Reference for IDEs.
1199 * @var $lname string Reference for IDEs.
1200 * @var $name string Reference for IDEs.
1201 * @var $email string Reference for IDEs.
1202 * @var $login string Reference for IDEs.
1203 * @var $pass string Reference for IDEs.
1204 * @var $ip string Reference for IDEs.
1205 * @var $opt_in boolean Reference for IDEs.
1206 * @var $fields array Reference for IDEs.
1207 */
1208 if($urls = $GLOBALS['WS_PLUGIN__']['s2member']['o']['registration_notification_urls'])
1209
1210 foreach(preg_split('/['."\r\n\t".']+/', $urls) as $url) // Notify each of the URLs.
1211
1212 if(($url = c_ws_plugin__s2member_utils_strings::fill_cvs($url, $custom, true)))
1213 if(($url = preg_replace('/%%role%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($role)), $url)))
1214 if(($url = preg_replace('/%%level%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($level)), $url)))
1215 if(($url = preg_replace('/%%ccaps%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($ccaps)), $url)))
1216 if(($url = preg_replace('/%%auto_eot_time%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($auto_eot_time)), $url)))
1217 if(($url = preg_replace('/%%user_first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($fname)), $url)))
1218 if(($url = preg_replace('/%%user_last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($lname)), $url)))
1219 if(($url = preg_replace('/%%user_full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($name)), $url)))
1220 if(($url = preg_replace('/%%user_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($email)), $url)))
1221 if(($url = preg_replace('/%%user_login%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($login)), $url)))
1222 if(($url = preg_replace('/%%user_pass%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($pass)), $url)))
1223 if(($url = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($ip)), $url)))
1224 if(($url = preg_replace('/%%user_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($user_id)), $url)))
1225 {
1226 foreach($fields as $var => $val) // Custom Fields.
1227 if(!($url = preg_replace('/%%'.preg_quote($var, '/').'%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode(maybe_serialize($val))), $url)))
1228 break;
1229
1230 if(($url = trim(preg_replace('/%%(.+?)%%/i', '', $url))))
1231 c_ws_plugin__s2member_utils_urls::remote($url);
1232 }
1233 unset($urls, $url, $var, $val); // Housekeeping.
1234
1235 if($GLOBALS['WS_PLUGIN__']['s2member']['o']['registration_notification_recipients'])
1236 {
1237 $email_configs_were_on = c_ws_plugin__s2member_email_configs::email_config_status();
1238 c_ws_plugin__s2member_email_configs::email_config_release();
1239
1240 $msg = $sbj = '(s2Member / API Notification Email) - Registration';
1241 $msg .= "\n\n"; // Spacing in the message body.
1242
1243 $msg .= 'role: %%role%%'."\n";
1244 $msg .= 'level: %%level%%'."\n";
1245 $msg .= 'ccaps: %%ccaps%%'."\n";
1246 $msg .= 'auto_eot_time: %%auto_eot_time%%'."\n";
1247 $msg .= 'user_first_name: %%user_first_name%%'."\n";
1248 $msg .= 'user_last_name: %%user_last_name%%'."\n";
1249 $msg .= 'user_full_name: %%user_full_name%%'."\n";
1250 $msg .= 'user_email: %%user_email%%'."\n";
1251 $msg .= 'user_login: %%user_login%%'."\n";
1252 //$msg .= 'user_pass: %%user_pass%%'."\n";
1253 $msg .= 'user_ip: %%user_ip%%'."\n";
1254 $msg .= 'user_id: %%user_id%%'."\n";
1255
1256 foreach($fields as $var => $val)
1257 $msg .= $var.': %%'.$var.'%%'."\n";
1258
1259 $msg .= 'cv0: %%cv0%%'."\n";
1260 $msg .= 'cv1: %%cv1%%'."\n";
1261 $msg .= 'cv2: %%cv2%%'."\n";
1262 $msg .= 'cv3: %%cv3%%'."\n";
1263 $msg .= 'cv4: %%cv4%%'."\n";
1264 $msg .= 'cv5: %%cv5%%'."\n";
1265 $msg .= 'cv6: %%cv6%%'."\n";
1266 $msg .= 'cv7: %%cv7%%'."\n";
1267 $msg .= 'cv8: %%cv8%%'."\n";
1268 $msg .= 'cv9: %%cv9%%';
1269
1270 if(($msg = c_ws_plugin__s2member_utils_strings::fill_cvs($msg, $custom)))
1271 if(($msg = preg_replace('/%%role%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($role), $msg)))
1272 if(($msg = preg_replace('/%%level%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($level), $msg)))
1273 if(($msg = preg_replace('/%%ccaps%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($ccaps), $msg)))
1274 if(($msg = preg_replace('/%%auto_eot_time%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($auto_eot_time), $msg)))
1275 if(($msg = preg_replace('/%%user_first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($fname), $msg)))
1276 if(($msg = preg_replace('/%%user_last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($lname), $msg)))
1277 if(($msg = preg_replace('/%%user_full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($name), $msg)))
1278 if(($msg = preg_replace('/%%user_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($email), $msg)))
1279 if(($msg = preg_replace('/%%user_login%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($login), $msg)))
1280 if(($msg = preg_replace('/%%user_pass%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($pass), $msg)))
1281 if(($msg = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($ip), $msg)))
1282 if(($msg = preg_replace('/%%user_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs($user_id), $msg)))
1283 {
1284 foreach($fields as $var => $val) // Custom Fields.
1285 if(!($msg = preg_replace('/%%'.preg_quote($var, '/').'%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(maybe_serialize($val)), $msg)))
1286 break;
1287
1288 if($sbj && ($msg = trim(preg_replace('/%%(.+?)%%/i', '', $msg)))) // Still have a ``$sbj`` and a ``$msg``?
1289
1290 foreach(c_ws_plugin__s2member_utils_strings::parse_emails($GLOBALS['WS_PLUGIN__']['s2member']['o']['registration_notification_recipients']) as $recipient)
1291 wp_mail($recipient, apply_filters('ws_plugin__s2member_registration_notification_email_sbj', $sbj, get_defined_vars()), apply_filters('ws_plugin__s2member_registration_notification_email_msg', $msg, get_defined_vars()), 'Content-Type: text/plain; charset=UTF-8');
1292 }
1293 if($email_configs_were_on) // Back on?
1294 c_ws_plugin__s2member_email_configs::email_config();
1295
1296 unset($sbj, $msg, $var, $val, $recipient, $email_configs_were_on); // Housekeeping.
1297 }
1298
1299 if(!empty($GLOBALS['ws_plugin__s2member_registration_return_url']) && ($url = $GLOBALS['ws_plugin__s2member_registration_return_url']))
1300
1301 if(($url = c_ws_plugin__s2member_utils_strings::fill_cvs($url, $custom, true)))
1302 if(($url = preg_replace('/%%role%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($role)), $url)))
1303 if(($url = preg_replace('/%%level%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($level)), $url)))
1304 if(($url = preg_replace('/%%ccaps%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($ccaps)), $url)))
1305 if(($url = preg_replace('/%%auto_eot_time%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($auto_eot_time)), $url)))
1306 if(($url = preg_replace('/%%user_first_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($fname)), $url)))
1307 if(($url = preg_replace('/%%user_last_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($lname)), $url)))
1308 if(($url = preg_replace('/%%user_full_name%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($name)), $url)))
1309 if(($url = preg_replace('/%%user_email%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($email)), $url)))
1310 if(($url = preg_replace('/%%user_login%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($login)), $url)))
1311 if(($url = preg_replace('/%%user_pass%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($pass)), $url)))
1312 if(($url = preg_replace('/%%user_ip%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($ip)), $url)))
1313 if(($url = preg_replace('/%%user_id%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode($user_id)), $url)))
1314 {
1315 foreach($fields as $var => $val) // Custom Fields.
1316 if(!($url = preg_replace('/%%'.preg_quote($var, '/').'%%/i', c_ws_plugin__s2member_utils_strings::esc_refs(urlencode(maybe_serialize($val))), $url)))
1317 break;
1318
1319 if(($url = trim($url))) // Preserve remaining Replacements; because the parent routine may perform replacements too.
1320 $GLOBALS['ws_plugin__s2member_registration_return_url'] = $url;
1321 }
1322 unset($url, $var, $val); // Housekeeping.
1323
1324 c_ws_plugin__s2member_list_servers::process_list_servers($role, $level, $login, $pass, $email, $fname, $lname, $ip, $opt_in, TRUE, $user_id);
1325 /*
1326 Suppress errors here in case this routine is fired in unexpected locations; or with odd output buffering techniques.
1327 @TODO It may also be impossible to delete cookies when fired inside: `/wp-activate.php`.
1328 */
1329 if(!headers_sent()) // Only if headers are NOT yet sent.
1330 {
1331 @setcookie('s2member_subscr_gateway', '', time() + 31556926, COOKIEPATH, COOKIE_DOMAIN).@setcookie('s2member_subscr_gateway', '', time() + 31556926, SITECOOKIEPATH, COOKIE_DOMAIN);
1332 @setcookie('s2member_subscr_id', '', time() + 31556926, COOKIEPATH, COOKIE_DOMAIN).@setcookie('s2member_subscr_id', '', time() + 31556926, SITECOOKIEPATH, COOKIE_DOMAIN);
1333 @setcookie('s2member_custom', '', time() + 31556926, COOKIEPATH, COOKIE_DOMAIN).@setcookie('s2member_custom', '', time() + 31556926, SITECOOKIEPATH, COOKIE_DOMAIN);
1334 @setcookie('s2member_item_number', '', time() + 31556926, COOKIEPATH, COOKIE_DOMAIN).@setcookie('s2member_item_number', '', time() + 31556926, SITECOOKIEPATH, COOKIE_DOMAIN);
1335 }
1336 /* If debugging/logging is enabled; we need to append ``$reg_vars`` to the log file.
1337 Logging now supports Multisite Networking as well. */
1338
1339 $reg_vars = get_defined_vars(); // All defined vars.
1340 $reg_vars['_COOKIE'] = $_COOKIE; // Record cookies also.
1341 // No need to include these in the logs. Unset before log entry.
1342 unset($reg_vars['wpdb'], $reg_vars['current_site'], $reg_vars['current_blog']);
1343
1344 //260223 Do not log passwords or password-like fields (even generated ones).
1345 unset($reg_vars['pass'], $reg_vars['password']);
1346 if(!empty($reg_vars['_pmr']) && is_array($reg_vars['_pmr']))
1347 foreach(array_keys($reg_vars['_pmr']) as $_k)
1348 if(preg_match('/pass_?(?:word)?/i', $_k))
1349 unset($reg_vars['_pmr'][$_k]);
1350 if(!empty($reg_vars['fields']) && is_array($reg_vars['fields']))
1351 foreach(array_keys($reg_vars['fields']) as $_k)
1352 if(preg_match('/pass_?(?:word)?/i', $_k))
1353 unset($reg_vars['fields'][$_k]);
1354 unset($_k);
1355
1356 c_ws_plugin__s2member_utils_logs::log_entry('reg-handler', $reg_vars);
1357 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
1358 do_action('ws_plugin__s2member_during_configure_user_registration', get_defined_vars());
1359 unset($__refs, $__v);
1360 }
1361 }
1362 foreach(array_keys(get_defined_vars()) as $__v) $__refs[$__v] =& $$__v;
1363 do_action('ws_plugin__s2member_after_configure_user_registration', get_defined_vars());
1364 unset($__refs, $__v); // Housekeeping.
1365 }
1366 }
1367 }
1368