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..66188a46 100644 --- a/assets/build/js/login.asset.php +++ b/assets/build/js/login.asset.php @@ -1 +1 @@ - array(), 'version' => '57f26158d9cbe8f4'); + array(), 'version' => '4d9d3a64de60ef78'); diff --git a/assets/build/js/login.js b/assets/build/js/login.js index 37350ba4..3dddb1e4 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=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 bcb5e361..4dfdef51 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,46 @@ 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 newState = btoa( JSON.stringify( decodeState ) ); + 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(); 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 { 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(), 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 ); + } } 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 ); } /** 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 @@ + 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 );