Making WordPress.org

source: sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-login/pending-create.php

Last change on this file was 11631, checked in by dd32, 3 months ago

Login: Properly block/require manual approval of signup attempts where reCaptcha v3 fails on the create step.

  • Property svn:eol-style set to native
File size: 7.1 KB
Line 
1<?php
2/**
3 * The post-email-confirm Template
4 *
5 * @package wporg-login
6 */
7
8$sso = WPOrg_SSO::get_instance();
9
10// Migrate to cookies.
11if ( ! empty( $sso::$matched_route_params['confirm_user'] ) ) {
12        setcookie( 'wporg_confirm_user', $sso::$matched_route_params['confirm_user'], time()+DAY_IN_SECONDS, '/register/', 'login.wordpress.org', true, true );
13        setcookie( 'wporg_confirm_key',  $sso::$matched_route_params['confirm_key'],  time()+DAY_IN_SECONDS, '/register/', 'login.wordpress.org', true, true );
14
15        wp_safe_redirect( '/register/create' );
16        die();
17}
18
19$activation_user = $_COOKIE['wporg_confirm_user'] ?? false;
20$activation_key  = $_COOKIE['wporg_confirm_key']  ?? false;
21
22$pending_user = wporg_get_pending_user( $activation_user );
23if ( ! $pending_user ) {
24        wp_safe_redirect( home_url( '/linkexpired/register/' . urlencode( $activation_user ) ) );
25        exit;
26}
27
28// Already logged in.. Warn about duplicate accounts, etc.
29if ( is_user_logged_in() && $activation_user != wp_get_current_user()->user_login ) {
30        wp_safe_redirect( home_url( '/linkexpired/register-logged-in' ) );
31        exit;
32}
33
34$can_access = false;
35if ( $pending_user && $pending_user['user_activation_key'] && ! $pending_user['created'] ) {
36        $expiration_duration = 2 * WEEK_IN_SECONDS; // Time that the user has to confirm the account.
37
38        list( $user_request_time, $hashed_activation_key ) = explode( ':', $pending_user['user_activation_key'], 2 );
39        $expiration_time                                   = $user_request_time + $expiration_duration;
40
41        $hash_is_correct = wp_check_password( $activation_key, $hashed_activation_key );
42
43        if ( $hash_is_correct && time() < $expiration_time ) {
44                $can_access = true;
45        } elseif ( $hash_is_correct ) {
46                wp_safe_redirect( home_url( '/linkexpired/register/' . urlencode( $activation_user ) ) );
47                exit;
48        }
49} elseif ( $pending_user && $pending_user['created'] ) {
50        wp_safe_redirect( home_url( '/linkexpired/account-created/' . urlencode( $pending_user['user_login'] ) ) );
51        die();
52}
53
54if ( ! $can_access ) {
55        wp_safe_redirect( '/linkexpired' );
56        die();
57}
58
59if ( wporg_login_save_profile_fields( $pending_user, 'create' ) ) {
60        // re-fetch the user, it's probably changed.
61        $pending_user = wporg_get_pending_user( $activation_user );
62}
63
64$error_recapcha_status = false;
65if ( isset( $_POST['user_pass'] ) && 2 !== $pending_user['cleared'] ) {
66
67        // Check reCaptcha status
68        if ( ! wporg_login_check_recapcha_status( 'pending_create', false ) ) {
69                unset( $_POST['user_pass'] );
70                $error_recapcha_status = true;
71        }
72
73        // Store for reference.
74        if ( isset( $_POST['_reCaptcha_v3_token'] ) ) {
75                $recaptcha_api = wporg_login_recaptcha_api(
76                        $_POST['_reCaptcha_v3_token'],
77                        RECAPTCHA_V3_PRIVKEY
78                );
79                if ( $recaptcha_api && $recaptcha_api['success'] && 'pending_create' == $recaptcha_api['action'] ) {
80                        $pending_user['scores']['create_attempt'] = $recaptcha_api['score'];
81                } // else: probably `timeout-or-duplicate` or w.org network error.
82        }
83
84        // Allow a recaptcha fail to try again, but if they're blocked due to low score, mark them as needing approval.
85        if (
86                $error_recapcha_status &&
87                ! empty( $pending_user['scores']['create_attempt'] ) &&
88                (float) $pending_user['scores']['create_attempt'] < (float) get_option( 'recaptcha_v3_threshold', 0.2 )
89        ) {
90                $pending_user['cleared'] = 0;
91        }
92
93        wporg_update_pending_user( $pending_user );
94}
95
96if ( ! $pending_user['cleared'] ) {
97        if ( ! empty( $_COOKIE['wporg_profile_user'] ) ) {
98                // Throw the user back to the pending screen after being detected as spam at this point.
99                wp_safe_redirect( '/register/create-profile/' );
100                die();
101        }
102
103        unset( $_POST['user_pass'] );
104}
105
106if ( isset( $_POST['user_pass'] ) ) {
107        $user_pass = wp_unslash( $_POST['user_pass'] );
108
109        if ( $pending_user && ! $pending_user['created'] ) {
110                $user = wporg_login_create_user_from_pending( $pending_user, $user_pass );
111                if ( $user ) {
112
113                        // Clear the cookies, they're no longer needed.
114                        setcookie( 'wporg_profile_user', false, time()-DAY_IN_SECONDS, '/register/', 'login.wordpress.org', true, true );
115                        setcookie( 'wporg_profile_key',  false, time()-DAY_IN_SECONDS, '/register/', 'login.wordpress.org', true, true );
116                        setcookie( 'wporg_confirm_user', false, time()-DAY_IN_SECONDS, '/register/', 'login.wordpress.org', true, true );
117                        setcookie( 'wporg_confirm_key',  false, time()-DAY_IN_SECONDS, '/register/', 'login.wordpress.org', true, true );
118
119                        // Log the user in
120                        wp_set_current_user( $user->ID );
121                        wp_set_auth_cookie( $user->ID, true );
122                }
123        }
124
125        wp_safe_redirect( 'https://wordpress.org/support/' );
126        die();
127}
128
129wp_enqueue_script( 'zxcvbn' );
130wp_enqueue_script( 'user-profile' );
131wp_enqueue_script( 'wporg-registration' );
132
133get_header();
134?>
135
136<form name="registerform" id="registerform" action="" method="post">
137
138        <?php if ( ! $pending_user['cleared'] ) { ?>
139        <div class="message info">
140                <p><?php
141                        printf(
142                                /* translators: %s Email address */
143                                __( 'Your account is pending approval. You will receive an email at %s to set your password when approved.', 'wporg' ) . '<br>' .
144                                __( 'Please contact %s for more details.', 'wporg' ),
145                                '<code>' . esc_html( $pending_user['user_email'] ) . '</code>',
146                                '<a href="mailto:' . $sso::SUPPORT_EMAIL . '">' . $sso::SUPPORT_EMAIL . '</a>'
147                        );
148                ?></p>
149        </div>
150        <?php } ?>
151
152        <p class="intro">
153                <?php _e( 'Set your password and complete your WordPress.org Profile information.', 'wporg' ); ?>
154        </p>
155
156        <p class="login-login">
157                <label for="user_login"><?php _e( 'Username', 'wporg' ); ?></label>
158                <input type="text" disabled="disabled" class="disabled" value="<?php echo esc_attr( $activation_user ); ?>" size="20" />
159        </p>
160
161        <div class="user-pass1-wrap" <?php echo ( $pending_user['cleared'] ? '' : "style='display:none;'" ); ?>>
162                <p>
163                        <label for="pass1"><?php _e( 'Password', 'wporg' ); ?></label>
164                </p>
165
166                <div class="wp-pwd">
167                        <span class="password-input-wrapper">
168                                <input type="password" data-reveal="1" data-pw="<?php echo esc_attr( wp_generate_password( 16 ) ); ?>" name="user_pass" id="pass1" class="input" size="20" value="" autocomplete="off" aria-describedby="pass-strength-result" />
169                        </span>
170
171                        <button type="button" class="button button-secondary wp-hide-pw hide-if-no-js" aria-label="<?php esc_attr_e( 'Hide password', 'wporg-login' ); ?>">
172                                <span class="dashicons dashicons-hidden" aria-hidden="true"></span>
173                        </button>
174                        <div id="pass-strength-result" class="hide-if-no-js" aria-live="polite"><?php _e( 'Strength indicator', 'wporg' ); ?></div>
175                </div>
176        </div>
177
178        <?php
179                $fields = &$pending_user['meta'];
180                include __DIR__ . '/partials/register-profilefields.php';
181        ?>
182
183        <?php
184                if ( $error_recapcha_status ) {
185                        echo '<div class="message error"><p>' . __( 'Please try again.', 'wporg' ) . '</p></div>';
186                }
187        ?>
188
189        <p class="login-submit">
190                <input data-sitekey="<?php echo esc_attr( RECAPTCHA_INVIS_PUBKEY ); ?>" data-callback='onSubmit' type="submit" name="wp-submit" id="wp-submit" class="g-recaptcha button button-primary button-large" value="<?php ( $pending_user['cleared'] ? esc_attr_e( 'Create Account', 'wporg' ) : esc_attr_e( 'Save Profile Information', 'wporg' ) ); ?>" />
191        </p>
192
193</form>
194
195<p id="nav">
196        <a href="<?php echo wporg_login_wordpress_url(); ?>"><?php _e( 'WordPress.org', 'wporg' ); ?></a>
197</p>
198
199<?php get_footer();
Note: See TracBrowser for help on using the repository browser.