From 99b4d75e715ae4a04e82726415be637c4b00e913 Mon Sep 17 00:00:00 2001 From: Vishal Kumar Date: Tue, 14 Feb 2023 10:35:39 +0530 Subject: [PATCH 01/10] Add Remember me checkbox for login with google --- templates/google-login-button.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates/google-login-button.php b/templates/google-login-button.php index c010785f..bb8ac4b5 100644 --- a/templates/google-login-button.php +++ b/templates/google-login-button.php @@ -34,4 +34,8 @@ +
+ + +
From d0b0a25b2cd539487c9d0a5b247ae876117a4ba9 Mon Sep 17 00:00:00 2001 From: Vishal Kumar Date: Tue, 14 Feb 2023 10:36:22 +0530 Subject: [PATCH 02/10] Add functionality to change state variable in hyperlink based on state of remember me check box --- assets/src/js/login.js | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/assets/src/js/login.js b/assets/src/js/login.js index bcb5e361..4a3e4632 100644 --- a/assets/src/js/login.js +++ b/assets/src/js/login.js @@ -13,6 +13,8 @@ const wpGoogleLogin = { */ init() { document.addEventListener( 'DOMContentLoaded', this.onContentLoaded ); + const rememberMeCheckbox = document.getElementById('remember-google-login'); + rememberMeCheckbox.addEventListener( 'change', this.rememberMe ); }, /** @@ -43,8 +45,47 @@ const wpGoogleLogin = { this.googleLoginButton.classList.remove( 'hidden' ); // HTML is cloned from existing HTML node. this.form.append( this.googleLoginButton ); + }, + + /** + * Callback function to detect change in state of remember me checkbox. + * + * Update request parameters based on user selection + * + * @return void + */ + rememberMe() { + + const loginWithGoogle = document.getElementsByClassName('wp_google_login__button')[0]; + + if(this.checked === true) { + window.remember = true; + var params = loginWithGoogle.getAttribute('href'); + var state = params.substring( params.indexOf('&state=') + 7, params.indexOf('&scope')); + + /* Decodes state value */ + var decodeState = JSON.parse( atob( state )); + + /* Add remember parameter to state */ + decodeState['remember'] = true; + var encodeState = JSON.stringify( decodeState ); + var newState = btoa( encodeState ); + window.orignalParams = params; + params = params.replace( state, newState ); + + /* Replace hyperlink to new state variable */ + loginWithGoogle.setAttribute( 'href', params ); + + } + + if( this.checked === false && window.remember === true ) { + /* Resets href attribute to orignal state if checked and unchecked again */ + loginWithGoogle.setAttribute( 'href', window.orignalParams ); + } } + + }; wpGoogleLogin.init(); From d96019be423ab220b78e08ba6131b33a27b1b2a3 Mon Sep 17 00:00:00 2001 From: Vishal Kumar Date: Tue, 14 Feb 2023 10:37:26 +0530 Subject: [PATCH 03/10] Add function to set auth cookie based on remember me value --- src/Modules/Login.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Modules/Login.php b/src/Modules/Login.php index 5e1a78fe..2d7e49bf 100644 --- a/src/Modules/Login.php +++ b/src/Modules/Login.php @@ -136,6 +136,10 @@ public function authenticate( $user = null ) { return $user; } + if ( ! empty( $decoded_state['remember'] ) && true === $decoded_state['remember'] ) { + add_action( 'wp_login', [ $this, 'remember_me' ], 9, 2 ); + } + try { $this->gh_client->set_access_token( $code ); $user = $this->gh_client->user(); @@ -230,4 +234,14 @@ public function login_redirect(): void { exit; } } + + /** + * Sets cookie to remember user + * + * @param String $user_login user login. + * @param WP_User $user WP User Object. + */ + public function remember_me( string $user_login, WP_User $user ) { + $this->authenticator->set_auth_cookies( $user, true ); + } } From 60b9dea68f0ab04f04f0c9fb5c7de1b96b54efec Mon Sep 17 00:00:00 2001 From: Vishal Kumar Date: Tue, 14 Feb 2023 10:37:58 +0530 Subject: [PATCH 04/10] Modify function to accept remember argument --- src/Utils/Authenticator.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Utils/Authenticator.php b/src/Utils/Authenticator.php index 78739869..45cdb355 100644 --- a/src/Utils/Authenticator.php +++ b/src/Utils/Authenticator.php @@ -134,13 +134,14 @@ public function register( stdClass $user ): ?WP_User { * Set auth cookies for WordPress login. * * @param WP_User $user WP User object. + * @param bool $remember to remember user or not. * * @return void */ - public function set_auth_cookies( WP_User $user ) { + public function set_auth_cookies( WP_User $user, bool $remember = false ) { wp_clear_auth_cookie(); wp_set_current_user( $user->ID, $user->user_login ); - wp_set_auth_cookie( $user->ID ); + wp_set_auth_cookie( $user->ID, $remember ); } /** From 69d1112a1f8cbe9dfa2cf1b80dc1e6e7add7e981 Mon Sep 17 00:00:00 2001 From: Vishal Kumar Date: Tue, 14 Feb 2023 10:38:21 +0530 Subject: [PATCH 05/10] Fix phpcs errors --- src/Modules/Block.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Modules/Block.php b/src/Modules/Block.php index e854a71a..5c8345c9 100644 --- a/src/Modules/Block.php +++ b/src/Modules/Block.php @@ -155,7 +155,7 @@ public function render_login_button( $attributes ): string { * @since 1.2.3 */ $force_display = $attributes['forceDisplay'] ?? false; - if ( $force_display || ! is_user_logged_in() || apply_filters( 'rtcamp.google_login_button_display', false ) ) { + if ( $force_display || ! is_user_logged_in() || apply_filters( 'rtcamp.google_login_button_display', false ) ) { $markup = $this->markup( [ 'login_url' => $this->client->authorization_url(), From ab8be9aae85931c7b35971ebf896a6aeb4939049 Mon Sep 17 00:00:00 2001 From: Vishal Kumar Date: Tue, 14 Feb 2023 10:38:46 +0530 Subject: [PATCH 06/10] Add style for remember me container --- assets/src/scss/login.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/assets/src/scss/login.scss b/assets/src/scss/login.scss index 5e58fd5c..bb217d40 100644 --- a/assets/src/scss/login.scss +++ b/assets/src/scss/login.scss @@ -80,6 +80,10 @@ $white_color: #FFFFFF; vertical-align: middle; margin-right: 10px; } + + &__remember-container { + margin-top: 15px; + } } .wp-block-google-login-login-button { From c2df1c4a7ce0c291813f24df768b7260edce6f85 Mon Sep 17 00:00:00 2001 From: Vishal Kumar Date: Tue, 14 Feb 2023 10:39:05 +0530 Subject: [PATCH 07/10] Build assets --- assets/build/css/login.css | 2 +- assets/build/js/login.asset.php | 2 +- assets/build/js/login.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/build/css/login.css b/assets/build/css/login.css index 5a36c9bd..1b0def7f 100644 --- a/assets/build/css/login.css +++ b/assets/build/css/login.css @@ -1 +1 @@ -.wp_google_login{clear:both;margin:40px auto 0}.wp_google_login.hidden{display:none}.wp_google_login__divider{position:relative;text-align:center}.wp_google_login__divider:before{background-color:#e1e2e2;content:"";height:1px;left:0;position:absolute;top:8px;width:100%}.wp_google_login__divider span{background-color:#fff;color:#e1e2e2;font-size:14px;padding-left:8px;padding-right:8px;position:relative;text-transform:uppercase;z-index:2}.wp_google_login__button-container{margin-top:10px}.wp_google_login__button{background-color:#fff;border:solid #ccced0;border-radius:4px;border-width:1px 1px 2px;box-sizing:border-box;color:#3d4145;cursor:pointer;display:block;font-size:14px;font-weight:500;line-height:25px;margin:0;outline:0;overflow:hidden;padding:10px 15px;text-align:center;text-decoration:none;text-overflow:ellipsis;width:100%}.wp_google_login__button:hover{color:#3d4145}.wp_google_login__google-icon{background:url(../images/google_light.png) no-repeat 50%;background-size:contain;display:inline-block;height:25px;margin-right:10px;vertical-align:middle;width:25px}.wp-block-google-login-login-button{display:inline-block} +.wp_google_login{clear:both;margin:40px auto 0}.wp_google_login.hidden{display:none}.wp_google_login__divider{position:relative;text-align:center}.wp_google_login__divider:before{background-color:#e1e2e2;content:"";height:1px;left:0;position:absolute;top:8px;width:100%}.wp_google_login__divider span{background-color:#fff;color:#e1e2e2;font-size:14px;padding-left:8px;padding-right:8px;position:relative;text-transform:uppercase;z-index:2}.wp_google_login__button-container{margin-top:10px}.wp_google_login__button{background-color:#fff;border:solid #ccced0;border-radius:4px;border-width:1px 1px 2px;box-sizing:border-box;color:#3d4145;cursor:pointer;display:block;font-size:14px;font-weight:500;line-height:25px;margin:0;outline:0;overflow:hidden;padding:10px 15px;text-align:center;text-decoration:none;text-overflow:ellipsis;width:100%}.wp_google_login__button:hover{color:#3d4145}.wp_google_login__google-icon{background:url(../images/google_light.png) no-repeat 50%;background-size:contain;display:inline-block;height:25px;margin-right:10px;vertical-align:middle;width:25px}.wp_google_login__remember-container{margin-top:15px}.wp-block-google-login-login-button{display:inline-block} diff --git a/assets/build/js/login.asset.php b/assets/build/js/login.asset.php index fb17492b..93cc568c 100644 --- a/assets/build/js/login.asset.php +++ b/assets/build/js/login.asset.php @@ -1 +1 @@ - array(), 'version' => '57f26158d9cbe8f4'); + array(), 'version' => '346e44ddee48bd04'); diff --git a/assets/build/js/login.js b/assets/build/js/login.js index 37350ba4..c58eea7d 100644 --- a/assets/build/js/login.js +++ b/assets/build/js/login.js @@ -1 +1 @@ -(()=>{var o,e={525:()=>{({init:function(){document.addEventListener("DOMContentLoaded",this.onContentLoaded)},onContentLoaded:function(){this.form=document.getElementById("loginform")||document.getElementById("registerform"),document.querySelector(".wp_google_login")&&null===this.form&&(document.cookie="vip-go-cb=1;wp-login-with-google=1;path="+encodeURI(window.location.pathname)+";"),null!==this.form&&(this.googleLoginButton=this.form.querySelector(".wp_google_login"),this.googleLoginButton.classList.remove("hidden"),this.form.append(this.googleLoginButton))}}).init()},879:()=>{}},t={};function n(o){var r=t[o];if(void 0!==r)return r.exports;var i=t[o]={exports:{}};return e[o](i,i.exports,n),i.exports}n.m=e,o=[],n.O=(e,t,r,i)=>{if(!t){var l=1/0;for(s=0;s=i)&&Object.keys(n.O).every((o=>n.O[o](t[d])))?t.splice(d--,1):(a=!1,i0&&o[s-1][2]>i;s--)o[s]=o[s-1];o[s]=[t,r,i]},n.o=(o,e)=>Object.prototype.hasOwnProperty.call(o,e),(()=>{var o={112:0,229:0};n.O.j=e=>0===o[e];var e=(e,t)=>{var r,i,[l,a,d]=t,g=0;if(l.some((e=>0!==o[e]))){for(r in a)n.o(a,r)&&(n.m[r]=a[r]);if(d)var s=d(n)}for(e&&e(t);gn(525)));var r=n.O(void 0,[229],(()=>n(879)));r=n.O(r)})(); \ No newline at end of file +(()=>{var e,o={525:()=>{({init:function(){document.addEventListener("DOMContentLoaded",this.onContentLoaded),document.getElementById("remember-google-login").addEventListener("change",this.rememberMe)},onContentLoaded:function(){this.form=document.getElementById("loginform")||document.getElementById("registerform"),document.querySelector(".wp_google_login")&&null===this.form&&(document.cookie="vip-go-cb=1;wp-login-with-google=1;path="+encodeURI(window.location.pathname)+";"),null!==this.form&&(this.googleLoginButton=this.form.querySelector(".wp_google_login"),this.googleLoginButton.classList.remove("hidden"),this.form.append(this.googleLoginButton))},rememberMe:function(){var e=document.getElementsByClassName("wp_google_login__button")[0];if(!0===this.checked){window.remember=!0;var o=e.getAttribute("href"),t=o.substring(o.indexOf("&state=")+7,o.indexOf("&scope")),n=JSON.parse(atob(t));n.remember=!0;var r=JSON.stringify(n),i=btoa(r);window.orignalParams=o,o=o.replace(t,i),e.setAttribute("href",o)}!1===this.checked&&!0===window.remember&&e.setAttribute("href",window.orignalParams)}}).init()},879:()=>{}},t={};function n(e){var r=t[e];if(void 0!==r)return r.exports;var i=t[e]={exports:{}};return o[e](i,i.exports,n),i.exports}n.m=o,e=[],n.O=(o,t,r,i)=>{if(!t){var a=1/0;for(d=0;d=i)&&Object.keys(n.O).every((e=>n.O[e](t[s])))?t.splice(s--,1):(l=!1,i0&&e[d-1][2]>i;d--)e[d]=e[d-1];e[d]=[t,r,i]},n.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),(()=>{var e={112:0,229:0};n.O.j=o=>0===e[o];var o=(o,t)=>{var r,i,[a,l,s]=t,g=0;if(a.some((o=>0!==e[o]))){for(r in l)n.o(l,r)&&(n.m[r]=l[r]);if(s)var d=s(n)}for(o&&o(t);gn(525)));var r=n.O(void 0,[229],(()=>n(879)));r=n.O(r)})(); \ No newline at end of file From bf1c7756018886278819a92823f280297a0dbb24 Mon Sep 17 00:00:00 2001 From: Vishal Kumar Date: Tue, 14 Feb 2023 11:31:14 +0530 Subject: [PATCH 08/10] Fix PHP unit test error --- tests/php/Unit/Utils/AuthenticatorTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/php/Unit/Utils/AuthenticatorTest.php b/tests/php/Unit/Utils/AuthenticatorTest.php index 0c56f6ca..8d056b52 100644 --- a/tests/php/Unit/Utils/AuthenticatorTest.php +++ b/tests/php/Unit/Utils/AuthenticatorTest.php @@ -392,7 +392,8 @@ public function testSetAuthCookies() { $this->wpMockFunction( 'wp_set_auth_cookie', [ - 100 + 100, + false, ], 1 ); From 823c00f4b1868d4913485cfad9fdca685637bf65 Mon Sep 17 00:00:00 2001 From: Vishal Kumar Date: Thu, 16 Feb 2023 17:10:07 +0530 Subject: [PATCH 09/10] Simplyfy code --- assets/build/js/login.asset.php | 2 +- assets/build/js/login.js | 2 +- assets/src/js/login.js | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/assets/build/js/login.asset.php b/assets/build/js/login.asset.php index 93cc568c..66188a46 100644 --- a/assets/build/js/login.asset.php +++ b/assets/build/js/login.asset.php @@ -1 +1 @@ - array(), 'version' => '346e44ddee48bd04'); + array(), 'version' => '4d9d3a64de60ef78'); diff --git a/assets/build/js/login.js b/assets/build/js/login.js index c58eea7d..3dddb1e4 100644 --- a/assets/build/js/login.js +++ b/assets/build/js/login.js @@ -1 +1 @@ -(()=>{var e,o={525:()=>{({init:function(){document.addEventListener("DOMContentLoaded",this.onContentLoaded),document.getElementById("remember-google-login").addEventListener("change",this.rememberMe)},onContentLoaded:function(){this.form=document.getElementById("loginform")||document.getElementById("registerform"),document.querySelector(".wp_google_login")&&null===this.form&&(document.cookie="vip-go-cb=1;wp-login-with-google=1;path="+encodeURI(window.location.pathname)+";"),null!==this.form&&(this.googleLoginButton=this.form.querySelector(".wp_google_login"),this.googleLoginButton.classList.remove("hidden"),this.form.append(this.googleLoginButton))},rememberMe:function(){var e=document.getElementsByClassName("wp_google_login__button")[0];if(!0===this.checked){window.remember=!0;var o=e.getAttribute("href"),t=o.substring(o.indexOf("&state=")+7,o.indexOf("&scope")),n=JSON.parse(atob(t));n.remember=!0;var r=JSON.stringify(n),i=btoa(r);window.orignalParams=o,o=o.replace(t,i),e.setAttribute("href",o)}!1===this.checked&&!0===window.remember&&e.setAttribute("href",window.orignalParams)}}).init()},879:()=>{}},t={};function n(e){var r=t[e];if(void 0!==r)return r.exports;var i=t[e]={exports:{}};return o[e](i,i.exports,n),i.exports}n.m=o,e=[],n.O=(o,t,r,i)=>{if(!t){var a=1/0;for(d=0;d=i)&&Object.keys(n.O).every((e=>n.O[e](t[s])))?t.splice(s--,1):(l=!1,i0&&e[d-1][2]>i;d--)e[d]=e[d-1];e[d]=[t,r,i]},n.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),(()=>{var e={112:0,229:0};n.O.j=o=>0===e[o];var o=(o,t)=>{var r,i,[a,l,s]=t,g=0;if(a.some((o=>0!==e[o]))){for(r in l)n.o(l,r)&&(n.m[r]=l[r]);if(s)var d=s(n)}for(o&&o(t);gn(525)));var r=n.O(void 0,[229],(()=>n(879)));r=n.O(r)})(); \ No newline at end of file +(()=>{var e,o={525:()=>{({init:function(){document.addEventListener("DOMContentLoaded",this.onContentLoaded),document.getElementById("remember-google-login").addEventListener("change",this.rememberMe)},onContentLoaded:function(){this.form=document.getElementById("loginform")||document.getElementById("registerform"),document.querySelector(".wp_google_login")&&null===this.form&&(document.cookie="vip-go-cb=1;wp-login-with-google=1;path="+encodeURI(window.location.pathname)+";"),null!==this.form&&(this.googleLoginButton=this.form.querySelector(".wp_google_login"),this.googleLoginButton.classList.remove("hidden"),this.form.append(this.googleLoginButton))},rememberMe:function(){var e=document.getElementsByClassName("wp_google_login__button")[0];if(!0===this.checked){window.remember=!0;var o=e.getAttribute("href"),t=o.substring(o.indexOf("&state=")+7,o.indexOf("&scope")),n=JSON.parse(atob(t));n.remember=!0;var r=btoa(JSON.stringify(n));window.orignalParams=o,o=o.replace(t,r),e.setAttribute("href",o)}!1===this.checked&&!0===window.remember&&e.setAttribute("href",window.orignalParams)}}).init()},879:()=>{}},t={};function n(e){var r=t[e];if(void 0!==r)return r.exports;var i=t[e]={exports:{}};return o[e](i,i.exports,n),i.exports}n.m=o,e=[],n.O=(o,t,r,i)=>{if(!t){var a=1/0;for(d=0;d=i)&&Object.keys(n.O).every((e=>n.O[e](t[s])))?t.splice(s--,1):(l=!1,i0&&e[d-1][2]>i;d--)e[d]=e[d-1];e[d]=[t,r,i]},n.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),(()=>{var e={112:0,229:0};n.O.j=o=>0===e[o];var o=(o,t)=>{var r,i,[a,l,s]=t,g=0;if(a.some((o=>0!==e[o]))){for(r in l)n.o(l,r)&&(n.m[r]=l[r]);if(s)var d=s(n)}for(o&&o(t);gn(525)));var r=n.O(void 0,[229],(()=>n(879)));r=n.O(r)})(); \ No newline at end of file diff --git a/assets/src/js/login.js b/assets/src/js/login.js index 4a3e4632..f373f726 100644 --- a/assets/src/js/login.js +++ b/assets/src/js/login.js @@ -68,8 +68,7 @@ const wpGoogleLogin = { /* Add remember parameter to state */ decodeState['remember'] = true; - var encodeState = JSON.stringify( decodeState ); - var newState = btoa( encodeState ); + var newState = btoa( JSON.stringify( decodeState ) ); window.orignalParams = params; params = params.replace( state, newState ); From 2a0159e33cbe7701e30a4b244e60e992617af0a7 Mon Sep 17 00:00:00 2001 From: Vishal Kumar Date: Fri, 17 Feb 2023 13:27:01 +0530 Subject: [PATCH 10/10] Fix white space issue --- assets/src/js/login.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/assets/src/js/login.js b/assets/src/js/login.js index f373f726..4dfdef51 100644 --- a/assets/src/js/login.js +++ b/assets/src/js/login.js @@ -13,7 +13,7 @@ const wpGoogleLogin = { */ init() { document.addEventListener( 'DOMContentLoaded', this.onContentLoaded ); - const rememberMeCheckbox = document.getElementById('remember-google-login'); + const rememberMeCheckbox = document.getElementById( 'remember-google-login' ); rememberMeCheckbox.addEventListener( 'change', this.rememberMe ); }, @@ -56,15 +56,15 @@ const wpGoogleLogin = { */ rememberMe() { - const loginWithGoogle = document.getElementsByClassName('wp_google_login__button')[0]; + const loginWithGoogle = document.getElementsByClassName( 'wp_google_login__button' )[0]; - if(this.checked === true) { + if( this.checked === true ) { window.remember = true; - var params = loginWithGoogle.getAttribute('href'); - var state = params.substring( params.indexOf('&state=') + 7, params.indexOf('&scope')); + var params = loginWithGoogle.getAttribute( 'href' ); + var state = params.substring( params.indexOf( '&state=' ) + 7, params.indexOf( '&scope' ) ); /* Decodes state value */ - var decodeState = JSON.parse( atob( state )); + var decodeState = JSON.parse( atob( state ) ); /* Add remember parameter to state */ decodeState['remember'] = true;