PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / trunk
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions vtrunk
260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 111216 111220 120213 120219 120301 All 187 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 trunk, at src/includes/classes/registrations.inc.php

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