Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
78.08% covered (success)
78.08%
57 / 73
76.92% covered (success)
76.92%
10 / 13
CRAP
0.00% covered (danger)
0.00%
0 / 1
Settings
78.08% covered (success)
78.08%
57 / 73
76.92% covered (success)
76.92%
10 / 13
22.80
0.00% covered (danger)
0.00%
0 / 1
 __get
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
3
 name
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 init
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 register_settings
100.00% covered (success)
100.00%
28 / 28
100.00% covered (success)
100.00%
1 / 1
1
 client_id_field
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 client_secret_field
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 user_registration
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
 one_tap_login
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 one_tap_login_screens
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 whitelisted_domains
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 settings_page
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 output
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 disabled
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2/**
3 * Register the settings under settings page and also
4 * provide the interface to retrieve the settings.
5 *
6 * @package RtCamp\GoogleLogin
7 * @since 1.0.0
8 * @author rtCamp <contact@rtcamp.com>
9 */
10
11declare(strict_types=1);
12
13namespace RtCamp\GoogleLogin\Modules;
14
15use RtCamp\GoogleLogin\Interfaces\Module as ModuleInterface;
16
17/**
18 * Class Settings.
19 *
20 * @property string|null whitelisted_domains
21 * @property string|null client_id
22 * @property string|null client_secret
23 * @property bool|null registration_enabled
24 * @property bool|null one_tap_login
25 * @property string    one_tap_login_screen
26 *
27 * @package RtCamp\GoogleLogin\Modules
28 */
29class Settings implements ModuleInterface {
30
31    /**
32     * Settings values.
33     *
34     * @var array
35     */
36    public $options;
37
38    /**
39     * Getters for settings values.
40     *
41     * @var string[]
42     */
43    private $getters = [
44        'WP_GOOGLE_LOGIN_CLIENT_ID'         => 'client_id',
45        'WP_GOOGLE_LOGIN_SECRET'            => 'client_secret',
46        'WP_GOOGLE_LOGIN_USER_REGISTRATION' => 'registration_enabled',
47        'WP_GOOGLE_LOGIN_WHITELIST_DOMAINS' => 'whitelisted_domains',
48        'WP_GOOGLE_ONE_TAP_LOGIN'           => 'one_tap_login',
49        'WP_GOOGLE_ONE_TAP_LOGIN_SCREEN'    => 'one_tap_login_screen',
50    ];
51
52    /**
53     * Getter method.
54     *
55     * @param string $name Name of option to fetch.
56     */
57    public function __get( string $name ) {
58        if ( in_array( $name, $this->getters, true ) ) {
59            $constant_name = array_search( $name, $this->getters, true );
60
61            return defined( $constant_name ) ? constant( $constant_name ) : ( $this->options[ $name ] ?? '' );
62        }
63
64        return null;
65    }
66
67    /**
68     * Return module name.
69     *
70     * @return string
71     */
72    public function name(): string {
73        return 'settings';
74    }
75
76    /**
77     * Initialization of module.
78     *
79     * @return void
80     */
81    public function init(): void {
82        $this->options = get_option( 'wp_google_login_settings', [] );
83        add_action( 'admin_init', [ $this, 'register_settings' ] );
84        add_action( 'admin_menu', [ $this, 'settings_page' ] );
85    }
86
87    /**
88     * Register the settings, section and fields.
89     *
90     * @return void
91     */
92    public function register_settings(): void {
93        register_setting( 'wp_google_login', 'wp_google_login_settings' );
94
95        add_settings_section(
96            'wp_google_login_section',
97            __( 'Log in with Google Settings', 'login-with-google' ),
98            function () {
99            },
100            'login-with-google'
101        );
102
103        add_settings_field(
104            'wp_google_login_client_id',
105            __( 'Client ID', 'login-with-google' ),
106            [ $this, 'client_id_field' ],
107            'login-with-google',
108            'wp_google_login_section',
109            [ 'label_for' => 'client-id' ]
110        );
111
112        add_settings_field(
113            'wp_google_login_client_secret',
114            __( 'Client Secret', 'login-with-google' ),
115            [ $this, 'client_secret_field' ],
116            'login-with-google',
117            'wp_google_login_section',
118            [ 'label_for' => 'client-secret' ]
119        );
120
121        add_settings_field(
122            'wp_google_allow_registration',
123            __( 'Create New User', 'login-with-google' ),
124            [ $this, 'user_registration' ],
125            'login-with-google',
126            'wp_google_login_section',
127            [ 'label_for' => 'user-registration' ]
128        );
129
130        add_settings_field(
131            'wp_google_one_tap_login',
132            __( 'Enable One Tap Login', 'login-with-google' ),
133            [ $this, 'one_tap_login' ],
134            'login-with-google',
135            'wp_google_login_section',
136            [ 'label_for' => 'one-tap-login' ]
137        );
138
139        add_settings_field(
140            'wp_google_one_tap_login_screen',
141            __( 'One Tap Login Locations', 'login-with-google' ),
142            [ $this, 'one_tap_login_screens' ],
143            'login-with-google',
144            'wp_google_login_section',
145            [ 'label_for' => 'one-tap-login-screen' ]
146        );
147
148        add_settings_field(
149            'wp_google_whitelisted_domain',
150            __( 'Whitelisted Domains', 'login-with-google' ),
151            [ $this, 'whitelisted_domains' ],
152            'login-with-google',
153            'wp_google_login_section',
154            [ 'label_for' => 'whitelisted-domains' ]
155        );
156    }
157
158    /**
159     * Render client ID field.
160     *
161     * @return void
162     */
163    public function client_id_field(): void { ?>
164        <input type='text' name='wp_google_login_settings[client_id]' id="client-id" value='<?php echo esc_attr( $this->client_id ); ?>' autocomplete="off" <?php $this->disabled( 'client_id' ); ?> />
165        <p class="description">
166            <?php
167            echo wp_kses_post(
168                sprintf(
169                    '<p>%1s <a target="_blank" href="%2s">%3s</a>.</p>',
170                    esc_html__( 'Create oAuth Client ID and Client Secret at', 'login-with-google' ),
171                    'https://console.developers.google.com/apis/dashboard',
172                    'console.developers.google.com'
173                )
174            );
175            ?>
176        </p>
177        <?php
178    }
179
180    /**
181     * Render client secret field.
182     *
183     * @return void
184     */
185    public function client_secret_field(): void {
186        ?>
187        <input type='password' name='wp_google_login_settings[client_secret]' id="client-secret" value='<?php echo esc_attr( $this->client_secret ); ?>' autocomplete="off" <?php $this->disabled( 'client_secret' ); ?> />
188        <?php
189    }
190
191    /**
192     * User registration field.
193     *
194     * This will tell us whether or not to create the user
195     * if the user does not exist on WP application.
196     *
197     * This is irrespective of registration flag present in Settings > General
198     *
199     * @return void
200     */
201    public function user_registration(): void {
202        ?>
203        <label style='display:block;margin-top:6px;'><input <?php $this->disabled( 'registration_enabled' ); ?> type='checkbox'
204                                                            name='wp_google_login_settings[registration_enabled]'
205                                                            id="user-registration" <?php echo esc_attr( checked( $this->registration_enabled ) ); ?>
206                                                            value='1'>
207            <?php esc_html_e( 'Create a new user account if it does not exist already', 'login-with-google' ); ?>
208        </label>
209        <p class="description">
210            <?php
211            echo wp_kses_post(
212                sprintf(
213                /* translators: %1s will be replaced by page link */
214                    __( 'If this setting is checked, a new user will be created even if <a target="_blank" href="%1s">membership setting</a> is off.', 'login-with-google' ),
215                    is_multisite() ? 'network/settings.php' : 'options-general.php'
216                )
217            );
218            ?>
219        </p>
220        <?php
221    }
222
223    /**
224     * Toggle One Tap Login functionality.
225     *
226     * @return void
227     */
228    public function one_tap_login(): void {
229        ?>
230        <label style='display:block;margin-top:6px;'><input <?php $this->disabled( 'one_tap_login' ); ?>
231                    type='checkbox'
232                    name='wp_google_login_settings[one_tap_login]'
233                    id="one-tap-login" <?php echo esc_attr( checked( $this->one_tap_login ) ); ?>
234                    value='1'>
235            <?php esc_html_e( 'One Tap Login', 'login-with-google' ); ?>
236        </label>
237        <?php
238    }
239
240    /**
241     * One tap login screens.
242     *
243     * It can be enabled only for wp-login.php OR sitewide.
244     *
245     * @return void
246     */
247    public function one_tap_login_screens(): void {
248        $default = $this->one_tap_login_screen ?? '';
249        ?>
250        <label style='display:block;margin-top:6px;'><input <?php $this->disabled( 'one_tap_login' ); ?>
251                    type='radio'
252                    name='wp_google_login_settings[one_tap_login_screen]'
253                    id="one-tap-login-screen-login" <?php echo esc_attr( checked( $this->one_tap_login_screen, $default ) ); ?>
254                    value='login'>
255            <?php esc_html_e( 'Enable One Tap Login Only on Login Screen', 'login-with-google' ); ?>
256        </label>
257        <label style='display:block;margin-top:6px;'><input <?php $this->disabled( 'one_tap_login' ); ?>
258                    type='radio'
259                    name='wp_google_login_settings[one_tap_login_screen]'
260                    id="one-tap-login-screen-sitewide" <?php echo esc_attr( checked( $this->one_tap_login_screen, 'sitewide' ) ); ?>
261                    value='sitewide'>
262            <?php esc_html_e( 'Enable One Tap Login Site-wide', 'login-with-google' ); ?>
263        </label>
264        <?php
265        // phpcs:disable
266        ?>
267        <script type="text/javascript">
268            jQuery(document).ready(function () {
269                var toggle = function () {
270                    var enabled = jQuery("#one-tap-login").is(":checked");
271                    var tr_elem = jQuery("#one-tap-login-screen-login").parents("tr");
272                    if (enabled) {
273                        tr_elem.show();
274                        return;
275                    }
276
277                    tr_elem.hide();
278                };
279                jQuery("#one-tap-login").on('change', toggle);
280                toggle();
281            });
282        </script>
283        <?php
284        // phpcs:enable
285    }
286
287    /**
288     * Whitelisted domains for registration.
289     *
290     * Only emails belonging to these domains would be preferred
291     * for registration.
292     *
293     * If left blank, all domains would be allowed.
294     *
295     * @return void
296     */
297    public function whitelisted_domains(): void {
298        ?>
299        <input <?php $this->disabled( 'whitelisted_domains' ); ?> type='text' name='wp_google_login_settings[whitelisted_domains]' id="whitelisted-domains" value='<?php echo esc_attr( $this->whitelisted_domains ); ?>' autocomplete="off" />
300        <p class="description">
301            <?php echo esc_html( __( 'Add each domain comma separated', 'login-with-google' ) ); ?>
302        </p>
303        <?php
304    }
305
306    /**
307     * Add settings sub-menu page in admin menu.
308     *
309     * @return void
310     */
311    public function settings_page(): void {
312        add_options_page(
313            __( 'Login with Google settings', 'login-with-google' ),
314            __( 'Login with Google', 'login-with-google' ),
315            'manage_options',
316            'login-with-google',
317            [ $this, 'output' ]
318        );
319    }
320
321    /**
322     * Output the plugin settings.
323     *
324     * @return void
325     */
326    public function output(): void {
327        ?>
328        <div class="wrap">
329        <form action='options.php' method='post'>
330            <?php
331            settings_fields( 'wp_google_login' );
332            do_settings_sections( 'login-with-google' );
333            submit_button();
334            ?>
335        </form>
336        </div>
337        <?php
338    }
339
340    /**
341     * Outputs the disabled attribute if field needs to
342     * be disabled.
343     *
344     * @param string $id Input ID.
345     *
346     * @return void
347     */
348    private function disabled( string $id ): void {
349        if ( empty( $id ) ) {
350            return;
351        }
352
353        $constant_name = array_search( $id, $this->getters, true );
354
355        if ( false !== $constant_name ) {
356            if ( defined( $constant_name ) ) {
357                echo esc_attr( 'disabled="disabled"' );
358            }
359        }
360    }
361}